<?php
declare(strict_types=1);
namespace BitBag\OpenMarketplace\Component\Organization\EventListener;
use BitBag\OpenMarketplace\Component\Brevo\Emails;
use BitBag\OpenMarketplace\Component\Brevo\Exporter\ContactExporterInterface;
use BitBag\OpenMarketplace\Component\Customer\Model\CustomerInterface;
use BitBag\OpenMarketplace\Component\Organization\Entity\OrganizationInterface;
use BitBag\OpenMarketplace\Component\Organization\OrganizationRoles;
use BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUserInterface;
use BitBag\SyliusB2BPlugin\Entity\CustomerInterface as BrevoCustomerInterface;
use BitBag\SyliusB2BPlugin\Repository\UserRepositoryInterface;
use Sylius\Component\Core\Context\ShopperContextInterface;
use Sylius\Component\Mailer\Sender\SenderInterface;
use Sylius\Component\User\Security\Generator\GeneratorInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
final class OrganizationManagementEventListener
{
public function __construct(
private GeneratorInterface $tokenGenerator,
private UserRepositoryInterface $userRepository,
private SenderInterface $emailSender,
private RouterInterface $router,
private ShopperContextInterface $shopperContext,
private TranslatorInterface $translator,
private ContactExporterInterface $contactExporter,
) {
}
public function onAddUser(GenericEvent $event): void
{
$customer = $event->getSubject();
if (!$customer instanceof CustomerInterface) {
return;
}
$user = $customer->getUser();
if (!$user instanceof ShopUserInterface) {
return;
}
$organization = $customer->getOrganization();
if (!$organization instanceof OrganizationInterface) {
return;
}
/** @var CustomerInterface $inviter */
$inviter = $this->shopperContext->getCustomer();
$customer->setInviter($inviter);
$this->sendActivationEmail($user, $organization);
/** @var BrevoCustomerInterface $brevoCustomer */
$brevoCustomer = $customer;
$this->contactExporter->export($brevoCustomer);
}
private function sendActivationEmail(ShopUserInterface $user, OrganizationInterface $organization): void
{
$token = $this->tokenGenerator->generate();
$user->setActivationToken($token);
$this->userRepository->add($user);
$emailCode = null !== $organization->getVendor() ?
Emails::ADD_USER_TO_SELLER_ORGANIZATION :
Emails::ADD_USER_TO_BUYER_ORGANIZATION;
$url = $this->router->generate(
'bitbag_sylius_organization_plugin_shop_active_user',
['token' => $user->getActivationToken()],
UrlGeneratorInterface::ABSOLUTE_PATH,
);
$this->emailSender->send(
$emailCode,
[$user->getEmail()],
[
'user' => $user,
'organization' => $organization,
'url' => $url,
'localeCode' => $this->shopperContext->getLocaleCode(),
'inviter' => $this->shopperContext->getCustomer(),
'roles' => $this->resolveRoles($user),
],
);
}
private function resolveRoles(ShopUserInterface $user): array
{
$roles = [];
foreach ($user->getRoles() as $role) {
if (in_array($role, OrganizationRoles::IGNORED_ROLES, true)) {
continue;
}
$roles[] = $this->translator->trans(sprintf('app.ui.roles.%s', strtolower($role)));
}
return $roles;
}
}