src/EventSubscriber/Category/CategoryPreWriteSubscriber.php line 55

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: sebastiantovar
  5.  * Date: 2019-04-15
  6.  * Time: 17:56
  7.  */
  8. namespace App\EventSubscriber\Category;
  9. use ApiPlatform\Core\EventListener\EventPriorities;
  10. use App\Entity\App\Category;
  11. use App\Entity\App\Role;
  12. use App\Entity\App\User;
  13. use App\Services\UtilsService;
  14. use App\Services\VendorService;
  15. use App\Exception\AccessDeniedException;
  16. use App\Exception\NotFoundException;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\HttpKernel\Event\ViewEvent;
  21. use Symfony\Component\HttpKernel\KernelEvents;
  22. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  23. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  24. use Symfony\Contracts\Translation\TranslatorInterface;
  25. class CategoryPreWriteSubscriber implements EventSubscriberInterface
  26. {
  27.     private $tokenStorage;
  28.     private $authorizationChecker;
  29.     private $vendorService;
  30.     private $utilsService;
  31.     private $translator;
  32.     public function __construct(
  33.         TokenStorageInterface $tokenStorage,
  34.         AuthorizationCheckerInterface $checker,
  35.         VendorService $vendorService,
  36.         UtilsService $utilsService,
  37.         TranslatorInterface $translator
  38.     ){
  39.         $this->tokenStorage $tokenStorage;
  40.         $this->authorizationChecker $checker;
  41.         $this->vendorService $vendorService;
  42.         $this->utilsService $utilsService;
  43.         $this->translator $translator;
  44.     }
  45.     /**
  46.      * @param ViewEvent $event
  47.      * @throws AccessDeniedException
  48.      * @throws NotFoundException
  49.      */
  50.     public function onKernelView(ViewEvent $event)
  51.     {
  52.         if ($this->utilsService->isAPublicRequest($event)) {
  53.             return;
  54.         }
  55.         $category $event->getControllerResult();
  56.         $request $event->getRequest();
  57.         $method $request->getMethod();
  58.         $userCurrent $this->tokenStorage->getToken()->getUser();
  59.         if (!($category instanceof Category) ||
  60.             (Request::METHOD_POST !== $method && Request::METHOD_PUT && Request::METHOD_DELETE !== $method)
  61.         )
  62.             return;
  63.         $locale $request->getLocale();
  64.         if ($this->tokenStorage->getToken()) {
  65.             $userCurrent $this->tokenStorage->getToken()->getUser();
  66.             if ($userCurrent instanceof User) {
  67.                 $locale $userCurrent->getLocale();
  68.             }
  69.         }
  70.         if (Request::METHOD_DELETE === $method) {
  71.             $resources $category->getResources();
  72.             $tasks $category->getTasks();
  73.             $maintenanceElements $category->getMaintenanceElements();
  74.             $locations $category->getLocations();
  75.             $vendorStaff $category->getVendorStaff();
  76.             $tickets $category->getTickets();
  77.             if($tickets){
  78.                 foreach ($tickets as $ticket){
  79.                     $ticket->setCategory(null);
  80.                 }
  81.             }
  82.             if($resources){
  83.                 foreach ($resources as $resource){
  84.                     $resource->setCategory(null);
  85.                 }
  86.             }
  87.             if($tasks){
  88.                 foreach ($tasks as $task){
  89.                     $task->setCategory(null);
  90.                 }
  91.             }
  92.             if($locations){
  93.                 foreach ($locations as $location){
  94.                     $location->removeCategory($category);
  95.                 }
  96.             }
  97.             if($maintenanceElements){
  98.                 foreach ($maintenanceElements as $maintenanceElement){
  99.                     $maintenanceElement->setFamily(null);
  100.                 }
  101.             }
  102.             if($vendorStaff){
  103.                 foreach ($vendorStaff as $staff){
  104.                     $staff->removeCategory($category);
  105.                 }
  106.             }
  107.             return;
  108.         }
  109.         if ($this->authorizationChecker->isGranted('ROLE_SUPERADMIN'))
  110.             return;
  111.         if (!$userCurrent instanceof User) {
  112.             throw new NotFoundException($this->translator->trans('User current not found'));
  113.         }
  114.         $controlAccess = [Role::ROLE_ADMIN];
  115.         if (!$this->vendorService->isUserRoleInToVendor($category->getVendor(), $userCurrent$controlAccess)) {
  116.             $controlAccessTranslator = [];
  117.             foreach ($controlAccess as $roleName) {
  118.                 $controlAccessTranslator[] = $this->translator->trans($roleName, [], null$locale);
  119.             }
  120.             $response = new Response();
  121.             $response->setContent(json_encode([
  122.                 'detail' => $this->translator->trans(
  123.                         'access_allowed_only_for',
  124.                         [],
  125.                         null,
  126.                         $locale
  127.                     ) . (implode(', '$controlAccessTranslator))
  128.             ]));
  129.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  130.             $event->setResponse($response);
  131.             return;
  132.         }
  133.     }
  134.     /**
  135.      * @return array
  136.      */
  137.     public static function getSubscribedEvents()
  138.     {
  139.         return [
  140.             KernelEvents::VIEW => ['onKernelView'EventPriorities::PRE_WRITE]
  141.         ];
  142.     }
  143. }