AccessProfileCreator.php 4.7 KB

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