Passed
Push — develop ( b1cbda...790c39 )
by BENARD
03:43
created

TopicExtension::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
namespace ProjetNormandie\ForumBundle\Doctrine;
3
4
use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
5
use ApiPlatform\Doctrine\Orm\Extension\QueryItemExtensionInterface;
6
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
7
use ApiPlatform\Metadata\Operation;
8
use ProjetNormandie\ForumBundle\Entity\Topic;
9
use Doctrine\ORM\QueryBuilder;
10
use Doctrine\ORM\Query\Expr\Join;
11
use Symfony\Component\Security\Core\Security;
12
13
final class TopicExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
14
{
15
    private Security $security;
16
17
    public function __construct(Security $security)
18
    {
19
        $this->security = $security;
20
    }
21
22
     /**
23
     * @param QueryBuilder                $queryBuilder
24
     * @param QueryNameGeneratorInterface $queryNameGenerator
25
     * @param string                      $resourceClass
26
     * @param Operation|null              $operation
27
     * @param array                       $context
28
     */
29
    public function applyToCollection(
30
        QueryBuilder $queryBuilder,
31
        QueryNameGeneratorInterface $queryNameGenerator,
32
        string $resourceClass,
33
        Operation $operation = null,
34
        array $context = []
35
    ): void {
36
        $this->addWhere($queryBuilder, $resourceClass);
37
    }
38
39
    public function applyToItem(
40
        QueryBuilder $queryBuilder,
41
        QueryNameGeneratorInterface $queryNameGenerator,
42
        string $resourceClass,
43
        array $identifiers,
44
        Operation $operation = null,
45
        array $context = []): void
46
    {
47
        $this->addWhere($queryBuilder, $resourceClass);
48
    }
49
50
    /**
51
     * @param QueryBuilder $queryBuilder
52
     * @param string       $resourceClass
53
     */
54
    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
55
    {
56
        if (Topic::class !== $resourceClass || !$this->security->isGranted(
57
                'ROLE_USER'
58
            ) || null === $user = $this->security->getUser()) {
59
            return;
60
        }
61
62
        $queryBuilder->innerJoin('o.topicUser', 'tu', Join::WITH, 'tu.user = :current_user');
63
        $queryBuilder->addSelect('tu');
64
        $queryBuilder->setParameter('current_user', $user);
65
    }
66
}
67