<?php
namespace Harmonizely\Service\EventSubscriber;
use Harmonizely\CalendarEvents;
use Harmonizely\Entity\Company\ApproveEventEntity;
use Harmonizely\Model\Event;
use Harmonizely\Model\EventInterface;
use Harmonizely\Repository\Company\Contract\IApproveEventRepository;
use Harmonizely\Service\Panel\Api\ApproveEvent\Contract\IIsApproveEventRequired;
use Harmonizely\Types\Company\ApproveEventStatus;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
class ApproveEventSubscriber implements EventSubscriberInterface
{
/**
* @var IIsApproveEventRequired
*/
private IIsApproveEventRequired $isApproveEventRequired;
/**
* @var IApproveEventRepository
*/
private IApproveEventRepository $approveEventRepository;
/**
* @var EventDispatcherInterface
*/
private EventDispatcherInterface $eventDispatcher;
/**
* @param IIsApproveEventRequired $isApproveEventRequired
* @param IApproveEventRepository $approveEventRepository
* @param EventDispatcherInterface $eventDispatcher
*/
public function __construct(
IIsApproveEventRequired $isApproveEventRequired,
IApproveEventRepository $approveEventRepository,
EventDispatcherInterface $eventDispatcher
)
{
$this->isApproveEventRequired = $isApproveEventRequired;
$this->approveEventRepository = $approveEventRepository;
$this->eventDispatcher = $eventDispatcher;
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
CalendarEvents::EVENT_AFTER_PERSIST => 'afterPersistEvent',
CalendarEvents::EVENT_POST_CREATE => 'eventPostCreate',
];
}
/**
* @param GenericEvent $genericEvent
* @return void
*/
public function afterPersistEvent(GenericEvent $genericEvent): void
{
/** @var Event $event */
$event = $genericEvent->getSubject();
if (!$this->isApproveEventRequired->perform($event, true)) {
return;
}
$approveEvent = new ApproveEventEntity($event);
$this->approveEventRepository->save($approveEvent);
$event->setApproveEvent($approveEvent);
$this->eventDispatcher->dispatch(new GenericEvent($event), CalendarEvents::EVENT_POST_REQUEST);
}
/**
* @param GenericEvent $genericEvent
* @return void
*/
public function eventPostCreate(GenericEvent $genericEvent)
{
/** @var EventInterface $event */
$event = $genericEvent->getSubject();
$approveEvent = $event->getApproveEvent();
if ($approveEvent && $approveEvent->getStatus() === ApproveEventStatus::STATUS_NEW) {
$approveEvent->approve();
$this->approveEventRepository->save($approveEvent);
}
}
}