From e5fb89e5d31c1c0645e8dd252bb4f970dc5f3226 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sat, 25 Jun 2016 21:05:50 +0200 Subject: Add since parameter --- src/Wallabag/ApiBundle/Controller/WallabagRestController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index af24e498..7d624812 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -34,6 +34,7 @@ class WallabagRestController extends FOSRestController * {"name"="page", "dataType"="integer", "required"=false, "format"="default '1'", "description"="what page you want."}, * {"name"="perPage", "dataType"="integer", "required"=false, "format"="default'30'", "description"="results per page."}, * {"name"="tags", "dataType"="string", "required"=false, "format"="api,rest", "description"="a list of tags url encoded. Will returns entries that matches ALL tags."}, + * {"name"="since", "dataType"="integer", "required"=false, "format"="default '0'", "description"="The timestamp since when you want entries updated."}, * } * ) * @@ -49,10 +50,11 @@ class WallabagRestController extends FOSRestController $order = $request->query->get('order', 'desc'); $page = (int) $request->query->get('page', 1); $perPage = (int) $request->query->get('perPage', 30); + $since = $request->query->get('since',0); $pager = $this->getDoctrine() ->getRepository('WallabagCoreBundle:Entry') - ->findEntries($this->getUser()->getId(), $isArchived, $isStarred, $sort, $order); + ->findEntries($this->getUser()->getId(), $isArchived, $isStarred, $sort, $order, $since); $pager->setCurrentPage($page); $pager->setMaxPerPage($perPage); -- cgit v1.2.3 From e43c78abd9193641d07ea27d0275fc19419b89ad Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sat, 25 Jun 2016 23:19:21 +0200 Subject: CS --- src/Wallabag/ApiBundle/Controller/WallabagRestController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index 7d624812..4fae4b0a 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -50,7 +50,7 @@ class WallabagRestController extends FOSRestController $order = $request->query->get('order', 'desc'); $page = (int) $request->query->get('page', 1); $perPage = (int) $request->query->get('perPage', 30); - $since = $request->query->get('since',0); + $since = $request->query->get('since', 0); $pager = $this->getDoctrine() ->getRepository('WallabagCoreBundle:Entry') -- cgit v1.2.3 From 28803f106bd091b5a7540a134cba2545d12d25ea Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sat, 25 Jun 2016 16:27:38 +0200 Subject: Add filter for tags on API --- src/Wallabag/ApiBundle/Controller/WallabagRestController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index 4fae4b0a..03eb9b08 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -51,10 +51,11 @@ class WallabagRestController extends FOSRestController $page = (int) $request->query->get('page', 1); $perPage = (int) $request->query->get('perPage', 30); $since = $request->query->get('since', 0); + $tags = $request->query->get('tags', ''); $pager = $this->getDoctrine() ->getRepository('WallabagCoreBundle:Entry') - ->findEntries($this->getUser()->getId(), $isArchived, $isStarred, $sort, $order, $since); + ->findEntries($this->getUser()->getId(), $isArchived, $isStarred, $sort, $order, $since, $tags); $pager->setCurrentPage($page); $pager->setMaxPerPage($perPage); -- cgit v1.2.3 From 9c545fe028013b30417c1a932cd6b9027bff752d Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sat, 21 May 2016 18:09:38 +0200 Subject: Added name on client - Fix typos in field name - Added migration for name field in API client table Manually cherry-picked from PR https://github.com/wallabag/wallabag/pull/2171 --- src/Wallabag/ApiBundle/Entity/Client.php | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Entity/Client.php b/src/Wallabag/ApiBundle/Entity/Client.php index c04ed0f6..3e2f491c 100644 --- a/src/Wallabag/ApiBundle/Entity/Client.php +++ b/src/Wallabag/ApiBundle/Entity/Client.php @@ -18,8 +18,39 @@ class Client extends BaseClient */ protected $id; + /** + * @var string + * + * @ORM\Column(name="name", type="text", nullable=true) + */ + protected $name; + public function __construct() { parent::__construct(); } + + /** + * Get name. + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Set name. + * + * @param string $name + * + * @return Client + */ + public function setName($name) + { + $this->name = $name; + + return $this; + } } -- cgit v1.2.3 From 119914e65d2d7c19977e1964e0409255eb7cd1a6 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sat, 21 May 2016 18:09:38 +0200 Subject: added name on client --- src/Wallabag/ApiBundle/Entity/Client.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Entity/Client.php b/src/Wallabag/ApiBundle/Entity/Client.php index 3e2f491c..3e8b54fe 100644 --- a/src/Wallabag/ApiBundle/Entity/Client.php +++ b/src/Wallabag/ApiBundle/Entity/Client.php @@ -21,7 +21,7 @@ class Client extends BaseClient /** * @var string * - * @ORM\Column(name="name", type="text", nullable=true) + * @ORM\Column(name="title", type="text", nullable=true) */ protected $name; -- cgit v1.2.3 From e71cef0bb81c80575f38c4ea040716efdfcb17f0 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Fri, 17 Jun 2016 23:57:35 +0200 Subject: Fix typos in field name --- src/Wallabag/ApiBundle/Entity/Client.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Entity/Client.php b/src/Wallabag/ApiBundle/Entity/Client.php index 3e8b54fe..3e2f491c 100644 --- a/src/Wallabag/ApiBundle/Entity/Client.php +++ b/src/Wallabag/ApiBundle/Entity/Client.php @@ -21,7 +21,7 @@ class Client extends BaseClient /** * @var string * - * @ORM\Column(name="title", type="text", nullable=true) + * @ORM\Column(name="name", type="text", nullable=true) */ protected $name; -- cgit v1.2.3 From 4da01f492b20312461d3f4f612a98e3b52c76fa9 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sat, 25 Jun 2016 18:37:41 +0200 Subject: Delete tag or tags by label Tests not included --- .../Controller/WallabagRestController.php | 61 ++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index 03eb9b08..8eaff5f6 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -352,6 +352,67 @@ class WallabagRestController extends FOSRestController return $this->renderJsonResponse($json); } + + /** + * Permanently remove one tag from **every** entry. + * + * @ApiDoc( + * requirements={ + * {"name"="tag", "dataType"="string", "requirement"="\w+", "description"="The tag as a string"} + * } + * ) + * + * @return Response + */ + public function deleteTagLabelAction(Request $request) + { + $this->validateAuthentication(); + $label = $request->query->get('tag',''); + + $tag = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findOneByLabel($label); + $this->getDoctrine() + ->getRepository('WallabagCoreBundle:Entry') + ->removeTag($this->getUser()->getId(), $tag); + + $json = $this->get('serializer')->serialize($tag, 'json'); + + return $this->renderJsonResponse($json); + } + + /** + * Permanently remove some tags from **every** entry. + * + * @ApiDoc( + * requirements={ + * {"name"="tags", "dataType"="string", "required"=true, "format"="tag1,tag2", "description"="The tags as strings"} + * } + * ) + * + * @return Response + */ + public function deleteTagsLabelAction(Request $request) + { + $this->validateAuthentication(); + + $tagsLabels = $request->query->get('tags', ''); + + $tags = array(); + + foreach (explode(',', $tagsLabels) as $tagLabel) { + $tagEntity = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findOneByLabel($tagLabel); + $tags[] = $tagEntity; + } + + $this->getDoctrine() + ->getRepository('WallabagCoreBundle:Entry') + ->removeTags($this->getUser()->getId(), $tags); + + $json = $this->get('serializer')->serialize($tags, 'json'); + + return $this->renderJsonResponse($json); + } + + /** * Retrieve version number. * -- cgit v1.2.3 From 9bf83f1fb8d588b871a5d12289179de087756d02 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Sat, 25 Jun 2016 19:25:50 +0200 Subject: CS --- src/Wallabag/ApiBundle/Controller/WallabagRestController.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index 8eaff5f6..43225149 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -367,7 +367,7 @@ class WallabagRestController extends FOSRestController public function deleteTagLabelAction(Request $request) { $this->validateAuthentication(); - $label = $request->query->get('tag',''); + $label = $request->query->get('tag', ''); $tag = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findOneByLabel($label); $this->getDoctrine() @@ -412,7 +412,6 @@ class WallabagRestController extends FOSRestController return $this->renderJsonResponse($json); } - /** * Retrieve version number. * -- cgit v1.2.3 From a0e1eafc35e1007056555651ace7221d09cd8270 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Sun, 24 Jul 2016 10:55:49 +0200 Subject: Add some tests Also, retrieve tag from the request instead of the query (which will be the same but it's more easy to test). Moved down `deleteTagAction` because it conflicted with the new action: api_delete_tag => /api/tags/{tag}.{_format} api_delete_tags_label => /api/tags/label.{_format} And finally, throw exception when a tag is not found before removing it. --- .../Controller/WallabagRestController.php | 58 +++++++++++++--------- 1 file changed, 35 insertions(+), 23 deletions(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index 43225149..869fdc56 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -334,15 +334,22 @@ class WallabagRestController extends FOSRestController * * @ApiDoc( * requirements={ - * {"name"="tag", "dataType"="integer", "requirement"="\w+", "description"="The tag"} + * {"name"="tag", "dataType"="string", "required"=true, "requirement"="\w+", "description"="Tag as a string"} * } * ) * * @return Response */ - public function deleteTagAction(Tag $tag) + public function deleteTagLabelAction(Request $request) { $this->validateAuthentication(); + $label = $request->request->get('tag', ''); + + $tag = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findOneByLabel($label); + + if (empty($tag)) { + throw $this->createNotFoundException('Tag not found'); + } $this->getDoctrine() ->getRepository('WallabagCoreBundle:Entry') @@ -354,60 +361,65 @@ class WallabagRestController extends FOSRestController } /** - * Permanently remove one tag from **every** entry. + * Permanently remove some tags from **every** entry. * * @ApiDoc( * requirements={ - * {"name"="tag", "dataType"="string", "requirement"="\w+", "description"="The tag as a string"} + * {"name"="tags", "dataType"="string", "required"=true, "format"="tag1,tag2", "description"="Tags as strings (comma splitted)"} * } * ) * * @return Response */ - public function deleteTagLabelAction(Request $request) + public function deleteTagsLabelAction(Request $request) { $this->validateAuthentication(); - $label = $request->query->get('tag', ''); - $tag = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findOneByLabel($label); + $tagsLabels = $request->request->get('tags', ''); + + $tags = []; + + foreach (explode(',', $tagsLabels) as $tagLabel) { + $tagEntity = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findOneByLabel($tagLabel); + + if (!empty($tagEntity)) { + $tags[] = $tagEntity; + } + } + + if (empty($tags)) { + throw $this->createNotFoundException('Tags not found'); + } + $this->getDoctrine() ->getRepository('WallabagCoreBundle:Entry') - ->removeTag($this->getUser()->getId(), $tag); + ->removeTags($this->getUser()->getId(), $tags); - $json = $this->get('serializer')->serialize($tag, 'json'); + $json = $this->get('serializer')->serialize($tags, 'json'); return $this->renderJsonResponse($json); } /** - * Permanently remove some tags from **every** entry. + * Permanently remove one tag from **every** entry. * * @ApiDoc( * requirements={ - * {"name"="tags", "dataType"="string", "required"=true, "format"="tag1,tag2", "description"="The tags as strings"} + * {"name"="tag", "dataType"="integer", "requirement"="\w+", "description"="The tag"} * } * ) * * @return Response */ - public function deleteTagsLabelAction(Request $request) + public function deleteTagAction(Tag $tag) { $this->validateAuthentication(); - $tagsLabels = $request->query->get('tags', ''); - - $tags = array(); - - foreach (explode(',', $tagsLabels) as $tagLabel) { - $tagEntity = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findOneByLabel($tagLabel); - $tags[] = $tagEntity; - } - $this->getDoctrine() ->getRepository('WallabagCoreBundle:Entry') - ->removeTags($this->getUser()->getId(), $tags); + ->removeTag($this->getUser()->getId(), $tag); - $json = $this->get('serializer')->serialize($tags, 'json'); + $json = $this->get('serializer')->serialize($tag, 'json'); return $this->renderJsonResponse($json); } -- cgit v1.2.3 From 429d86f388da856c9d8d9a649147c5212bee4258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20L=C5=93uillet?= Date: Sun, 4 Sep 2016 20:53:28 +0200 Subject: Added tags counter in sidebar (material theme) --- src/Wallabag/ApiBundle/Controller/WallabagRestController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index 869fdc56..07fedeb0 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -322,7 +322,9 @@ class WallabagRestController extends FOSRestController $tags = $this->getDoctrine() ->getRepository('WallabagCoreBundle:Tag') - ->findAllTags($this->getUser()->getId()); + ->findAllTags($this->getUser()->getId()) + ->getQuery() + ->getResult(); $json = $this->get('serializer')->serialize($tags, 'json'); -- cgit v1.2.3 From 60faee002ceff1d6f77996fc32a0023a140a2fe9 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Thu, 8 Sep 2016 12:03:09 +0200 Subject: Re-user JsonResponse Since Symfony 3.1 we can define the json of a JsonResonse using `->setJson()` --- .../Controller/WallabagRestController.php | 67 +++++++++------------- 1 file changed, 27 insertions(+), 40 deletions(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index 07fedeb0..fb7c6c1f 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -7,7 +7,7 @@ use Hateoas\Configuration\Route; use Hateoas\Representation\Factory\PagerfantaFactory; use Nelmio\ApiDocBundle\Annotation\ApiDoc; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Exception\AccessDeniedException; use Wallabag\CoreBundle\Entity\Entry; @@ -38,7 +38,7 @@ class WallabagRestController extends FOSRestController * } * ) * - * @return Response + * @return JsonResponse */ public function getEntriesAction(Request $request) { @@ -68,7 +68,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($paginatedCollection, 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -80,7 +80,7 @@ class WallabagRestController extends FOSRestController * } * ) * - * @return Response + * @return JsonResponse */ public function getEntryAction(Entry $entry) { @@ -89,7 +89,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($entry, 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -105,7 +105,7 @@ class WallabagRestController extends FOSRestController * } * ) * - * @return Response + * @return JsonResponse */ public function postEntriesAction(Request $request) { @@ -149,7 +149,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($entry, 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -167,7 +167,7 @@ class WallabagRestController extends FOSRestController * } * ) * - * @return Response + * @return JsonResponse */ public function patchEntriesAction(Entry $entry, Request $request) { @@ -200,7 +200,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($entry, 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -212,7 +212,7 @@ class WallabagRestController extends FOSRestController * } * ) * - * @return Response + * @return JsonResponse */ public function deleteEntriesAction(Entry $entry) { @@ -225,7 +225,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($entry, 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -237,7 +237,7 @@ class WallabagRestController extends FOSRestController * } * ) * - * @return Response + * @return JsonResponse */ public function getEntriesTagsAction(Entry $entry) { @@ -246,7 +246,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($entry->getTags(), 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -261,7 +261,7 @@ class WallabagRestController extends FOSRestController * } * ) * - * @return Response + * @return JsonResponse */ public function postEntriesTagsAction(Request $request, Entry $entry) { @@ -279,7 +279,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($entry, 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -292,7 +292,7 @@ class WallabagRestController extends FOSRestController * } * ) * - * @return Response + * @return JsonResponse */ public function deleteEntriesTagsAction(Entry $entry, Tag $tag) { @@ -306,7 +306,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($entry, 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -314,7 +314,7 @@ class WallabagRestController extends FOSRestController * * @ApiDoc() * - * @return Response + * @return JsonResponse */ public function getTagsAction() { @@ -328,7 +328,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($tags, 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -340,7 +340,7 @@ class WallabagRestController extends FOSRestController * } * ) * - * @return Response + * @return JsonResponse */ public function deleteTagLabelAction(Request $request) { @@ -359,7 +359,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($tag, 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -371,7 +371,7 @@ class WallabagRestController extends FOSRestController * } * ) * - * @return Response + * @return JsonResponse */ public function deleteTagsLabelAction(Request $request) { @@ -399,7 +399,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($tags, 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -411,7 +411,7 @@ class WallabagRestController extends FOSRestController * } * ) * - * @return Response + * @return JsonResponse */ public function deleteTagAction(Tag $tag) { @@ -423,7 +423,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($tag, 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -431,7 +431,7 @@ class WallabagRestController extends FOSRestController * * @ApiDoc() * - * @return Response + * @return JsonResponse */ public function getVersionAction() { @@ -439,7 +439,7 @@ class WallabagRestController extends FOSRestController $json = $this->get('serializer')->serialize($version, 'json'); - return $this->renderJsonResponse($json); + return (new JsonResponse())->setJson($json); } /** @@ -455,17 +455,4 @@ class WallabagRestController extends FOSRestController throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$requestUserId.', logged user id: '.$user->getId()); } } - - /** - * Send a JSON Response. - * We don't use the Symfony JsonRespone, because it takes an array as parameter instead of a JSON string. - * - * @param string $json - * - * @return Response - */ - private function renderJsonResponse($json) - { - return new Response($json, 200, ['application/json']); - } } -- cgit v1.2.3 From faa86e06ba3032fdb98f3c0f79c72e8581d3c96f Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Sun, 25 Sep 2016 11:21:13 +0200 Subject: Fix tags count in menu Move enable cache for Tag in the Entity because function `find*` should return result and not a Query --- src/Wallabag/ApiBundle/Controller/WallabagRestController.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index fb7c6c1f..dd17ef97 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -322,9 +322,7 @@ class WallabagRestController extends FOSRestController $tags = $this->getDoctrine() ->getRepository('WallabagCoreBundle:Tag') - ->findAllTags($this->getUser()->getId()) - ->getQuery() - ->getResult(); + ->findAllTagsWithEntries($this->getUser()->getId()); $json = $this->get('serializer')->serialize($tags, 'json'); -- cgit v1.2.3 From 6273fefd5d945de1d871815a652f5a716e12e820 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Sat, 1 Oct 2016 17:15:28 +0200 Subject: Add an exists endpoint in API It should allow third party to check if an url was already saved by a user --- .../Controller/WallabagRestController.php | 32 ++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index dd17ef97..b83e4266 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -22,6 +22,38 @@ class WallabagRestController extends FOSRestController } } + /** + * Check if an entry exist by url + * + * @ApiDoc( + * parameters={ + * {"name"="url", "dataType"="string", "required"=true, "format"="An url", "description"="Url to check if it exists"} + * } + * ) + * + * @return JsonResponse + */ + public function getEntriesExistsAction(Request $request) + { + $this->validateAuthentication(); + + $url = $request->query->get('url', ''); + + if (empty($url)) { + throw $this->createAccessDeniedException('URL is empty?, logged user id: '.$user->getId()); + } + + $res = $this->getDoctrine() + ->getRepository('WallabagCoreBundle:Entry') + ->findByUrlAndUserId($url, $this->getUser()->getId()); + + $exists = false === $res ? false : true; + + $json = $this->get('serializer')->serialize(['exists' => $exists], 'json'); + + return (new JsonResponse())->setJson($json); + } + /** * Retrieve all entries. It could be filtered by many options. * -- cgit v1.2.3 From 3583cadf6fc4e5d2b410a42c874bb9a94e505390 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Sun, 2 Oct 2016 01:43:50 +0200 Subject: CS --- src/Wallabag/ApiBundle/Controller/WallabagRestController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index b83e4266..104720a9 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -23,7 +23,7 @@ class WallabagRestController extends FOSRestController } /** - * Check if an entry exist by url + * Check if an entry exist by url. * * @ApiDoc( * parameters={ -- cgit v1.2.3 From c3f8b428dd50578a6eba5f4673ea1c9edabd2512 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Sun, 2 Oct 2016 15:41:08 +0200 Subject: Fix parameters in API _links We forgot to pass them to the factory --- .../ApiBundle/Controller/WallabagRestController.php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index 104720a9..791bf80b 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -82,8 +82,8 @@ class WallabagRestController extends FOSRestController $order = $request->query->get('order', 'desc'); $page = (int) $request->query->get('page', 1); $perPage = (int) $request->query->get('perPage', 30); - $since = $request->query->get('since', 0); $tags = $request->query->get('tags', ''); + $since = $request->query->get('since', 0); $pager = $this->getDoctrine() ->getRepository('WallabagCoreBundle:Entry') @@ -95,7 +95,20 @@ class WallabagRestController extends FOSRestController $pagerfantaFactory = new PagerfantaFactory('page', 'perPage'); $paginatedCollection = $pagerfantaFactory->createRepresentation( $pager, - new Route('api_get_entries', [], UrlGeneratorInterface::ABSOLUTE_URL) + new Route( + 'api_get_entries', + [ + 'archive' => $isArchived, + 'starred' => $isStarred, + 'sort' => $sort, + 'order' => $order, + 'page' => $page, + 'perPage' => $perPage, + 'tags' => $tags, + 'since' => $since, + ], + UrlGeneratorInterface::ABSOLUTE_URL + ) ); $json = $this->get('serializer')->serialize($paginatedCollection, 'json'); -- cgit v1.2.3 From b0da721a5238ece3056ae7af760e9455f7af3e11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20L=C5=93uillet?= Date: Mon, 3 Oct 2016 21:39:01 +0200 Subject: Changed relation between API client and refresh token Fix #2350 --- src/Wallabag/ApiBundle/Entity/Client.php | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Entity/Client.php b/src/Wallabag/ApiBundle/Entity/Client.php index 3e2f491c..92b2f762 100644 --- a/src/Wallabag/ApiBundle/Entity/Client.php +++ b/src/Wallabag/ApiBundle/Entity/Client.php @@ -25,6 +25,11 @@ class Client extends BaseClient */ protected $name; + /** + * @ORM\OneToMany(targetEntity="RefreshToken", mappedBy="client", cascade={"remove"}) + */ + protected $refreshTokens; + public function __construct() { parent::__construct(); -- cgit v1.2.3 From 5d39243068a3c1132f6e3020c6c9da1840f85fcf Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Wed, 5 Oct 2016 15:28:36 +0200 Subject: Fix exists API call Boo --- src/Wallabag/ApiBundle/Controller/WallabagRestController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index 791bf80b..b2c73932 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -40,7 +40,7 @@ class WallabagRestController extends FOSRestController $url = $request->query->get('url', ''); if (empty($url)) { - throw $this->createAccessDeniedException('URL is empty?, logged user id: '.$user->getId()); + throw $this->createAccessDeniedException('URL is empty?, logged user id: '.$this->getUser->getId()); } $res = $this->getDoctrine() -- cgit v1.2.3 From 0b174d69d77770fab617661c284095bc61d30c10 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Wed, 5 Oct 2016 19:30:56 +0200 Subject: Fix typo & add test --- src/Wallabag/ApiBundle/Controller/WallabagRestController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index b2c73932..a0d9d4f3 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -40,7 +40,7 @@ class WallabagRestController extends FOSRestController $url = $request->query->get('url', ''); if (empty($url)) { - throw $this->createAccessDeniedException('URL is empty?, logged user id: '.$this->getUser->getId()); + throw $this->createAccessDeniedException('URL is empty?, logged user id: '.$this->getUser()->getId()); } $res = $this->getDoctrine() -- cgit v1.2.3 From f0abc22d09d2e38d3dd408425821a89da3d21377 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Fri, 7 Oct 2016 20:37:01 +0200 Subject: Ability to check multiple urls in API --- .../Controller/WallabagRestController.php | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index a0d9d4f3..6dd03c1b 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -27,7 +27,8 @@ class WallabagRestController extends FOSRestController * * @ApiDoc( * parameters={ - * {"name"="url", "dataType"="string", "required"=true, "format"="An url", "description"="Url to check if it exists"} + * {"name"="url", "dataType"="string", "required"=true, "format"="An url", "description"="Url to check if it exists"}, + * {"name"="urls", "dataType"="string", "required"=false, "format"="An array of urls (?urls[]=http...&urls[]=http...)", "description"="Urls (as an array) to check if it exists"} * } * ) * @@ -37,6 +38,25 @@ class WallabagRestController extends FOSRestController { $this->validateAuthentication(); + $urls = $request->query->get('urls', []); + + // handle multiple urls first + if (!empty($urls)) { + $results = []; + foreach ($urls as $url) { + $res = $this->getDoctrine() + ->getRepository('WallabagCoreBundle:Entry') + ->findByUrlAndUserId($url, $this->getUser()->getId()); + + $results[$url] = false === $res ? false : true; + } + + $json = $this->get('serializer')->serialize($results, 'json'); + + return (new JsonResponse())->setJson($json); + } + + // let's see if it is a simple url? $url = $request->query->get('url', ''); if (empty($url)) { -- cgit v1.2.3 From ac8cf632bb3a225c1b69d16e714ff60a2e988c89 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Fri, 7 Oct 2016 23:31:53 +0200 Subject: Ensure orphan tag are remove in API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the association between a tag and an entry is removed, if the tag doesn’t have other entries, we can remove it. Also add more tests for that part and ensure TagControllerTest is isolated from the rest of the test suite (finally!) --- .../Controller/WallabagRestController.php | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index a0d9d4f3..cc6923a0 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -400,6 +400,8 @@ class WallabagRestController extends FOSRestController ->getRepository('WallabagCoreBundle:Entry') ->removeTag($this->getUser()->getId(), $tag); + $this->cleanOrphanTag($tag); + $json = $this->get('serializer')->serialize($tag, 'json'); return (new JsonResponse())->setJson($json); @@ -440,6 +442,8 @@ class WallabagRestController extends FOSRestController ->getRepository('WallabagCoreBundle:Entry') ->removeTags($this->getUser()->getId(), $tags); + $this->cleanOrphanTag($tags); + $json = $this->get('serializer')->serialize($tags, 'json'); return (new JsonResponse())->setJson($json); @@ -464,6 +468,8 @@ class WallabagRestController extends FOSRestController ->getRepository('WallabagCoreBundle:Entry') ->removeTag($this->getUser()->getId(), $tag); + $this->cleanOrphanTag($tag); + $json = $this->get('serializer')->serialize($tag, 'json'); return (new JsonResponse())->setJson($json); @@ -485,6 +491,28 @@ class WallabagRestController extends FOSRestController return (new JsonResponse())->setJson($json); } + /** + * Remove orphan tag in case no entries are associated to it. + * + * @param Tag|array $tags + */ + private function cleanOrphanTag($tags) + { + if (!is_array($tags)) { + $tags = [$tags]; + } + + $em = $this->getDoctrine()->getManager(); + + foreach ($tags as $tag) { + if (count($tag->getEntries()) === 0) { + $em->remove($tag); + } + } + + $em->flush(); + } + /** * Validate that the first id is equal to the second one. * If not, throw exception. It means a user try to access information from an other user. -- cgit v1.2.3 From ee32248f43baef7e995c9e420cd00a137e626cf0 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Sat, 8 Oct 2016 00:02:22 +0200 Subject: Ensure access_token are removed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When we remove the client, we should ensure that access_token are also removed. To ensure that, I created a test that generated an access_token. So when we remove the client, this association should be cascaded and shouldn’t generate an error. Also I moved some Api related stuff to the ApiBundle (like the developer controler and ClientType form) --- .../ApiBundle/Controller/DeveloperController.php | 101 +++++++++++++++++++++ src/Wallabag/ApiBundle/Entity/Client.php | 5 + src/Wallabag/ApiBundle/Form/Type/ClientType.php | 46 ++++++++++ 3 files changed, 152 insertions(+) create mode 100644 src/Wallabag/ApiBundle/Controller/DeveloperController.php create mode 100644 src/Wallabag/ApiBundle/Form/Type/ClientType.php (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/DeveloperController.php b/src/Wallabag/ApiBundle/Controller/DeveloperController.php new file mode 100644 index 00000000..5a36a260 --- /dev/null +++ b/src/Wallabag/ApiBundle/Controller/DeveloperController.php @@ -0,0 +1,101 @@ +getDoctrine()->getRepository('WallabagApiBundle:Client')->findAll(); + + return $this->render('@WallabagCore/themes/common/Developer/index.html.twig', [ + 'clients' => $clients, + ]); + } + + /** + * Create a client (an app). + * + * @param Request $request + * + * @Route("/developer/client/create", name="developer_create_client") + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function createClientAction(Request $request) + { + $em = $this->getDoctrine()->getManager(); + $client = new Client(); + $clientForm = $this->createForm(ClientType::class, $client); + $clientForm->handleRequest($request); + + if ($clientForm->isValid()) { + $client->setAllowedGrantTypes(['token', 'authorization_code', 'password', 'refresh_token']); + $em->persist($client); + $em->flush(); + + $this->get('session')->getFlashBag()->add( + 'notice', + $this->get('translator')->trans('flashes.developer.notice.client_created', ['%name%' => $client->getName()]) + ); + + return $this->render('@WallabagCore/themes/common/Developer/client_parameters.html.twig', [ + 'client_id' => $client->getPublicId(), + 'client_secret' => $client->getSecret(), + 'client_name' => $client->getName(), + ]); + } + + return $this->render('@WallabagCore/themes/common/Developer/client.html.twig', [ + 'form' => $clientForm->createView(), + ]); + } + + /** + * Remove a client. + * + * @param Client $client + * + * @Route("/developer/client/delete/{id}", requirements={"id" = "\d+"}, name="developer_delete_client") + * + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + public function deleteClientAction(Client $client) + { + $em = $this->getDoctrine()->getManager(); + $em->remove($client); + $em->flush(); + + $this->get('session')->getFlashBag()->add( + 'notice', + $this->get('translator')->trans('flashes.developer.notice.client_deleted', ['%name%' => $client->getName()]) + ); + + return $this->redirect($this->generateUrl('developer')); + } + + /** + * Display developer how to use an existing app. + * + * @Route("/developer/howto/first-app", name="developer_howto_firstapp") + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function howtoFirstAppAction() + { + return $this->render('@WallabagCore/themes/common/Developer/howto_app.html.twig'); + } +} diff --git a/src/Wallabag/ApiBundle/Entity/Client.php b/src/Wallabag/ApiBundle/Entity/Client.php index 92b2f762..f7898ac8 100644 --- a/src/Wallabag/ApiBundle/Entity/Client.php +++ b/src/Wallabag/ApiBundle/Entity/Client.php @@ -30,6 +30,11 @@ class Client extends BaseClient */ protected $refreshTokens; + /** + * @ORM\OneToMany(targetEntity="AccessToken", mappedBy="client", cascade={"remove"}) + */ + protected $accessTokens; + public function __construct() { parent::__construct(); diff --git a/src/Wallabag/ApiBundle/Form/Type/ClientType.php b/src/Wallabag/ApiBundle/Form/Type/ClientType.php new file mode 100644 index 00000000..0ea1a9c5 --- /dev/null +++ b/src/Wallabag/ApiBundle/Form/Type/ClientType.php @@ -0,0 +1,46 @@ +add('name', TextType::class, ['label' => 'developer.client.form.name_label']) + ->add('redirect_uris', UrlType::class, ['required' => false, 'label' => 'developer.client.form.redirect_uris_label']) + ->add('save', SubmitType::class, ['label' => 'developer.client.form.save_label']) + ; + + $builder->get('redirect_uris') + ->addModelTransformer(new CallbackTransformer( + function ($originalUri) { + return $originalUri; + }, + function ($submittedUri) { + return [$submittedUri]; + } + )) + ; + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => 'Wallabag\ApiBundle\Entity\Client', + ]); + } + + public function getBlockPrefix() + { + return 'client'; + } +} -- cgit v1.2.3 From 28bb48905a2104adad65508f51737f987dc1ad4c Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Sun, 9 Oct 2016 18:41:19 +0200 Subject: Optimize the way tag list is rendered MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of retrieve all informations about entries of a tag to just count them, we’ll count them before with a fastest query. Also change the layout of the tag list in material design --- src/Wallabag/ApiBundle/Controller/WallabagRestController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index ed31c536..9997913d 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php @@ -387,7 +387,7 @@ class WallabagRestController extends FOSRestController $tags = $this->getDoctrine() ->getRepository('WallabagCoreBundle:Tag') - ->findAllTagsWithEntries($this->getUser()->getId()); + ->findAllTags($this->getUser()->getId()); $json = $this->get('serializer')->serialize($tags, 'json'); -- cgit v1.2.3 From 8dc4cd0f25838d074a1b512392f2087a44d26f54 Mon Sep 17 00:00:00 2001 From: Jeremy Benoist Date: Sun, 9 Oct 2016 20:51:37 +0200 Subject: Fix entities definition As per Doctrine said in the debug tool bar: - The field Wallabag\ApiBundle\Entity\Client#refreshTokens is on the inverse side of a bi-directional relationship, but the specified mappedBy association on the target-entity Wallabag\ApiBundle\Entity\RefreshToken#client does not contain the required 'inversedBy="refreshTokens"' attribute. - The field Wallabag\ApiBundle\Entity\Client#accessTokens is on the inverse side of a bi-directional relationship, but the specified mappedBy association on the target-entity Wallabag\ApiBundle\Entity\AccessToken#client does not contain the required 'inversedBy="accessTokens"' attribute. --- src/Wallabag/ApiBundle/Entity/AccessToken.php | 2 +- src/Wallabag/ApiBundle/Entity/RefreshToken.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/Wallabag/ApiBundle') diff --git a/src/Wallabag/ApiBundle/Entity/AccessToken.php b/src/Wallabag/ApiBundle/Entity/AccessToken.php index 2ff63a83..c09a0c80 100644 --- a/src/Wallabag/ApiBundle/Entity/AccessToken.php +++ b/src/Wallabag/ApiBundle/Entity/AccessToken.php @@ -19,7 +19,7 @@ class AccessToken extends BaseAccessToken protected $id; /** - * @ORM\ManyToOne(targetEntity="Client") + * @ORM\ManyToOne(targetEntity="Client", inversedBy="accessTokens") * @ORM\JoinColumn(nullable=false) */ protected $client; diff --git a/src/Wallabag/ApiBundle/Entity/RefreshToken.php b/src/Wallabag/ApiBundle/Entity/RefreshToken.php index 6d0cab68..822a02d8 100644 --- a/src/Wallabag/ApiBundle/Entity/RefreshToken.php +++ b/src/Wallabag/ApiBundle/Entity/RefreshToken.php @@ -19,7 +19,7 @@ class RefreshToken extends BaseRefreshToken protected $id; /** - * @ORM\ManyToOne(targetEntity="Client") + * @ORM\ManyToOne(targetEntity="Client", inversedBy="refreshTokens") * @ORM\JoinColumn(nullable=false) */ protected $client; -- cgit v1.2.3