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

SagasOnlyOnceEventDispatcher::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 8
c 0
b 0
f 0
ccs 4
cts 4
cp 1
rs 9.4285
cc 1
eloc 5
nc 1
nop 2
crap 1
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
}