CurrentAccessExtension.php 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Doctrine\Access;
  4. use ApiPlatform\Metadata\Operation;
  5. use App\Doctrine\AbstractExtension;
  6. use App\Entity\Access\Access;
  7. use App\Service\ServiceIterator\CurrentAccessExtensionIterator;
  8. use Doctrine\ORM\QueryBuilder;
  9. use Symfony\Bundle\SecurityBundle\Security;
  10. /**
  11. * Class CurrentAccessExtension : Filtre de sécurité par défaut pour une resource Access.
  12. */
  13. final class CurrentAccessExtension extends AbstractExtension
  14. {
  15. public function __construct(
  16. private Security $security,
  17. private CurrentAccessExtensionIterator $currentAccessExtensionIterator
  18. ) {
  19. }
  20. public function supports(string $resourceClass, ?Operation $operation): bool
  21. {
  22. return $resourceClass === Access::class;
  23. }
  24. public function addWhere(QueryBuilder $queryBuilder, string $resourceClass, ?Operation $operation): void
  25. {
  26. /** @var Access $currentUser */
  27. $currentUser = $this->security->getUser();
  28. $rootAlias = $queryBuilder->getRootAliases()[0];
  29. $queryBuilder
  30. ->andWhere(sprintf('%s.organization = :current_organization', $rootAlias))
  31. ->setParameter('current_organization', $currentUser->getOrganization())
  32. ;
  33. $this->currentAccessExtensionIterator->addWhere($queryBuilder, $operation?->getName());
  34. }
  35. }