<?php
declare(strict_types=1);
namespace BitBag\OpenMarketplace\Component\Organization\EventListener;
use BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUserInterface as AppShopUserInterface;
use BitBag\SyliusB2BPlugin\Entity\CustomerInterface;
use BitBag\SyliusB2BPlugin\Entity\ShopUserInterface;
use BitBag\SyliusB2BPlugin\Repository\CustomerRepositoryInterface;
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\RouterInterface;
use Webmozart\Assert\Assert;
class RemoveUserFromOrganizationEventListener
{
private const ORGANIZATION_INDEX_ROUTE = 'bitbag_sylius_organization_plugin_shop_account_organization_index';
private RouterInterface $router;
private RequestStack $requestStack;
private CustomerRepositoryInterface $customerRepository;
public function __construct(
RouterInterface $router,
RequestStack $requestStack,
CustomerRepositoryInterface $customerRepository,
) {
$this->router = $router;
$this->requestStack = $requestStack;
$this->customerRepository = $customerRepository;
}
public function onRemoveUser(ResourceControllerEvent $event): void
{
$user = $event->getSubject();
Assert::isInstanceOf($user, ShopUserInterface::class);
$this->removeOrganizationAndRoleFromUser($user);
$url = $this->router->generate(self::ORGANIZATION_INDEX_ROUTE);
/** @var Session $session */
$session = $this->requestStack->getSession();
$session->getFlashBag()->add('success', 'bitbag_sylius_organization_plugin.user.removed');
$event->setResponse(new RedirectResponse($url));
}
private function removeOrganizationAndRoleFromUser(ShopUserInterface $user): void
{
/** @var CustomerInterface $customer */
$customer = $user->getCustomer();
if (null === $customer->getOrganization()) {
return;
}
$customer->setOrganization(null);
$user->setEnabled(false);
/** @var AppShopUserInterface $shopUser */
$shopUser = $customer->getUser();
foreach ($shopUser->getRoles() as $userRole) {
$shopUser->removeRole($userRole);
}
$this->customerRepository->add($customer);
}
}