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

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. /**
  12.  * @deprecated tag:v6.5.0 - reason:becomes-internal - EventSubscribers will become internal in v6.5.0
  13.  */
  14. class RetryWebhookMessageFailedSubscriber implements EventSubscriberInterface
  15. {
  16.     private const MAX_WEBHOOK_ERROR_COUNT 10;
  17.     private const MAX_DEAD_MESSAGE_ERROR_COUNT 2;
  18.     private EntityRepositoryInterface $deadMessageRepository;
  19.     private EntityRepositoryInterface $webhookRepository;
  20.     private EntityRepositoryInterface $webhookEventLogRepository;
  21.     /**
  22.      * @internal
  23.      */
  24.     public function __construct(
  25.         EntityRepositoryInterface $deadMessageRepository,
  26.         EntityRepositoryInterface $webhookRepository,
  27.         EntityRepositoryInterface $webhookEventLogRepository
  28.     ) {
  29.         $this->deadMessageRepository $deadMessageRepository;
  30.         $this->webhookRepository $webhookRepository;
  31.         $this->webhookEventLogRepository $webhookEventLogRepository;
  32.     }
  33.     public static function getSubscribedEvents(): array
  34.     {
  35.         return [RetryWebhookMessageFailedEvent::class => ['handleWebhookMessageFail']];
  36.     }
  37.     public function handleWebhookMessageFail(RetryWebhookMessageFailedEvent $event): void
  38.     {
  39.         $deadMessage $event->getDeadMessage();
  40.         $context $event->getContext();
  41.         if ($deadMessage->getErrorCount() < self::MAX_DEAD_MESSAGE_ERROR_COUNT) {
  42.             return;
  43.         }
  44.         /** @var WebhookEventMessage $webhookEventMessage */
  45.         $webhookEventMessage $deadMessage->getOriginalMessage();
  46.         $webhookId $webhookEventMessage->getWebhookId();
  47.         $webhookEventLogId $webhookEventMessage->getWebhookEventId();
  48.         $this->deleteDeadMessage($deadMessage->getId(), $context);
  49.         $this->markWebhookEventFailed($webhookEventLogId$context);
  50.         /** @var WebhookEntity|null $webhook */
  51.         $webhook $this->webhookRepository
  52.             ->search(new Criteria([$webhookId]), $context)
  53.             ->get($webhookId);
  54.         if ($webhook === null || !$webhook->isActive()) {
  55.             return;
  56.         }
  57.         $webhookErrorCount $webhook->getErrorCount() + 1;
  58.         $params = [
  59.             'id' => $webhook->getId(),
  60.             'errorCount' => $webhookErrorCount,
  61.         ];
  62.         if ($webhookErrorCount >= self::MAX_WEBHOOK_ERROR_COUNT) {
  63.             $params array_merge($params, [
  64.                 'errorCount' => 0,
  65.                 'active' => false,
  66.             ]);
  67.         }
  68.         $this->webhookRepository->update([$params], $context);
  69.     }
  70.     private function deleteDeadMessage(string $deadMessageIdContext $context): void
  71.     {
  72.         $this->deadMessageRepository->delete([
  73.             [
  74.                 'id' => $deadMessageId,
  75.             ],
  76.         ], $context);
  77.     }
  78.     private function markWebhookEventFailed(string $webhookEventLogIdContext $context): void
  79.     {
  80.         $this->webhookEventLogRepository->update([
  81.             [
  82.                 'id' => $webhookEventLogId,
  83.                 'deliveryStatus' => WebhookEventLogDefinition::STATUS_FAILED,
  84.             ],
  85.         ], $context);
  86.     }
  87. }