Skip to content

Commit 8442735

Browse files
committed
Implemented #504
1 parent 8314a24 commit 8442735

File tree

6 files changed

+63
-4
lines changed

6 files changed

+63
-4
lines changed

src/Tqdev/PhpCrudApi/Api.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Tqdev\PhpCrudApi\Middleware\FirewallMiddleware;
1818
use Tqdev\PhpCrudApi\Middleware\JwtAuthMiddleware;
1919
use Tqdev\PhpCrudApi\Middleware\MultiTenancyMiddleware;
20+
use Tqdev\PhpCrudApi\Middleware\PageLimitsMiddleware;
2021
use Tqdev\PhpCrudApi\Middleware\Router\SimpleRouter;
2122
use Tqdev\PhpCrudApi\Middleware\SanitationMiddleware;
2223
use Tqdev\PhpCrudApi\Middleware\ValidationMiddleware;
@@ -74,6 +75,9 @@ public function __construct(Config $config)
7475
case 'xsrf':
7576
new XsrfMiddleware($router, $responder, $properties);
7677
break;
78+
case 'pageLimits':
79+
new PageLimitsMiddleware($router, $responder, $properties, $reflection);
80+
break;
7781
case 'customization':
7882
new CustomizationMiddleware($router, $responder, $properties, $reflection);
7983
break;

src/Tqdev/PhpCrudApi/Record/PaginationInfo.php

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function getPageOffset(array $params): int
2525
return $offset;
2626
}
2727

28-
public function getPageSize(array $params): int
28+
private function getPageSize(array $params): int
2929
{
3030
$pageSize = $this->DEFAULT_PAGE_SIZE;
3131
if (isset($params['page'])) {
@@ -50,4 +50,21 @@ public function getResultSize(array $params): int
5050
return $numberOfRows;
5151
}
5252

53+
public function getPageLimit(array $params): int
54+
{
55+
$pageLimit = -1;
56+
if ($this->hasPage($params)) {
57+
$pageLimit = $this->getPageSize($params);
58+
}
59+
$resultSize = $this->getResultSize($params);
60+
if ($resultSize >= 0) {
61+
if ($pageLimit >= 0) {
62+
$pageLimit = min($pageLimit, $resultSize);
63+
} else {
64+
$pageLimit = $resultSize;
65+
}
66+
}
67+
return $pageLimit;
68+
}
69+
5370
}

src/Tqdev/PhpCrudApi/Record/RecordService.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,11 @@ public function _list(String $tableName, array $params): ListDocument
108108
$columnOrdering = $this->ordering->getColumnOrdering($table, $params);
109109
if (!$this->pagination->hasPage($params)) {
110110
$offset = 0;
111-
$limit = $this->pagination->getResultSize($params);
111+
$limit = $this->pagination->getPageLimit($params);
112112
$count = 0;
113113
} else {
114114
$offset = $this->pagination->getPageOffset($params);
115-
$limit = $this->pagination->getPageSize($params);
115+
$limit = $this->pagination->getPageLimit($params);
116116
$count = $this->db->selectCount($table, $condition);
117117
}
118118
$records = $this->db->selectAll($table, $columnNames, $condition, $columnOrdering, $offset, $limit);

src/Tqdev/PhpCrudApi/Request.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ public function getParams(): array
128128
return $this->params;
129129
}
130130

131+
public function setParams(array $params) /*: void*/
132+
{
133+
$this->params = $params;
134+
}
135+
131136
public function getBody() /*: ?array*/
132137
{
133138
return $this->body;

tests/config/base.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
'username' => 'php-crud-api',
55
'password' => 'php-crud-api',
66
'controllers' => 'records,columns,cache,openapi',
7-
'middlewares' => 'cors,jwtAuth,basicAuth,authorization,validation,sanitation,multiTenancy,customization',
7+
'middlewares' => 'cors,jwtAuth,basicAuth,authorization,validation,sanitation,multiTenancy,pageLimits,customization',
88
'jwtAuth.mode' => 'optional',
99
'jwtAuth.time' => '1538207605',
1010
'jwtAuth.secret' => 'axpIrCGNGqxzx2R9dtXLIPUSqPo778uhb8CA0F4Hx',
@@ -28,6 +28,8 @@
2828
'multiTenancy.handler' => function ($operation, $tableName) {
2929
return ($tableName == 'kunsthåndværk') ? ['user_id' => 1] : [];
3030
},
31+
'pageLimits.pages' => 5,
32+
'pageLimits.records' => 10,
3133
'customization.beforeHandler' => function ($operation, $tableName, $request, $environment) {
3234
$environment->start = 0.003/*microtime(true)*/;
3335
},
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
GET /records/posts?size=10
2+
===
3+
200
4+
Content-Type: application/json
5+
Content-Length: 690
6+
7+
{"records":[{"id":1,"user_id":1,"category_id":1,"content":"blog started"},{"id":2,"user_id":1,"category_id":2,"content":"🦀€ Grüßgott, Вiтаю, dobrý deň, hyvää päivää, გამარჯობა, Γεια σας, góðan dag, здравствуйте"},{"id":5,"user_id":1,"category_id":1,"content":"#1"},{"id":6,"user_id":1,"category_id":1,"content":"#2"},{"id":7,"user_id":1,"category_id":1,"content":"#3"},{"id":8,"user_id":1,"category_id":1,"content":"#4"},{"id":9,"user_id":1,"category_id":1,"content":"#5"},{"id":10,"user_id":1,"category_id":1,"content":"#6"},{"id":11,"user_id":1,"category_id":1,"content":"#7"},{"id":12,"user_id":1,"category_id":1,"content":"#8"}]}
8+
===
9+
GET /records/posts
10+
===
11+
200
12+
Content-Type: application/json
13+
Content-Length: 690
14+
15+
{"records":[{"id":1,"user_id":1,"category_id":1,"content":"blog started"},{"id":2,"user_id":1,"category_id":2,"content":"🦀€ Grüßgott, Вiтаю, dobrý deň, hyvää päivää, გამარჯობა, Γεια σας, góðan dag, здравствуйте"},{"id":5,"user_id":1,"category_id":1,"content":"#1"},{"id":6,"user_id":1,"category_id":1,"content":"#2"},{"id":7,"user_id":1,"category_id":1,"content":"#3"},{"id":8,"user_id":1,"category_id":1,"content":"#4"},{"id":9,"user_id":1,"category_id":1,"content":"#5"},{"id":10,"user_id":1,"category_id":1,"content":"#6"},{"id":11,"user_id":1,"category_id":1,"content":"#7"},{"id":12,"user_id":1,"category_id":1,"content":"#8"}]}
16+
===
17+
GET /records/posts?page=5,1
18+
===
19+
200
20+
Content-Type: application/json
21+
Content-Length: 78
22+
23+
{"records":[{"id":7,"user_id":1,"category_id":1,"content":"#3"}],"results":12}
24+
===
25+
GET /records/posts?page=6,1
26+
===
27+
200
28+
Content-Type: application/json
29+
Content-Length: 78
30+
31+
{"records":[{"id":7,"user_id":1,"category_id":1,"content":"#3"}],"results":12}

0 commit comments

Comments
 (0)