From 05e561d3d62efc1dbb2d07a791cb3407c90f2f53 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 7 May 2015 08:22:15 +0930 Subject: [PATCH] Add pagination links to JSON-API index actions --- src/Api/Actions/Discussions/IndexAction.php | 2 +- src/Api/Actions/SerializeAction.php | 47 ++++++++++++++++++--- src/Api/Actions/Users/IndexAction.php | 2 +- src/Api/Request.php | 5 +++ 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/Api/Actions/Discussions/IndexAction.php b/src/Api/Actions/Discussions/IndexAction.php index d2da7263e..65695afd7 100644 --- a/src/Api/Actions/Discussions/IndexAction.php +++ b/src/Api/Actions/Discussions/IndexAction.php @@ -76,7 +76,7 @@ class IndexAction extends SerializeCollectionAction $response->content->addMeta('total', $total); } - // $response->content->addMeta('moreUrl', $moreUrl); + static::addPaginationLinks($response, $request, route('flarum.api.discussions.index'), $total ?: $results->areMoreResults()); return $results->getDiscussions(); } diff --git a/src/Api/Actions/SerializeAction.php b/src/Api/Actions/SerializeAction.php index 490bf5ec8..0521e7337 100644 --- a/src/Api/Actions/SerializeAction.php +++ b/src/Api/Actions/SerializeAction.php @@ -61,8 +61,8 @@ abstract class SerializeAction implements ActionInterface /** * Handle an API request and return an API response. * - * @param Flarum\Api\Request $request - * @return Flarum\Api\Response + * @param \Flarum\Api\Request $request + * @return \Flarum\Api\Response */ public function handle(Request $request) { @@ -80,8 +80,8 @@ abstract class SerializeAction implements ActionInterface /** * Get the data to be serialized and assigned to the response document. * - * @param Flarum\Api\JsonApiRequest $request - * @param Flarum\Api\JsonApiResponse $response + * @param \Flarum\Api\JsonApiRequest $request + * @param \Flarum\Api\JsonApiResponse $response * @return array */ abstract protected function data(JsonApiRequest $request, JsonApiResponse $response); @@ -99,7 +99,7 @@ abstract class SerializeAction implements ActionInterface * Extract parameters from the request input and assign them to the * request, restricted by the action's specifications. * - * @param Flarum\Api\Request $request + * @param \Flarum\Api\Request $request * @return void */ protected static function buildJsonApiRequest(Request $request) @@ -151,4 +151,41 @@ abstract class SerializeAction implements ActionInterface { return min($limit, static::$limitMax) ?: static::$limit; } + + /** + * Add pagination links to a JSON-API response, based on input parameters + * and the default parameters of this action. + * + * @param \Flarum\Api\JsonApiResponse $response + * @param \Flarum\Api\JsonApiRequest $request + * @param string $url The base URL to build pagination links with. + * @param integer|boolean $total The total number of results (used to build + * a 'last' link), or just true if there are more results but how many + * is unknown ('last' link is ommitted). + * @return void + */ + protected static function addPaginationLinks(JsonApiResponse $response, JsonApiRequest $request, $url, $total = true) + { + if ($request->limit != static::$limit) { + array_set($input, 'page.limit', $request->limit); + } + + array_set($input, 'page.offset', 0); + $response->content->addLink('first', $url.'?'.http_build_query($input)); + + if ($request->offset > 0) { + array_set($input, 'page.offset', max(0, $request->offset - $request->limit)); + $response->content->addLink('prev', $url.'?'.http_build_query($input)); + } + + if ($total === true || $request->offset + $request->limit < $total) { + array_set($input, 'page.offset', $request->offset + $request->limit); + $response->content->addLink('next', $url.'?'.http_build_query($input)); + } + + if ($total && $total !== true) { + array_set($input, 'page.offset', $total - $request->limit); + $response->content->addLink('last', $url.'?'.http_build_query($input)); + } + } } diff --git a/src/Api/Actions/Users/IndexAction.php b/src/Api/Actions/Users/IndexAction.php index b4c7e2d4c..b3d0975c2 100644 --- a/src/Api/Actions/Users/IndexAction.php +++ b/src/Api/Actions/Users/IndexAction.php @@ -71,7 +71,7 @@ class IndexAction extends SerializeCollectionAction $response->content->addMeta('total', $total); } - // $response->content->addMeta('moreUrl', $moreUrl); + static::addPaginationLinks($response, $request, route('flarum.api.users.index'), $total ?: $results->areMoreResults()); return $results->getUsers(); } diff --git a/src/Api/Request.php b/src/Api/Request.php index e6a754822..8f1b4bdfb 100644 --- a/src/Api/Request.php +++ b/src/Api/Request.php @@ -22,4 +22,9 @@ class Request { return array_get($this->input, $key, $default); } + + public function all() + { + return $this->input; + } }