Skip to content

Commit a2605c8

Browse files
authored
Merge pull request #8 from rizkyarlin/pagination
#4 Allow Pagination
2 parents ff88c51 + 99296cb commit a2605c8

File tree

3 files changed

+97
-2
lines changed

3 files changed

+97
-2
lines changed

src/RequestParser.php

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public function getBuilder(): Builder
5656

5757
$builder = $this->applyFilter($model::query(), $modelBuilderStruct->filters);
5858
$builder = $this->applySorter($builder, $modelBuilderStruct->sorter);
59+
$builder = $this->applyPaginator($builder, $modelBuilderStruct->paginator);
5960

6061
return $builder;
6162
}
@@ -65,12 +66,15 @@ private function createModelBuilderStruct(Request $request): ModelBuilderStruct
6566
$queryParam = $request->query;
6667
$filterQuery = $queryParam->get('filter') ?? [];
6768
$sortQuery = $queryParam->get('sort') ?? null;
69+
$limitQuery = $queryParam->get('limit') ?? null;
70+
$offsetQuery = $queryParam->get('offset') ?? 0;
6871

6972
$baseModelName = $this->getBaseModelName($request);
7073
$filters = $this->parseFilter($filterQuery);
7174
$sorter = $this->parseSorter($sortQuery);
75+
$paginator = $this->parsePaginator($limitQuery, $offsetQuery);
7276

73-
return new ModelBuilderStruct($baseModelName, $filters, $sorter);
77+
return new ModelBuilderStruct($baseModelName, $filters, $sorter, $paginator);
7478
}
7579

7680
private function getBaseModelName(Request $request): string
@@ -156,6 +160,13 @@ private function parseSorter(?string $sortQuery): ?array
156160
return $sortStructs;
157161
}
158162

163+
private function parsePaginator($limitQuery, $offsetQuery){
164+
return [
165+
"limit" => $limitQuery,
166+
"offset" => $offsetQuery
167+
];
168+
}
169+
159170
private function getModelFromNamespaces(string $modelName, array $modelNamespaces)
160171
{
161172
foreach ($modelNamespaces as $modelNamespace) {
@@ -193,6 +204,14 @@ private function applySorter(Builder $builder, array $sorter)
193204
return $builder;
194205
}
195206

207+
private function applyPaginator(Builder $builder, array $paginator): Builder
208+
{
209+
if ($paginator['limit']){
210+
return $builder->limit($paginator['limit'])->offset($paginator['offset']);
211+
}
212+
return $builder;
213+
}
214+
196215
private function createModel(string $baseModelName)
197216
{
198217
$model = new $baseModelName;

src/Struct/ModelBuilderStruct.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,15 @@ class ModelBuilderStruct {
1616
* @var SortStruct
1717
*/
1818
public $sorter;
19+
/**
20+
* @var array
21+
*/
22+
public $paginator;
1923

20-
public function __construct(string $baseModelName, array $filters, array $sorter) {
24+
public function __construct(string $baseModelName, array $filters, array $sorter, array $paginator) {
2125
$this->baseModelName = $baseModelName;
2226
$this->filters = $filters;
2327
$this->sorter = $sorter;
28+
$this->paginator = $paginator;
2429
}
2530
}

tests/RequestParserTest.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,4 +404,75 @@ function testFilterWithOrUsingBetweenQueryKeyword()
404404
$builder->getBindings()
405405
);
406406
}
407+
408+
function testPagination()
409+
{
410+
$uri = 'some_model';
411+
$controllerClass = MockModelController::class;
412+
$query = new ParameterBag([
413+
"limit" => "100",
414+
"offset" => "50"
415+
]);
416+
$requestParserOptions = [
417+
'model_namespaces' => [
418+
'LIQRGV\QueryFilter\Mocks',
419+
]
420+
];
421+
422+
$request = $this->createControllerRequest($uri, $controllerClass, $query, $requestParserOptions);
423+
424+
$requestParser = new RequestParser($request);
425+
$builder = $requestParser->getBuilder();
426+
427+
$query = $builder->getQuery();
428+
$this->assertEquals("mock_models", $query->from);
429+
$this->assertEquals(100, $query->limit);
430+
$this->assertEquals(50, $query->offset);
431+
}
432+
433+
function testPaginationIgnoreOffset(){
434+
$uri = 'some_model';
435+
$controllerClass = MockModelController::class;
436+
$query = new ParameterBag([
437+
"offset" => "50"
438+
]);
439+
$requestParserOptions = [
440+
'model_namespaces' => [
441+
'LIQRGV\QueryFilter\Mocks',
442+
]
443+
];
444+
445+
$request = $this->createControllerRequest($uri, $controllerClass, $query, $requestParserOptions);
446+
447+
$requestParser = new RequestParser($request);
448+
$builder = $requestParser->getBuilder();
449+
450+
$query = $builder->getQuery();
451+
$this->assertEquals("mock_models", $query->from);
452+
$this->assertNull($query->limit);
453+
$this->assertNull($query->offset);
454+
}
455+
456+
function testPaginationUsingZeroAsDefaultOffset(){
457+
$uri = 'some_model';
458+
$controllerClass = MockModelController::class;
459+
$query = new ParameterBag([
460+
"limit" => "50"
461+
]);
462+
$requestParserOptions = [
463+
'model_namespaces' => [
464+
'LIQRGV\QueryFilter\Mocks',
465+
]
466+
];
467+
468+
$request = $this->createControllerRequest($uri, $controllerClass, $query, $requestParserOptions);
469+
470+
$requestParser = new RequestParser($request);
471+
$builder = $requestParser->getBuilder();
472+
473+
$query = $builder->getQuery();
474+
$this->assertEquals("mock_models", $query->from);
475+
$this->assertEquals(50, $query->limit);
476+
$this->assertEquals(0, $query->offset);
477+
}
407478
}

0 commit comments

Comments
 (0)