<?php
declare(strict_types=1);
namespace App\Subscriber;
use App\Entity\Admin;
use App\Entity\User;
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\HttpFoundation\RequestStack;
class AuthenticationSuccessSubscriber implements EventSubscriberInterface
{
private EntityManagerInterface $entityManager;
private RequestStack $requestStack;
public function __construct(
EntityManagerInterface $entityManager,
RequestStack $requestStack
) {
$this->entityManager = $entityManager;
$this->requestStack = $requestStack;
}
public static function getSubscribedEvents(): array
{
return [
Events::AUTHENTICATION_SUCCESS => ['onAuthenticationSuccess'],
];
}
public function onAuthenticationSuccess(AuthenticationSuccessEvent $event): void
{
$user = $event->getUser();
if ($user instanceof User) {
$user->setLastLoginAt(new \DateTimeImmutable());
$this->entityManager->persist($user);
$this->entityManager->flush($user);
}
if (!($user instanceof Admin)) {
return;
}
/** @var Request $request */
$request = $this->requestStack->getCurrentRequest();
$meta = [
'admin' => [
'id' => $user->getId()->toString(),
'username' => $user->getUsername(),
'email' => $user->getEmail()
],
'client_ip' => $request->getClientIp(),
'user_agent' => $request->headers->get('User-Agent', 'unknown')
];
$connection = (new Admin\Connection())
->setAdmin($user)
->setClientIp($meta['client_ip'])
->setUserAgent($meta['user_agent'])
->setMeta($meta);
$this->entityManager->persist($connection);
$this->entityManager->flush($connection);
}
}