vendor/shopware/core/Framework/Webhook/Subscriber/RetryWebhookMessageFailedSubscriber.php line 43

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework\Webhook\Subscriber;
  3. use Shopware\Core\Framework\Context;
  4. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  6. use Shopware\Core\Framework\Webhook\Event\RetryWebhookMessageFailedEvent;
  7. use Shopware\Core\Framework\Webhook\EventLog\WebhookEventLogDefinition;
  8. use Shopware\Core\Framework\Webhook\Message\WebhookEventMessage;
  9. use Shopware\Core\Framework\Webhook\WebhookEntity;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. class RetryWebhookMessageFailedSubscriber implements EventSubscriberInterface
  12. {
  13.     private const MAX_WEBHOOK_ERROR_COUNT 10;
  14.     private const MAX_DEAD_MESSAGE_ERROR_COUNT 2;
  15.     private EntityRepositoryInterface $deadMessageRepository;
  16.     private EntityRepositoryInterface $webhookRepository;
  17.     private EntityRepositoryInterface $webhookEventLogRepository;
  18.     /**
  19.      * @internal
  20.      */
  21.     public function __construct(
  22.         EntityRepositoryInterface $deadMessageRepository,
  23.         EntityRepositoryInterface $webhookRepository,
  24.         EntityRepositoryInterface $webhookEventLogRepository
  25.     ) {
  26.         $this->deadMessageRepository $deadMessageRepository;
  27.         $this->webhookRepository $webhookRepository;
  28.         $this->webhookEventLogRepository $webhookEventLogRepository;
  29.     }
  30.     public static function getSubscribedEvents(): array
  31.     {
  32.         return [RetryWebhookMessageFailedEvent::class => ['handleWebhookMessageFail']];
  33.     }
  34.     public function handleWebhookMessageFail(RetryWebhookMessageFailedEvent $event): void
  35.     {
  36.         $deadMessage $event->getDeadMessage();
  37.         $context $event->getContext();
  38.         if ($deadMessage->getErrorCount() < self::MAX_DEAD_MESSAGE_ERROR_COUNT) {
  39.             return;
  40.         }
  41.         /** @var WebhookEventMessage $webhookEventMessage */
  42.         $webhookEventMessage $deadMessage->getOriginalMessage();
  43.         $webhookId $webhookEventMessage->getWebhookId();
  44.         $webhookEventLogId $webhookEventMessage->getWebhookEventId();
  45.         $this->deleteDeadMessage($deadMessage->getId(), $context);
  46.         $this->markWebhookEventFailed($webhookEventLogId$context);
  47.         /** @var WebhookEntity|null $webhook */
  48.         $webhook $this->webhookRepository
  49.             ->search(new Criteria([$webhookId]), $context)
  50.             ->get($webhookId);
  51.         if ($webhook === null || !$webhook->isActive()) {
  52.             return;
  53.         }
  54.         $webhookErrorCount $webhook->getErrorCount() + 1;
  55.         $params = [
  56.             'id' => $webhook->getId(),
  57.             'errorCount' => $webhookErrorCount,
  58.         ];
  59.         if ($webhookErrorCount >= self::MAX_WEBHOOK_ERROR_COUNT) {
  60.             $params array_merge($params, [
  61.                 'errorCount' => 0,
  62.                 'active' => false,
  63.             ]);
  64.         }
  65.         $this->webhookRepository->update([$params], $context);
  66.     }
  67.     private function deleteDeadMessage(string $deadMessageIdContext $context): void
  68.     {
  69.         $this->deadMessageRepository->delete([
  70.             [
  71.                 'id' => $deadMessageId,
  72.             ],
  73.         ], $context);
  74.     }
  75.     private function markWebhookEventFailed(string $webhookEventLogIdContext $context): void
  76.     {
  77.         $this->webhookEventLogRepository->update([
  78.             [
  79.                 'id' => $webhookEventLogId,
  80.                 'deliveryStatus' => WebhookEventLogDefinition::STATUS_FAILED,
  81.             ],
  82.         ], $context);
  83.     }
  84. }