Passed
Push — develop ( ec1e42...80559e )
by Brent
03:22
created

CollectionAdapter::createEntryConfiguration()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 10
nc 1
nop 3
dl 0
loc 15
ccs 10
cts 10
cp 1
crap 1
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace Stitcher\Page\Adapter;
4
5
use Stitcher\Adapter;
6
use Stitcher\Exception\InvalidConfiguration;
7
use Stitcher\Validatory;
8
use Stitcher\Variable\VariableParser;
9
10
class CollectionAdapter implements Adapter, Validatory
11
{
12
    private $parameter;
13
    private $variable;
14
    private $variableParser;
15
16 9
    public function __construct(array $adapterConfiguration, VariableParser $variableParser)
17
    {
18 9
        if (! $this->isValid($adapterConfiguration)) {
19
            throw InvalidConfiguration::invalidAdapterConfiguration('collection', '`variable` and `parameter`');
20
        }
21
22 9
        $this->variable = $adapterConfiguration['variable'];
23 9
        $this->parameter = $adapterConfiguration['parameter'];
24 9
        $this->variableParser = $variableParser;
25 9
    }
26
27 9
    public static function make(array $adapterConfiguration, VariableParser $variableParser)
28
    {
29 9
        return new self($adapterConfiguration, $variableParser);
30
    }
31
32 8
    public function transform(array $pageConfiguration): array
33
    {
34 8
        $entries = $this->getEntries($pageConfiguration);
35 8
        $collectionPageConfiguration = [];
36
37 8
        foreach ($entries as $entryId => $entry) {
38 8
            $entryConfiguration = $this->createEntryConfiguration($pageConfiguration, $entryId, $entry);
39
40 8
            $collectionPageConfiguration[$entryConfiguration['id']] = $entryConfiguration;
41
        }
42
43 8
        return $collectionPageConfiguration;
44
    }
45
46 9
    public function isValid($subject): bool
47
    {
48 9
        return is_array($subject) && isset($subject['variable']) && isset($subject['parameter']);
49
    }
50
51 8
    protected function getEntries($pageConfiguration): array
52
    {
53 8
        $variable = $pageConfiguration['variables'][$this->variable] ?? null;
54
55 8
        $entries = $this->variableParser->parse($variable)
56 8
            ?? $variable;
57
58 8
        return $entries;
59
    }
60
61 8
    protected function createEntryConfiguration(array $pageConfiguration, $entryId, $entry): array
62
    {
63 8
        $entryConfiguration = $pageConfiguration;
64 8
        $parsedEntryId = str_replace('{' . $this->parameter . '}', $entryId, $pageConfiguration['id']);
65 8
        $entryConfiguration['id'] = $parsedEntryId;
66 8
        $entryConfiguration['variables'][$this->variable] = $entry;
67 8
        $entryConfiguration['variables']['meta'] = array_merge(
68 8
            $entryConfiguration['variables']['meta'] ?? [],
69 8
            $this->createMetaVariable($entryConfiguration)
70
        );
71
72 8
        unset($entryConfiguration['config']['collection']);
73
74 8
        return $entryConfiguration;
75
    }
76
77 8
    protected function createMetaVariable(array $entryConfiguration): array
78
    {
79 8
        $meta = [];
80
81 8
        if ($title = $this->getTitleMeta($entryConfiguration)) {
82 6
            $meta['title'] = $title;
83
        }
84
85 8
        if ($description = $this->getDescriptionMeta($entryConfiguration)) {
86 1
            $meta['description'] = $description;
87
        }
88
89 8
        return $meta;
90
    }
91
92 8
    protected function getTitleMeta(array $entryConfiguration): ?string
93
    {
94 8
        $title = $entryConfiguration['variables'][$this->variable]['meta']['title']
95 8
            ?? $entryConfiguration['variables'][$this->variable]['title']
96 8
            ?? null;
97
98 8
        return $title;
99
    }
100
101 8
    protected function getDescriptionMeta(array $entryConfiguration): ?string
102
    {
103 8
        $description = $entryConfiguration['variables'][$this->variable]['meta']['description']
104 8
            ?? $entryConfiguration['variables'][$this->variable]['description']
105 8
            ?? null;
106
107 8
        return $description;
108
    }
109
}
110