Passed
Branch v2 (aaaa8e)
by Brent
03:38
created

PaginationAdapter   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 117
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 2
dl 0
loc 117
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 2
A make() 0 4 1
A transform() 0 21 2
A isValid() 0 4 2
A getEntries() 0 9 1
A createPageConfiguration() 0 19 1
A createPaginationVariable() 0 9 1
A createPreviousPagination() 0 13 2
A createNextPagination() 0 13 2
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 PaginationAdapter implements Adapter, Validatory
11
{
12
    private $variableParser;
13
    private $variable;
14
    private $perPage;
15
16
    public function __construct(array $adapterConfiguration, VariableParser $variableParser)
17
    {
18
        if (! $this->isValid($adapterConfiguration)) {
19
            throw InvalidConfiguration::invalidAdapterConfiguration('pagination', '`variable`, `perPage`');
20
        }
21
22
        $this->variable = $adapterConfiguration['variable'];
23
        $this->perPage = $adapterConfiguration['perPage'] ?? 12;
24
        $this->variableParser = $variableParser;
25
    }
26
27
    public static function make(array $adapterConfiguration, VariableParser $variableParser): PaginationAdapter
28
    {
29
        return new self($adapterConfiguration, $variableParser);
30
    }
31
32
    public function transform(array $pageConfiguration): array
33
    {
34
        $paginationPageConfiguration = [];
35
        $entries = $this->getEntries($pageConfiguration);
36
        $pageCount = (int) ceil(count($entries) / $this->perPage);
37
38
        for ($pageIndex = 1; $pageIndex <= $pageCount; $pageIndex++) {
39
            $entriesForPage = array_splice($entries, 0, $this->perPage);
40
41
            $entryConfiguration = $this->createPageConfiguration(
42
                $pageConfiguration,
43
                $entriesForPage,
44
                $pageIndex,
45
                $pageCount
46
            );
47
48
            $paginationPageConfiguration[$entryConfiguration['id']] = $entryConfiguration;
49
        }
50
51
        return $paginationPageConfiguration;
52
    }
53
54
    public function isValid($subject): bool
55
    {
56
        return is_array($subject) && isset($subject['variable']);
57
    }
58
59
    protected function getEntries(array $pageConfiguration): ?array
60
    {
61
        $variable = $pageConfiguration['variables'][$this->variable] ?? null;
62
        $entries = $this->variableParser->parse($variable)['entries']
63
            ?? $this->variableParser->parse($variable)
64
            ?? $variable;
65
66
        return $entries;
67
    }
68
69
    protected function createPageConfiguration(
70
        array $entryConfiguration,
71
        array $entriesForPage,
72
        int $pageIndex,
73
        int $pageCount
74
    ): array {
75
        $pageId = rtrim($entryConfiguration['id'], '/');
76
        $paginatedId = "{$pageId}/page-{$pageIndex}";
77
78
        $entryConfiguration['id'] = $paginatedId;
79
        $entryConfiguration['variables'][$this->variable] = $entriesForPage;
80
81
        $paginationVariable = $this->createPaginationVariable($pageId, $pageIndex, $pageCount);
82
        $entryConfiguration['variables']['_pagination'] = $paginationVariable;
83
84
        unset($entryConfiguration['config']['pagination']);
85
86
        return $entryConfiguration;
87
    }
88
89
    protected function createPaginationVariable(string $pageId, int $pageIndex, int $pageCount): array
90
    {
91
        return [
92
            'current'  => $pageIndex,
93
            'previous' => $this->createPreviousPagination($pageId, $pageIndex),
94
            'next'     => $this->createNextPagination($pageId, $pageIndex, $pageCount),
95
            'pages'    => $pageCount,
96
        ];
97
    }
98
99
    protected function createPreviousPagination(string $pageId, int $pageIndex): ?array
100
    {
101
        if ($pageIndex <= 1) {
102
            return null;
103
        }
104
105
        $previous = $pageIndex - 1;
106
107
        return [
108
            'url'   => "{$pageId}/page-{$previous}",
109
            'index' => $previous,
110
        ];
111
    }
112
113
    protected function createNextPagination(string $pageId, int $pageIndex, int $pageCount): ?array
114
    {
115
        if ($pageIndex >= $pageCount) {
116
            return null;
117
        }
118
119
        $next = $pageIndex + 1;
120
121
        return [
122
            'url'   => "{$pageId}/page-{$next}",
123
            'index' => $next,
124
        ];
125
    }
126
}
127