Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
15.38% covered (danger)
15.38%
4 / 26
50.00% covered (danger)
50.00%
2 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
UserBelongsToCollectivityExtension
15.38% covered (danger)
15.38%
4 / 26
50.00% covered (danger)
50.00%
2 / 4
99.24
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 applyToCollection
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 applyToItem
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 addWhere
8.70% covered (danger)
8.70%
2 / 23
0.00% covered (danger)
0.00%
0 / 1
70.65
1<?php
2
3namespace App\Domain\User\Doctrine;
4
5use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
6use ApiPlatform\Doctrine\Orm\Extension\QueryItemExtensionInterface;
7use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
8use ApiPlatform\Metadata\Operation;
9use App\Application\Interfaces\CollectivityRelated;
10use App\Domain\Registry\Model\Request;
11use App\Domain\Registry\Model\Treatment;
12use App\Domain\User\Model\Collectivity;
13use Doctrine\ORM\QueryBuilder;
14use Symfony\Component\Security\Core\Security;
15
16final class UserBelongsToCollectivityExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
17{
18    private Security $security;
19
20    public function __construct(Security $security)
21    {
22        $this->security = $security;
23    }
24
25    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, ?Operation $operation = null, array $context = []): void
26    {
27        $this->addWhere($queryBuilder, $resourceClass);
28    }
29
30    public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, ?Operation $operation = null, array $context = []): void
31    {
32        $this->addWhere($queryBuilder, $resourceClass);
33    }
34
35    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
36    {
37        if ($this->security->isGranted('ROLE_ADMIN') || null === $user = $this->security->getUser()) {
38            // Return all elements because user is admin
39            return;
40        }
41
42        if (Request::class === $resourceClass) {
43            // Handle treatment case
44            $rootAlias = $queryBuilder->getRootAliases()[0];
45            $queryBuilder->andWhere(sprintf('%s.collectivity = :user_collectivity', $rootAlias));
46            $queryBuilder->setParameter(
47                'user_collectivity',
48                $user instanceof CollectivityRelated ? $user->getCollectivity() : null
49            );
50        }
51
52        if (Treatment::class === $resourceClass) {
53            // Handle treatment case
54            $rootAlias = $queryBuilder->getRootAliases()[0];
55            $queryBuilder->andWhere(sprintf('%s.collectivity = :user_collectivity', $rootAlias));
56            $queryBuilder->setParameter(
57                'user_collectivity',
58                $user instanceof CollectivityRelated ? $user->getCollectivity() : null
59            );
60        }
61
62        if (Collectivity::class === $resourceClass) {
63            // Handle collectivity case
64            $rootAlias = $queryBuilder->getRootAliases()[0];
65            $queryBuilder->andWhere(sprintf('%s.id = :user_collectivity', $rootAlias));
66            $queryBuilder->setParameter(
67                'user_collectivity',
68                $user instanceof CollectivityRelated ? $user->getCollectivity()->getId() : null
69            );
70        }
71    }
72}