AllowedAddressPostalExtension.php 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Doctrine\Core;
  4. use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
  5. use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface;
  6. use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
  7. use App\Entity\Access\Access;
  8. use App\Entity\Core\AddressPostal;
  9. use Doctrine\ORM\QueryBuilder;
  10. use Symfony\Component\Security\Core\Security;
  11. /**
  12. * Class AllowedAddressPostalExtension : Filtre de sécurité par défaut pour une resource AddressPostal
  13. * @package App\Doctrine\Core
  14. */
  15. final class AllowedAddressPostalExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
  16. {
  17. public function __construct(private Security $security)
  18. { }
  19. public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null): void
  20. {
  21. $this->addWhere($queryBuilder, $resourceClass, $operationName);
  22. }
  23. public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void
  24. {
  25. $this->addWhere($queryBuilder, $resourceClass, $operationName);
  26. }
  27. private function addWhere(QueryBuilder $queryBuilder, string $resourceClass, string $operationName): void
  28. {
  29. if (AddressPostal::class !== $resourceClass) {
  30. return;
  31. }
  32. /** @var Access $currentUser */
  33. $currentUser = $this->security->getUser();
  34. $rootAlias = $queryBuilder->getRootAliases()[0];
  35. $queryBuilder
  36. ->innerJoin(sprintf('%s.organizationAddressPostal', $rootAlias), 'organization_address_postal')
  37. ->andWhere('organization_address_postal.organization = :organization')
  38. ->setParameter('organization', $currentUser->getOrganization())
  39. ;
  40. }
  41. }