Passed
Push — master ( 8631fb...7f9d4e )
by Julito
18:15
created

CDocumentExtension::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\ResourceLink;
13
use Chamilo\CourseBundle\Entity\CDocument;
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
 * CDocumentExtension is called when calling the api/documents.json
21
 */
22
final class CDocumentExtension implements QueryCollectionExtensionInterface //, QueryItemExtensionInterface
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 (CDocument::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
            return;
56
        }
57
58
        $request = $this->requestStack->getCurrentRequest();
59
60
        // Listing documents must contain the resource node parent (resourceNode.parent) and the course (cid)
61
        // At least the cid so the CourseListener can be called.
62
        $resourceParentId = $request->query->get('resourceNode_parent');
63
        $courseId = $request->query->get('cid');
64
        $sessionId = $request->query->get('sid');
65
        $groupId = $request->query->get('gid');
66
67
        if (empty($resourceParentId)) {
68
            throw new AccessDeniedException('resourceNode.parent is required');
69
        }
70
71
        if (empty($courseId)) {
72
            throw new AccessDeniedException('cid is required');
73
        }
74
75
        error_log('addWhere');
76
        error_log('here!');
77
        $rootAlias = $queryBuilder->getRootAliases()[0];
78
79
        $queryBuilder
80
            ->innerJoin("$rootAlias.resourceNode", 'node')
81
            ->innerJoin('node.resourceLinks', 'links')
82
        ;
83
84
        $queryBuilder
85
            ->andWhere('links.visibility != :visibilityDeleted')
86
            ->setParameter('visibilityDeleted', ResourceLink::VISIBILITY_DELETED)
87
        ;
88
89
        $queryBuilder
90
            ->andWhere('links.visibility != :visibilityDraft')
91
            ->setParameter('visibilityDraft', ResourceLink::VISIBILITY_DRAFT)
92
        ;
93
94
        $queryBuilder
95
            ->andWhere('links.course = :course')
96
            ->setParameter('course', $courseId)
97
        ;
98
99
        if (empty($sessionId)) {
100
            $queryBuilder->andWhere('links.session IS NULL');
101
        } else {
102
            $queryBuilder
103
                ->andWhere('links.session = :session')
104
                ->setParameter('session', $sessionId);
105
        }
106
107
108
        /*$queryBuilder->
109
            andWhere('node.creator = :current_user')
110
        ;*/
111
        //$queryBuilder->andWhere(sprintf('%s.node.creator = :current_user', $rootAlias));
112
        //$queryBuilder->setParameter('current_user', $user->getId());
113
    }
114
}
115