-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPaginationFactory.php
116 lines (100 loc) · 4 KB
/
PaginationFactory.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php
declare(strict_types=1);
namespace Undabot\JsonApi\Implementation\Factory;
use Assert\Assertion;
use Assert\AssertionFailedException;
use Undabot\JsonApi\Definition\Model\Request\Pagination\PaginationInterface;
use Undabot\JsonApi\Implementation\Model\Request\Pagination\OffsetBasedPagination;
use Undabot\JsonApi\Implementation\Model\Request\Pagination\PageBasedPagination;
/** @psalm-suppress UnusedClass */
class PaginationFactory
{
/**
* @param array<string, int> $paginationParams
*
* @throws AssertionFailedException
*/
public function fromArray(array $paginationParams): PaginationInterface
{
if (true === \array_key_exists(PageBasedPagination::PARAM_PAGE_SIZE, $paginationParams)
&& true === \array_key_exists(PageBasedPagination::PARAM_PAGE_NUMBER, $paginationParams)) {
return $this->makePageBasedPagination($paginationParams);
}
if (true === \array_key_exists(OffsetBasedPagination::PARAM_PAGE_OFFSET, $paginationParams)
&& true === \array_key_exists(OffsetBasedPagination::PARAM_PAGE_LIMIT, $paginationParams)) {
return $this->makeOffsetBasedPagination($paginationParams);
}
$message = sprintf('Couldn\'t create pagination from given params: %s', json_encode($paginationParams));
throw new \InvalidArgumentException($message);
}
/**
* @param array<string, int|string> $paginationParams
*
* @throws AssertionFailedException
*/
private function makePageBasedPagination(array $paginationParams): PageBasedPagination
{
Assertion::keyExists($paginationParams, PageBasedPagination::PARAM_PAGE_SIZE);
Assertion::keyExists($paginationParams, PageBasedPagination::PARAM_PAGE_NUMBER);
// Only whitelisted keys are allowed
Assertion::allChoice(
array_keys($paginationParams),
[
PageBasedPagination::PARAM_PAGE_SIZE,
PageBasedPagination::PARAM_PAGE_NUMBER,
]
);
foreach ($paginationParams as $paginationParam) {
Assertion::integerish(
$paginationParam,
sprintf('Params must be integer(ish): %s', $paginationParam)
);
Assertion::greaterThan(
$paginationParam,
0,
sprintf('Params can\'t be zero: %s', $paginationParam)
);
}
return new PageBasedPagination(
(int) $paginationParams[PageBasedPagination::PARAM_PAGE_NUMBER],
(int) $paginationParams[PageBasedPagination::PARAM_PAGE_SIZE]
);
}
/**
* @param array<string, int|string> $paginationParams
*
* @throws AssertionFailedException
*/
private function makeOffsetBasedPagination(array $paginationParams): OffsetBasedPagination
{
Assertion::keyExists($paginationParams, OffsetBasedPagination::PARAM_PAGE_OFFSET);
Assertion::keyExists($paginationParams, OffsetBasedPagination::PARAM_PAGE_LIMIT);
// Only whitelisted keys are allowed
Assertion::allChoice(
array_keys($paginationParams),
[
OffsetBasedPagination::PARAM_PAGE_OFFSET,
OffsetBasedPagination::PARAM_PAGE_LIMIT,
]
);
$limit = $paginationParams[OffsetBasedPagination::PARAM_PAGE_LIMIT];
Assertion::integerish(
$limit,
sprintf('Param must be integer(ish): %s', $limit)
);
Assertion::greaterThan(
$limit,
0,
sprintf('Param can\'t be zero: %s', $limit)
);
$offset = $paginationParams[OffsetBasedPagination::PARAM_PAGE_OFFSET];
Assertion::integerish(
$offset,
sprintf('Param must be integer(ish): %s', $offset)
);
return new OffsetBasedPagination(
(int) $paginationParams[OffsetBasedPagination::PARAM_PAGE_OFFSET],
(int) $paginationParams[OffsetBasedPagination::PARAM_PAGE_LIMIT]
);
}
}