Passed
Push — develop ( 3b0ceb...9dc7fc )
by Brent
02:07
created

CollectionAdapter::createMetaVariable()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 7
nc 4
nop 1
dl 0
loc 14
ccs 7
cts 7
cp 1
crap 3
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace Stitcher\Page\Adapter;
4
5
use Stitcher\Page\Adapter;
6
use Stitcher\Exception\InvalidConfiguration;
7
use Stitcher\Configureable;
8
use Stitcher\Variable\VariableParser;
9
10
class CollectionAdapter implements Adapter, Configureable
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->isValidConfiguration($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 isValidConfiguration($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) ?? $variable;
56
57 8
        return $entries;
58
    }
59
60 8
    protected function createEntryConfiguration(array $pageConfiguration, $entryId, $entry): array
61
    {
62 8
        $entryConfiguration = $pageConfiguration;
63 8
        $parsedEntryId = str_replace('{' . $this->parameter . '}', $entryId, $pageConfiguration['id']);
64 8
        $entryConfiguration['id'] = $parsedEntryId;
65 8
        $entryConfiguration['variables'][$this->variable] = $entry;
66 8
        $entryConfiguration['variables']['meta'] = array_merge(
67 8
            $entryConfiguration['variables']['meta'] ?? [],
68 8
            $this->createMetaVariable($entryConfiguration)
69
        );
70
71 8
        unset($entryConfiguration['config']['collection']);
72
73 8
        return $entryConfiguration;
74
    }
75
76 8
    protected function createMetaVariable(array $entryConfiguration): array
77
    {
78 8
        $meta = [];
79
80 8
        if ($title = $this->getTitleMeta($entryConfiguration)) {
81 6
            $meta['title'] = $title;
82
        }
83
84 8
        if ($description = $this->getDescriptionMeta($entryConfiguration)) {
85 1
            $meta['description'] = $description;
86
        }
87
88 8
        return $meta;
89
    }
90
91 8
    protected function getTitleMeta(array $entryConfiguration): ?string
92
    {
93 8
        $title = $entryConfiguration['variables'][$this->variable]['meta']['title']
94 8
            ?? $entryConfiguration['variables'][$this->variable]['title']
95 8
            ?? null;
96
97 8
        return $title;
98
    }
99
100 8
    protected function getDescriptionMeta(array $entryConfiguration): ?string
101
    {
102 8
        $description = $entryConfiguration['variables'][$this->variable]['meta']['description']
103 8
            ?? $entryConfiguration['variables'][$this->variable]['description']
104 8
            ?? null;
105
106 8
        return $description;
107
    }
108
}
109