Completed
Push — master ( 3d4711...74b130 )
by Constantin
04:05
created

tryToExtractEventClassFromParameter()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3.0416

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 5
cts 6
cp 0.8333
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 6
nc 3
nop 1
crap 3.0416
1
<?php
2
/******************************************************************************
3
 * Copyright (c) 2016 Constantin Galbenu <[email protected]>             *
4
 ******************************************************************************/
5
6
namespace Gica\Cqrs\ReadModel;
7
8
9
use Gica\CodeAnalysis\Shared\ClassComparison\SubclassComparator;
10
use Gica\Cqrs\Event;
11
use Gica\Cqrs\Event\EventsApplier\EventsApplierOnListener;
12
use Gica\Cqrs\EventStore;
13
use Psr\Log\LoggerInterface;
14
15
class ReadModelRecreator
16
{
17
18
    /**
19
     * @var EventStore
20
     */
21
    private $eventStore;
22
    /**
23
     * @var EventsApplierOnListener
24
     */
25
    private $eventsApplierOnListener;
26
    /**
27
     * @var LoggerInterface
28
     */
29
    private $logger;
30
31 1
    public function __construct(
32
        EventStore $eventStore,
33
        EventsApplierOnListener $eventsApplier,
34
        LoggerInterface $logger
35
    )
36
    {
37 1
        $this->eventStore = $eventStore;
38 1
        $this->eventsApplierOnListener = $eventsApplier;
39 1
        $this->logger = $logger;
40 1
    }
41
42 1
    public function recreateRead(ReadModelInterface $readModel)
43
    {
44 1
        $eventClasses = $this->getListenerEventClasses(get_class($readModel));
45
46 1
        $this->logger->info(print_r($eventClasses, true));
47 1
        $this->logger->info("loading events...");
48 1
        $allEvents = $this->eventStore->loadEventsByClassNames($eventClasses);
49
50 1
        $this->logger->info("applying events...");
51
52 1
        $this->eventsApplierOnListener->applyEventsOnListener($readModel, $allEvents);
53 1
    }
54
55 1
    private function getListenerEventClasses(string $readModelClass)
56
    {
57 1
        $result = [];
58
59 1
        $classReflection = new \ReflectionClass($readModelClass);
60
61 1
        foreach ($classReflection->getMethods() as $reflectionMethod) {
62 1
            $eventClass = $this->tryToExtractEventClassFromMethod($reflectionMethod);
63
64 1
            if (false !== $eventClass) {
65 1
                $result[] = $eventClass;
66
            }
67
        }
68
69 1
        return $result;
70
    }
71
72 1
    private function tryToExtractEventClassFromMethod(\ReflectionMethod $reflectionMethod)
73
    {
74 1
        foreach ($reflectionMethod->getParameters() as $reflectionParameter) {
75 1
            $eventClass = $this->tryToExtractEventClassFromParameter($reflectionParameter);
76
77 1
            if (false !== $eventClass) {
78 1
                return $eventClass;
79
            }
80
        }
81
82 1
        return false;
83
    }
84
85 1
    private function tryToExtractEventClassFromParameter(\ReflectionParameter $reflectionParameter)
86
    {
87 1
        if (!$reflectionParameter->getClass())
88 1
            return false;
89
90 1
        if ((new SubclassComparator())->isASubClassButNoSameClass($reflectionParameter->getClass()->name, Event::class)) {
91 1
            return $reflectionParameter->getClass()->name;
92
        }
93
94
        return false;
95
    }
96
}