<?php
namespace App\EventSubscriber;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\Device;
use App\Repository\DeviceRepository;
use Doctrine\ORM\EntityManagerInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
use Lexik\Bundle\JWTAuthenticationBundle\Events;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Security;
class LoginSuccessSubscriber implements EventSubscriberInterface
{
/**
* @var Request
*/
private $request;
/**
* @var DeviceRepository
*/
private $deviceRepository;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var Security
*/
private $security;
/**
* LoginSuccessSubscriber constructor.
* @param DeviceRepository $deviceRepository
* @param EntityManagerInterface $entityManager
*/
public function __construct(DeviceRepository $deviceRepository, EntityManagerInterface $entityManager, Security $security)
{
$this->deviceRepository = $deviceRepository;
$this->entityManager = $entityManager;
$this->security = $security;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => ['onRequest', EventPriorities::POST_SERIALIZE],
Events::AUTHENTICATION_SUCCESS => 'onSuccess',
];
}
public function onSuccess(AuthenticationSuccessEvent $event)
{
if($this->request !== null) {
$content = json_decode($this->request->getContent(), true);
if(empty($content['uuid'])) {
return;
}
$device = $this->deviceRepository->findOneBy(['uuid' => $content['uuid']]);
if( ! $device) {
$device = new Device();
$device->setName($content['model']);
$device->setUuid($content['uuid']);
$device->setUser($this->security->getUser());
$this->entityManager->persist($device);
$this->entityManager->flush();
}
}
}
public function onRequest(RequestEvent $requestEvent)
{
$request = $requestEvent->getRequest();
if('api_login_check' === $request->attributes->get('_route')) {
$this->request = $request;
}
}
}