src/Listener/RequestListener.php line 41

Open in your IDE?
  1. <?php
  2. namespace App\Listener;
  3. use App\Controller\RestController;
  4. use App\Entity\Admin;
  5. use App\Entity\User;
  6. use App\Entity\UserDevice;
  7. use App\Repository\AdminRepository;
  8. use App\Repository\UserDeviceRepository;
  9. use App\Repository\UserRepository;
  10. use App\Service\Security;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\HttpKernel\Event\RequestEvent;
  14. use Symfony\Contracts\Translation\TranslatorInterface;
  15. class RequestListener extends RestController
  16. {
  17.     private AdminRepository $adminRepository;
  18.     private UserRepository $userRepository;
  19.     private UserDeviceRepository $userDeviceRepository;
  20.     public function __construct(
  21.         EntityManagerInterface $em,
  22.         AdminRepository $adminRepository,
  23.         UserRepository $userRepository,
  24.         UserDeviceRepository $userDeviceRepository,
  25.         TranslatorInterface $translator
  26.     ) {
  27.         $this->em $em;
  28.         $this->adminRepository $adminRepository;
  29.         $this->userRepository $userRepository;
  30.         $this->userDeviceRepository $userDeviceRepository;
  31.         $this->translator $translator;
  32.     }
  33.     /**
  34.      * @throws \Exception
  35.      */
  36.     public function onKernelRequest(RequestEvent $event): ?RequestEvent
  37.     {
  38.         $request $event->getRequest();
  39.         $route $request->attributes->get('_route');
  40.         $route explode('_'$route)[0];
  41.         switch ($route) {
  42.             case 'api':
  43.                 $token = (string)$request->headers->get('token'null);
  44.                 $deviceId = (string)$request->headers->get('deviceId'null);
  45.                 $deviceType = (int)$request->headers->get('deviceType'null);
  46.                 $deviceModel = (string)$request->headers->get('deviceModel'null);
  47.                 $deviceOs = (string)$request->headers->get('deviceOs'null);
  48.                 $deviceVersion = (string)$request->headers->get('deviceVersion'null);
  49.                 $deviceNetwork = (string)$request->headers->get('deviceNetwork'null);
  50.                 if (!Security::validateToken($token)) {
  51.                     $event->setResponse($this->json(
  52.                         ['message' => $this->translator->trans('auth.invalid_or_expired_token')],
  53.                         Response::HTTP_UNAUTHORIZED
  54.                     ));
  55.                     return null;
  56.                 }
  57.                 $data Security::decodeToken($token);
  58.                 $user $this->userRepository->findOneBy([
  59.                     'hash' => $data['user_id'],
  60.                     'status' => User::STATUS_PUBLISHED
  61.                 ]);
  62.                 if (!$user instanceof User) {
  63.                     $event->setResponse($this->json(
  64.                         ['message' => $this->translator->trans('user.not_found')],
  65.                         Response::HTTP_UNAUTHORIZED
  66.                     ));
  67.                     return null;
  68.                 }
  69.                 $device $this->userDeviceRepository->findOneBy([
  70.                     'user' => $user,
  71.                     'device_id' => $deviceId,
  72.                     'type' => $deviceType]);
  73.                 if (!$device instanceof UserDevice) {
  74.                     $event->setResponse($this->json(
  75.                         ['message' => $this->translator->trans('device.not_found')],
  76.                         Response::HTTP_UNAUTHORIZED
  77.                     ));
  78.                     return null;
  79.                 }
  80.                 $device->setModel($deviceModel);
  81.                 $device->setOs($deviceOs);
  82.                 $device->setVersion($deviceVersion);
  83.                 $device->setNetwork($deviceNetwork);
  84.                 $this->em->persist($device);
  85.                 $this->em->flush();
  86.                 $request->attributes->set('user'$user);
  87.                 $request->attributes->set('device'$device);
  88.                 break;
  89.             case 'cms':
  90.                 $token = (string)$request->headers->get('token'null);
  91.                 if (!Security::validateToken($token)) {
  92.                     $event->setResponse($this->json(
  93.                         ['message' => $this->translator->trans('auth.invalid_or_expired_token')],
  94.                         Response::HTTP_UNAUTHORIZED
  95.                     ));
  96.                     return null;
  97.                 }
  98.                 $data Security::decodeToken($token);
  99.                 $admin $this->adminRepository->findOneBy(['hash' => $data['user_id']]);
  100.                 if (!$admin instanceof Admin) {
  101.                     $event->setResponse($this->json(
  102.                         ['message' => $this->translator->trans('user.not_found')],
  103.                         Response::HTTP_UNAUTHORIZED
  104.                     ));
  105.                     return null;
  106.                 }
  107.                 $request->attributes->set('admin'$admin);
  108.                 break;
  109.         }
  110.         return null;
  111.     }
  112. }