<?php
namespace App\V4\EventSubscriber\CustomEventTrigger;
use App\Service\PreSendSerializer;
use App\V4\Builder\CustomEventTrigger\CustomEventTriggerBuilder;
use App\V4\Entity\CustomEventTrigger;
use App\V4\Event\PostPersistEvent;
use App\V4\EventSubscriber\AbstractSubscriber;
use App\V4\Model\ChildrenAwareInterface;
use App\V4\Model\Prospect\Prospect;
use App\V4\Model\Quote\Quote;
use App\V4\Repository\CustomEventTriggerRepository;
use App\V4\Transformer\FQCNToShortNameTransformer;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Serializer\Exception\ExceptionInterface;
class CustomEventTriggerPostPersistSubscriber extends AbstractSubscriber implements EventSubscriberInterface
{
/**
* @var CustomEventTriggerRepository
*/
private $customEventTriggerRepository;
/**
* @var CustomEventTriggerBuilder
*/
private $customEventTriggerBuilder;
/**
* @var PreSendSerializer
*/
private $serializer;
/**
* @param CustomEventTriggerRepository $customEventTriggerRepository
* @param CustomEventTriggerBuilder $customEventTriggerBuilder
* @param PreSendSerializer $serializer
*/
public function __construct(
customEventTriggerRepository $customEventTriggerRepository,
CustomEventTriggerBuilder $customEventTriggerBuilder,
PreSendSerializer $serializer
) {
$this->customEventTriggerRepository = $customEventTriggerRepository;
$this->customEventTriggerBuilder = $customEventTriggerBuilder;
$this->serializer = $serializer;
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
PostPersistEvent::NAME => 'onPostPersist',
];
}
/**
* @param $entity
*
* @return bool
*/
public function supports($entity): bool
{
if (!$entity instanceof Quote && !$entity instanceof Prospect) {
return false;
}
if ($entity instanceof ChildrenAwareInterface && $entity->isSplit()) {
return false;
}
return true;
}
/**
* @throws ExceptionInterface
*/
public function onPostPersist(PostPersistEvent $event): void
{
$entity = $event->getAfter();
if (!$this->supports($entity) || $this->isIdAlreadyManaged($entity->getId(), get_class($this))) {
return;
}
if (method_exists($entity, 'getCustomerFiles')) {
$files = $entity->getCustomerFiles();
$entity->setCustomerFiles([]);
}
$customEventTriggers = $this
->customEventTriggerRepository
->searchByEntityAndWhenApply(
(new FQCNToShortNameTransformer())->transform(get_class($entity)),
CustomEventTrigger::WHEN_POST_PERSIST
)
;
foreach ($customEventTriggers as $customEventTrigger) {
$entitySerialized = $this->serializer->serialize($entity);
$this
->customEventTriggerBuilder
->getBuilder($entitySerialized, $customEventTrigger)
->apply($entitySerialized, $customEventTrigger)
;
}
if (isset($files)) {
$entity->setCustomerFiles($files);
}
}
}