src/EventSubscriber/Ticket/TicketPreSerializeSubscriber.php line 64

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Ticket;
  3. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpKernel\Event\ViewEvent;
  6. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. use Symfony\Contracts\Translation\TranslatorInterface;
  10. use App\Exception\NotFoundException;
  11. use App\Exception\AccessDeniedException;
  12. use ApiPlatform\Core\EventListener\EventPriorities;
  13. use App\Repository\App\Ticket\TicketTypeRepository;
  14. use App\Repository\App\Ticket\TicketStateRepository;
  15. use App\Repository\App\Task\WorkerBudgetRepository;
  16. use App\Repository\App\RoleRepository;
  17. use App\Services\VendorService;
  18. use App\Services\UtilsService;
  19. use App\Entity\App\Ticket\Ticket;
  20. use App\Entity\App\User;
  21. use App\Entity\App\Role;
  22. class TicketPreSerializeSubscriber implements EventSubscriberInterface
  23. {
  24.     private $translator;
  25.     private $tokenStorage;
  26.     private $authorizationChecker;
  27.     private $ticketTypeRepository;
  28.     private $vendorService;
  29.     private $ticketStateRepository;
  30.     private $workerBudgetRepository;
  31.     private $roleRepository;
  32.     private $utilsService;
  33.     public function __construct(
  34.         TranslatorInterface $translator,
  35.         TokenStorageInterface $tokenStorage,
  36.         AuthorizationCheckerInterface $checker,
  37.         TicketTypeRepository $ticketTypeRepository,
  38.         TicketStateRepository $ticketStateRepository,
  39.         WorkerBudgetRepository $workerBudgetRepository,
  40.         RoleRepository $roleRepository,
  41.         VendorService $vendorService,
  42.         UtilsService $utilsService)
  43.     {
  44.         $this->translator $translator;
  45.         $this->tokenStorage $tokenStorage;
  46.         $this->authorizationChecker $checker;
  47.         $this->ticketTypeRepository $ticketTypeRepository;
  48.         $this->vendorService $vendorService;
  49.         $this->ticketStateRepository $ticketStateRepository;
  50.         $this->workerBudgetRepository $workerBudgetRepository;
  51.         $this->roleRepository $roleRepository;
  52.         $this->utilsService $utilsService;
  53.     }
  54.     /**
  55.      * @param ViewEvent $event
  56.      * @throws AccessDeniedException
  57.      * @throws NotFoundException
  58.      */
  59.     public function onKernelView(ViewEvent $event)
  60.     {
  61.         if ($this->utilsService->isAPublicRequest($event)) {
  62.             return;
  63.         }
  64.         
  65.         $ticket $event->getControllerResult();
  66.         $request $event->getRequest();
  67.         $method $request->getMethod();
  68.         $currentUser $this->tokenStorage->getToken()->getUser();
  69.         if (!($ticket instanceof Ticket) || (Request::METHOD_GET !== $method))
  70.             return;
  71.         if(!($currentUser instanceof User)) {
  72.             throw new NotFoundException($this->translator->trans('User current not found'));
  73.         }
  74.         if ($this->authorizationChecker->isGranted('ROLE_SUPERADMIN'))
  75.             return;
  76.         $vendor $ticket->getVendor();
  77.         $vendorStaff $this->vendorService->getVendorStaff(null$currentUser$vendor);
  78.         if ($vendorStaff === null) {
  79.             throw new AccessDeniedException(
  80.                 $this->translator->trans(
  81.                     'Access denied. it does not belong to the vendor',
  82.                     ['%vendor%' => $vendor->getName()]
  83.                 )
  84.             );
  85.         }
  86.         $authorization false;
  87.         $controlAccess = [Role::ROLE_ADMINRole::ROLE_TASKMASTER];
  88.         if ($ticket->getCreatedBy() === $currentUser) {
  89.             $controlAccess = [Role::ROLE_ALL];
  90.         }
  91.         if ($this->vendorService->isUserRoleInToVendor($ticket->getVendor(), $currentUser$controlAccess)) {
  92.             $authorization true;
  93.         }
  94. /*
  95.  * permiso para capataz poder ver un ticket en donde fue asignado solamente
  96.         if (!$authorization) {
  97.             $role[] = $this->roleRepository->findOneBy(['name' => Role::ROLE_TASKMASTER]);
  98.             $workerBudget = $this->workerBudgetRepository->getWorkersOfTicketByRole(
  99.                 $ticket,
  100.                 $role,
  101.                 $currentUser->getId()
  102.             );
  103.             if ($workerBudget) {
  104.                 $authorization = true;
  105.             }
  106.         }
  107. */
  108. /*
  109.         $rolesUser = $this->vendorService->getRolesOfUserByVendor($currentUser, $vendor);
  110.         $roleAdmin = $this->roleRepository->findOneBy(['name' => Role::ROLE_ADMIN]);
  111.         $ticketTypeRequest = $this->ticketTypeRepository->findOneBy(['name' => 'request']);
  112.         $ticketTypeIncidence = $this->ticketTypeRepository->findOneBy(['name' => 'incidence']);
  113.         $workOrder = $this->ticketTypeRepository->findOneBy(['name' => 'work_order']);
  114.         if ($ticket->getType() === $ticketTypeRequest or
  115.             $ticket->getType() === $ticketTypeIncidence) {
  116.             $controlAccess = [Role::ROLE_ADMIN, Role::ROLE_USER];
  117.             $roleUser = $this->roleRepository->findOneBy(['name' => Role::ROLE_USER]);
  118.             switch (true) {
  119.                 case (in_array($roleAdmin, $rolesUser)):
  120.                     $authorization = true;
  121.                     break;
  122.                 case (in_array($roleUser, $rolesUser)):
  123.                     if ($ticket->getCreatedBy() === $currentUser)
  124.                         $authorization = true;
  125.                     break;
  126.                 default:
  127.                     $authorization = false;
  128.             }
  129.         }
  130.         if ($ticket->getType() === $workOrder && in_array($roleAdmin, $rolesUser))
  131.             $authorization = true;
  132. */
  133.         if (!$authorization) {
  134.             $controlAccessTranslator = [];
  135.             foreach ($controlAccess as $roleName) {
  136.                 $controlAccessTranslator[] = $this->translator->trans($roleName);
  137.             }
  138.             throw new AccessDeniedException(
  139.                 $this->translator->trans('access_allowed_only_for') . (implode(', '$controlAccessTranslator))
  140.             );
  141.         }
  142.     }
  143.     public static function getSubscribedEvents()
  144.     {
  145.         return [
  146.             KernelEvents::VIEW => ['onKernelView'EventPriorities::PRE_SERIALIZE]
  147.         ];
  148.     }
  149. }