src/EventSubscriber/Task/TaskPreSerializerSubscriber.php line 71

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: SUSAN MEDINA
  5.  * Date: 13/06/2019
  6.  * Time: 03:09 PM
  7.  */
  8. namespace App\EventSubscriber\Task;
  9. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\HttpKernel\Event\ViewEvent;
  12. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpKernel\KernelEvents;
  15. use Symfony\Contracts\Translation\TranslatorInterface;
  16. use App\Exception\NotFoundException;
  17. use App\Exception\AccessDeniedException;
  18. use ApiPlatform\Core\EventListener\EventPriorities;
  19. use App\Repository\App\Ticket\TicketTypeRepository;
  20. use App\Repository\App\Ticket\TicketStateRepository;
  21. use App\Repository\App\Task\WorkerBudgetRepository;
  22. use App\Repository\App\RoleRepository;
  23. use App\Services\VendorService;
  24. use App\Services\UtilsService;
  25. use App\Entity\App\Task\Task;
  26. use App\Entity\App\User;
  27. use App\Entity\App\Role;
  28. class TaskPreSerializerSubscriber implements EventSubscriberInterface
  29. {
  30.     private $translator;
  31.     private $tokenStorage;
  32.     private $authorizationChecker;
  33.     private $ticketTypeRepository;
  34.     private $vendorService;
  35.     private $ticketStateRepository;
  36.     private $workerBudgetRepository;
  37.     private $roleRepository;
  38.     private $utilsService;
  39.     public function __construct(
  40.         TranslatorInterface $translator,
  41.         TokenStorageInterface $tokenStorage,
  42.         AuthorizationCheckerInterface $checker,
  43.         TicketTypeRepository $ticketTypeRepository,
  44.         TicketStateRepository $ticketStateRepository,
  45.         WorkerBudgetRepository $workerBudgetRepository,
  46.         RoleRepository $roleRepository,
  47.         VendorService $vendorService,
  48.         UtilsService $utilsService)
  49.     {
  50.         $this->translator $translator;
  51.         $this->tokenStorage $tokenStorage;
  52.         $this->authorizationChecker $checker;
  53.         $this->ticketTypeRepository $ticketTypeRepository;
  54.         $this->vendorService $vendorService;
  55.         $this->ticketStateRepository $ticketStateRepository;
  56.         $this->workerBudgetRepository $workerBudgetRepository;
  57.         $this->roleRepository $roleRepository;
  58.         $this->utilsService $utilsService;
  59.     }
  60.     /**
  61.      * @param ViewEvent $event
  62.      * @throws AccessDeniedException
  63.      * @throws NotFoundException
  64.      * @throws \Doctrine\ORM\NonUniqueResultException
  65.      */
  66.     public function onKernelView(ViewEvent $event)
  67.     {
  68.         if ($this->utilsService->isAPublicRequest($event)) {
  69.             return;
  70.         }
  71.         $task $event->getControllerResult();
  72.         $request $event->getRequest();
  73.         $method $request->getMethod();
  74.         $userCurrent $this->tokenStorage->getToken()->getUser();
  75.         if (!($task instanceof Task) || (Request::METHOD_GET !== $method))
  76.             return;
  77.         if(!($userCurrent instanceof User)) {
  78.             throw new NotFoundException($this->translator->trans('User current not found'));
  79.         }
  80.         if ($this->authorizationChecker->isGranted('ROLE_SUPERADMIN'))
  81.             return;
  82.         $authorization false;
  83.         $controlAccess = [Role::ROLE_ADMINRole::ROLE_TASKMASTER];
  84.         $vendor $task->getTicket()->getVendor();
  85.         if ($task->getCreatedBy() === $userCurrent) {
  86.             $controlAccess = [Role::ROLE_ALL];
  87.         }
  88.         if ($this->vendorService->isUserRoleInToVendor($vendor$userCurrent$controlAccess)) {
  89.             $authorization true;
  90.         }
  91.         if (!$authorization) {
  92.             $role[] = $this->roleRepository->findOneBy(['name' => Role::ROLE_TASKMASTER]);
  93.             $role[] = $this->roleRepository->findOneBy(['name' => Role::ROLE_OPERATOR]);
  94.             if ($this->workerBudgetRepository->findGroupByRoles($role$task$userCurrent->getId()))
  95.                 $authorization true;
  96.         }
  97.         if (!$authorization) {
  98.             $controlAccessTranslator = [];
  99.             foreach ($controlAccess as $roleName) {
  100.                 $controlAccessTranslator[] = $this->translator->trans($roleName);
  101.             }
  102.             throw new AccessDeniedException(
  103.                 $this->translator->trans('access_allowed_only_for') . (implode(', '$controlAccessTranslator))
  104.             );
  105.         }
  106.     }
  107.     public static function getSubscribedEvents()
  108.     {
  109.         return [
  110.             KernelEvents::VIEW => ['onKernelView'EventPriorities::PRE_SERIALIZE]
  111.         ];
  112.     }
  113. }