src/Service/Admission/Tickets/MercureManager.php line 77

Open in your IDE?
  1. <?php
  2. namespace App\Service\Admission\Tickets;
  3. use App\Entity\Admission\Tickets\AbstractTicketStatus;
  4. use App\Entity\Admission\Tickets\AgreeTicketStatus;
  5. use App\Entity\Admission\Tickets\TicketInterface;
  6. use App\Entity\Admission\Tickets\TicketOperator;
  7. use Carbon\Carbon;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\Mercure\HubInterface;
  11. use Symfony\Component\Mercure\Update;
  12. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  13. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  14. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  15. use Symfony\Component\Serializer\Serializer;
  16. use Symfony\Component\Workflow\Event\CompletedEvent;
  17. class MercureManager implements EventSubscriberInterface
  18. {
  19.     protected HubInterface $publisher;
  20.     protected Serializer $serializer;
  21.     private $em;
  22.     public function __construct(HubInterface $publisherEntityManagerInterface $em)
  23.     {
  24.         $defaultContext = [
  25.             AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object$format$context) {
  26.                 return $object->__toString();
  27.             },
  28.             AbstractNormalizer::CALLBACKS => [
  29.                 'datetime' => function ($innerObject$outerObjectstring $attributeNamestring $format null, array $context = []) {
  30.                     return $innerObject instanceof Carbon $innerObject->getTimestamp() : '';
  31.                 }
  32.             ]
  33.         ];
  34.         $normalizer = new ObjectNormalizer(nullnullnullnullnullnull$defaultContext);
  35.         $this->serializer = new Serializer([$normalizer], [new JsonEncoder()]);
  36.         $this->publisher $publisher;
  37.         $this->em $em;
  38.     }
  39.     public static function getSubscribedEvents(): array
  40.     {
  41.         return [
  42.             'workflow.entrant_ticket_workflow.completed.ticket_assign' => 'onTicketAssign',
  43.             'workflow.entrant_ticket_workflow.completed.ticket_accept' => 'onTicketAccept',
  44.             'workflow.entrant_ticket_workflow.completed.ticket_cancel' => 'onTicketCancel',
  45.             'workflow.entrant_ticket_workflow.completed.ticket_activate' => 'onTicketActivate',
  46.             'workflow.entrant_ticket_workflow.completed.ticket_close' => 'onTicketClose',
  47.             'workflow.agree_ticket_workflow.completed.ticket_assign' => 'onAgreeTicketAssign',
  48.             'workflow.agree_ticket_workflow.completed.ticket_close' => 'onAgreeTicketClose',
  49.             'workflow.agree_ticket_workflow.completed.ticket_reassign' => 'onAgreeTicketReassign',
  50.             'workflow.agree_ticket_workflow.completed.ticket_pause' => 'onAgreeTicketPause',
  51.             'workflow.agree_ticket_workflow.completed.ticket_unpause' => 'onAgreeTicketUnpause',
  52.             'workflow.agree_ticket_workflow.completed.ticket_cancel' => 'onAgreeTicketCancel',
  53.             'workflow.original_ticket_workflow.completed.ticket_assign' => 'onAgreeTicketAssign',
  54.             'workflow.original_ticket_workflow.completed.ticket_close' => 'onAgreeTicketClose',
  55.             'workflow.original_ticket_workflow.completed.ticket_reassign' => 'onAgreeTicketReassign',
  56.             'workflow.original_ticket_workflow.completed.ticket_pause' => 'onAgreeTicketPause',
  57.             'workflow.original_ticket_workflow.completed.ticket_unpause' => 'onAgreeTicketUnpause',
  58.             'workflow.original_ticket_workflow.completed.ticket_cancel' => 'onAgreeTicketCancel',
  59.         ];
  60.     }
  61.     public function onAgreeTicketAssign(CompletedEvent $event)
  62.     {
  63.         /** @var TicketInterface $ticket */
  64.         $ticket $event->getSubject();
  65.         $this->publishTicketEvent($ticketAbstractTicketStatus::ASSIGN);
  66.         $this->em->flush();
  67.     }
  68.     public function onAgreeTicketClose(CompletedEvent $event)
  69.     {
  70.         /** @var TicketInterface $ticket */
  71.         $ticket $event->getSubject();
  72.         $this->publishTicketEvent($ticketAbstractTicketStatus::CLOSE);
  73.         $this->em->flush();
  74.     }
  75.     public function onAgreeTicketReassign(CompletedEvent $event)
  76.     {
  77.         /** @var TicketInterface $ticket */
  78.         $ticket $event->getSubject();
  79.         $this->publishTicketEvent($ticketAbstractTicketStatus::REASSIGN);
  80.         $this->em->flush();
  81.     }
  82.     public function onAgreeTicketPause(CompletedEvent $event)
  83.     {
  84.         /** @var TicketInterface $ticket */
  85.         $ticket $event->getSubject();
  86.         $this->publishTicketEvent($ticketAgreeTicketStatus::PAUSE);
  87.         $this->em->flush();
  88.     }
  89.     public function onAgreeTicketUnpause(CompletedEvent $event)
  90.     {
  91.         /** @var TicketInterface $ticket */
  92.         $ticket $event->getSubject();
  93.         $this->publishTicketEvent($ticketAgreeTicketStatus::UNPAUSE);
  94.         $this->em->flush();
  95.     }
  96.     public function onAgreeTicketCancel(CompletedEvent $event)
  97.     {
  98.         /** @var TicketInterface $ticket */
  99.         $ticket $event->getSubject();
  100.         $this->publishTicketEvent($ticketAbstractTicketStatus::CANCEL);
  101.         $this->em->flush();
  102.     }
  103.     public function onTicketAssign(CompletedEvent $event)
  104.     {
  105.         /** @var TicketInterface $ticket */
  106.         $ticket $event->getSubject();
  107.         $this->publishTicketEvent($ticketAbstractTicketStatus::ASSIGN);
  108.         $this->em->flush();
  109.     }
  110.     public function onTicketAccept(CompletedEvent $event)
  111.     {
  112.         /** @var TicketInterface $ticket */
  113.         $ticket $event->getSubject();
  114.         $this->publishTicketEvent($ticketAbstractTicketStatus::ACCEPT);
  115.         $this->em->flush();
  116.     }
  117.     public function onTicketCancel(CompletedEvent $event)
  118.     {
  119.         /** @var TicketInterface $ticket */
  120.         $ticket $event->getSubject();
  121.         $this->publishTicketEvent($ticketAbstractTicketStatus::CANCEL);
  122.         $this->em->flush();
  123.     }
  124.     public function onTicketActivate(CompletedEvent $event)
  125.     {
  126.         /** @var TicketInterface $ticket */
  127.         $ticket $event->getSubject();
  128.         $this->publishTicketEvent($ticketAbstractTicketStatus::ACTIVATE);
  129.         $this->em->flush();
  130.     }
  131.     public function onTicketClose(CompletedEvent $event)
  132.     {
  133.         /** @var TicketInterface $ticket */
  134.         $ticket $event->getSubject();
  135.         $this->publishTicketEvent($ticketAbstractTicketStatus::CLOSE);
  136.         $this->em->flush();
  137.     }
  138.     protected function publish(Update $update)
  139.     {
  140.         $this->publisher->publish($update);
  141.     }
  142.     public function publishOperatorStatusEvent(TicketOperator $operatorstring $event)
  143.     {
  144.         $update = new Update(
  145.             $this->getOperatorStatusTopic($operator),
  146.             $this->serializer->serialize(
  147.                 $operator,
  148.                 'json',
  149.                 [
  150.                     AbstractNormalizer::IGNORED_ATTRIBUTES => [
  151.                         'lastAssignedTicket',
  152.                         'password',
  153.                         'plainPassword',
  154.                         'plainPasswordConfirmation',
  155.                         'roles',
  156.                         'salt',
  157.                         'token',
  158.                     ]
  159.                 ]),
  160.             false,
  161.             null,
  162.             $event
  163.         );
  164.         $this->publish($update);
  165.     }
  166.     public function getTicketsTopic(TicketInterface $ticket null): string
  167.     {
  168.         $id $ticket $ticket->getId() : null;
  169.         return 'pk-tickets/' . ($id ?? '{id}');
  170.     }
  171.     public function getOperatorStatusTopic(TicketOperator $operator null): string
  172.     {
  173.         $id $operator $operator->getId() : null;
  174.         return 'ticket-operators/' . ($id ?? '{id}');
  175.     }
  176.     public function publishTicketEvent(TicketInterface $ticketstring $event)
  177.     {
  178.         $ticketOperator $ticket->getCurrentStatus()->getOperator();
  179.         $update = new Update(
  180.             $this->getTicketsTopic($ticket),
  181.             json_encode([
  182.                 'userId' => $ticketOperator $ticketOperator->getUser()->getId() : null,
  183.                 'ticketId' => $ticket->getId(),
  184.             ]),
  185.             false,
  186.             null,
  187.             $event
  188.         );
  189.         $this->publish($update);
  190.     }
  191. }