Passed
Push — master ( 38677f...b96f5e )
by Julito
07:27
created

PersonalFileExtension   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 65
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 26
c 1
b 0
f 0
dl 0
loc 65
rs 10
wmc 6

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A addWhere() 0 43 4
A applyToCollection() 0 3 1
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\PersonalFile;
13
use Chamilo\CoreBundle\Entity\ResourceLink;
14
use Doctrine\ORM\QueryBuilder;
15
use Symfony\Component\HttpFoundation\RequestStack;
16
use Symfony\Component\Security\Core\Security;
17
18
/**
19
 * Extension is called when loading api/personal_files.json.
20
 */
21
final class PersonalFileExtension implements QueryCollectionExtensionInterface //, QueryItemExtensionInterface
22
{
23
    private Security $security;
24
    private RequestStack $requestStack;
25
26
    public function __construct(Security $security, RequestStack $request)
27
    {
28
        $this->security = $security;
29
        $this->requestStack = $request;
30
    }
31
32
    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null): void
33
    {
34
        $this->addWhere($queryBuilder, $resourceClass);
35
    }
36
37
    /*public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void
38
    {
39
        error_log('applyToItem');
40
        $this->addWhere($queryBuilder, $resourceClass);
41
    }*/
42
43
    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
44
    {
45
        if (PersonalFile::class !== $resourceClass) {
46
            return;
47
        }
48
49
        // Admin can see everything.
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
        $isShared = 1 === (int) $request->get('shared');
60
61
        $rootAlias = $queryBuilder->getRootAliases()[0];
62
        $queryBuilder
63
            ->innerJoin("$rootAlias.resourceNode", 'node')
64
        ;
65
66
        if ($isShared) {
67
            $queryBuilder->leftJoin('node.resourceLinks', 'links');
68
69
            /*$queryBuilder
70
                ->andWhere('links.visibility != :visibilityDeleted')
71
                ->setParameter('visibilityDeleted', ResourceLink::VISIBILITY_DELETED)
72
            ;*/
73
74
            $queryBuilder
75
                ->andWhere('links.visibility = :visibility')
76
                ->setParameter('visibility', ResourceLink::VISIBILITY_PUBLISHED)
77
            ;
78
79
            $queryBuilder
80
                ->orWhere('links.user = :userLink')
81
                ->setParameter('userLink', $user)
82
            ;
83
        } else {
84
            $queryBuilder->orWhere('node.creator = :current');
85
            $queryBuilder->setParameter('current', $user->getId());
86
        }
87
    }
88
}
89