<?php
declare(strict_types=1);
namespace App\EventListener;
use App\Entity\Order\OrderItem;
use App\Entity\Product\Product;
use App\Entity\User\ShopUser;
use App\Entity\UserLibrary;
use Doctrine\ORM\EntityManagerInterface;
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
use Sylius\Component\Core\Model\ProductVariant;
use Sylius\Component\Taxonomy\Model\TaxonInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Translation\Translator;
use function filter_var;
use function in_array;
use const FILTER_VALIDATE_EMAIL;
class OrderItemListener
{
public function __construct(private EntityManagerInterface $entityManagerInterface, private FlashBagInterface $flashBag, private RouterInterface $router, private TokenStorageInterface $tokenStorage, private ContainerInterface $container)
{
}
public function onSyliusOrderAddCheck(ResourceControllerEvent $event): void
{
/** @var Translator $translator **/
$translator = $this->container->get('translator') ?? null;
/** @var OrderItem $orderItem */
$orderItem = $event->getSubject();
/** @phpstan-ignore-next-line */
$orderItems = $orderItem->getItems();
/** @var TokenInterface $token */
$token = $this->tokenStorage->getToken();
if (! filter_var($token->getUser(), FILTER_VALIDATE_EMAIL)) {
$event->setResponse(new RedirectResponse($this->router->generate('sylius_shop_login')));
return;
}
/** @var ShopUser $shopUser */
$shopUser = $token->getUser();
$userLibraryRepository = $this->entityManagerInterface->getRepository(UserLibrary::class);
foreach ($orderItems as $key => $orderDetails) {
/** @var Product $product */
$product = $orderDetails->getProduct();
/** @var TaxonInterface $mainTaxon */
$mainTaxon = $product->getMainTaxon();
// $packsCheck = ['story-welcome-packs', 'story-subscription-packs', 'story-default-packs', 'quiz-default-packs', 'special-events', 'special-events-story', 'special-events-quiz'];
$packsCheck = ['story-welcome-packs', 'story-subscription-packs', 'story-default-packs', 'quiz-default-packs'];
$getCode = $mainTaxon->getCode() ? $mainTaxon->getCode() : '';
if (in_array($getCode, $packsCheck, true)) {
$this->flashBag->add('error', '"' . $product->getName() . '" ' . $translator->trans('sylius.pages.content.errorMsgPack'));
$event->setResponse(new RedirectResponse($this->router->generate('sylius_shop_cart_summary')));
return;
}
//Get Library Data
$libraryItem = $userLibraryRepository->findOneBy(['product' => $product->getId(), 'shopUser' => $shopUser->getId()]);
if (! $libraryItem || $libraryItem->getContentType() === '') {
continue;
}
// Redirect to cart with message
$this->flashBag->add('error', '"' . $product->getName() . '" ' . $translator->trans('sylius.pages.content.errorMsg'));
$event->setResponse(new RedirectResponse($this->router->generate('sylius_shop_cart_summary')));
return;
}
}
public function onSyliusOrderAddtoCart(ResourceControllerEvent $event): void
{
/** @var TokenInterface $token */
$token = $this->tokenStorage->getToken();
if (! filter_var($token->getUser(), FILTER_VALIDATE_EMAIL)) {
return;
}
/** @var OrderItem $orderItem */
$orderItem = $event->getSubject();
/** @var ProductVariant $productVarriant */
$productVarriant = $orderItem->getVariant();
/** @var Product $product */
$product = $productVarriant->getProduct();
/** @var ShopUser $shopUser */
$shopUser = $token->getUser();
if (! $shopUser || $shopUser->getId() === '') {
return;
}
$userLibraryRepository = $this->entityManagerInterface->getRepository(UserLibrary::class);
//Get Cart Product Taxon
/** @var TaxonInterface $productMainTaxon */
$productMainTaxon = $product ? $product->getMainTaxon() : '';
$libraryItem = $userLibraryRepository->findOneBy(['product' => $product->getId(), 'shopUser' => $shopUser->getId()]);
if (! $libraryItem || $libraryItem->getContentType() === '') {
return;
}
$event->stop('sylius.pages.content.errorMsg');
}
}