AccessProfileCreator.php 4.1 KB

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