src/Service/EventSubscriber/ApproveEventSubscriber.php line 66

Open in your IDE?
  1. <?php
  2. namespace Harmonizely\Service\EventSubscriber;
  3. use Harmonizely\CalendarEvents;
  4. use Harmonizely\Entity\Company\ApproveEventEntity;
  5. use Harmonizely\Model\Event;
  6. use Harmonizely\Model\EventInterface;
  7. use Harmonizely\Repository\Company\Contract\IApproveEventRepository;
  8. use Harmonizely\Service\Panel\Api\ApproveEvent\Contract\IIsApproveEventRequired;
  9. use Harmonizely\Types\Company\ApproveEventStatus;
  10. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\EventDispatcher\GenericEvent;
  13. class ApproveEventSubscriber implements EventSubscriberInterface
  14. {
  15.     /**
  16.      * @var IIsApproveEventRequired
  17.      */
  18.     private IIsApproveEventRequired $isApproveEventRequired;
  19.     /**
  20.      * @var IApproveEventRepository
  21.      */
  22.     private IApproveEventRepository $approveEventRepository;
  23.     /**
  24.      * @var EventDispatcherInterface
  25.      */
  26.     private EventDispatcherInterface $eventDispatcher;
  27.     /**
  28.      * @param IIsApproveEventRequired $isApproveEventRequired
  29.      * @param IApproveEventRepository $approveEventRepository
  30.      * @param EventDispatcherInterface $eventDispatcher
  31.      */
  32.     public function __construct(
  33.         IIsApproveEventRequired $isApproveEventRequired,
  34.         IApproveEventRepository $approveEventRepository,
  35.         EventDispatcherInterface $eventDispatcher
  36.     )
  37.     {
  38.         $this->isApproveEventRequired $isApproveEventRequired;
  39.         $this->approveEventRepository $approveEventRepository;
  40.         $this->eventDispatcher $eventDispatcher;
  41.     }
  42.     /**
  43.      * @return string[]
  44.      */
  45.     public static function getSubscribedEvents(): array
  46.     {
  47.         return [
  48.             CalendarEvents::EVENT_AFTER_PERSIST => 'afterPersistEvent',
  49.             CalendarEvents::EVENT_POST_CREATE => 'eventPostCreate',
  50.         ];
  51.     }
  52.     /**
  53.      * @param GenericEvent $genericEvent
  54.      * @return void
  55.      */
  56.     public function afterPersistEvent(GenericEvent $genericEvent): void
  57.     {
  58.         /** @var Event $event */
  59.         $event $genericEvent->getSubject();
  60.         if (!$this->isApproveEventRequired->perform($eventtrue)) {
  61.             return;
  62.         }
  63.         $approveEvent = new ApproveEventEntity($event);
  64.         $this->approveEventRepository->save($approveEvent);
  65.         $event->setApproveEvent($approveEvent);
  66.         $this->eventDispatcher->dispatch(new GenericEvent($event), CalendarEvents::EVENT_POST_REQUEST);
  67.     }
  68.     /**
  69.      * @param GenericEvent $genericEvent
  70.      * @return void
  71.      */
  72.     public function eventPostCreate(GenericEvent $genericEvent)
  73.     {
  74.         /** @var EventInterface $event */
  75.         $event $genericEvent->getSubject();
  76.         $approveEvent $event->getApproveEvent();
  77.         if ($approveEvent && $approveEvent->getStatus() === ApproveEventStatus::STATUS_NEW) {
  78.             $approveEvent->approve();
  79.             $this->approveEventRepository->save($approveEvent);
  80.         }
  81.     }
  82. }