<?php
declare(strict_types=1);
namespace App\Event;
use ApiPlatform\Core\Api\IriConverterInterface;
use App\Entity\User\User;
use App\Repository\ActiveServices\ProjectConditionRepository;
use App\Repository\ActiveServices\ProjectRepository;
use App\Repository\Notification\NotificationAreaRepository;
use App\Repository\Notification\NotificationTypeRepository;
use App\Repository\User\RoleRepository;
use App\Service\ActiveServices\NotificationServicesApiConnectService;
use App\Service\NotificationGenerator\NotificationGenerator;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent;
class JwtCreatedListener
{
public function __construct(
private readonly IriConverterInterface $iriConverter,
private readonly EntityManagerInterface $entityManager,
private readonly ProjectRepository $projectRepository,
private readonly ProjectConditionRepository $projectConditionRepository,
private readonly NotificationServicesApiConnectService $notificationServicesApiConnectService,
private readonly RoleRepository $roleRepository,
private readonly NotificationGenerator $notificationGenerator,
private readonly NotificationAreaRepository $notificationAreaRepository,
private readonly NotificationTypeRepository $notificationTypeRepository,
) {}
public function onJWTCreated(JWTCreatedEvent $event)
{
$user = $event->getUser();
assert($user instanceof User);
$company = $user->getCompany();
$payload = $event->getData();
$payload['user'] = $this->iriConverter->getIriFromItem($user);
$payload['company'] = $company ? $this->iriConverter->getIriFromItem($company) : null;
$payload['impersonateFrom'] = $user->getIsUserImpersonate() ? $user->getImpersonateFrom() : null;
$payload['preImpersonateRole'] = $user->getIsUserImpersonate() ? $user->getPreImpersonateRole() : null;
$event->setData($payload);
}
public function noteLoginData(JWTCreatedEvent $event)
{
/** @var User $user */
$user = $event->getUser();
$update = false;
assert($user instanceof User);
if ($user->getRole() === $this->roleRepository->getImpersonateRole()) {
if (str_contains(strtolower($user->getEmail()), 'fakeowner@aadmi.com')) {
$user->setRole($this->roleRepository->getFakeAccountManagerRole());
} else {
$user->setRole($this->roleRepository->getAccountManagerRole());
}
$update = true;
}
if (!$user->getIsUserImpersonate()) {
$user->setLastLoginTime(new \DateTime());
$user->setIsUserSawQRCode(true);
$update = true;
}
if ($update) {
$this->entityManager->persist($user);
$this->entityManager->flush();
}
}
public function changeProjectConditionStatus(JWTCreatedEvent $event)
{
/** @var User $user */
$user = $event->getUser();
$projectsComapny = $this->projectRepository->findBy(['company' => $user->getCompany()]);
$projectsUser = $this->projectRepository->findBy(['user' => $user]);
$projects = array_merge($projectsComapny, $projectsUser);
foreach ($projects as $project) {
if (null !== $project->getCompletedAt() && $this->projectConditionRepository->getConditionArchive() !== $project->getConditionStatus()) {
/** @var DataTime $completedAt */
$completedAt = $project->getCompletedAt();
$completedAt->modify('+10 day');
if ($completedAt < new DateTime() && $project->getConditionStatus() === $this->projectConditionRepository->getConditionActive()) {
$project->setConditionStatus($this->projectConditionRepository->getConditionArchive());
}
$this->entityManager->persist($project);
$this->entityManager->flush();
}
// if ($project->getDeadline() !== null) {
// try {
// $projectDeadLine = $project->getDeadline();
// if (($projectDeadLine->modify('+3 days')) <= (new DateTime())) {
// $this->notificationGenerator->addNotificationForCompany(
// $project->getCompany(),
// $this->notificationAreaRepository->getNotificationAreaProjectOnTrack(),
// $this->notificationTypeRepository->getNotificationTypeSystem(),
// $project,
// );
// }
// } catch (\Throwable $th) {
// }
// }
}
}
}