EventProjectorMapProvisioner::factory()   A
last analyzed

Complexity

Conditions 2
Paths 1

Size

Total Lines 26
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 18
nc 1
nop 3
dl 0
loc 26
ccs 0
cts 11
cp 0
crap 6
rs 9.6666
c 1
b 0
f 0
1
<?php declare(strict_types=1);
2
/**
3
 * This file is part of the daikon-cqrs/boot project.
4
 *
5
 * For the full copyright and license information, please view the LICENSE
6
 * file that was distributed with this source code.
7
 */
8
9
namespace Daikon\Boot\Service\Provisioner;
10
11
use Auryn\Injector;
12
use Daikon\Boot\ReadModel\EventProjector;
13
use Daikon\Boot\Service\ServiceDefinitionInterface;
14
use Daikon\Config\ConfigProviderInterface;
15
use Daikon\ReadModel\Projector\EventProjectorMap;
16
use Daikon\ReadModel\Repository\RepositoryMap;
17
18
final class EventProjectorMapProvisioner implements ProvisionerInterface
19
{
20
    public function provision(
21
        Injector $injector,
22
        ConfigProviderInterface $configProvider,
23
        ServiceDefinitionInterface $serviceDefinition
24
    ): void {
25
        $projectorConfigs = (array)$configProvider->get('databases.projectors', []);
26
        $injector
27
            ->share(EventProjectorMap::class)
28
            ->delegate(
29
                EventProjectorMap::class,
30
                $this->factory($injector, $projectorConfigs, $serviceDefinition)
31
            );
32
    }
33
34
    private function factory(
35
        Injector $injector,
36
        array $projectorConfigs,
37
        ServiceDefinitionInterface $serviceDefinition
38
    ): callable {
39
        return function (RepositoryMap $repositoryMap) use (
40
            $injector,
41
            $projectorConfigs,
42
            $serviceDefinition
43
        ): EventProjectorMap {
44
            $settings = $serviceDefinition->getSettings();
45
            $defaultMatcher = $settings['matcher'] ?? EventProjector::class;
46
            $eventMatchers = [];
47
            foreach ($projectorConfigs as $projectorKey => $projectorConfig) {
48
                $projectorClass = $projectorConfig['class'];
49
                $projectorEvents = $projectorConfig['events'];
50
                $eventMatcher = $projectorConfig['matcher'] ?? $defaultMatcher;
51
                $eventMatchers[$projectorKey] = $injector->make($eventMatcher, [
52
                    ':eventExpressions' => $projectorEvents,
53
                    ':projector' => $injector->make(
54
                        $projectorClass,
55
                        [':repository' => $repositoryMap->get($projectorConfig['repository'])]
56
                    )
57
                ]);
58
            }
59
            return new EventProjectorMap($eventMatchers);
60
        };
61
    }
62
}
63