X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=application%2Fapi%2Fcontrollers%2FLinks.php;h=ffcfd4c75a4f8748101675247a138c083bd1dd27;hb=62f5a7581380da7885025498de10e9a20c45b358;hp=0db10fd054daff621826d58affafdc2eaa04aa04;hpb=4c7045229c94973c1cb83193e69463f426ddc35b;p=github%2Fshaarli%2FShaarli.git diff --git a/application/api/controllers/Links.php b/application/api/controllers/Links.php index 0db10fd0..ffcfd4c7 100644 --- a/application/api/controllers/Links.php +++ b/application/api/controllers/Links.php @@ -59,25 +59,25 @@ class Links extends ApiController $limit = $request->getParam('limit'); if (empty($limit)) { $limit = self::$DEFAULT_LIMIT; - } else if (ctype_digit($limit)) { + } elseif (ctype_digit($limit)) { $limit = intval($limit); - } else if ($limit === 'all') { + } elseif ($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']); + $indexUrl = index_url($this->ci['environment']); $out = []; - $cpt = 0; + $index = 0; foreach ($links as $link) { if (count($out) >= $limit) { break; } - if ($cpt++ >= $offset) { - $out[] = ApiUtils::formatLink($link, $index); + if ($index++ >= $offset) { + $out[] = ApiUtils::formatLink($link, $indexUrl); } } @@ -141,9 +141,77 @@ 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) ->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')); + $this->history->updateLink($responseLink); + + $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(); + } + $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); + } }