vendor/wns/security-compliance-suite/src/Logging/Subscriber/OrderStateSubscriber.php line 36

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace WnsSecurityComplianceSuite\Logging\Subscriber;
  4. use Shopware\Core\System\StateMachine\Event\StateMachineStateChangeEvent;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use WnsSecurityComplianceSuite\Logging\DTO\Log;
  7. use WnsSecurityComplianceSuite\Logging\Provider\SourceInfoProvider;
  8. use WnsSecurityComplianceSuite\Logging\Service\ActionLogger;
  9. final class OrderStateSubscriber implements EventSubscriberInterface
  10. {
  11. private ActionLogger $actionLogger;
  12. private SourceInfoProvider $sourceInfoProvider;
  13. public function __construct(
  14. ActionLogger $actionLogger,
  15. SourceInfoProvider $sourceInfoProvider
  16. ) {
  17. $this->actionLogger = $actionLogger;
  18. $this->sourceInfoProvider = $sourceInfoProvider;
  19. }
  20. public static function getSubscribedEvents()
  21. {
  22. return [
  23. 'state_machine.order.state_changed' => 'onStateChange',
  24. 'state_machine.order_delivery.state_changed' => 'onStateChange',
  25. 'state_machine.order_transaction.state_changed' => 'onStateChange',
  26. ];
  27. }
  28. public function onStateChange(StateMachineStateChangeEvent $event): void
  29. {
  30. // The specifics don't matter here - the important part is to avoid getting 2 hits per state change
  31. if ($event->getTransitionSide() !== StateMachineStateChangeEvent::STATE_MACHINE_TRANSITION_SIDE_ENTER) {
  32. return;
  33. }
  34. $contextSource = $event->getContext()->getSource();
  35. $source = $this->sourceInfoProvider->getSourceDTO($contextSource);
  36. $log = new Log(
  37. $event->getName(),
  38. $source,
  39. $this->assembleDetail($event),
  40. new \DateTimeImmutable(),
  41. );
  42. $this->actionLogger->log($log, $event->getSalesChannelId());
  43. }
  44. private function assembleDetail(StateMachineStateChangeEvent $event): array
  45. {
  46. return [
  47. 'entity' => $event->getTransition()
  48. ->getEntityName(),
  49. 'entityId' => $event->getTransition()
  50. ->getEntityId(),
  51. 'transition' => $event->getTransition()
  52. ->getTransitionName(),
  53. 'previousState' => [
  54. 'id' => $event->getPreviousState()
  55. ->getId(),
  56. 'technicalName' => $event->getPreviousState()
  57. ->getTechnicalName(),
  58. 'stateMachineId' => $event->getPreviousState()
  59. ->getStateMachineId(),
  60. ],
  61. 'nextState' => [
  62. 'id' => $event->getNextState()
  63. ->getId(),
  64. 'technicalName' => $event->getNextState()
  65. ->getTechnicalName(),
  66. 'stateMachineId' => $event->getNextState()
  67. ->getStateMachineId(),
  68. ],
  69. ];
  70. }
  71. }