Passed
Pull Request — master (#5694)
by
unknown
07:26
created

CourseRelUserExtension::applyToCollection()   B

Complexity

Conditions 8
Paths 15

Size

Total Lines 47
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
eloc 28
c 1
b 0
f 0
nc 15
nop 5
dl 0
loc 47
rs 8.4444
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
declare(strict_types=1);
6
7
namespace Chamilo\CoreBundle\DataProvider\Extension;
8
9
use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
10
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
11
use ApiPlatform\Metadata\Operation;
12
use Chamilo\CoreBundle\Entity\AccessUrlRelCourse;
13
use Chamilo\CoreBundle\Entity\CourseRelUser;
14
use Chamilo\CoreBundle\Entity\User;
15
use Chamilo\CoreBundle\ServiceHelper\AccessUrlHelper;
16
use Doctrine\ORM\QueryBuilder;
17
use Symfony\Bundle\SecurityBundle\Security;
18
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
19
20
final class CourseRelUserExtension implements QueryCollectionExtensionInterface
21
{
22
    public function __construct(
23
        private readonly Security $security,
24
        private readonly AccessUrlHelper $accessUrlHelper
25
    ) {}
26
27
    public function applyToCollection(
28
        QueryBuilder $queryBuilder,
29
        QueryNameGeneratorInterface $queryNameGenerator,
30
        string $resourceClass,
31
        ?Operation $operation = null,
32
        array $context = []
33
    ): 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
56
        if ($this->security->isGranted('ROLE_ADMIN')) {
57
            return;
58
        }
59
60
        if (CourseRelUser::class === $resourceClass) {
61
            if ('collection_query' === $operation?->getName()) {
62
                /** @var User|null $user */
63
                if (null === $user = $this->security->getUser()) {
64
                    throw new AccessDeniedException('Access Denied.');
65
                }
66
67
                $rootAlias = $queryBuilder->getRootAliases()[0];
68
                $queryBuilder->andWhere(sprintf('%s.user = :current_user', $rootAlias));
69
                $queryBuilder->setParameter('current_user', $user->getId());
70
            }
71
        }
72
73
        $this->addWhere($queryBuilder, $resourceClass);
74
    }
75
76
    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
77
    {
78
        if (CourseRelUser::class !== $resourceClass) {
79
            return;
80
        }
81
82
        if ($this->security->isGranted('ROLE_ADMIN')) {
83
            return;
84
        }
85
86
        // Need to be login to access the list.
87
        if (null === $user = $this->security->getUser()) {
88
            throw new AccessDeniedException('Access Denied.');
89
        }
90
    }
91
}
92