<?php
namespace App\Listener;
use App\Controller\RestController;
use App\Entity\Admin;
use App\Entity\User;
use App\Entity\UserDevice;
use App\Repository\AdminRepository;
use App\Repository\UserDeviceRepository;
use App\Repository\UserRepository;
use App\Service\Security;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Contracts\Translation\TranslatorInterface;
class RequestListener extends RestController
{
private AdminRepository $adminRepository;
private UserRepository $userRepository;
private UserDeviceRepository $userDeviceRepository;
public function __construct(
EntityManagerInterface $em,
AdminRepository $adminRepository,
UserRepository $userRepository,
UserDeviceRepository $userDeviceRepository,
TranslatorInterface $translator
) {
$this->em = $em;
$this->adminRepository = $adminRepository;
$this->userRepository = $userRepository;
$this->userDeviceRepository = $userDeviceRepository;
$this->translator = $translator;
}
/**
* @throws \Exception
*/
public function onKernelRequest(RequestEvent $event): ?RequestEvent
{
$request = $event->getRequest();
$route = $request->attributes->get('_route');
$route = explode('_', $route)[0];
switch ($route) {
case 'api':
$token = (string)$request->headers->get('token', null);
$deviceId = (string)$request->headers->get('deviceId', null);
$deviceType = (int)$request->headers->get('deviceType', null);
$deviceModel = (string)$request->headers->get('deviceModel', null);
$deviceOs = (string)$request->headers->get('deviceOs', null);
$deviceVersion = (string)$request->headers->get('deviceVersion', null);
$deviceNetwork = (string)$request->headers->get('deviceNetwork', null);
if (!Security::validateToken($token)) {
$event->setResponse($this->json(
['message' => $this->translator->trans('auth.invalid_or_expired_token')],
Response::HTTP_UNAUTHORIZED
));
return null;
}
$data = Security::decodeToken($token);
$user = $this->userRepository->findOneBy([
'hash' => $data['user_id'],
'status' => User::STATUS_PUBLISHED
]);
if (!$user instanceof User) {
$event->setResponse($this->json(
['message' => $this->translator->trans('user.not_found')],
Response::HTTP_UNAUTHORIZED
));
return null;
}
$device = $this->userDeviceRepository->findOneBy([
'user' => $user,
'device_id' => $deviceId,
'type' => $deviceType]);
if (!$device instanceof UserDevice) {
$event->setResponse($this->json(
['message' => $this->translator->trans('device.not_found')],
Response::HTTP_UNAUTHORIZED
));
return null;
}
$device->setModel($deviceModel);
$device->setOs($deviceOs);
$device->setVersion($deviceVersion);
$device->setNetwork($deviceNetwork);
$this->em->persist($device);
$this->em->flush();
$request->attributes->set('user', $user);
$request->attributes->set('device', $device);
break;
case 'cms':
$token = (string)$request->headers->get('token', null);
if (!Security::validateToken($token)) {
$event->setResponse($this->json(
['message' => $this->translator->trans('auth.invalid_or_expired_token')],
Response::HTTP_UNAUTHORIZED
));
return null;
}
$data = Security::decodeToken($token);
$admin = $this->adminRepository->findOneBy(['hash' => $data['user_id']]);
if (!$admin instanceof Admin) {
$event->setResponse($this->json(
['message' => $this->translator->trans('user.not_found')],
Response::HTTP_UNAUTHORIZED
));
return null;
}
$request->attributes->set('admin', $admin);
break;
}
return null;
}
}