|
|
@@ -0,0 +1,48 @@
|
|
|
+<?php
|
|
|
+declare(strict_types=1);
|
|
|
+
|
|
|
+namespace App\Doctrine\Core;
|
|
|
+
|
|
|
+use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
|
|
|
+use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface;
|
|
|
+use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
|
|
|
+use App\Entity\Access\Access;
|
|
|
+use App\Entity\Core\AddressPostal;
|
|
|
+use Doctrine\ORM\QueryBuilder;
|
|
|
+use Symfony\Component\Security\Core\Security;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Class AddressPostalExtension : Filtre de sécurité par défaut pour une resource AddressPostal
|
|
|
+ * @package App\Doctrine\Core
|
|
|
+ */
|
|
|
+final class AddressPostalExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
|
|
|
+{
|
|
|
+ public function __construct(private Security $security)
|
|
|
+ { }
|
|
|
+
|
|
|
+ public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null): void
|
|
|
+ {
|
|
|
+ $this->addWhere($queryBuilder, $resourceClass, $operationName);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void
|
|
|
+ {
|
|
|
+ $this->addWhere($queryBuilder, $resourceClass, $operationName);
|
|
|
+ }
|
|
|
+
|
|
|
+ private function addWhere(QueryBuilder $queryBuilder, string $resourceClass, string $operationName): void
|
|
|
+ {
|
|
|
+ if (AddressPostal::class !== $resourceClass) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /** @var Access $currentUser */
|
|
|
+ $currentUser = $this->security->getUser();
|
|
|
+ $rootAlias = $queryBuilder->getRootAliases()[0];
|
|
|
+ $queryBuilder
|
|
|
+ ->innerJoin(sprintf('%s.organizationAddressPostal', $rootAlias), 'organization_address_postal')
|
|
|
+ ->andWhere('organization_address_postal.organization = :organization')
|
|
|
+ ->setParameter('organization', $currentUser->getOrganization())
|
|
|
+ ;
|
|
|
+ }
|
|
|
+}
|