<?php
namespace App\EventListener;
use App\Entity\User;
use App\Handler\Logger\User\UsersLogsHandler;
use App\Handler\Logger\User\UsersLogsOptions;
use App\Repository\Company\PersonRepository;
use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class AuthenticationSuccessListener
{
private PersonRepository $personRepository;
private NormalizerInterface $normalizer;
private UsersLogsHandler $usersLogsHandler;
private RequestStack $requestStack;
public function __construct(
PersonRepository $personRepository,
NormalizerInterface $normalizer,
UsersLogsHandler $usersLogsHandler,
RequestStack $requestStack
)
{
$this->personRepository = $personRepository;
$this->normalizer = $normalizer;
$this->usersLogsHandler = $usersLogsHandler;
$this->requestStack = $requestStack;
}
public function onAuthenticationSuccessResponse(AuthenticationSuccessEvent $event)
{
$data = $event->getData();
/** @var User $user */
$user = $event->getUser();
$roles = $user->getRoles();
$person = $user->getPerson();
$company = $user->getCompany();
$personArray = $this->normalizer->normalize($person, null, [
AbstractNormalizer::ATTRIBUTES => [
'id',
'name',
'middleName',
'surname',
'birthday',
],
]);
if (!$user instanceof UserInterface) {
return;
}
$person = $this->personRepository->findOneBy([
'relatedUser' => $user,
]);
$userArray = $this->normalizer->normalize($user, null, [
AbstractNormalizer::ATTRIBUTES => [
'id',
'name',
'fullName',
'surname',
'email',
'tempPassword',
],
]);
$avatar = '/assets/img/blank_avatar.png';
if (null !== $person && null !== $person->getAvatar()) {
$avatar = $person->getAvatar();
}
$companyName = null;
if (null !== $company ) {
$companyName = $company->getName();
$companyUid = $company->getUid();
$companyMainUid = $company->getUid();
if ($company->getParent() !== null) {
$companyMainUid = $company->getParent()->getUid();
}
}
$data['user'] = [
'avatar' => $avatar,
'person' => $personArray,
'company' => $companyName,
'companyUid' => $companyUid,
'companyMainUid' => $companyMainUid,
'user' => $userArray
];
if (null !== $roles) {
if (in_array('ROLE_SYSTEM', $roles)) {
$data['role'] = 'ROLE_SYSTEM';
} elseif (in_array('ROLE_COMPANY_MANAGER', $roles)) {
$data['role'] = 'ROLE_COMPANY_MANAGER';
} elseif (in_array('ROLE_BACKOFFICE', $roles)) {
$data['role'] = 'ROLE_BACKOFFICE';
} elseif (in_array('ROLE_BACKOFFICE_OPERATION', $roles)) {
$data['role'] = 'ROLE_BACKOFFICE_OPERATION';
} elseif (in_array('ROLE_BACKOFFICE_FLIGHT', $roles)) {
$data['role'] = 'ROLE_BACKOFFICE_FLIGHT';
} elseif (in_array('ROLE_BACKOFFICE_ACCOUNT_USER', $roles)) {
$data['role'] = 'ROLE_BACKOFFICE_ACCOUNT_USER';
} elseif (in_array('ROLE_BACKOFFICE_ACCOUNT_USER', $roles)) {
$data['role'] = 'ROLE_BACKOFFICE_ACCOUNT_USER';
} elseif (in_array('ROLE_COMPANY_TRAVEL_APPROVER', $roles)) {
$data['role'] = 'ROLE_COMPANY_TRAVEL_APPROVER';
} elseif (in_array('ROLE_COMPANY_USER', $roles)) {
$data['role'] = 'ROLE_COMPANY_USER';
} elseif (in_array('ROLE_USER', $roles)) {
$data['role'] = 'ROLE_USER';
}
}
$userLog = $this->usersLogsHandler->handle(UsersLogsOptions::fromArray([
'createdBy' => $event->getUser(),
'ipAddress' => $this->requestStack->getCurrentRequest()->getClientIp(),
'status' => 'SUCCESS'
]));
$event->setData($data);
}
}