- <?php declare(strict_types=1);
- namespace Shopware\Core\Framework\Event;
- use Psr\EventDispatcher\StoppableEventInterface;
- use Shopware\Core\Framework\Context;
- use Shopware\Core\Framework\DataAbstractionLayer\DefinitionInstanceRegistry;
- use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
- use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
- use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
- use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\OrFilter;
- use Shopware\Core\Framework\Event\EventAction\EventActionCollection;
- use Shopware\Core\Framework\Event\EventAction\EventActionDefinition;
- use Shopware\Core\Framework\Feature;
- use Shopware\Core\Framework\Log\Package;
- use Symfony\Component\EventDispatcher\EventDispatcherInterface;
- use Symfony\Component\EventDispatcher\EventSubscriberInterface;
- /**
-  * @deprecated tag:v6.5.0 - reason:remove-decorator - Will be removed in v6.5.0, use FlowDispatcher instead.
-  */
- #[Package('business-ops')]
- class BusinessEventDispatcher implements EventDispatcherInterface
- {
-     /**
-      * @var EventDispatcherInterface
-      */
-     private $dispatcher;
-     /**
-      * @var EventActionDefinition
-      */
-     private $eventActionDefinition;
-     /**
-      * @var DefinitionInstanceRegistry
-      */
-     private $definitionRegistry;
-     /**
-      * @internal
-      */
-     public function __construct(
-         EventDispatcherInterface $dispatcher,
-         DefinitionInstanceRegistry $definitionRegistry,
-         EventActionDefinition $eventActionDefinition
-     ) {
-         $this->dispatcher = $dispatcher;
-         $this->eventActionDefinition = $eventActionDefinition;
-         $this->definitionRegistry = $definitionRegistry;
-     }
-     public function dispatch($event, ?string $eventName = null): object
-     {
-         $event = $this->dispatcher->dispatch($event, $eventName);
-         if (Feature::isActive('FEATURE_NEXT_17858')) {
-             return $event;
-         }
-         if (!$event instanceof BusinessEventInterface || $event instanceof FlowEvent) {
-             return $event;
-         }
-         if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) {
-             return $event;
-         }
-         $this->callActions($event);
-         return $event;
-     }
-     /**
-      * @param callable $listener can not use native type declaration @see https://github.com/symfony/symfony/issues/42283
-      */
-     public function addListener(string $eventName, $listener, int $priority = 0): void
-     {
-         $this->dispatcher->addListener($eventName, $listener, $priority);
-     }
-     public function addSubscriber(EventSubscriberInterface $subscriber): void
-     {
-         $this->dispatcher->addSubscriber($subscriber);
-     }
-     /**
-      * @param callable $listener can not use native type hint as it is incompatible with symfony <5.3.4
-      */
-     public function removeListener(string $eventName, $listener): void
-     {
-         $this->dispatcher->removeListener($eventName, $listener);
-     }
-     public function removeSubscriber(EventSubscriberInterface $subscriber): void
-     {
-         $this->dispatcher->removeSubscriber($subscriber);
-     }
-     public function getListeners(?string $eventName = null): array
-     {
-         return $this->dispatcher->getListeners($eventName);
-     }
-     /**
-      * @param callable $listener can not use native type hint as it is incompatible with symfony <5.3.4
-      */
-     public function getListenerPriority(string $eventName, $listener): ?int
-     {
-         return $this->dispatcher->getListenerPriority($eventName, $listener);
-     }
-     public function hasListeners(?string $eventName = null): bool
-     {
-         return $this->dispatcher->hasListeners($eventName);
-     }
-     private function getActions(BusinessEventInterface $event, Context $context): EventActionCollection
-     {
-         $name = $event->getName();
-         $criteria = new Criteria();
-         $criteria->setTitle('business-events::' . $event->getName());
-         $criteria->addFilter(new EqualsFilter('event_action.eventName', $name));
-         $criteria->addFilter(new EqualsFilter('event_action.active', true));
-         $criteria->addFilter(new OrFilter([
-             new EqualsFilter('event_action.rules.id', null),
-             new EqualsAnyFilter('event_action.rules.id', $context->getRuleIds()),
-         ]));
-         if ($event instanceof SalesChannelAware) {
-             $criteria->addFilter(new OrFilter([
-                 new EqualsFilter('salesChannels.id', $event->getSalesChannelId()),
-                 new EqualsFilter('salesChannels.id', null),
-             ]));
-         }
-         /** @var EventActionCollection $events */
-         $events = $this->definitionRegistry
-             ->getRepository($this->eventActionDefinition->getEntityName())
-             ->search($criteria, $context)
-             ->getEntities();
-         return $events;
-     }
-     private function callActions(BusinessEventInterface $event): void
-     {
-         $actions = $this->getActions($event, $event->getContext());
-         foreach ($actions as $action) {
-             $actionEvent = new BusinessEvent($action->getActionName(), $event, $action->getConfig());
-             $this->dispatcher->dispatch($actionEvent, $actionEvent->getActionName());
-         }
-         $globalEvent = new BusinessEvent(BusinessEvents::GLOBAL_EVENT, $event);
-         $this->dispatcher->dispatch($globalEvent, $globalEvent->getActionName());
-     }
- }
-