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/controllers/Links.php | 86 +++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 application/api/controllers/Links.php (limited to 'application/api/controllers/Links.php') 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 From 7f96d9ec21a95cb85d0292b46e18235b20efbcb2 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Mon, 16 Jan 2017 13:57:11 +0100 Subject: Update LinkFilter to be able to filter only public links No update regarding the UI or the API for now Fixes #758 --- application/api/controllers/Links.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'application/api/controllers/Links.php') diff --git a/application/api/controllers/Links.php b/application/api/controllers/Links.php index 1c7b41cd..01b7e783 100644 --- a/application/api/controllers/Links.php +++ b/application/api/controllers/Links.php @@ -41,7 +41,8 @@ class Links extends ApiController 'searchterm' => $request->getParam('searchterm', ''), ], false, - $private === 'true' || $private === '1' + // to updated in another PR depending on the API doc + ($private === 'true' || $private === '1') ? 'private' : 'all' ); // Return links from the {offset}th link, starting from 0. -- cgit v1.2.3 From c37a6f820b0a213ee2d5980a96aafac262aeb97a Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Tue, 17 Jan 2017 18:51:40 +0100 Subject: REST API - getLinks: support the visibility parameter --- application/api/controllers/Links.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'application/api/controllers/Links.php') diff --git a/application/api/controllers/Links.php b/application/api/controllers/Links.php index 01b7e783..0a7968e3 100644 --- a/application/api/controllers/Links.php +++ b/application/api/controllers/Links.php @@ -34,15 +34,14 @@ class Links extends ApiController */ public function getLinks($request, $response) { - $private = $request->getParam('private'); + $private = $request->getParam('visibility'); $links = $this->linkDb->filterSearch( [ 'searchtags' => $request->getParam('searchtags', ''), 'searchterm' => $request->getParam('searchterm', ''), ], false, - // to updated in another PR depending on the API doc - ($private === 'true' || $private === '1') ? 'private' : 'all' + $private ); // Return links from the {offset}th link, starting from 0. -- cgit v1.2.3 From 16e3d006e9e9386001881053f610657525feb188 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 24 Dec 2016 10:30:21 +0100 Subject: REST API: implements getLink by ID service See http://shaarli.github.io/api-documentation/#links-link-get --- application/api/controllers/Links.php | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) (limited to 'application/api/controllers/Links.php') diff --git a/application/api/controllers/Links.php b/application/api/controllers/Links.php index 0a7968e3..d4f1a09c 100644 --- a/application/api/controllers/Links.php +++ b/application/api/controllers/Links.php @@ -4,6 +4,7 @@ namespace Shaarli\Api\Controllers; use Shaarli\Api\ApiUtils; use Shaarli\Api\Exceptions\ApiBadParametersException; +use Shaarli\Api\Exceptions\ApiLinkNotFoundException; use Slim\Http\Request; use Slim\Http\Response; @@ -58,8 +59,7 @@ class Links extends ApiController $limit = $request->getParam('limit'); if (empty($limit)) { $limit = self::$DEFAULT_LIMIT; - } - else if (ctype_digit($limit)) { + } else if (ctype_digit($limit)) { $limit = intval($limit); } else if ($limit === 'all') { $limit = count($links); @@ -83,4 +83,25 @@ class Links extends ApiController return $response->withJson($out, 200, $this->jsonStyle); } + + /** + * Return a single formatted link by its ID. + * + * @param Request $request Slim request. + * @param Response $response Slim response. + * @param array $args Path parameters. including the ID. + * + * @return Response containing the link array. + * + * @throws ApiLinkNotFoundException generating a 404 error. + */ + public function getLink($request, $response, $args) + { + if (! isset($this->linkDb[$args['id']])) { + throw new ApiLinkNotFoundException(); + } + $index = index_url($this->ci['environment']); + $out = ApiUtils::formatLink($this->linkDb[$args['id']], $index); + return $response->withJson($out, 200, $this->jsonStyle); + } } -- cgit v1.2.3 From 68016e37983b882c51c6ac92da6f6cc1250676e5 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Thu, 5 Jan 2017 15:58:24 +0100 Subject: REST API: implement POST link service --- application/api/controllers/Links.php | 44 ++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'application/api/controllers/Links.php') diff --git a/application/api/controllers/Links.php b/application/api/controllers/Links.php index d4f1a09c..0db10fd0 100644 --- a/application/api/controllers/Links.php +++ b/application/api/controllers/Links.php @@ -97,11 +97,53 @@ class Links extends ApiController */ public function getLink($request, $response, $args) { - if (! isset($this->linkDb[$args['id']])) { + if (!isset($this->linkDb[$args['id']])) { throw new ApiLinkNotFoundException(); } $index = index_url($this->ci['environment']); $out = ApiUtils::formatLink($this->linkDb[$args['id']], $index); + return $response->withJson($out, 200, $this->jsonStyle); } + + /** + * Creates a new link from posted request body. + * + * @param Request $request Slim request. + * @param Response $response Slim response. + * + * @return Response response. + */ + public function postLink($request, $response) + { + $data = $request->getParsedBody(); + $link = ApiUtils::buildLinkFromRequest($data, $this->conf->get('privacy.default_private_links')); + // duplicate by URL, return 409 Conflict + if (! empty($link['url']) && ! empty($dup = $this->linkDb->getLinkFromUrl($link['url']))) { + return $response->withJson( + ApiUtils::formatLink($dup, index_url($this->ci['environment'])), + 409, + $this->jsonStyle + ); + } + + $link['id'] = $this->linkDb->getNextId(); + $link['shorturl'] = link_small_hash($link['created'], $link['id']); + + // note: general relative URL + if (empty($link['url'])) { + $link['url'] = '?' . $link['shorturl']; + } + + if (empty($link['title'])) { + $link['title'] = $link['url']; + } + + $this->linkDb[$link['id']] = $link; + $this->linkDb->save($this->conf->get('resource.page_cache')); + $out = ApiUtils::formatLink($link, index_url($this->ci['environment'])); + $redirect = $this->ci->router->relativePathFor('getLink', ['id' => $link['id']]); + return $response->withAddedHeader('Location', $redirect) + ->withJson($out, 201, $this->jsonStyle); + } } -- cgit v1.2.3 From cf9181dddf8b6113b1b017e4bcb21fac0a0b1c83 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 1 Apr 2017 11:11:25 +0200 Subject: REST API: implement PUT method * Related to #609 * Documentation: http://shaarli.github.io/api-documentation/#links-link-put --- application/api/controllers/Links.php | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'application/api/controllers/Links.php') diff --git a/application/api/controllers/Links.php b/application/api/controllers/Links.php index 0db10fd0..1c68b062 100644 --- a/application/api/controllers/Links.php +++ b/application/api/controllers/Links.php @@ -146,4 +146,46 @@ class Links extends ApiController return $response->withAddedHeader('Location', $redirect) ->withJson($out, 201, $this->jsonStyle); } + + /** + * Updates an existing link from posted request body. + * + * @param Request $request Slim request. + * @param Response $response Slim response. + * @param array $args Path parameters. including the ID. + * + * @return Response response. + * + * @throws ApiLinkNotFoundException generating a 404 error. + */ + public function putLink($request, $response, $args) + { + if (! isset($this->linkDb[$args['id']])) { + throw new ApiLinkNotFoundException(); + } + + $index = index_url($this->ci['environment']); + $data = $request->getParsedBody(); + + $requestLink = ApiUtils::buildLinkFromRequest($data, $this->conf->get('privacy.default_private_links')); + // duplicate URL on a different link, return 409 Conflict + if (! empty($requestLink['url']) + && ! empty($dup = $this->linkDb->getLinkFromUrl($requestLink['url'])) + && $dup['id'] != $args['id'] + ) { + return $response->withJson( + ApiUtils::formatLink($dup, $index), + 409, + $this->jsonStyle + ); + } + + $responseLink = $this->linkDb[$args['id']]; + $responseLink = ApiUtils::updateLink($responseLink, $requestLink); + $this->linkDb[$responseLink['id']] = $responseLink; + $this->linkDb->save($this->conf->get('resource.page_cache')); + + $out = ApiUtils::formatLink($responseLink, $index); + return $response->withJson($out, 200, $this->jsonStyle); + } } -- cgit v1.2.3 From 0843848c1d18e92504c43d181063a2012f8fd5b9 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sat, 6 May 2017 17:32:16 +0200 Subject: API: add DELETE endpoint Based on #840 See http://shaarli.github.io/api-documentation/\#links-link-delete --- application/api/controllers/Links.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'application/api/controllers/Links.php') diff --git a/application/api/controllers/Links.php b/application/api/controllers/Links.php index 1c68b062..a40e974d 100644 --- a/application/api/controllers/Links.php +++ b/application/api/controllers/Links.php @@ -188,4 +188,27 @@ class Links extends ApiController $out = ApiUtils::formatLink($responseLink, $index); return $response->withJson($out, 200, $this->jsonStyle); } + + /** + * Delete an existing link by its ID. + * + * @param Request $request Slim request. + * @param Response $response Slim response. + * @param array $args Path parameters. including the ID. + * + * @return Response response. + * + * @throws ApiLinkNotFoundException generating a 404 error. + */ + public function deleteLink($request, $response, $args) + { + if (! isset($this->linkDb[$args['id']])) { + throw new ApiLinkNotFoundException(); + } + + unset($this->linkDb[(int) $args['id']]); + $this->linkDb->save($this->conf->get('resource.page_cache')); + + return $response->withStatus(204); + } } -- cgit v1.2.3 From 813849e5216cb87121e0f778a734575be6a36052 Mon Sep 17 00:00:00 2001 From: ArthurHoaro Date: Sun, 7 May 2017 16:50:20 +0200 Subject: Add history entries for API endpoint CHANGED: datetime is now store as an object in history store file --- application/api/controllers/Links.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'application/api/controllers/Links.php') diff --git a/application/api/controllers/Links.php b/application/api/controllers/Links.php index a40e974d..eb78dd26 100644 --- a/application/api/controllers/Links.php +++ b/application/api/controllers/Links.php @@ -141,6 +141,7 @@ class Links extends ApiController $this->linkDb[$link['id']] = $link; $this->linkDb->save($this->conf->get('resource.page_cache')); + $this->history->addLink($link); $out = ApiUtils::formatLink($link, index_url($this->ci['environment'])); $redirect = $this->ci->router->relativePathFor('getLink', ['id' => $link['id']]); return $response->withAddedHeader('Location', $redirect) @@ -184,6 +185,7 @@ class Links extends ApiController $responseLink = ApiUtils::updateLink($responseLink, $requestLink); $this->linkDb[$responseLink['id']] = $responseLink; $this->linkDb->save($this->conf->get('resource.page_cache')); + $this->history->updateLink($responseLink); $out = ApiUtils::formatLink($responseLink, $index); return $response->withJson($out, 200, $this->jsonStyle); @@ -205,9 +207,10 @@ class Links extends ApiController if (! isset($this->linkDb[$args['id']])) { throw new ApiLinkNotFoundException(); } - + $link = $this->linkDb[$args['id']]; unset($this->linkDb[(int) $args['id']]); $this->linkDb->save($this->conf->get('resource.page_cache')); + $this->history->deleteLink($link); return $response->withStatus(204); } -- cgit v1.2.3