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

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. }