Completed
Push — master ( 5c8f47...4321c6 )
by Constantin
04:44
created

ReadModelRecreator::findMethodsByEventClass()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 12
ccs 6
cts 6
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 6
nc 3
nop 2
crap 3
1
<?php
2
/******************************************************************************
3
 * Copyright (c) 2016 Constantin Galbenu <[email protected]>             *
4
 ******************************************************************************/
5
6
namespace Gica\Cqrs\ReadModel;
7
8
9
use Gica\CodeAnalysis\MethodListenerDiscovery;
10
use Gica\CodeAnalysis\MethodListenerDiscovery\ListenerClassValidator\AnyPhpClassIsAccepted;
11
use Gica\CodeAnalysis\MethodListenerDiscovery\ListenerMethod;
12
use Gica\CodeAnalysis\Shared\ClassSorter\ByConstructorDependencySorter;
13
use Gica\Cqrs\Command\CodeAnalysis\ReadModelEventHandlerDetector;
14
use Gica\Cqrs\Event\EventWithMetaData;
15
use Gica\Cqrs\EventStore;
16
use Psr\Log\LoggerInterface;
17
18
class ReadModelRecreator
19
{
20
21
    /**
22
     * @var EventStore
23
     */
24
    private $eventStore;
25
    /**
26
     * @var LoggerInterface
27
     */
28
    private $logger;
29
30 1
    public function __construct(
31
        EventStore $eventStore,
32
        LoggerInterface $logger
33
    )
34
    {
35 1
        $this->eventStore = $eventStore;
36 1
        $this->logger = $logger;
37 1
    }
38
39 1
    public function recreateRead(ReadModelInterface $readModel)
40
    {
41 1
        $discoverer = new MethodListenerDiscovery(
42 1
            new ReadModelEventHandlerDetector(),
43 1
            new AnyPhpClassIsAccepted(),
44 1
            new ByConstructorDependencySorter()
45
        );
46
47 1
        $allMethods = $discoverer->findListenerMethodsInClass(get_class($readModel));
48
49 1
        $eventClasses = $this->getEventClassesFromMethods($allMethods);
50
51 1
        $this->logger->info(print_r($eventClasses, true));
52 1
        $this->logger->info("loading events...");
53
54 1
        $allEvents = $this->eventStore->loadEventsByClassNames($eventClasses);
55
56 1
        $this->logger->info("applying events...");
57
58 1
        foreach ($allEvents as $eventWithMetadata) {
59
            /** @var EventWithMetaData $eventWithMetadata */
60 1
            $methods = $this->findMethodsByEventClass(get_class($eventWithMetadata->getEvent()), $allMethods);
61
62 1
            foreach ($methods as $method) {
63
64 1
                call_user_func([$readModel, $method->getMethodName()], $eventWithMetadata->getEvent(), $eventWithMetadata->getMetaData());
65
            }
66
        }
67 1
    }
68
69
    /**
70
     * @param ListenerMethod[] $methods
71
     * @return array
72
     */
73 1
    private function getEventClassesFromMethods($methods)
74
    {
75 1
        $eventClasses = [];
76 1
        foreach ($methods as $listenerMethod) {
77 1
            $eventClasses[] = $listenerMethod->getEventClassName();
78
        }
79
80 1
        return $eventClasses;
81
    }
82
83
    /**
84
     * @param string $eventClass
85
     * @param ListenerMethod[] $allMethods
86
     * @return ListenerMethod[]
87
     */
88 1
    private function findMethodsByEventClass(string $eventClass, $allMethods)
89
    {
90 1
        $result = [];
91
92 1
        foreach ($allMethods as $listenerMethod) {
93 1
            if ($listenerMethod->getEventClassName() == $eventClass) {
94 1
                $result[] = $listenerMethod;
95
            }
96
        }
97
98 1
        return $result;
99
    }
100
}