ScheduledEventsPlayer   A
last analyzed

Complexity

Total Complexity 4

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 4
lcom 1
cbo 7
dl 0
loc 62
ccs 23
cts 23
cp 1
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 12 1
A run() 0 9 1
A saveEventToStore() 0 8 1
A trySaveEventToStore() 0 9 1
1
<?php
2
/******************************************************************************
3
 * Copyright (c) 2016 Constantin Galbenu <[email protected]>             *
4
 ******************************************************************************/
5
6
namespace Gica\Cqrs\Scheduling;
7
8
9
use Gica\Cqrs\Command\CommandDispatcher\ConcurrentProofFunctionCaller;
10
use Gica\Cqrs\Event\EventDispatcher;
11
use Gica\Cqrs\EventStore;
12
use Gica\Cqrs\FutureEventsStore;
13
14
class ScheduledEventsPlayer
15
{
16
17
    /**
18
     * @var FutureEventsStore
19
     */
20
    private $futureEventsStore;
21
    /**
22
     * @var EventDispatcher
23
     */
24
    private $eventDispatcher;
25
    /**
26
     * @var EventStore
27
     */
28
    private $eventStore;
29
    /**
30
     * @var ConcurrentProofFunctionCaller
31
     */
32
    private $concurrentProofFunctionCaller;
33
34 1
    public function __construct(
35
        FutureEventsStore $futureEventsStore,
36
        EventDispatcher $eventDispatcher,
37
        EventStore $eventStore,
38
        ConcurrentProofFunctionCaller $functionCaller
39
    )
40
    {
41 1
        $this->futureEventsStore = $futureEventsStore;
42 1
        $this->eventDispatcher = $eventDispatcher;
43 1
        $this->eventStore = $eventStore;
44 1
        $this->concurrentProofFunctionCaller = $functionCaller;
45 1
    }
46
47
    public function run()
48
    {
49 1
        $this->futureEventsStore->loadAndProcessScheduledEvents(function (ScheduledEventWithMetadata $scheduledEvent) {
50
51 1
            $this->saveEventToStore($scheduledEvent);
52 1
            $this->eventDispatcher->dispatchEvent($scheduledEvent->getEventWithMetaData());
53
54 1
        });
55 1
    }
56
57
    private function saveEventToStore(ScheduledEventWithMetadata $scheduledEvent)
58
    {
59 1
        $this->concurrentProofFunctionCaller->executeFunction(function () use ($scheduledEvent) {
60 1
            $metaData = $scheduledEvent->getEventWithMetaData()->getMetaData();
61 1
            $aggregateVersion = $this->eventStore->getAggregateVersion($metaData->getAggregateClass(), $metaData->getAggregateId());
62 1
            $this->trySaveEventToStore($scheduledEvent, $aggregateVersion);
63 1
        }, 9999);
64 1
    }
65
66 1
    private function trySaveEventToStore(ScheduledEventWithMetadata $scheduledEvent, $version)
67
    {
68 1
        $eventWithMetaData = $scheduledEvent->getEventWithMetaData();
69 1
        $metaData = $eventWithMetaData->getMetaData();
70
71 1
        $expectedSequence = $this->eventStore->fetchLatestSequence();
72
73 1
        $this->eventStore->appendEventsForAggregate($metaData->getAggregateId(), $metaData->getAggregateClass(), [$eventWithMetaData], $version, $expectedSequence);
74
    }
75
}