Merge pull request #727 from ArthurHoaro/api/getlinks
REST API: implement getLinks service
This commit is contained in:
commit
9977c418d6
5 changed files with 576 additions and 0 deletions
application/api
|
@ -46,4 +46,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;
|
||||
}
|
||||
}
|
||||
|
|
86
application/api/controllers/Links.php
Normal file
86
application/api/controllers/Links.php
Normal file
|
@ -0,0 +1,86 @@
|
|||
<?php
|
||||
|
||||
namespace Shaarli\Api\Controllers;
|
||||
|
||||
use Shaarli\Api\ApiUtils;
|
||||
use Shaarli\Api\Exceptions\ApiBadParametersException;
|
||||
use Slim\Http\Request;
|
||||
use Slim\Http\Response;
|
||||
|
||||
/**
|
||||
* Class Links
|
||||
*
|
||||
* REST API Controller: all services related to links collection.
|
||||
*
|
||||
* @package Api\Controllers
|
||||
* @see http://shaarli.github.io/api-documentation/#links-links-collection
|
||||
*/
|
||||
class Links extends ApiController
|
||||
{
|
||||
/**
|
||||
* @var int Number of links returned if no limit is provided.
|
||||
*/
|
||||
public static $DEFAULT_LIMIT = 20;
|
||||
|
||||
/**
|
||||
* Retrieve a list of links, allowing different filters.
|
||||
*
|
||||
* @param Request $request Slim request.
|
||||
* @param Response $response Slim response.
|
||||
*
|
||||
* @return Response response.
|
||||
*
|
||||
* @throws ApiBadParametersException Invalid parameters.
|
||||
*/
|
||||
public function getLinks($request, $response)
|
||||
{
|
||||
$private = $request->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);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue