src/Component/Organization/EventListener/OrganizationManagementEventListener.php line 36

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace BitBag\OpenMarketplace\Component\Organization\EventListener;
  4. use BitBag\OpenMarketplace\Component\Brevo\Emails;
  5. use BitBag\OpenMarketplace\Component\Brevo\Exporter\ContactExporterInterface;
  6. use BitBag\OpenMarketplace\Component\Customer\Model\CustomerInterface;
  7. use BitBag\OpenMarketplace\Component\Organization\Entity\OrganizationInterface;
  8. use BitBag\OpenMarketplace\Component\Organization\OrganizationRoles;
  9. use BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUserInterface;
  10. use BitBag\SyliusB2BPlugin\Entity\CustomerInterface as BrevoCustomerInterface;
  11. use BitBag\SyliusB2BPlugin\Repository\UserRepositoryInterface;
  12. use Sylius\Component\Core\Context\ShopperContextInterface;
  13. use Sylius\Component\Mailer\Sender\SenderInterface;
  14. use Sylius\Component\User\Security\Generator\GeneratorInterface;
  15. use Symfony\Component\EventDispatcher\GenericEvent;
  16. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  17. use Symfony\Component\Routing\RouterInterface;
  18. use Symfony\Contracts\Translation\TranslatorInterface;
  19. final class OrganizationManagementEventListener
  20. {
  21.     public function __construct(
  22.         private GeneratorInterface $tokenGenerator,
  23.         private UserRepositoryInterface $userRepository,
  24.         private SenderInterface $emailSender,
  25.         private RouterInterface $router,
  26.         private ShopperContextInterface $shopperContext,
  27.         private TranslatorInterface $translator,
  28.         private ContactExporterInterface $contactExporter,
  29.         ) {
  30.     }
  31.     public function onAddUser(GenericEvent $event): void
  32.     {
  33.         $customer $event->getSubject();
  34.         if (!$customer instanceof CustomerInterface) {
  35.             return;
  36.         }
  37.         $user $customer->getUser();
  38.         if (!$user instanceof ShopUserInterface) {
  39.             return;
  40.         }
  41.         $organization $customer->getOrganization();
  42.         if (!$organization instanceof OrganizationInterface) {
  43.             return;
  44.         }
  45.         /** @var CustomerInterface $inviter */
  46.         $inviter $this->shopperContext->getCustomer();
  47.         $customer->setInviter($inviter);
  48.         $this->sendActivationEmail($user$organization);
  49.         /** @var BrevoCustomerInterface $brevoCustomer */
  50.         $brevoCustomer $customer;
  51.         $this->contactExporter->export($brevoCustomer);
  52.     }
  53.     private function sendActivationEmail(ShopUserInterface $userOrganizationInterface $organization): void
  54.     {
  55.         $token $this->tokenGenerator->generate();
  56.         $user->setActivationToken($token);
  57.         $this->userRepository->add($user);
  58.         $emailCode null !== $organization->getVendor() ?
  59.             Emails::ADD_USER_TO_SELLER_ORGANIZATION :
  60.             Emails::ADD_USER_TO_BUYER_ORGANIZATION;
  61.         $url $this->router->generate(
  62.             'bitbag_sylius_organization_plugin_shop_active_user',
  63.             ['token' => $user->getActivationToken()],
  64.             UrlGeneratorInterface::ABSOLUTE_PATH,
  65.         );
  66.         $this->emailSender->send(
  67.             $emailCode,
  68.             [$user->getEmail()],
  69.             [
  70.                 'user' => $user,
  71.                 'organization' => $organization,
  72.                 'url' => $url,
  73.                 'localeCode' => $this->shopperContext->getLocaleCode(),
  74.                 'inviter' => $this->shopperContext->getCustomer(),
  75.                 'roles' => $this->resolveRoles($user),
  76.             ],
  77.         );
  78.     }
  79.     private function resolveRoles(ShopUserInterface $user): array
  80.     {
  81.         $roles = [];
  82.         foreach ($user->getRoles() as $role) {
  83.             if (in_array($roleOrganizationRoles::IGNORED_ROLEStrue)) {
  84.                 continue;
  85.             }
  86.             $roles[] = $this->translator->trans(sprintf('app.ui.roles.%s'strtolower($role)));
  87.         }
  88.         return $roles;
  89.     }
  90. }