Handler.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Signifyd\Controller\Webhooks;
  7. use Magento\Framework\App\Action\Action;
  8. use Magento\Framework\App\Action\Context;
  9. use Magento\Framework\App\Request\InvalidRequestException;
  10. use Magento\Framework\App\RequestInterface;
  11. use Magento\Framework\Exception\LocalizedException;
  12. use Magento\Signifyd\Api\CaseRepositoryInterface;
  13. use Magento\Signifyd\Model\CaseServices\UpdatingServiceFactory;
  14. use Magento\Signifyd\Model\Config;
  15. use Magento\Signifyd\Model\SignifydGateway\Response\WebhookMessageReader;
  16. use Magento\Signifyd\Model\SignifydGateway\Response\WebhookRequest;
  17. use Magento\Signifyd\Model\SignifydGateway\Response\WebhookRequestValidator;
  18. use Psr\Log\LoggerInterface;
  19. /**
  20. * Responsible for handling webhook posts from Signifyd service.
  21. *
  22. * @see https://www.signifyd.com/docs/api/#/reference/webhooks/
  23. */
  24. class Handler extends Action implements \Magento\Framework\App\CsrfAwareActionInterface
  25. {
  26. /**
  27. * Event topic of test webhook request.
  28. *
  29. * @var string
  30. */
  31. private static $eventTopicTest = 'cases/test';
  32. /**
  33. * @var WebhookRequest
  34. */
  35. private $webhookRequest;
  36. /**
  37. * @var LoggerInterface
  38. */
  39. private $logger;
  40. /**
  41. * @var WebhookMessageReader
  42. */
  43. private $webhookMessageReader;
  44. /**
  45. * @var UpdatingServiceFactory
  46. */
  47. private $caseUpdatingServiceFactory;
  48. /**
  49. * @var WebhookRequestValidator
  50. */
  51. private $webhookRequestValidator;
  52. /**
  53. * @var CaseRepositoryInterface
  54. */
  55. private $caseRepository;
  56. /**
  57. * @var Config
  58. */
  59. private $config;
  60. /**
  61. * @param Context $context
  62. * @param WebhookRequest $webhookRequest
  63. * @param LoggerInterface $logger
  64. * @param WebhookMessageReader $webhookMessageReader
  65. * @param UpdatingServiceFactory $caseUpdatingServiceFactory
  66. * @param WebhookRequestValidator $webhookRequestValidator
  67. * @param CaseRepositoryInterface $caseRepository
  68. * @param Config $config
  69. */
  70. public function __construct(
  71. Context $context,
  72. WebhookRequest $webhookRequest,
  73. LoggerInterface $logger,
  74. WebhookMessageReader $webhookMessageReader,
  75. UpdatingServiceFactory $caseUpdatingServiceFactory,
  76. WebhookRequestValidator $webhookRequestValidator,
  77. CaseRepositoryInterface $caseRepository,
  78. Config $config
  79. ) {
  80. parent::__construct($context);
  81. $this->webhookRequest = $webhookRequest;
  82. $this->logger = $logger;
  83. $this->webhookMessageReader = $webhookMessageReader;
  84. $this->caseUpdatingServiceFactory = $caseUpdatingServiceFactory;
  85. $this->webhookRequestValidator = $webhookRequestValidator;
  86. $this->caseRepository = $caseRepository;
  87. $this->config = $config;
  88. }
  89. /**
  90. * Processes webhook request data and updates case entity
  91. *
  92. * @return void
  93. */
  94. public function execute()
  95. {
  96. if ($this->config->isDebugModeEnabled()) {
  97. $this->logger->debug($this->webhookRequest->getEventTopic() . '|' . $this->webhookRequest->getBody());
  98. }
  99. if (!$this->webhookRequestValidator->validate($this->webhookRequest)) {
  100. $this->_redirect('noroute');
  101. return;
  102. }
  103. $webhookMessage = $this->webhookMessageReader->read($this->webhookRequest);
  104. if ($webhookMessage->getEventTopic() === self::$eventTopicTest) {
  105. return;
  106. }
  107. $data = $webhookMessage->getData();
  108. if (empty($data['caseId'])) {
  109. $this->_redirect('noroute');
  110. return;
  111. }
  112. $case = $this->caseRepository->getByCaseId($data['caseId']);
  113. if ($case === null) {
  114. $this->_redirect('noroute');
  115. return;
  116. }
  117. $caseUpdatingService = $this->caseUpdatingServiceFactory->create($webhookMessage->getEventTopic());
  118. try {
  119. $caseUpdatingService->update($case, $data);
  120. } catch (LocalizedException $e) {
  121. $this->getResponse()->setHttpResponseCode(400);
  122. $this->logger->critical($e);
  123. }
  124. }
  125. /**
  126. * @inheritDoc
  127. */
  128. public function createCsrfValidationException(RequestInterface $request): ?InvalidRequestException
  129. {
  130. return null;
  131. }
  132. /**
  133. * @inheritDoc
  134. */
  135. public function validateForCsrf(RequestInterface $request): ?bool
  136. {
  137. return true;
  138. }
  139. }