99use ApiPlatform \Doctrine \Orm \Extension \QueryCollectionExtensionInterface ;
1010use ApiPlatform \Doctrine \Orm \Util \QueryNameGeneratorInterface ;
1111use ApiPlatform \Metadata \Operation ;
12+ use Chamilo \CoreBundle \Entity \AccessUrlRelCourse ;
1213use Chamilo \CoreBundle \Entity \CourseRelUser ;
1314use Chamilo \CoreBundle \Entity \User ;
15+ use Chamilo \CoreBundle \ServiceHelper \AccessUrlHelper ;
1416use Doctrine \ORM \QueryBuilder ;
1517use Symfony \Bundle \SecurityBundle \Security ;
1618use Symfony \Component \Security \Core \Exception \AccessDeniedException ;
1719
18- // use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface;
19-
20- final class CourseRelUserExtension implements QueryCollectionExtensionInterface // , QueryItemExtensionInterface
20+ final class CourseRelUserExtension implements QueryCollectionExtensionInterface
2121{
2222 public function __construct (
23- private readonly Security $ security
23+ private readonly Security $ security ,
24+ private readonly AccessUrlHelper $ accessUrlHelper
2425 ) {}
2526
2627 public function applyToCollection (
@@ -30,13 +31,34 @@ public function applyToCollection(
3031 ?Operation $ operation = null ,
3132 array $ context = []
3233 ): void {
34+ if ($ this ->accessUrlHelper ->isMultiple ()) {
35+ $ accessUrl = $ this ->accessUrlHelper ->getCurrent ();
36+ $ rootAlias = $ queryBuilder ->getRootAliases ()[0 ];
37+ if (isset ($ context ['filters ' ]['sticky ' ]) && $ context ['filters ' ]['sticky ' ]) {
38+ $ queryBuilder
39+ ->innerJoin (
40+ AccessUrlRelCourse::class,
41+ 'url_rel ' ,
42+ 'WITH ' ,
43+ 'url_rel.course = ' . $ rootAlias
44+ )
45+ ->andWhere ('url_rel.url = :access_url_id ' )
46+ ->setParameter ('access_url_id ' , $ accessUrl ->getId ());
47+ } else {
48+ $ queryBuilder
49+ ->innerJoin ("$ rootAlias.course " , 'c ' )
50+ ->innerJoin ('c.urls ' , 'url_rel ' )
51+ ->andWhere ('url_rel.url = :access_url_id ' )
52+ ->setParameter ('access_url_id ' , $ accessUrl ->getId ());
53+ }
54+ }
55+
3356 if ($ this ->security ->isGranted ('ROLE_ADMIN ' )) {
3457 return ;
3558 }
3659
3760 if (CourseRelUser::class === $ resourceClass ) {
38- // Blocks a ROLE_USER to access CourseRelUsers from another User.
39- if ('collection_query ' === $ operation ->getName ()) {
61+ if ('collection_query ' === $ operation ?->getName()) {
4062 /** @var User|null $user */
4163 if (null === $ user = $ this ->security ->getUser ()) {
4264 throw new AccessDeniedException ('Access Denied. ' );
@@ -51,12 +73,6 @@ public function applyToCollection(
5173 $ this ->addWhere ($ queryBuilder , $ resourceClass );
5274 }
5375
54- /*public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void
55- {
56- error_log('applyToItem');
57- $this->addWhere($queryBuilder, $resourceClass);
58- }*/
59-
6076 private function addWhere (QueryBuilder $ queryBuilder , string $ resourceClass ): void
6177 {
6278 if (CourseRelUser::class !== $ resourceClass ) {
0 commit comments