Passed
Push — master ( 2ac859...8bf2dd )
by Julito
10:14
created

CourseExtension::applyToCollection()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 4
dl 0
loc 3
rs 10
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\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
10
//use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface;
11
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
12
use Chamilo\CoreBundle\Entity\Course;
13
use Chamilo\CoreBundle\Entity\ResourceLink;
14
use Doctrine\ORM\QueryBuilder;
15
use Symfony\Component\HttpFoundation\RequestStack;
16
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
17
use Symfony\Component\Security\Core\Security;
18
19
/**
20
 * Extension is called when loading api/courses.json.
21
 */
22
final class CourseExtension implements QueryCollectionExtensionInterface
23
{
24
    private Security $security;
25
    private RequestStack $requestStack;
26
27
    public function __construct(Security $security, RequestStack $request)
28
    {
29
        $this->security = $security;
30
        $this->requestStack = $request;
31
    }
32
33
    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null): void
34
    {
35
        $this->addWhere($queryBuilder, $resourceClass);
36
    }
37
38
    /*public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void
39
    {
40
        error_log('applyToItem');
41
        $this->addWhere($queryBuilder, $resourceClass);
42
    }*/
43
44
    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
45
    {
46
        if (Course::class !== $resourceClass) {
47
            return;
48
        }
49
50
        if ($this->security->isGranted('ROLE_ADMIN')) {
51
            return;
52
        }
53
54
        if (null === $user = $this->security->getUser()) {
55
            throw new AccessDeniedException('Access Denied.');
56
        }
57
58
        $rootAlias = $queryBuilder->getRootAliases()[0];
59
60
        $queryBuilder
61
            ->andWhere(sprintf('%s.visibility <> :visibility_hidden', $rootAlias))
62
            ->setParameter('visibility_hidden', Course::HIDDEN)
63
        ;
64
        $queryBuilder
65
            ->andWhere(sprintf('%s.visibility <> :visibility_closed', $rootAlias))
66
            ->setParameter('visibility_closed', Course::CLOSED)
67
        ;
68
    }
69
}
70