<?php
namespace App\Service;
use App\Entity\AuthLog;
use App\Entity\User;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
class UserLocationLogger implements EventSubscriberInterface
{
private EntityManagerInterface $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
/**
* @throws Exception
*/
public function createAuthLog(LoginSuccessEvent $event)
{
/* @var User $user */
$user = $event->getAuthenticatedToken()->getUser();
$ip = $event->getRequest()->getClientIp();
$geoInfo = new GeoInfo($ip);
$authLog = new AuthLog();
$authLog
->setUser($user)
->setIp($ip)
->setCountry($geoInfo->getCountry())
->setVille($geoInfo->getCity())
->setCreatedAt(new DateTime());
$this->entityManager->persist($authLog);
$this->entityManager->flush();
}
public static function getSubscribedEvents(): array
{
return [
LoginSuccessEvent::class => 'createAuthLog'
];
}
}