diff options
Diffstat (limited to 'src/Wallabag/CoreBundle/Controller/WallabagRestController.php')
-rw-r--r-- | src/Wallabag/CoreBundle/Controller/WallabagRestController.php | 170 |
1 files changed, 130 insertions, 40 deletions
diff --git a/src/Wallabag/CoreBundle/Controller/WallabagRestController.php b/src/Wallabag/CoreBundle/Controller/WallabagRestController.php index e9cd8c93..14f42c48 100644 --- a/src/Wallabag/CoreBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/CoreBundle/Controller/WallabagRestController.php | |||
@@ -5,14 +5,41 @@ namespace Wallabag\CoreBundle\Controller; | |||
5 | use Nelmio\ApiDocBundle\Annotation\ApiDoc; | 5 | use Nelmio\ApiDocBundle\Annotation\ApiDoc; |
6 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | 6 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
7 | use Symfony\Component\HttpFoundation\Request; | 7 | use Symfony\Component\HttpFoundation\Request; |
8 | use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | 8 | use Symfony\Component\HttpFoundation\Response; |
9 | use Wallabag\CoreBundle\Entity\Entry; | 9 | use Wallabag\CoreBundle\Entity\Entry; |
10 | use Wallabag\CoreBundle\Entity\Tag; | 10 | use Wallabag\CoreBundle\Entity\Tag; |
11 | use Wallabag\CoreBundle\Service\Extractor; | 11 | use Wallabag\CoreBundle\Service\Extractor; |
12 | use Hateoas\Configuration\Route; | ||
13 | use Hateoas\Representation\Factory\PagerfantaFactory; | ||
12 | 14 | ||
13 | class WallabagRestController extends Controller | 15 | class WallabagRestController extends Controller |
14 | { | 16 | { |
15 | /** | 17 | /** |
18 | * @param Entry $entry | ||
19 | * @param string $tags | ||
20 | */ | ||
21 | private function assignTagsToEntry(Entry $entry, $tags) | ||
22 | { | ||
23 | foreach (explode(',', $tags) as $label) { | ||
24 | $label = trim($label); | ||
25 | $tagEntity = $this | ||
26 | ->getDoctrine() | ||
27 | ->getRepository('WallabagCoreBundle:Tag') | ||
28 | ->findOneByLabel($label); | ||
29 | |||
30 | if (is_null($tagEntity)) { | ||
31 | $tagEntity = new Tag($this->getUser()); | ||
32 | $tagEntity->setLabel($label); | ||
33 | } | ||
34 | |||
35 | // only add the tag on the entry if the relation doesn't exist | ||
36 | if (!$entry->getTags()->contains($tagEntity)) { | ||
37 | $entry->addTag($tagEntity); | ||
38 | } | ||
39 | } | ||
40 | } | ||
41 | |||
42 | /** | ||
16 | * Retrieve salt for a giver user. | 43 | * Retrieve salt for a giver user. |
17 | * | 44 | * |
18 | * @ApiDoc( | 45 | * @ApiDoc( |
@@ -42,7 +69,6 @@ class WallabagRestController extends Controller | |||
42 | * parameters={ | 69 | * parameters={ |
43 | * {"name"="archive", "dataType"="boolean", "required"=false, "format"="true or false, all entries by default", "description"="filter by archived status."}, | 70 | * {"name"="archive", "dataType"="boolean", "required"=false, "format"="true or false, all entries by default", "description"="filter by archived status."}, |
44 | * {"name"="star", "dataType"="boolean", "required"=false, "format"="true or false, all entries by default", "description"="filter by starred status."}, | 71 | * {"name"="star", "dataType"="boolean", "required"=false, "format"="true or false, all entries by default", "description"="filter by starred status."}, |
45 | * {"name"="delete", "dataType"="boolean", "required"=false, "format"="true or false, default '0'", "description"="filter by deleted status."}, | ||
46 | * {"name"="sort", "dataType"="string", "required"=false, "format"="'created' or 'updated', default 'created'", "description"="sort entries by date."}, | 72 | * {"name"="sort", "dataType"="string", "required"=false, "format"="'created' or 'updated', default 'created'", "description"="sort entries by date."}, |
47 | * {"name"="order", "dataType"="string", "required"=false, "format"="'asc' or 'desc', default 'desc'", "description"="order of sort."}, | 73 | * {"name"="order", "dataType"="string", "required"=false, "format"="'asc' or 'desc', default 'desc'", "description"="order of sort."}, |
48 | * {"name"="page", "dataType"="integer", "required"=false, "format"="default '1'", "description"="what page you want."}, | 74 | * {"name"="page", "dataType"="integer", "required"=false, "format"="default '1'", "description"="what page you want."}, |
@@ -56,23 +82,33 @@ class WallabagRestController extends Controller | |||
56 | { | 82 | { |
57 | $isArchived = $request->query->get('archive'); | 83 | $isArchived = $request->query->get('archive'); |
58 | $isStarred = $request->query->get('star'); | 84 | $isStarred = $request->query->get('star'); |
59 | $isDeleted = $request->query->get('delete', 0); | ||
60 | $sort = $request->query->get('sort', 'created'); | 85 | $sort = $request->query->get('sort', 'created'); |
61 | $order = $request->query->get('order', 'desc'); | 86 | $order = $request->query->get('order', 'desc'); |
62 | $page = $request->query->get('page', 1); | 87 | $page = (int) $request->query->get('page', 1); |
63 | $perPage = $request->query->get('perPage', 30); | 88 | $perPage = (int) $request->query->get('perPage', 30); |
64 | $tags = $request->query->get('tags', array()); | 89 | $tags = $request->query->get('tags', array()); |
65 | 90 | ||
66 | $entries = $this | 91 | $pager = $this |
67 | ->getDoctrine() | 92 | ->getDoctrine() |
68 | ->getRepository('WallabagCoreBundle:Entry') | 93 | ->getRepository('WallabagCoreBundle:Entry') |
69 | ->findEntries($this->getUser()->getId(), $isArchived, $isStarred, $isDeleted, $sort, $order); | 94 | ->findEntries($this->getUser()->getId(), $isArchived, $isStarred, $sort, $order); |
70 | 95 | ||
71 | if (!($entries)) { | 96 | if (0 === $pager->getNbResults()) { |
72 | throw $this->createNotFoundException(); | 97 | throw $this->createNotFoundException(); |
73 | } | 98 | } |
74 | 99 | ||
75 | return $entries; | 100 | $pager->setCurrentPage($page); |
101 | $pager->setMaxPerPage($perPage); | ||
102 | |||
103 | $pagerfantaFactory = new PagerfantaFactory('page', 'perPage'); | ||
104 | $paginatedCollection = $pagerfantaFactory->createRepresentation( | ||
105 | $pager, | ||
106 | new Route('api_get_entries', [], $absolute = true) | ||
107 | ); | ||
108 | |||
109 | $json = $this->get('serializer')->serialize($paginatedCollection, 'json'); | ||
110 | |||
111 | return new Response($json, 200, array('application/json')); | ||
76 | } | 112 | } |
77 | 113 | ||
78 | /** | 114 | /** |
@@ -87,7 +123,13 @@ class WallabagRestController extends Controller | |||
87 | */ | 123 | */ |
88 | public function getEntryAction(Entry $entry) | 124 | public function getEntryAction(Entry $entry) |
89 | { | 125 | { |
90 | return $entry; | 126 | if ($entry->getUser()->getId() != $this->getUser()->getId()) { |
127 | throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$entry->getUser()->getId().', logged user id: '.$this->getUser()->getId()); | ||
128 | } | ||
129 | |||
130 | $json = $this->get('serializer')->serialize($entry, 'json'); | ||
131 | |||
132 | return new Response($json, 200, array('application/json')); | ||
91 | } | 133 | } |
92 | 134 | ||
93 | /** | 135 | /** |
@@ -104,7 +146,6 @@ class WallabagRestController extends Controller | |||
104 | */ | 146 | */ |
105 | public function postEntriesAction(Request $request) | 147 | public function postEntriesAction(Request $request) |
106 | { | 148 | { |
107 | //TODO gérer si on passe les tags | ||
108 | $url = $request->request->get('url'); | 149 | $url = $request->request->get('url'); |
109 | 150 | ||
110 | $content = Extractor::extract($url); | 151 | $content = Extractor::extract($url); |
@@ -112,11 +153,19 @@ class WallabagRestController extends Controller | |||
112 | $entry->setUrl($url); | 153 | $entry->setUrl($url); |
113 | $entry->setTitle($request->request->get('title') ?: $content->getTitle()); | 154 | $entry->setTitle($request->request->get('title') ?: $content->getTitle()); |
114 | $entry->setContent($content->getBody()); | 155 | $entry->setContent($content->getBody()); |
156 | |||
157 | $tags = $request->request->get('tags', ''); | ||
158 | if (!empty($tags)) { | ||
159 | $this->assignTagsToEntry($entry, $tags); | ||
160 | } | ||
161 | |||
115 | $em = $this->getDoctrine()->getManager(); | 162 | $em = $this->getDoctrine()->getManager(); |
116 | $em->persist($entry); | 163 | $em->persist($entry); |
117 | $em->flush(); | 164 | $em->flush(); |
118 | 165 | ||
119 | return $entry; | 166 | $json = $this->get('serializer')->serialize($entry, 'json'); |
167 | |||
168 | return new Response($json, 200, array('application/json')); | ||
120 | } | 169 | } |
121 | 170 | ||
122 | /** | 171 | /** |
@@ -131,17 +180,18 @@ class WallabagRestController extends Controller | |||
131 | * {"name"="tags", "dataType"="string", "required"=false, "format"="tag1,tag2,tag3", "description"="a comma-separated list of tags."}, | 180 | * {"name"="tags", "dataType"="string", "required"=false, "format"="tag1,tag2,tag3", "description"="a comma-separated list of tags."}, |
132 | * {"name"="archive", "dataType"="boolean", "required"=false, "format"="true or false", "description"="archived the entry."}, | 181 | * {"name"="archive", "dataType"="boolean", "required"=false, "format"="true or false", "description"="archived the entry."}, |
133 | * {"name"="star", "dataType"="boolean", "required"=false, "format"="true or false", "description"="starred the entry."}, | 182 | * {"name"="star", "dataType"="boolean", "required"=false, "format"="true or false", "description"="starred the entry."}, |
134 | * {"name"="delete", "dataType"="boolean", "required"=false, "format"="true or false", "description"="flag as deleted. Default false. In case that you don't want to *really* remove it.."}, | 183 | * } |
135 | * } | ||
136 | * ) | 184 | * ) |
137 | * @return Entry | 185 | * @return Entry |
138 | */ | 186 | */ |
139 | public function patchEntriesAction(Entry $entry, Request $request) | 187 | public function patchEntriesAction(Entry $entry, Request $request) |
140 | { | 188 | { |
189 | if ($entry->getUser()->getId() != $this->getUser()->getId()) { | ||
190 | throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$entry->getUser()->getId().', logged user id: '.$this->getUser()->getId()); | ||
191 | } | ||
192 | |||
141 | $title = $request->request->get("title"); | 193 | $title = $request->request->get("title"); |
142 | $tags = $request->request->get("tags", array()); | ||
143 | $isArchived = $request->request->get("archive"); | 194 | $isArchived = $request->request->get("archive"); |
144 | $isDeleted = $request->request->get("delete"); | ||
145 | $isStarred = $request->request->get("star"); | 195 | $isStarred = $request->request->get("star"); |
146 | 196 | ||
147 | if (!is_null($title)) { | 197 | if (!is_null($title)) { |
@@ -152,18 +202,21 @@ class WallabagRestController extends Controller | |||
152 | $entry->setArchived($isArchived); | 202 | $entry->setArchived($isArchived); |
153 | } | 203 | } |
154 | 204 | ||
155 | if (!is_null($isDeleted)) { | ||
156 | $entry->setDeleted($isDeleted); | ||
157 | } | ||
158 | |||
159 | if (!is_null($isStarred)) { | 205 | if (!is_null($isStarred)) { |
160 | $entry->setStarred($isStarred); | 206 | $entry->setStarred($isStarred); |
161 | } | 207 | } |
162 | 208 | ||
209 | $tags = $request->request->get('tags', ''); | ||
210 | if (!empty($tags)) { | ||
211 | $this->assignTagsToEntry($entry, $tags); | ||
212 | } | ||
213 | |||
163 | $em = $this->getDoctrine()->getManager(); | 214 | $em = $this->getDoctrine()->getManager(); |
164 | $em->flush(); | 215 | $em->flush(); |
165 | 216 | ||
166 | return $entry; | 217 | $json = $this->get('serializer')->serialize($entry, 'json'); |
218 | |||
219 | return new Response($json, 200, array('application/json')); | ||
167 | } | 220 | } |
168 | 221 | ||
169 | /** | 222 | /** |
@@ -178,15 +231,17 @@ class WallabagRestController extends Controller | |||
178 | */ | 231 | */ |
179 | public function deleteEntriesAction(Entry $entry) | 232 | public function deleteEntriesAction(Entry $entry) |
180 | { | 233 | { |
181 | if ($entry->isDeleted()) { | 234 | if ($entry->getUser()->getId() != $this->getUser()->getId()) { |
182 | throw new NotFoundHttpException('This entry is already deleted'); | 235 | throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$entry->getUser()->getId().', logged user id: '.$this->getUser()->getId()); |
183 | } | 236 | } |
184 | 237 | ||
185 | $em = $this->getDoctrine()->getManager(); | 238 | $em = $this->getDoctrine()->getManager(); |
186 | $entry->setDeleted(1); | 239 | $em->remove($entry); |
187 | $em->flush(); | 240 | $em->flush(); |
188 | 241 | ||
189 | return $entry; | 242 | $json = $this->get('serializer')->serialize($entry, 'json'); |
243 | |||
244 | return new Response($json, 200, array('application/json')); | ||
190 | } | 245 | } |
191 | 246 | ||
192 | /** | 247 | /** |
@@ -200,6 +255,13 @@ class WallabagRestController extends Controller | |||
200 | */ | 255 | */ |
201 | public function getEntriesTagsAction(Entry $entry) | 256 | public function getEntriesTagsAction(Entry $entry) |
202 | { | 257 | { |
258 | if ($entry->getUser()->getId() != $this->getUser()->getId()) { | ||
259 | throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$entry->getUser()->getId().', logged user id: '.$this->getUser()->getId()); | ||
260 | } | ||
261 | |||
262 | $json = $this->get('serializer')->serialize($entry->getTags(), 'json'); | ||
263 | |||
264 | return new Response($json, 200, array('application/json')); | ||
203 | } | 265 | } |
204 | 266 | ||
205 | /** | 267 | /** |
@@ -214,8 +276,24 @@ class WallabagRestController extends Controller | |||
214 | * } | 276 | * } |
215 | * ) | 277 | * ) |
216 | */ | 278 | */ |
217 | public function postEntriesTagsAction(Entry $entry) | 279 | public function postEntriesTagsAction(Request $request, Entry $entry) |
218 | { | 280 | { |
281 | if ($entry->getUser()->getId() != $this->getUser()->getId()) { | ||
282 | throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$entry->getUser()->getId().', logged user id: '.$this->getUser()->getId()); | ||
283 | } | ||
284 | |||
285 | $tags = $request->request->get('tags', ''); | ||
286 | if (!empty($tags)) { | ||
287 | $this->assignTagsToEntry($entry, $tags); | ||
288 | } | ||
289 | |||
290 | $em = $this->getDoctrine()->getManager(); | ||
291 | $em->persist($entry); | ||
292 | $em->flush(); | ||
293 | |||
294 | $json = $this->get('serializer')->serialize($entry, 'json'); | ||
295 | |||
296 | return new Response($json, 200, array('application/json')); | ||
219 | } | 297 | } |
220 | 298 | ||
221 | /** | 299 | /** |
@@ -230,29 +308,30 @@ class WallabagRestController extends Controller | |||
230 | */ | 308 | */ |
231 | public function deleteEntriesTagsAction(Entry $entry, Tag $tag) | 309 | public function deleteEntriesTagsAction(Entry $entry, Tag $tag) |
232 | { | 310 | { |
311 | if ($entry->getUser()->getId() != $this->getUser()->getId()) { | ||
312 | throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$entry->getUser()->getId().', logged user id: '.$this->getUser()->getId()); | ||
313 | } | ||
314 | |||
315 | $entry->removeTag($tag); | ||
316 | $em = $this->getDoctrine()->getManager(); | ||
317 | $em->persist($entry); | ||
318 | $em->flush(); | ||
319 | |||
320 | $json = $this->get('serializer')->serialize($entry, 'json'); | ||
321 | |||
322 | return new Response($json, 200, array('application/json')); | ||
233 | } | 323 | } |
234 | 324 | ||
235 | /** | 325 | /** |
236 | * Retrieve all tags | 326 | * Retrieve all tags |
237 | * | 327 | * |
238 | * @ApiDoc( | 328 | * @ApiDoc() |
239 | * ) | ||
240 | */ | 329 | */ |
241 | public function getTagsAction() | 330 | public function getTagsAction() |
242 | { | 331 | { |
243 | } | 332 | $json = $this->get('serializer')->serialize($this->getUser()->getTags(), 'json'); |
244 | 333 | ||
245 | /** | 334 | return new Response($json, 200, array('application/json')); |
246 | * Retrieve a single tag | ||
247 | * | ||
248 | * @ApiDoc( | ||
249 | * requirements={ | ||
250 | * {"name"="tag", "dataType"="string", "requirement"="\w+", "description"="The tag"} | ||
251 | * } | ||
252 | * ) | ||
253 | */ | ||
254 | public function getTagAction(Tag $tag) | ||
255 | { | ||
256 | } | 335 | } |
257 | 336 | ||
258 | /** | 337 | /** |
@@ -266,5 +345,16 @@ class WallabagRestController extends Controller | |||
266 | */ | 345 | */ |
267 | public function deleteTagAction(Tag $tag) | 346 | public function deleteTagAction(Tag $tag) |
268 | { | 347 | { |
348 | if ($tag->getUser()->getId() != $this->getUser()->getId()) { | ||
349 | throw $this->createAccessDeniedException('Access forbidden. Entry user id: '.$tag->getUser()->getId().', logged user id: '.$this->getUser()->getId()); | ||
350 | } | ||
351 | |||
352 | $em = $this->getDoctrine()->getManager(); | ||
353 | $em->remove($tag); | ||
354 | $em->flush(); | ||
355 | |||
356 | $json = $this->get('serializer')->serialize($tag, 'json'); | ||
357 | |||
358 | return new Response($json, 200, array('application/json')); | ||
269 | } | 359 | } |
270 | } | 360 | } |