AccessExtension.php 2.1 KB

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