<?php
namespace App\EventListener;
use App\Entity\Gos\PortalSettings;
use App\Utils\UserFlagService;
use Doctrine\ORM\EntityManagerInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\User\UserInterface;
class JWTCreatedListener
{
private $request;
private $em;
private $userFlagService;
public function __construct(
EntityManagerInterface $em,
RequestStack $requestStack,
UserFlagService $userFlagService
) {
$this->em = $em;
$this->request = $requestStack->getCurrentRequest();
$this->userFlagService = $userFlagService;
}
public function onJWTCreated(JWTCreatedEvent $event): void
{
$payload = $event->getData();
$user = $event->getUser();
if (!empty($payload['roles']))
{
$payload['roles'] = $this->simplifyRolesArray($payload['roles']);
}
$payload['user'] = [
'firstName' => $user->getFirstName(),
'lastName' => $user->getLastName(),
'phoneNumber' => $user->getPhoneNumber(),
];
$payload['is_employee'] = $user->getEmployeeAccount();
$payload['fbLoginId'] = $user->getFacebookId();
$payload['flags'] = $this->userFlagService->getUserFlags($user);
$payload['using_portals'] = $user->getUsingPortals()->map(static function (PortalSettings $portal) {
return $portal->getTitle();
})->toArray();
$event->setData($payload);
$this->markUserUsingPortal($user);
}
private function simplifyRolesArray(array $roles): array
{
$simplifiedRolesArray = [];
$simplifiedRolesArray[] = 'ROLE_USER';
if (in_array('ROLE_SUPER_ADMIN', $roles, true))
{
$simplifiedRolesArray[] = 'ROLE_SUPER_ADMIN';
}
if (in_array('ROLE_ADMIN', $roles, true))
{
$simplifiedRolesArray[] = 'ROLE_ADMIN';
}
return $simplifiedRolesArray;
}
private function markUserUsingPortal(UserInterface $user)
{
$hash = $this->request->request->get('hash');
if ($hash !== null) {
$portalSettings = $this->em->getRepository(PortalSettings::class)->findOneBy(['hash' => $hash]);
if ($portalSettings !== null) {
$user->addUsingPortal($portalSettings);
$this->em->persist($user);
$this->em->flush();
}
}
}
}