diff --git a/src/Bundle/ChillTicketBundle/src/Action/Ticket/Handler/ChangeEmergencyStateCommandHandler.php b/src/Bundle/ChillTicketBundle/src/Action/Ticket/Handler/ChangeEmergencyStateCommandHandler.php index 2a5440916..0ff810d07 100644 --- a/src/Bundle/ChillTicketBundle/src/Action/Ticket/Handler/ChangeEmergencyStateCommandHandler.php +++ b/src/Bundle/ChillTicketBundle/src/Action/Ticket/Handler/ChangeEmergencyStateCommandHandler.php @@ -14,14 +14,20 @@ namespace Chill\TicketBundle\Action\Ticket\Handler; use Chill\TicketBundle\Action\Ticket\ChangeEmergencyStateCommand; use Chill\TicketBundle\Entity\EmergencyStatusHistory; use Chill\TicketBundle\Entity\Ticket; +use Chill\TicketBundle\Event\EmergencyStatusUpdateEvent; +use Chill\TicketBundle\Event\TicketUpdateEvent; use Symfony\Component\Clock\ClockInterface; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; /** * Handler for changing the emergency status of a ticket. */ class ChangeEmergencyStateCommandHandler { - public function __construct(private readonly ClockInterface $clock) {} + public function __construct( + private readonly ClockInterface $clock, + private readonly EventDispatcherInterface $eventDispatcher, + ) {} public function __invoke(Ticket $ticket, ChangeEmergencyStateCommand $command): Ticket { @@ -30,6 +36,8 @@ class ChangeEmergencyStateCommandHandler return $ticket; } + $previous = $ticket->getEmergencyStatus(); + // End the current emergency status history (if any) foreach ($ticket->getEmergencyStatusHistories() as $emergencyStatusHistory) { if (null === $emergencyStatusHistory->getEndDate()) { @@ -44,6 +52,12 @@ class ChangeEmergencyStateCommandHandler $this->clock->now(), ); + // Dispatch event about the toggle + if (null !== $previous) { + $event = new EmergencyStatusUpdateEvent($ticket, $previous, $command->newEmergencyStatus); + $this->eventDispatcher->dispatch($event, TicketUpdateEvent::class); + } + return $ticket; } } diff --git a/src/Bundle/ChillTicketBundle/src/Event/EmergencyStatusUpdateEvent.php b/src/Bundle/ChillTicketBundle/src/Event/EmergencyStatusUpdateEvent.php new file mode 100644 index 000000000..934c38dde --- /dev/null +++ b/src/Bundle/ChillTicketBundle/src/Event/EmergencyStatusUpdateEvent.php @@ -0,0 +1,26 @@ +prophesize(EventDispatcherInterface::class); + $eventDispatcher->dispatch(Argument::type(EmergencyStatusUpdateEvent::class), TicketUpdateEvent::class)->shouldNotBeCalled(); + + $handler = new ChangeEmergencyStateCommandHandler(new MockClock(), $eventDispatcher->reveal()); $command = new ChangeEmergencyStateCommand(EmergencyStatusEnum::YES); $result = $handler->__invoke($ticket, $command); @@ -57,7 +64,17 @@ final class ChangeEmergencyStateCommandHandlerTest extends TestCase // Create a YES emergency status history new EmergencyStatusHistory(EmergencyStatusEnum::YES, $ticket); - $handler = new ChangeEmergencyStateCommandHandler(new MockClock()); + $eventDispatcher = $this->prophesize(EventDispatcherInterface::class); + $eventDispatcher->dispatch( + Argument::that( + fn ($e) => $e instanceof EmergencyStatusUpdateEvent + && EmergencyStatusEnum::YES === $e->previousEmergencyStatus + && EmergencyStatusEnum::NO === $e->newEmergencyStatus + ), + TicketUpdateEvent::class + )->shouldBeCalled(); + + $handler = new ChangeEmergencyStateCommandHandler(new MockClock(), $eventDispatcher->reveal()); $command = new ChangeEmergencyStateCommand(EmergencyStatusEnum::NO); $result = $handler->__invoke($ticket, $command); @@ -90,7 +107,17 @@ final class ChangeEmergencyStateCommandHandlerTest extends TestCase // Create a NO emergency status history new EmergencyStatusHistory(EmergencyStatusEnum::NO, $ticket); - $handler = new ChangeEmergencyStateCommandHandler(new MockClock()); + $eventDispatcher = $this->prophesize(EventDispatcherInterface::class); + $eventDispatcher->dispatch( + Argument::that( + fn ($e) => $e instanceof EmergencyStatusUpdateEvent + && EmergencyStatusEnum::NO === $e->previousEmergencyStatus + && EmergencyStatusEnum::YES === $e->newEmergencyStatus + ), + TicketUpdateEvent::class + )->shouldBeCalled(); + + $handler = new ChangeEmergencyStateCommandHandler(new MockClock(), $eventDispatcher->reveal()); $command = new ChangeEmergencyStateCommand(EmergencyStatusEnum::YES); $result = $handler->__invoke($ticket, $command);