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

ForumExtension::applyToItem()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 9
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 6
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\Forum;
9
use Doctrine\ORM\QueryBuilder;
10
use Doctrine\ORM\Query\Expr\Join;
11
use Symfony\Component\Security\Core\Security;
12
13
final class ForumExtension 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
    /**
52
     * @param QueryBuilder $queryBuilder
53
     * @param string       $resourceClass
54
     */
55
    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
56
    {
57
        if (Forum::class !== $resourceClass || !$this->security->isGranted(
58
                'ROLE_USER'
59
            ) || null === $user = $this->security->getUser()) {
60
            return;
61
        }
62
        $queryBuilder->innerJoin('o.forumUser', 'fu', Join::WITH, 'fu.user = :current_user');
63
        $queryBuilder->addSelect('fu');
64
        $queryBuilder->setParameter('current_user', $user);
65
    }
66
}
67