Utils.php 4.2 KB

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