From c3b00963fe22479e87998c82bc83827a54c8d972 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Thu, 22 Dec 2016 14:36:45 +0100 Subject: REST API: implement getLinks service See http://shaarli.github.io/api-documentation/#links-links-collection-get --- application/api/ApiUtils.php | 31 +++++++++++++ application/api/controllers/Links.php | 86 +++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 application/api/controllers/Links.php (limited to 'application/api') diff --git a/application/api/ApiUtils.php b/application/api/ApiUtils.php index fbb1e72f..d0242919 100644 --- a/application/api/ApiUtils.php +++ b/application/api/ApiUtils.php @@ -48,4 +48,35 @@ class ApiUtils throw new ApiAuthorizationException('Invalid JWT issued time'); } } + + /** + * Format a Link for the REST API. + * + * @param array $link Link data read from the datastore. + * @param string $indexUrl Shaarli's index URL (used for relative URL). + * + * @return array Link data formatted for the REST API. + */ + public static function formatLink($link, $indexUrl) + { + $out['id'] = $link['id']; + // Not an internal link + if ($link['url'][0] != '?') { + $out['url'] = $link['url']; + } else { + $out['url'] = $indexUrl . $link['url']; + } + $out['shorturl'] = $link['shorturl']; + $out['title'] = $link['title']; + $out['description'] = $link['description']; + $out['tags'] = preg_split('/\s+/', $link['tags'], -1, PREG_SPLIT_NO_EMPTY); + $out['private'] = $link['private'] == true; + $out['created'] = $link['created']->format(\DateTime::ATOM); + if (! empty($link['updated'])) { + $out['updated'] = $link['updated']->format(\DateTime::ATOM); + } else { + $out['updated'] = ''; + } + return $out; + } } diff --git a/application/api/controllers/Links.php b/application/api/controllers/Links.php new file mode 100644 index 00000000..1c7b41cd --- /dev/null +++ b/application/api/controllers/Links.php @@ -0,0 +1,86 @@ +getParam('private'); + $links = $this->linkDb->filterSearch( + [ + 'searchtags' => $request->getParam('searchtags', ''), + 'searchterm' => $request->getParam('searchterm', ''), + ], + false, + $private === 'true' || $private === '1' + ); + + // Return links from the {offset}th link, starting from 0. + $offset = $request->getParam('offset'); + if (! empty($offset) && ! ctype_digit($offset)) { + throw new ApiBadParametersException('Invalid offset'); + } + $offset = ! empty($offset) ? intval($offset) : 0; + if ($offset > count($links)) { + return $response->withJson([], 200, $this->jsonStyle); + } + + // limit parameter is either a number of links or 'all' for everything. + $limit = $request->getParam('limit'); + if (empty($limit)) { + $limit = self::$DEFAULT_LIMIT; + } + else if (ctype_digit($limit)) { + $limit = intval($limit); + } else if ($limit === 'all') { + $limit = count($links); + } else { + throw new ApiBadParametersException('Invalid limit'); + } + + // 'environment' is set by Slim and encapsulate $_SERVER. + $index = index_url($this->ci['environment']); + + $out = []; + $cpt = 0; + foreach ($links as $link) { + if (count($out) >= $limit) { + break; + } + if ($cpt++ >= $offset) { + $out[] = ApiUtils::formatLink($link, $index); + } + } + + return $response->withJson($out, 200, $this->jsonStyle); + } +} -- cgit v1.2.3