AccessProfileCreator.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service\Access;
  4. use App\ApiResources\Profile\AccessProfile;
  5. use App\Entity\Access\Access;
  6. use App\Repository\Access\AccessRepository;
  7. use App\Service\Organization\OrganizationProfileCreator;
  8. use App\Test\Service\Access\AccessProfileCreatorTest;
  9. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  10. use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
  11. /**
  12. * Class AccessProfileCreator : Service contenant les manipulations associés à la ressource AccessProfile
  13. * @package App\Service\ProfileCreator
  14. */
  15. class AccessProfileCreator
  16. {
  17. private RoleHierarchyInterface $roleHierarchy;
  18. private OrganizationProfileCreator $organizationProfileCreator;
  19. private AccessRepository $accessRepository;
  20. private Utils $accessUtils;
  21. public function __construct(
  22. RoleHierarchyInterface $roleHierarchy,
  23. OrganizationProfileCreator $organizationProfileCreator,
  24. AccessRepository $accessRepository,
  25. Utils $accessUtils
  26. )
  27. {
  28. $this->roleHierarchy = $roleHierarchy;
  29. $this->organizationProfileCreator = $organizationProfileCreator;
  30. $this->accessRepository = $accessRepository;
  31. $this->accessUtils = $accessUtils;
  32. }
  33. /**
  34. * On récupère l'accessProfile complet correspondant à l'Access
  35. * @param Access $access
  36. * @param Access $originalAccess
  37. * @return AccessProfile
  38. * @throws \Exception
  39. * @see AccessProfileCreatorTest::testGetAccessProfileFailed
  40. */
  41. public function getAccessProfile(Access $access, Access $originalAccess = null): AccessProfile{
  42. $validAccesses = $this->accessRepository->findAllValidAccesses($access);
  43. if(empty($validAccesses))
  44. throw new AuthenticationException('no_valid_access', 401);
  45. //L'Access en paramètre est celui de la connexion
  46. $mainAccessProfile = $this->createCompleteAccessProfile($access);
  47. //On remplit les accesses multi-compte
  48. $multiAccesses = $this->accessUtils->filterAccesses($validAccesses, $access);
  49. foreach ($multiAccesses as $multiAccess){
  50. $mainAccessProfile->addMultiAccess($this->organizationProfileCreator->createLightOrganizationProfile($multiAccess->getOrganization()));
  51. }
  52. //On remplit les accesses famille
  53. $familyAccesses = $access->getChildren();
  54. foreach ($familyAccesses as $familyAccess){
  55. $mainAccessProfile->addFamilyAccess($this->createLightAccessProfile($familyAccess));
  56. }
  57. //Dans le cas où nous sommes dans une connexion switch
  58. if($originalAccess){
  59. $mainAccessProfile->setOriginalAccess($this->createLightAccessProfile($originalAccess));
  60. }
  61. return $mainAccessProfile;
  62. }
  63. /**
  64. * Créer une ressource AccessProfile à partir d'une entité Access
  65. * @param Access $access
  66. * @return AccessProfile
  67. * @see AccessProfileCreatorTest::testCreateAccessProfile
  68. */
  69. public function createCompleteAccessProfile(Access $access): AccessProfile{
  70. $accessProfile = $this->createLightAccessProfile($access);
  71. return $accessProfile
  72. ->setIsAdminAccess($access->getAdminAccess())
  73. ->setRoles($this->roleHierarchy->getReachableRoleNames($access->getRoles()))
  74. ->setHistorical($access->getHistorical())
  75. ->setOrganization($this->organizationProfileCreator->createCompleteOrganizationProfile($access->getOrganization()));
  76. }
  77. /**
  78. * Classe permettant de créer et Setter les éléments de base d'une ressource AccessProfile à partir d'une entité Access
  79. * @param Access $access
  80. * @return AccessProfile
  81. * @see AccessProfileCreatorTest::testCreateLightAccessProfile()
  82. */
  83. public function createLightAccessProfile(Access $access): AccessProfile{
  84. $accessProfile = new AccessProfile();
  85. return $accessProfile
  86. ->setId($access->getId())
  87. ->setName($access->getPerson()->getName())
  88. ->setGivenName($access->getPerson()->getGivenName())
  89. ->setGender($access->getPerson()->getGender())
  90. ->setActivityYear($access->getActivityYear())
  91. ->setAvatarId($access->getPerson()->getImage() ? $access->getPerson()->getImage()->getId() : null)
  92. ;
  93. }
  94. }