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

ForumExtension   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 52
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 12
dl 0
loc 52
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A applyToCollection() 0 8 1
A __construct() 0 3 1
A addWhere() 0 10 4
A applyToItem() 0 9 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\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