<?php
namespace App\EventSubscriber\Game;
use App\DependencyInjection\Framework\EntityManagerDI;
use App\DependencyInjection\Framework\MessageBusDI;
use App\DependencyInjection\Service\PaymentMiddlewareServiceDI;
use App\DTO\Data\Notification\Ticket\TicketInvalidatedEmailTemplate;
use App\DTO\Data\Notification\Ticket\TicketInvalidatedPushTemplate;
use App\Enum\Game\TicketStatus;
use App\Event\Game\TicketEvent;
use App\Message\Notification\GenerateNotificationMessage;
use App\Message\Payment\RefundTicketPaymentMessage;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class TicketEventSubscriber implements EventSubscriberInterface
{
use EntityManagerDI;
use MessageBusDI;
use PaymentMiddlewareServiceDI;
public static function getSubscribedEvents(): array
{
return [
TicketEvent::VALIDATED => 'onTicketValidated',
TicketEvent::INVALIDATED => 'onTicketInvalidated',
TicketEvent::CANCELED => 'onTicketCanceled',
];
}
public function onTicketCanceled(TicketEvent $event): void
{
$ticket = $event->getTicket();
if ($ticket->getStatus() !== TicketStatus::Canceled) {
return;
}
if ($ticket->getFile() != null) {
$file = $ticket->getFile();
$ticket->setFile(null);
$this->entityManager->remove($file);
$this->entityManager->flush();
}
if ($ticket->canBeRefunded()) {
$this->messageBus->dispatch(new RefundTicketPaymentMessage($ticket));
}
$this->messageBus->dispatch(new GenerateNotificationMessage($ticket->getUser(), new TicketInvalidatedPushTemplate($ticket), $ticket->getId(), $ticket->get_class_short_name()));
$this->messageBus->dispatch(new GenerateNotificationMessage($ticket->getUser(), new TicketInvalidatedEmailTemplate($ticket), $ticket->getId(), $ticket->get_class_short_name()));
}
public function onTicketValidated(TicketEvent $event): void
{
$ticket = $event->getTicket();
if ($ticket->getStatus() !== TicketStatus::Validated) {
return;
}
}
public function onTicketInvalidated(TicketEvent $event): void
{
$ticket = $event->getTicket();
if ($ticket->getStatus() !== TicketStatus::Invalidated) {
return;
}
if ($ticket->canBeRefunded()) {
$this->paymentMiddlewareService->refundTransaction($ticket->getPurchaseTransaction());
}
$this->messageBus->dispatch(new GenerateNotificationMessage($ticket->getUser(), new TicketInvalidatedPushTemplate($ticket), $ticket->getId(), $ticket->get_class_short_name()));
$this->messageBus->dispatch(new GenerateNotificationMessage($ticket->getUser(), new TicketInvalidatedEmailTemplate($ticket), $ticket->getId(), $ticket->get_class_short_name()));
}
}