Issues (135)

src/Saga/SagaEventHandler.php (1 issue)

Labels
Severity
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Gember\EventSourcing\Saga;
6
7
use Gember\EventSourcing\Registry\Saga\SagaRegistry;
8
use Gember\EventSourcing\Resolver\Common\SagaId\SagaIdDefinition;
9
use Gember\EventSourcing\Resolver\Common\SagaId\SagaIdValueHelper;
10
use Gember\EventSourcing\Resolver\DomainEvent\DomainEventResolver;
11
use Gember\EventSourcing\Resolver\Saga\SagaDefinition;
12
use Gember\EventSourcing\Resolver\Saga\SagaEventSubscriberDefinition;
13
use Generator;
14
15
final readonly class SagaEventHandler
0 ignored issues
show
A parse error occurred: Syntax error, unexpected T_READONLY, expecting T_CLASS on line 15 at column 6
Loading history...
16
{
17 2
    public function __construct(
18
        private DomainEventResolver $domainEventResolver,
19
        private SagaRegistry $sagaRegistry,
20
        private SagaEventExecutor $sagaEventExecutor,
21 2
    ) {}
22
23 2
    public function __invoke(object $event): void
24
    {
25 2
        foreach ($this->getSagaDefinitionsForEvent($event) as [$sagaDefinition, $sagaIdDefinition, $eventSubscriberDefinition]) {
26 2
            $sagaId = SagaIdValueHelper::getSagaIdValue($event, $sagaIdDefinition);
27
28 2
            if ($sagaId === null) {
29
                continue;
30
            }
31
32 2
            $this->sagaEventExecutor->execute(
33 2
                $event,
34 2
                $eventSubscriberDefinition,
35 2
                $sagaDefinition->sagaClassName,
36 2
                $eventSubscriberDefinition->methodName,
37 2
                $sagaId,
38 2
            );
39
        }
40
    }
41
42
    /**
43
     * @return Generator<array{SagaDefinition, SagaIdDefinition, SagaEventSubscriberDefinition}>
44
     */
45 2
    private function getSagaDefinitionsForEvent(object $event): Generator
46
    {
47
        // Get all Saga ids in event
48 2
        foreach ($this->domainEventResolver->resolve($event::class)->sagaIds as $sagaIdDefinition) {
49
            // Get all Sagas linked to SagaIds (by saga id name)
50 2
            foreach ($this->sagaRegistry->retrieve($sagaIdDefinition->sagaIdName) as $sagaDefinition) {
51
                // Get subscribers for given event from these Sagas
52 2
                foreach ($sagaDefinition->eventSubscribers as $eventSubscriberDefinition) {
53 2
                    if ($eventSubscriberDefinition->eventClassName !== $event::class) {
54 2
                        continue;
55
                    }
56
57 2
                    yield [$sagaDefinition, $sagaIdDefinition, $eventSubscriberDefinition];
58
                }
59
            }
60
        }
61
    }
62
}
63