src/EventSubscriber/User/UserPreValidateSubscriber.php line 69

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: MEDINA
  5.  * Date: 29/03/2019
  6.  * Time: 04:08 PM
  7.  */
  8. namespace App\EventSubscriber\User;
  9. use App\Exception\AccessDeniedException;
  10. use App\Exception\CaptchaTokenInvalidException;
  11. use App\Exception\NotFoundException;
  12. use App\Services\UtilsService;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  15. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. use Symfony\Component\HttpKernel\Event\ViewEvent;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use ApiPlatform\Core\EventListener\EventPriorities;
  22. use App\Repository\App\VendorRepository;
  23. use App\Repository\App\UserRepository;
  24. use App\Services\VendorService;
  25. use App\Entity\App\User;
  26. use App\Entity\App\Role;
  27. use App\Entity\App\Vendor;
  28. use Symfony\Contracts\Translation\TranslatorInterface;
  29. class UserPreValidateSubscriber implements EventSubscriberInterface
  30. {
  31.     private $tokenStorage;
  32.     private $authorizationChecker;
  33.     private $entityManager;
  34.     private $userRepository;
  35.     private $vendorRepository;
  36.     private $vendorService;
  37.     private $utilsService;
  38.     private $translator;
  39.     public function __construct(
  40.         TokenStorageInterface $tokenStorage,
  41.         AuthorizationCheckerInterface $checker,
  42.         UserRepository $userRepository,
  43.         VendorRepository $vendorRepository,
  44.         VendorService $vendorService,
  45.         EntityManagerInterface $entityManager,
  46.         TranslatorInterface $translator,
  47.         UtilsService $utilsService)
  48.     {
  49.         $this->tokenStorage $tokenStorage;
  50.         $this->authorizationChecker $checker;
  51.         $this->entityManager $entityManager;
  52.         $this->userRepository $userRepository;
  53.         $this->vendorRepository $vendorRepository;
  54.         $this->vendorService $vendorService;
  55.         $this->utilsService $utilsService;
  56.         $this->translator $translator;
  57.     }
  58.     /**
  59.      * @param ViewEvent $event
  60.      * @throws AccessDeniedException
  61.      * @throws CaptchaTokenInvalidException
  62.      * @throws NotFoundException
  63.      */
  64.     public function onKernelView(ViewEvent $event)
  65.     {
  66.         if ($this->utilsService->isAPublicRequest($event)) {
  67.             return;
  68.         }
  69.         $user $event->getControllerResult();
  70.         $request $event->getRequest();
  71.         $route $request->attributes->get('_route');
  72.         $method $event->getRequest()->getMethod();
  73.         if (!($user instanceof User) ||
  74.             (Request::METHOD_POST !== $method && Request::METHOD_PUT !== $method))
  75.             return;
  76.         $locale $request->getLocale();
  77.         if ($this->tokenStorage->getToken()) {
  78.             $userCurrent $this->tokenStorage->getToken()->getUser();
  79.             if ($userCurrent instanceof User) {
  80.                 $locale $userCurrent->getLocale();
  81.             }
  82.         }
  83.         $userCurrent $this->tokenStorage->getToken()->getUser();
  84.         $content $request->getContent();
  85.         $data json_decode($contenttrue);
  86.         if (Request::METHOD_POST == $method && isset($data['captchaToken'])) {
  87.             if (!$this->utilsService->checkRecaptchaTokenIsValid($data['captchaToken'])) {
  88.                 throw new CaptchaTokenInvalidException('Sent token is not valid');
  89.             }
  90.         }
  91.         $vendor null;
  92.         if (isset($data['vendor'])) {
  93.             $vendor $this->vendorRepository->find($data['vendor']);
  94.             if (!($vendor instanceof Vendor)) {
  95.                 $response = new Response();
  96.                 $response->setContent(json_encode([
  97.                     'detail' => $this->translator->trans(
  98.                         'entity not found',
  99.                         [
  100.                             '%entity%' => 'vendor',
  101.                             '%entityId%' => $data['vendor']
  102.                         ],
  103.                         null,
  104.                         $locale
  105.                     )
  106.                 ]));
  107.                 $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  108.                 $event->setResponse($response);
  109.                 return;
  110.             }
  111.         }
  112.         $authorization false;
  113.         if ($this->authorizationChecker->isGranted('ROLE_SUPERADMIN'))
  114.             $authorization true;
  115.         $controlAccess = [Role::ROLE_ADMIN];
  116.         if ($userCurrent instanceof User && $vendor instanceof Vendor) {
  117.             if ($this->vendorService->isUserRoleInToVendor($vendor$userCurrent$controlAccess)) {
  118.                 $authorization true;
  119.             }
  120.         } elseif (is_null($vendor) && $userCurrent instanceof User && Request::METHOD_PUT === $method) {
  121.             $vendorUserCurrent $this->vendorService->getVendorsOfUserByRole($userCurrentRole::ROLE_ADMIN);
  122.             foreach ($user->getVendorStaff() as $userVendorStaff) {
  123.                 if (in_array($userVendorStaff->getVendor(), $vendorUserCurrent)) {
  124.                     $authorization true;
  125.                     break;
  126.                 }
  127.             }
  128.         }
  129.         if (!$authorization &&
  130.             Request::METHOD_PUT === $method &&
  131.             $userCurrent instanceof User &&
  132.             $user->getId() === $userCurrent->getId()
  133.         ) {
  134.             $authorization true;
  135.         }
  136.         if (!$authorization) {
  137.             $controlAccessTranslator = [];
  138.             foreach ($controlAccess as $roleName) {
  139.                 $controlAccessTranslator[] = $this->translator->trans($roleName, [], null$locale);
  140.             }
  141.             $response = new Response();
  142.             $response->setContent(
  143.                 json_encode(
  144.                     [
  145.                         'detail' => $this->translator->trans('access_allowed_only_for', [], null$locale) . (implode(
  146.                                 ', ',
  147.                                 $controlAccessTranslator
  148.                             ))
  149.                     ]
  150.                 )
  151.             );
  152.             $response->setStatusCode(Response::HTTP_NOT_ACCEPTABLE);
  153.             $event->setResponse($response);
  154.             return;
  155.         }
  156.         $phone null;
  157.         if (!empty($user->getPhoneNumber())) {
  158.             $phone str_replace([' ''+''-''('')''-'], ''$user->getPhoneNumber());
  159.             $user->setPhoneNumber($phone);
  160.         }
  161.         if (!empty($user->getPhonePrefix()) && empty($user->getPhoneNumber())) {
  162.             $response = new Response();
  163.             $response->setContent(
  164.                 json_encode(
  165.                     [
  166.                         'detail' => $this->translator->trans(
  167.                             'phoneNumber is required if phonePrefix is not blank',
  168.                             [],
  169.                             null,
  170.                             $locale
  171.                         )
  172.                     ]
  173.                 )
  174.             );
  175.             $response->setStatusCode(Response::HTTP_NOT_ACCEPTABLE);
  176.             $event->setResponse($response);
  177.             return;
  178.         }
  179.         if (!empty($user->getPhonePrefix()) && !empty($user->getPhoneNumber())) {
  180.             $phone =
  181.                 $user->setPhonePrefixAndPhone(sprintf("%s%s"$user->getPhonePrefix(), $phone));
  182.         }
  183.         if (empty($user->getPhonePrefix()) && empty($user->getPhoneNumber())) {
  184.             $user->setPhonePrefixAndPhone(null);
  185.         }
  186.         if (empty($user->getCostPerHour()) && is_null($user->getCostPerHour())) {
  187.             $user->setCostPerHour(0);
  188.         }
  189.     }
  190.     public static function getSubscribedEvents()
  191.     {
  192.         return [
  193.             KernelEvents::VIEW => ['onKernelView'EventPriorities::PRE_VALIDATE]
  194.         ];
  195.     }
  196. }