Utils.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service\Access;
  4. use App\Entity\Access\Access;
  5. use App\Entity\Organization\Organization;
  6. use App\Repository\Access\AccessRepository;
  7. use App\Service\ServiceIterator\OptionalsRolesIterator;
  8. use App\Test\Service\Access\UtilsTest;
  9. use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
  10. /**
  11. * Class Utils : service rassemblant des fonctions d'aides pour les questions se rapportant à l'access
  12. * @package App\Service\Resource
  13. */
  14. class Utils
  15. {
  16. public function __construct(
  17. private RoleHierarchyInterface $roleHierarchy,
  18. private AccessRepository $accessRepository,
  19. private OptionalsRolesIterator $optionalsRolesIterator
  20. )
  21. {}
  22. /**
  23. * Filtre un tableau d'Access pour ne laisser que les Accesses ne correspondant pas à l'Access passé en second parametre
  24. * @param array<Access> $accesses
  25. * @param Access $access
  26. * @return array
  27. * @see UtilsTest::testFilterAccesses()
  28. */
  29. public function filterAccesses(array $accesses, Access $access): array {
  30. return array_filter($accesses, function($a) use($access){
  31. /** @var Access $a */
  32. return $a->getId() !== $access->getId();
  33. });
  34. }
  35. /**
  36. * Recherche parmis les roles si l'Access possède celui passé en paramètre
  37. * @param Access $access
  38. * @param string $roleToHave
  39. * @return bool
  40. * @see UtilsTest::testHasRoles()
  41. */
  42. public function hasRoles(Access $access, string $roleToHave): bool{
  43. return in_array($roleToHave, $this->getAllRoles($access));
  44. }
  45. /**
  46. * Va récupérer les roles d'access + les roles optionnels possibles
  47. * @param Access $access
  48. * @return array
  49. * @see UtilsTest::testGetAllRoles()
  50. */
  51. public function getAllRoles(Access $access): array {
  52. $roles = $this->optionalsRolesIterator->getOptionalsRoles($access);
  53. return $this->roleHierarchy->getReachableRoleNames(array_merge($access->getRoles(), $roles));
  54. }
  55. /**
  56. * Renvoi l'access de l'organization qui est le "super admin"
  57. * @param Organization $organization
  58. * @return Access|null
  59. * @see UtilsTest::testGetAdminAccess()
  60. */
  61. public function getAdminAccess(Organization $organization): Access|null{
  62. return $this->accessRepository->findOneBy([
  63. 'adminAccess' => true,
  64. 'organization' => $organization
  65. ]) ?? null;
  66. }
  67. }