<?php
declare(strict_types=1);
namespace App\V4\Webhook\EventSubscriber\PostPersistEvent;
use App\Model\Product\Product;
use App\Transformer\FQCNToShortNameTransformer;
use App\V4\Event\PostPersistEvent;
use App\V4\Model\Prospect\Prospect;
use App\V4\Model\Quote\Quote;
use App\V4\Model\Task\Task;
use App\V4\Security\AuthenticationManager;
use App\V4\Webhook\Enum\WebhookTriggeredOnEnum;
use App\V4\Webhook\Message\WebhookTriggeredMessage;
use App\V4\Webhook\Repository\WebhookRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\MessageBusInterface;
class SendAsyncWebhookHandleMessageEventSubscriber implements EventSubscriberInterface
{
/**
* @var AuthenticationManager
*/
private $authenticationManager;
/**
* @var MessageBusInterface
*/
private $messageBus;
/**
* @var WebhookRepository
*/
private $webhookRepository;
public function __construct(
AuthenticationManager $authenticationManager,
MessageBusInterface $messageBus,
WebhookRepository $webhookRepository
) {
$this->authenticationManager = $authenticationManager;
$this->messageBus = $messageBus;
$this->webhookRepository = $webhookRepository;
}
public static function getSubscribedEvents(): array
{
return [
PostPersistEvent::NAME => 'onPostPersist',
];
}
/**
* @SuppressWarnings(PHPMD.StaticAccess)
*/
public function onPostPersist(PostPersistEvent $event): void
{
$trigger = null === $event->getBefore()
? WebhookTriggeredOnEnum::CREATE
: WebhookTriggeredOnEnum::UPDATE;
$className = FQCNToShortNameTransformer::transform(get_class($event->getAfter()));
if (!$className) {
return;
}
$webhooks = $this->webhookRepository->getEnableWebhooksFor($trigger, $className);
if (0 === count($webhooks)) {
return;
}
//hotfix/2.44.4 : nécessaire pour éviter de sérialiser les fichiers lors du dispatch du message
$after = $event->getAfter();
if (in_array(get_class($after), [Prospect::class, Task::class, Quote::class, Product::class], true) && is_array($after->getCustomerFiles())) {
foreach ($after->getCustomerFiles() as $file) {
$file->setCustomerFile(null);
}
}
foreach ($webhooks as $webhook) {
$message = new WebhookTriggeredMessage(
$event,
$webhook->getId(),
$this->authenticationManager->getLoggedInUser()->getCustomerId()
);
$this->messageBus->dispatch($message);
}
}
}