Passed
Pull Request — master (#5682)
by
unknown
09:04 queued 01:50
created

CourseRelUserExtension::applyToCollection()   B

Complexity

Conditions 7
Paths 11

Size

Total Lines 38
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 19
c 0
b 0
f 0
nc 11
nop 5
dl 0
loc 38
rs 8.8333
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\CourseRelUser;
13
use Chamilo\CoreBundle\Entity\User;
14
use Chamilo\CoreBundle\ServiceHelper\AccessUrlHelper;
15
use Doctrine\ORM\QueryBuilder;
16
use Symfony\Bundle\SecurityBundle\Security;
17
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
18
19
final class CourseRelUserExtension implements QueryCollectionExtensionInterface
20
{
21
    public function __construct(
22
        private readonly Security $security,
23
        private readonly AccessUrlHelper $accessUrlHelper
24
    ) {}
25
26
    public function applyToCollection(
27
        QueryBuilder $queryBuilder,
28
        QueryNameGeneratorInterface $queryNameGenerator,
29
        string $resourceClass,
30
        ?Operation $operation = null,
31
        array $context = []
32
    ): void {
33
        if ($this->security->isGranted('ROLE_ADMIN')) {
34
           return;
35
        }
36
37
        if ($this->accessUrlHelper->hasMultipleAccessUrls()) {
38
            $accessUrl = $this->accessUrlHelper->getCurrent();
39
            $rootAlias = $queryBuilder->getRootAliases()[0];
40
41
            $queryBuilder
42
                ->innerJoin("$rootAlias.course", 'c')
43
                ->innerJoin('c.urls', 'url_rel')
44
                ->andWhere('url_rel.url = :access_url_id')
45
                ->setParameter('access_url_id', $accessUrl->getId());
46
        }
47
48
        if (!$this->security->isGranted('ROLE_ADMIN')) {
49
            if (CourseRelUser::class === $resourceClass) {
50
                if ('collection_query' === $operation?->getName()) {
51
                    /** @var User|null $user */
52
                    if (null === $user = $this->security->getUser()) {
53
                        throw new AccessDeniedException('Access Denied.');
54
                    }
55
56
                    $rootAlias = $queryBuilder->getRootAliases()[0];
57
                    $queryBuilder->andWhere(sprintf('%s.user = :current_user', $rootAlias));
58
                    $queryBuilder->setParameter('current_user', $user->getId());
59
                }
60
            }
61
        }
62
63
        $this->addWhere($queryBuilder, $resourceClass);
64
    }
65
66
    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
67
    {
68
        if (CourseRelUser::class !== $resourceClass) {
69
            return;
70
        }
71
72
        if ($this->security->isGranted('ROLE_ADMIN')) {
73
            return;
74
        }
75
76
        // Need to be logged in to access the list.
77
        if (null === $user = $this->security->getUser()) {
78
            throw new AccessDeniedException('Access Denied.');
79
        }
80
    }
81
}
82