Completed
Push — master ( 6b9dac...24d110 )
by Constantin
02:54
created

SagasOnlyOnceEventDispatcher   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 38
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
dl 0
loc 38
c 0
b 0
f 0
wmc 5
lcom 1
cbo 4
ccs 14
cts 14
cp 1
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
A dispatchEvent() 0 18 4
1
<?php
2
/**
3
 * Copyright (c) 2017 Constantin Galbenu <[email protected]>
4
 */
5
6
namespace Gica\Cqrs\Saga;
7
8
9
use Gica\Cqrs\Event\EventSubscriber;
10
use Gica\Cqrs\Event\EventWithMetaData;
11
12
class SagasOnlyOnceEventDispatcher implements \Gica\Cqrs\Event\EventDispatcher
13
{
14
15
    /** @var EventSubscriber */
16
    private $eventSubscriber;
17
    /**
18
     * @var SagaRepository
19
     */
20
    private $sagaRepository;
21
22 3
    public function __construct(
23
        SagaRepository $sagaRepository,
24
        EventSubscriber $eventSubscriber
25
    )
26
    {
27 3
        $this->eventSubscriber = $eventSubscriber;
28 3
        $this->sagaRepository = $sagaRepository;
29 3
    }
30
31 3
    public function dispatchEvent(EventWithMetaData $eventWithMetaData)
32
    {
33 3
        $listeners = $this->eventSubscriber->getListenersForEvent($eventWithMetaData->getEvent());
34
35 3
        foreach ($listeners as $listener) {
36 3
            $metaData = $eventWithMetaData->getMetaData();
37
38 3
            if (is_array($listener)) {
39 3
                $saga = $listener[0];
40
41 3
                if (!$this->sagaRepository->isEventAlreadyDispatched(get_class($saga), $metaData->getSequence(), $metaData->getIndex())) {
42 2
                    call_user_func($listener, $eventWithMetaData->getEvent(), $metaData);
43
44 2
                    $this->sagaRepository->persistLastProcessedEventBySaga(get_class($saga), $metaData->getSequence(), $metaData->getIndex());
45
                }
46
            }
47
        }
48
    }
49
}