vendor/kobizo/core-bundle/src/EventSubscriber/BeforeActionSubscriber.php line 56

Open in your IDE?
  1. <?php
  2. namespace Kobizo\Bundle\CoreBundle\EventSubscriber;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Kobizo\Bundle\ECommerceBundle\Repository\ViewedProductRepository;
  5. use Kobizo\Component\Configuration\Site\ViewedProductsFeatureFlag;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  8. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  11. use Symfony\Component\Security\Http\SecurityEvents;
  12. class BeforeActionSubscriber implements EventSubscriberInterface
  13. {
  14.     private EntityManagerInterface $entityManager;
  15.     private ViewedProductRepository $viewedProductRepository;
  16.     private ViewedProductsFeatureFlag $viewedProductsFeatureFlag;
  17.     public function __construct(
  18.         EntityManagerInterface $entityManager,
  19.         ViewedProductRepository $viewedProductRepository,
  20.         ViewedProductsFeatureFlag $viewedProductsFeatureFlag
  21.     ) {
  22.         $this->entityManager $entityManager;
  23.         $this->viewedProductRepository $viewedProductRepository;
  24.         $this->viewedProductsFeatureFlag $viewedProductsFeatureFlag;
  25.     }
  26.     public static function getSubscribedEvents(): array
  27.     {
  28.         return [
  29.             KernelEvents::CONTROLLER => 'convertJsonStringToArray',
  30.             SecurityEvents::INTERACTIVE_LOGIN => 'onLogin'
  31.         ];
  32.     }
  33.     public function convertJsonStringToArray(ControllerEvent $event)
  34.     {
  35.         $request $event->getRequest();
  36.         if ('json' != $request->getContentType() || !$request->getContent()) {
  37.             return;
  38.         }
  39.         $data json_decode($request->getContent(), true);
  40.         if (JSON_ERROR_NONE !== json_last_error()) {
  41.             throw new BadRequestHttpException('invalid json body: '.json_last_error_msg());
  42.         }
  43.         $request->request->replace(is_array($data) ? $data : []);
  44.     }
  45.     public function onLogin(InteractiveLoginEvent $event): void
  46.     {
  47.         if ($event->getAuthenticationToken()->isAuthenticated() && $this->viewedProductsFeatureFlag->isEnabled()) {
  48.             $guestViewedProducts $this->viewedProductRepository->findBy(['sessionId' => $event->getRequest()->getSession()->get("previousId")]);
  49.             foreach ($guestViewedProducts as $viewedProduct) {
  50.                 $userViewedProduct $this->viewedProductRepository->findOneBy(['customer' => $event->getAuthenticationToken()->getUser(), 'product' => $viewedProduct->getProduct()]);
  51.                 if ($userViewedProduct !== null) {
  52.                     $userViewedProduct->setCount($userViewedProduct->getCount()+$viewedProduct->getCount());
  53.                     $userViewedProduct->setAddedAt($viewedProduct->getAddedAt());
  54.                     $this->entityManager->remove($viewedProduct);
  55.                 } else {
  56.                     $viewedProduct->setCustomer($event->getAuthenticationToken()->getUser());
  57.                     $viewedProduct->setSessionId($event->getRequest()->getSession()->getId());
  58.                 }
  59.                 $this->entityManager->flush();
  60.             }
  61.         }
  62.     }
  63. }