src/Listener/RequestListener.php line 82

Open in your IDE?
  1. <?php
  2. namespace App\Listener;
  3. use App\Controller\RestController;
  4. use App\Entity\Customer;
  5. use App\Entity\Device;
  6. use App\Entity\Employee;
  7. use App\Entity\Collaborator;
  8. use App\Entity\Manager;
  9. use App\Repository\CustomerRepository;
  10. use App\Repository\EmployeeRepository;
  11. use App\Repository\CollaboratorRepository;
  12. use App\Repository\ManagerRepository;
  13. use App\Service\Security;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\HttpKernel\Event\RequestEvent;
  19. use Symfony\Contracts\Translation\TranslatorInterface;
  20. class RequestListener extends RestController
  21. {
  22.     private CustomerRepository $customerRepository;
  23.     private EmployeeRepository $employeeRepository;
  24.     private CollaboratorRepository $collaboratorRepository;
  25.     private ManagerRepository $managerRepository;
  26.     public function __construct(
  27.         EntityManagerInterface $em,
  28.         CustomerRepository     $customerRepository,
  29.         EmployeeRepository     $employeeRepository,
  30.         CollaboratorRepository $collaboratorRepository,
  31.         TranslatorInterface    $translator,
  32.         ManagerRepository      $managerRepository
  33.     )
  34.     {
  35.         $this->em $em;
  36.         $this->customerRepository $customerRepository;
  37.         $this->employeeRepository $employeeRepository;
  38.         $this->collaboratorRepository $collaboratorRepository;
  39.         $this->translator $translator;
  40.         $this->managerRepository $managerRepository;
  41.     }
  42.     private function getDevice(Request $request): Device
  43.     {
  44.         $headers $request->headers;
  45.         $deviceId $headers->get('deviceId''robot');
  46.         $deviceType $headers->get('deviceType''-1');
  47.         $deviceModel $headers->get('deviceModel'null);
  48.         $deviceVersion $headers->get('deviceVersion'null);
  49.         $deviceOs $headers->get('deviceOs'null);
  50.         $deviceNetwork $headers->get('deviceNetwork'null);
  51.         $device $this->em->getRepository(Device::class)->findOneBy(
  52.             ['device_id' => $deviceId'type' => $deviceType]
  53.         );
  54.         if (!$device instanceof Device) {
  55.             $device = new Device();
  56.             $device->setDeviceId($deviceId);
  57.             $device->setType((int)$deviceType);
  58.             $device->setModel($deviceModel);
  59.             $device->setOs($deviceOs);
  60.             $this->em->persist($device);
  61.             $this->em->flush();
  62.         }
  63.         $device->setVersion($deviceVersion);
  64.         $device->setNetwork($deviceNetwork);
  65.         $request->attributes->set('device'$device);
  66.         return $device;
  67.     }
  68.     /**
  69.      * @throws \Exception
  70.      */
  71.     public function onKernelRequest(RequestEvent $event): ?RequestEvent
  72.     {
  73.         $request $event->getRequest();
  74.         $route $request->attributes->get('_route');
  75.         $route explode('_'$route)[0];
  76.         switch ($route) {
  77.             case 'auth':
  78.                 $this->getDevice($request);
  79.                 break;
  80.             case 'mails':
  81.                 $this->getDevice($request);
  82.                 break;
  83.             case 'api':
  84.                 $token = (string)$request->headers->get('token'null);
  85.                 if (!Security::validateToken($token)) {
  86.                     return $event->setResponse($this->json(
  87.                         ['message' => $this->translator->trans('Token inválido o expirado')],
  88.                         Response::HTTP_UNAUTHORIZED
  89.                     ));
  90.                 }
  91.                 $data Security::decodeToken($token);
  92.                 $customer $this->customerRepository->findOneBy(['hash' => $data['user_id']]);
  93.                 if (!$customer instanceof Customer) {
  94.                     return $event->setResponse($this->json(
  95.                         ['message' => $this->translator->trans('Cliente no encontrado')],
  96.                         Response::HTTP_UNAUTHORIZED
  97.                     ));
  98.                 }
  99.                 if (!is_null($request->headers->get('deviceId'))) {
  100.                     $device $this->getDevice($request);
  101.                     if ($device->getRefreshTokenExpiration() && $device->getRefreshTokenExpiration() < new \DateTime()) {
  102.                         $event->setResponse(new JsonResponse(['message' => 'Invalid or expired token'], 401));
  103.                     }
  104.                     $device->setCustomer($customer);
  105.                     $this->em->flush();
  106.                 }
  107.                 $request->attributes->set('customer'$customer);
  108.                 break;
  109.             case 'cms':
  110.                 $token = (string)$request->headers->get('token'null);
  111.                 if (!Security::validateToken($token)) {
  112.                     return $event->setResponse($this->json(
  113.                         ['message' => $this->translator->trans('Token inválido o expirado')],
  114.                         Response::HTTP_UNAUTHORIZED
  115.                     ));
  116.                 }
  117.                 $data Security::decodeToken($token);
  118.                 $employee $this->employeeRepository->findOneBy(['hash' => $data['user_id']]);
  119.                 if (!$employee instanceof Employee) {
  120.                     return $event->setResponse($this->json(
  121.                         ['message' => $this->translator->trans('Empleado no encontrado')],
  122.                         Response::HTTP_UNAUTHORIZED
  123.                     ));
  124.                 }
  125.                 $request->attributes->set('employee'$employee);
  126.                 break;
  127.             case 'col':
  128.                 $token = (string)$request->headers->get('token'null);
  129.                 if (!Security::validateToken($token)) {
  130.                     return $event->setResponse($this->json(
  131.                         ['message' => $this->translator->trans('Token inválido o expirado')],
  132.                         Response::HTTP_UNAUTHORIZED
  133.                     ));
  134.                 }
  135.                 $data Security::decodeToken($token);
  136.                 $collaborator $this->collaboratorRepository->findOneBy(['hash' => $data['user_id']]);
  137.                 if (!$collaborator instanceof Collaborator) {
  138.                     return $event->setResponse($this->json(
  139.                         ['message' => $this->translator->trans('Proveedor no encontrado')],
  140.                         Response::HTTP_UNAUTHORIZED
  141.                     ));
  142.                 }
  143.                 $request->attributes->set('collaborator'$collaborator);
  144.                 break;
  145.             case 'ent':
  146.                 $token = (string)$request->headers->get('token'null);
  147.                 if (!Security::validateToken($token)) {
  148.                     return $event->setResponse($this->json(
  149.                         ['message' => $this->translator->trans('Token inválido o expirado')],
  150.                         Response::HTTP_UNAUTHORIZED
  151.                     ));
  152.                 }
  153.                 $data Security::decodeToken($token);
  154.                 $manager $this->managerRepository->findOneBy(['hash' => $data['user_id']]);
  155.                 if (!$manager instanceof Manager) {
  156.                     return $event->setResponse($this->json(
  157.                         ['message' => $this->translator->trans('Manager no encontrado')],
  158.                         Response::HTTP_UNAUTHORIZED
  159.                     ));
  160.                 }
  161.                 $request->attributes->set('manager'$manager);
  162.                 break;
  163.         }
  164.         return null;
  165.     }
  166. }