<?php
namespace App\EventListener;
use App\Entity\User;
use Doctrine\ORM\EntityManager;
use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
class JWTCreatedListener
{
const REMEMBER_ME_EXPIRATION_DAYS = 30;
/**
* @var RequestStack
*/
private $requestStack;
/**
* @var EntityManager
*/
private $entityManager;
/**
* @param RequestStack $requestStack
* @param EntityManager $entityManager
*/
public function __construct(RequestStack $requestStack, EntityManager $entityManager)
{
$this->requestStack = $requestStack;
$this->entityManager = $entityManager;
}
/**
* @param JWTCreatedEvent $event
*
* @return void
*/
public function onJWTCreated(JWTCreatedEvent $event)
{
$payload = $event->getData();
// get user by it's username/email
/** @var User $user */
$user = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $payload['username']]);
$payload['caps'] = $user->getPermissions();
$payload['id'] = $user->getId();
$payload['firstname'] = $user->getFirstname();
$payload['lastname'] = $user->getLastname();
$payload['email'] = $user->getEmail();
$payload['isCompleted'] = $user->getIsRegistrationCompleted();
/** @var Request|null $request */
$request = $this->requestStack->getCurrentRequest();
if (isset($request) && $request->getContentType() === 'json') {
$data = json_decode($request->getContent(), true);
if ( !empty($data['_remember_me']) && $data['_remember_me'] === true ) {
$expiration = new \DateTime('+' . self::REMEMBER_ME_EXPIRATION_DAYS . ' days');
$payload['exp'] = $expiration->getTimestamp();
}
}
$event->setData($payload);
}
}