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') 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