vendor/ibexa/corporate-account/src/lib/Form/Processor/InvitationsFormProcessor.php line 118

Open in your IDE?
  1. <?php
  2. /**
  3. * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4. * @license For full copyright and license information view LICENSE file distributed with this source code.
  5. */
  6. declare(strict_types=1);
  7. namespace Ibexa\CorporateAccount\Form\Processor;
  8. use Ibexa\ContentForms\Event\FormActionEvent;
  9. use Ibexa\Contracts\Core\Repository\UserService;
  10. use Ibexa\Contracts\Core\Repository\Values\User\Limitation\SubtreeLimitation;
  11. use Ibexa\Contracts\CorporateAccount\Exception\CorporateSiteAccessConfigurationException;
  12. use Ibexa\Contracts\User\Invitation\Exception\InvitationAlreadyExistsException;
  13. use Ibexa\Contracts\User\Invitation\Invitation;
  14. use Ibexa\Contracts\User\Invitation\InvitationCreateStruct;
  15. use Ibexa\Contracts\User\Invitation\InvitationSender;
  16. use Ibexa\Contracts\User\Invitation\InvitationService;
  17. use Ibexa\Core\MVC\Symfony\SiteAccess\SiteAccessServiceInterface;
  18. use Ibexa\CorporateAccount\Event\DispatcherEvents;
  19. use Ibexa\CorporateAccount\Form\Data\Invitation\InviteMembersData;
  20. use Ibexa\CorporateAccount\Form\Data\Invitation\InviteMembersWithSiteAccessData;
  21. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  22. class InvitationsFormProcessor implements EventSubscriberInterface
  23. {
  24. private UserService $userService;
  25. private InvitationService $invitationService;
  26. private InvitationSender $sender;
  27. private SiteAccessServiceInterface $siteAccessService;
  28. /** @var array<string, array<string>> */
  29. private array $siteAccessGroups;
  30. /** @param array<string, array<string>> $siteAccessGroups */
  31. public function __construct(
  32. UserService $userService,
  33. InvitationService $invitationService,
  34. InvitationSender $sender,
  35. SiteAccessServiceInterface $siteAccessService,
  36. array $siteAccessGroups
  37. ) {
  38. $this->userService = $userService;
  39. $this->invitationService = $invitationService;
  40. $this->sender = $sender;
  41. $this->siteAccessService = $siteAccessService;
  42. $this->siteAccessGroups = $siteAccessGroups;
  43. }
  44. /**
  45. * @return array<string, mixed>
  46. */
  47. public static function getSubscribedEvents(): array
  48. {
  49. return [
  50. DispatcherEvents::COMPANY_INVITATIONS_SEND => ['processCreateAndSend', 10],
  51. DispatcherEvents::COMPANY_INVITATIONS_RESEND => ['processResend', 10],
  52. DispatcherEvents::COMPANY_INVITATIONS_REINVITE => [
  53. ['processRefresh', 20],
  54. ['processResend', 10],
  55. ],
  56. ];
  57. }
  58. public function processCreateAndSend(FormActionEvent $event): void
  59. {
  60. $data = $event->getData();
  61. if (!$data instanceof InviteMembersData && !$data instanceof InviteMembersWithSiteAccessData) {
  62. return;
  63. }
  64. /** @var \Ibexa\Contracts\CorporateAccount\Values\Company $company */
  65. $company = $event->getOption('company');
  66. $siteAccessIdentifier = $data instanceof InviteMembersWithSiteAccessData
  67. ? $data->getSiteAccess()->name
  68. : $this->getCurrentSiteAccessIdentifier();
  69. $membersGroup = $this->userService->loadUserGroup(
  70. $company->getMembersId()
  71. );
  72. foreach ($data->getInvitations() as $simpleInvitation) {
  73. if ($simpleInvitation->getEmail() === null || $simpleInvitation->getRole() === null) {
  74. continue;
  75. }
  76. $struct = new InvitationCreateStruct(
  77. $simpleInvitation->getEmail(),
  78. $siteAccessIdentifier,
  79. $membersGroup,
  80. $simpleInvitation->getRole(),
  81. new SubtreeLimitation(
  82. [
  83. 'limitationValues' => [
  84. $company->getContent()->getVersionInfo()->getContentInfo()->getMainLocation()->pathString,
  85. ],
  86. ]
  87. )
  88. );
  89. try {
  90. $invitation = $this->invitationService->createInvitation($struct);
  91. $this->sender->sendInvitation($invitation);
  92. } catch (InvitationAlreadyExistsException $exception) {
  93. $existingInvitation = $this->invitationService->getInvitationByEmail($simpleInvitation->getEmail());
  94. $this->sender->sendInvitation(
  95. $this->invitationService->refreshInvitation(
  96. $existingInvitation
  97. )
  98. );
  99. }
  100. }
  101. }
  102. public function processRefresh(FormActionEvent $event): void
  103. {
  104. $data = $event->getData();
  105. if (!$data instanceof Invitation) {
  106. return;
  107. }
  108. $refreshed = $this->invitationService->refreshInvitation($data);
  109. $event->setData($refreshed);
  110. }
  111. public function processResend(FormActionEvent $event): void
  112. {
  113. $data = $event->getData();
  114. if (!$data instanceof Invitation) {
  115. return;
  116. }
  117. $this->sender->sendInvitation($data);
  118. }
  119. private function getCurrentSiteAccessIdentifier(): string
  120. {
  121. $currentSiteAccess = $this->siteAccessService->getCurrent();
  122. if ($currentSiteAccess === null) {
  123. $defaultSiteAccess = reset($this->siteAccessGroups['corporate_group']);
  124. if (!$defaultSiteAccess) {
  125. throw new CorporateSiteAccessConfigurationException(
  126. 'There is no site access configured for `corporate_group` group'
  127. );
  128. }
  129. return $defaultSiteAccess;
  130. }
  131. $siteAccessIdentifier = $currentSiteAccess->name;
  132. if (!in_array($siteAccessIdentifier, $this->siteAccessGroups['corporate_group'], true)) {
  133. throw new CorporateSiteAccessConfigurationException(
  134. 'Current SiteAccess is not a part of `corporate_group`'
  135. );
  136. }
  137. return $siteAccessIdentifier;
  138. }
  139. }