src/EventSubscriber/Category/CategoryPostValidateSubscriber.php line 58

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: sebastiantovar
  5.  * Date: 2019-04-15
  6.  * Time: 08:51
  7.  */
  8. namespace App\EventSubscriber\Category;
  9. use ApiPlatform\Core\EventListener\EventPriorities;
  10. use App\Entity\App\Category;
  11. use App\Entity\App\User;
  12. use App\Exception\InvalidArgumentException;
  13. use App\Repository\App\CategoryRepository;
  14. use App\Services\UtilsService;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\HttpKernel\Event\ViewEvent;
  19. use Symfony\Component\HttpKernel\KernelEvents;
  20. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  21. use Symfony\Contracts\Translation\TranslatorInterface;
  22. class CategoryPostValidateSubscriber implements EventSubscriberInterface
  23. {
  24.     private $tokenStorage;
  25.     private $utilsService;
  26.     private $translator;
  27.     private $categoryRepository;
  28.     public function __construct(
  29.         TokenStorageInterface $tokenStorage,
  30.         UtilsService $utilsService,
  31.         TranslatorInterface $translator,
  32.         CategoryRepository $categoryRepository
  33.     ) {
  34.         $this->tokenStorage $tokenStorage;
  35.         $this->utilsService $utilsService;
  36.         $this->translator $translator;
  37.         $this->categoryRepository $categoryRepository;
  38.     }
  39.     /**
  40.      * {@inheritdoc}
  41.      */
  42.     public static function getSubscribedEvents() {
  43.         return [
  44.             KernelEvents::VIEW => ['prepareCategoryData'EventPriorities::POST_VALIDATE]
  45.         ];
  46.     }
  47.     /**
  48.      * @param ViewEvent $event
  49.      * @throws InvalidArgumentException
  50.      * @throws \Doctrine\ORM\NonUniqueResultException
  51.      */
  52.     public function prepareCategoryData(ViewEvent $event)
  53.     {
  54.         if ($this->utilsService->isAPublicRequest($event)) {
  55.             return;
  56.         }
  57.         $category $event->getControllerResult();
  58.         $method $event->getRequest()->getMethod();
  59.         $request $event->getRequest();
  60.         if (!($category instanceof Category) ||
  61.             (Request::METHOD_POST !== $method && Request::METHOD_PUT !== $method))
  62.             return;
  63.         $parent $category->getParent();
  64.         if ($parent !== null && $parent !== 0)
  65.             $this->validateParent($category$parent);
  66.         $locale $request->getLocale();
  67.         if ($this->tokenStorage->getToken()) {
  68.             $userCurrent $this->tokenStorage->getToken()->getUser();
  69.             if ($userCurrent instanceof User) {
  70.                 $locale $userCurrent->getLocale();
  71.             }
  72.         }
  73.         $isDuplicated false;
  74.         if ($category->getVendor()) {
  75.             $isCategory $this->categoryRepository->isExisted($category->getVendor(), $category->getType(), $category->getName());
  76.             if (Request::METHOD_POST === $method && $isCategory instanceof Category) {
  77.                 $isDuplicated true;
  78.             }
  79.             if (Request::METHOD_PUT === $method && $isCategory instanceof Category && $isCategory !== $category) {
  80.                 $isDuplicated true;
  81.             }
  82.         }
  83.         if ($isDuplicated) {
  84.             $response = new Response();
  85.             $response->setContent(json_encode([
  86.                 'detail' => $this->translator->trans(
  87.                     'category.validate.duplicated',
  88.                     [],
  89.                     null,
  90.                     $locale
  91.                 )
  92.             ]));
  93.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  94.             $event->setResponse($response);
  95.             return;
  96.         }
  97.     }
  98.     /**
  99.      * @param Category $category
  100.      * @param Category $parent
  101.      * @throws InvalidArgumentException
  102.      */
  103.     public function validateParent(Category $categoryCategory $parent)
  104.     {
  105.         if ($category->getVendor() !== $parent->getVendor()) {
  106.             throw new InvalidArgumentException(
  107.                 $this->translator->trans('The vendor between the parent and the new category is not equal')
  108.             );
  109.         }
  110.         if ($category->getType() != $parent->getType()) {
  111.             throw new InvalidArgumentException(
  112.                 $this->translator->trans('The type between the parent and the new category is not equal')
  113.             );
  114.         }
  115.     }
  116. }