Passed
Push — master ( e157d2...b7d807 )
by Julito
12:22
created

MessageExtension::addWhere()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 22
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 13
nc 3
nop 2
dl 0
loc 22
rs 9.8333
c 1
b 0
f 0
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\Message;
13
use Doctrine\ORM\QueryBuilder;
14
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
15
use Symfony\Component\Security\Core\Security;
16
17
final class MessageExtension implements QueryCollectionExtensionInterface //, QueryItemExtensionInterface
18
{
19
    private Security $security;
20
21
    public function __construct(Security $security)
22
    {
23
        $this->security = $security;
24
    }
25
26
    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null): void
27
    {
28
        if ($this->security->isGranted('ROLE_ADMIN')) {
29
            return;
30
        }
31
        /*
32
        if ('collection_query' === $operationName) {
33
            if (null === $user = $this->security->getUser()) {
34
                throw new AccessDeniedException('Access Denied.');
35
            }
36
37
            $rootAlias = $queryBuilder->getRootAliases()[0];
38
            $queryBuilder->andWhere(sprintf('%s.user = :current_user', $rootAlias));
39
            $queryBuilder->setParameter('current_user', $user);
40
        }*/
41
42
        $this->addWhere($queryBuilder, $resourceClass);
43
    }
44
45
    public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void
46
    {
47
        //error_log('applyToItem');
48
        //$this->addWhere($queryBuilder, $resourceClass);
49
    }
50
51
    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
52
    {
53
        if (Message::class !== $resourceClass) {
54
            return;
55
        }
56
57
        if ($this->security->isGranted('ROLE_ADMIN')) {
58
            return;
59
        }
60
61
        $user = $this->security->getUser();
62
63
        $alias = $queryBuilder->getRootAliases()[0];
64
65
        $queryBuilder->andWhere("
66
            ($alias.userSender = :current AND $alias.msgType = :outbox) OR 
67
            ($alias.userReceiver = :current AND $alias.msgType = :inbox)
68
        ");
69
        $queryBuilder->setParameters([
70
            'current' => $user,
71
            'inbox' => Message::MESSAGE_TYPE_INBOX,
72
            'outbox' => Message::MESSAGE_TYPE_OUTBOX,
73
        ]);
74
    }
75
}
76