<?php
namespace App\EventSubscriber;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\Device;
use App\Entity\User;
use App\Repository\DeviceRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Security;
class ResolveMeSubscriber implements EventSubscriberInterface
{
/**
* @var Security
*/
private $security;
/**
* @var DeviceRepository
*/
private $deviceRepository;
/**
* ResolveMeSubscriber constructor.
* @param Security $security
* @param DeviceRepository $deviceRepository
*/
public function __construct(Security $security, DeviceRepository $deviceRepository)
{
$this->security = $security;
$this->deviceRepository = $deviceRepository;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => ['resolveMe', EventPriorities::PRE_READ],
];
}
public function resolveMe(RequestEvent $event)
{
$request = $event->getRequest();
$user = $this->security->getUser();
if($request->headers->has('Device') && $user) {
$device = $this->deviceRepository->findOneBy(['uuid' => $request->headers->get('Device')]);
$user->setCurrentDevice($device);
}
if ('api_users_get_item' !== $request->attributes->get('_route')) {
return;
}
if ('me' !== $request->attributes->get('id')) {
return;
}
if (!$user instanceof User) {
return;
}
$request->attributes->set('id', $user->getId());
}
}