Utils.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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\Enum\Access\FunctionEnum;
  7. use App\Repository\Access\AccessRepository;
  8. use App\Service\ServiceIterator\OptionalsRolesIterator;
  9. use App\Service\Utils\DatesUtils;
  10. use App\Test\Service\Access\UtilsTest;
  11. use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
  12. /**
  13. * Class Utils : service rassemblant des fonctions d'aides pour les questions se rapportant à l'access.
  14. */
  15. class Utils
  16. {
  17. public function __construct(
  18. readonly private RoleHierarchyInterface $roleHierarchy,
  19. readonly private AccessRepository $accessRepository,
  20. readonly private OptionalsRolesIterator $optionalsRolesIterator,
  21. ) {
  22. }
  23. /**
  24. * Filtre un tableau d'Access pour ne laisser que les Accesses ne correspondant pas à l'Access passé en second parametre.
  25. *
  26. * @param array<Access> $accesses
  27. *
  28. * @return array<Access>
  29. *
  30. * @see UtilsTest::testFilterAccesses()
  31. * TODO: est-ce qu'on essaierait pas de trouver un nom plus explicite? j'ai pas trop d'idée la tout de suite cela dit
  32. */
  33. public function filterAccesses(array $accesses, Access $access): array
  34. {
  35. return array_filter($accesses, function ($a) use ($access) {
  36. /* @var Access $a */
  37. return $a->getId() !== $access->getId();
  38. });
  39. }
  40. /**
  41. * Recherche parmis les roles si l'Access possède celui passé en paramètre.
  42. *
  43. * @see UtilsTest::testHasRoles()
  44. */
  45. public function hasRole(Access $access, string $roleToHave): bool
  46. {
  47. return in_array($roleToHave, $this->getAllRoles($access), true);
  48. }
  49. /**
  50. * Va récupérer les roles d'access + les roles optionnels possibles.
  51. *
  52. * @return string[]
  53. *
  54. * @see UtilsTest::testGetAllRoles()
  55. */
  56. public function getAllRoles(Access $access): array
  57. {
  58. // TODO: est-ce qu'on ne pourrait pas mettre ça en cache d'une façon ou d'une autre?
  59. $roles = $this->optionalsRolesIterator->getOptionalsRoles($access);
  60. return $this->roleHierarchy->getReachableRoleNames(array_merge($access->getRoles(), $roles));
  61. }
  62. /**
  63. * Renvoie l'access de l'organization qui est le "super admin".
  64. *
  65. * @see UtilsTest::testGetAdminAccess()
  66. */
  67. public function findAdminFor(Organization $organization): ?Access
  68. {
  69. return $this->accessRepository->findOneBy([
  70. 'adminAccess' => true,
  71. 'organization' => $organization,
  72. ]);
  73. }
  74. /**
  75. * Retourne les noms des fonctions actives d'un access au sein d'une organisation.
  76. *
  77. * @return array<string>
  78. *
  79. * @throws \Exception
  80. */
  81. public function getActiveFunctions(Access $access): array
  82. {
  83. $functions = [];
  84. foreach ($access->getOrganizationFunction() as $function) {
  85. if (
  86. $function->getStartDate() !== null
  87. && DatesUtils::new() <= $function->getStartDate()->sub(new \DateInterval('PT23H59M'))
  88. ) {
  89. // La fonction n'est pas encore active
  90. continue;
  91. }
  92. if (
  93. $function->getEndDate() !== null
  94. && DatesUtils::new() >= $function->getEndDate()->add(new \DateInterval('PT23H59M'))
  95. ) {
  96. // La fonction n'est plus active
  97. continue;
  98. }
  99. $functions[] = $function->getFunctionType()->getMission();
  100. }
  101. return $functions;
  102. }
  103. /**
  104. * L'access possède-t-il la fonction donnée au sein de son organisation.
  105. *
  106. * @throws \Exception
  107. */
  108. public function hasActiveFunction(Access $access, FunctionEnum $functionName): bool
  109. {
  110. return in_array($functionName->value, $this->getActiveFunctions($access));
  111. }
  112. }