diff options
Diffstat (limited to 'src/Wallabag/CoreBundle/Controller')
5 files changed, 192 insertions, 15 deletions
diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php index 46fb9503..52a03070 100644 --- a/src/Wallabag/CoreBundle/Controller/ConfigController.php +++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php | |||
@@ -7,6 +7,7 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller; | |||
7 | use Symfony\Component\HttpFoundation\JsonResponse; | 7 | use Symfony\Component\HttpFoundation\JsonResponse; |
8 | use Symfony\Component\HttpFoundation\RedirectResponse; | 8 | use Symfony\Component\HttpFoundation\RedirectResponse; |
9 | use Symfony\Component\HttpFoundation\Request; | 9 | use Symfony\Component\HttpFoundation\Request; |
10 | use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; | ||
10 | use Wallabag\CoreBundle\Entity\Config; | 11 | use Wallabag\CoreBundle\Entity\Config; |
11 | use Wallabag\CoreBundle\Entity\TaggingRule; | 12 | use Wallabag\CoreBundle\Entity\TaggingRule; |
12 | use Wallabag\CoreBundle\Form\Type\ConfigType; | 13 | use Wallabag\CoreBundle\Form\Type\ConfigType; |
@@ -150,6 +151,10 @@ class ConfigController extends Controller | |||
150 | 'token' => $config->getRssToken(), | 151 | 'token' => $config->getRssToken(), |
151 | ], | 152 | ], |
152 | 'twofactor_auth' => $this->getParameter('twofactor_auth'), | 153 | 'twofactor_auth' => $this->getParameter('twofactor_auth'), |
154 | 'wallabag_url' => $this->get('craue_config')->get('wallabag_url'), | ||
155 | 'enabled_users' => $this->getDoctrine() | ||
156 | ->getRepository('WallabagUserBundle:User') | ||
157 | ->getSumEnabledUsers(), | ||
153 | ]); | 158 | ]); |
154 | } | 159 | } |
155 | 160 | ||
@@ -223,6 +228,78 @@ class ConfigController extends Controller | |||
223 | } | 228 | } |
224 | 229 | ||
225 | /** | 230 | /** |
231 | * Remove all annotations OR tags OR entries for the current user. | ||
232 | * | ||
233 | * @Route("/reset/{type}", requirements={"id" = "annotations|tags|entries"}, name="config_reset") | ||
234 | * | ||
235 | * @return RedirectResponse | ||
236 | */ | ||
237 | public function resetAction($type) | ||
238 | { | ||
239 | switch ($type) { | ||
240 | case 'annotations': | ||
241 | $this->getDoctrine() | ||
242 | ->getRepository('WallabagAnnotationBundle:Annotation') | ||
243 | ->removeAllByUserId($this->getUser()->getId()); | ||
244 | break; | ||
245 | |||
246 | case 'tags': | ||
247 | $this->removeAllTagsByUserId($this->getUser()->getId()); | ||
248 | break; | ||
249 | |||
250 | case 'entries': | ||
251 | // SQLite doesn't care about cascading remove, so we need to manually remove associated stuf | ||
252 | // otherwise they won't be removed ... | ||
253 | if ($this->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) { | ||
254 | $this->getDoctrine()->getRepository('WallabagAnnotationBundle:Annotation')->removeAllByUserId($this->getUser()->getId()); | ||
255 | } | ||
256 | |||
257 | // manually remove tags to avoid orphan tag | ||
258 | $this->removeAllTagsByUserId($this->getUser()->getId()); | ||
259 | |||
260 | $this->getDoctrine() | ||
261 | ->getRepository('WallabagCoreBundle:Entry') | ||
262 | ->removeAllByUserId($this->getUser()->getId()); | ||
263 | } | ||
264 | |||
265 | $this->get('session')->getFlashBag()->add( | ||
266 | 'notice', | ||
267 | 'flashes.config.notice.'.$type.'_reset' | ||
268 | ); | ||
269 | |||
270 | return $this->redirect($this->generateUrl('config').'#set3'); | ||
271 | } | ||
272 | |||
273 | /** | ||
274 | * Remove all tags for a given user and cleanup orphan tags. | ||
275 | * | ||
276 | * @param int $userId | ||
277 | */ | ||
278 | private function removeAllTagsByUserId($userId) | ||
279 | { | ||
280 | $tags = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findAllTags($userId); | ||
281 | |||
282 | if (empty($tags)) { | ||
283 | return; | ||
284 | } | ||
285 | |||
286 | $this->getDoctrine() | ||
287 | ->getRepository('WallabagCoreBundle:Entry') | ||
288 | ->removeTags($userId, $tags); | ||
289 | |||
290 | // cleanup orphan tags | ||
291 | $em = $this->getDoctrine()->getManager(); | ||
292 | |||
293 | foreach ($tags as $tag) { | ||
294 | if (count($tag->getEntries()) === 0) { | ||
295 | $em->remove($tag); | ||
296 | } | ||
297 | } | ||
298 | |||
299 | $em->flush(); | ||
300 | } | ||
301 | |||
302 | /** | ||
226 | * Validate that a rule can be edited/deleted by the current user. | 303 | * Validate that a rule can be edited/deleted by the current user. |
227 | * | 304 | * |
228 | * @param TaggingRule $rule | 305 | * @param TaggingRule $rule |
@@ -253,4 +330,37 @@ class ConfigController extends Controller | |||
253 | 330 | ||
254 | return $config; | 331 | return $config; |
255 | } | 332 | } |
333 | |||
334 | /** | ||
335 | * Delete account for current user. | ||
336 | * | ||
337 | * @Route("/account/delete", name="delete_account") | ||
338 | * | ||
339 | * @param Request $request | ||
340 | * | ||
341 | * @throws AccessDeniedHttpException | ||
342 | * | ||
343 | * @return \Symfony\Component\HttpFoundation\RedirectResponse | ||
344 | */ | ||
345 | public function deleteAccountAction(Request $request) | ||
346 | { | ||
347 | $enabledUsers = $this->getDoctrine() | ||
348 | ->getRepository('WallabagUserBundle:User') | ||
349 | ->getSumEnabledUsers(); | ||
350 | |||
351 | if ($enabledUsers <= 1) { | ||
352 | throw new AccessDeniedHttpException(); | ||
353 | } | ||
354 | |||
355 | $user = $this->getUser(); | ||
356 | |||
357 | // logout current user | ||
358 | $this->get('security.token_storage')->setToken(null); | ||
359 | $request->getSession()->invalidate(); | ||
360 | |||
361 | $em = $this->get('fos_user.user_manager'); | ||
362 | $em->deleteUser($user); | ||
363 | |||
364 | return $this->redirect($this->generateUrl('fos_user_security_login')); | ||
365 | } | ||
256 | } | 366 | } |
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php index 97bb3d12..8c13255e 100644 --- a/src/Wallabag/CoreBundle/Controller/EntryController.php +++ b/src/Wallabag/CoreBundle/Controller/EntryController.php | |||
@@ -13,10 +13,37 @@ use Wallabag\CoreBundle\Form\Type\EntryFilterType; | |||
13 | use Wallabag\CoreBundle\Form\Type\EditEntryType; | 13 | use Wallabag\CoreBundle\Form\Type\EditEntryType; |
14 | use Wallabag\CoreBundle\Form\Type\NewEntryType; | 14 | use Wallabag\CoreBundle\Form\Type\NewEntryType; |
15 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; | 15 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; |
16 | use Wallabag\CoreBundle\Event\EntrySavedEvent; | ||
17 | use Wallabag\CoreBundle\Event\EntryDeletedEvent; | ||
18 | use Wallabag\CoreBundle\Form\Type\SearchEntryType; | ||
16 | 19 | ||
17 | class EntryController extends Controller | 20 | class EntryController extends Controller |
18 | { | 21 | { |
19 | /** | 22 | /** |
23 | * @param Request $request | ||
24 | * @param int $page | ||
25 | * | ||
26 | * @Route("/search/{page}", name="search", defaults={"page" = "1"}) | ||
27 | * | ||
28 | * @return \Symfony\Component\HttpFoundation\Response | ||
29 | */ | ||
30 | public function searchFormAction(Request $request, $page, $currentRoute) | ||
31 | { | ||
32 | $form = $this->createForm(SearchEntryType::class); | ||
33 | |||
34 | $form->handleRequest($request); | ||
35 | |||
36 | if ($form->isValid()) { | ||
37 | return $this->showEntries('search', $request, $page); | ||
38 | } | ||
39 | |||
40 | return $this->render('WallabagCoreBundle:Entry:search_form.html.twig', [ | ||
41 | 'form' => $form->createView(), | ||
42 | 'currentRoute' => $currentRoute, | ||
43 | ]); | ||
44 | } | ||
45 | |||
46 | /** | ||
20 | * Fetch content and update entry. | 47 | * Fetch content and update entry. |
21 | * In case it fails, entry will return to avod loosing the data. | 48 | * In case it fails, entry will return to avod loosing the data. |
22 | * | 49 | * |
@@ -81,6 +108,9 @@ class EntryController extends Controller | |||
81 | $em->persist($entry); | 108 | $em->persist($entry); |
82 | $em->flush(); | 109 | $em->flush(); |
83 | 110 | ||
111 | // entry saved, dispatch event about it! | ||
112 | $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry)); | ||
113 | |||
84 | return $this->redirect($this->generateUrl('homepage')); | 114 | return $this->redirect($this->generateUrl('homepage')); |
85 | } | 115 | } |
86 | 116 | ||
@@ -107,6 +137,9 @@ class EntryController extends Controller | |||
107 | $em = $this->getDoctrine()->getManager(); | 137 | $em = $this->getDoctrine()->getManager(); |
108 | $em->persist($entry); | 138 | $em->persist($entry); |
109 | $em->flush(); | 139 | $em->flush(); |
140 | |||
141 | // entry saved, dispatch event about it! | ||
142 | $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry)); | ||
110 | } | 143 | } |
111 | 144 | ||
112 | return $this->redirect($this->generateUrl('homepage')); | 145 | return $this->redirect($this->generateUrl('homepage')); |
@@ -236,8 +269,14 @@ class EntryController extends Controller | |||
236 | private function showEntries($type, Request $request, $page) | 269 | private function showEntries($type, Request $request, $page) |
237 | { | 270 | { |
238 | $repository = $this->get('wallabag_core.entry_repository'); | 271 | $repository = $this->get('wallabag_core.entry_repository'); |
272 | $searchTerm = (isset($request->get('search_entry')['term']) ? $request->get('search_entry')['term'] : ''); | ||
273 | $currentRoute = (!is_null($request->get('currentRoute')) ? $request->get('currentRoute') : ''); | ||
239 | 274 | ||
240 | switch ($type) { | 275 | switch ($type) { |
276 | case 'search': | ||
277 | $qb = $repository->getBuilderForSearchByUser($this->getUser()->getId(), $searchTerm, $currentRoute); | ||
278 | |||
279 | break; | ||
241 | case 'untagged': | 280 | case 'untagged': |
242 | $qb = $repository->getBuilderForUntaggedByUser($this->getUser()->getId()); | 281 | $qb = $repository->getBuilderForUntaggedByUser($this->getUser()->getId()); |
243 | 282 | ||
@@ -286,11 +325,11 @@ class EntryController extends Controller | |||
286 | } | 325 | } |
287 | 326 | ||
288 | return $this->render( | 327 | return $this->render( |
289 | 'WallabagCoreBundle:Entry:entries.html.twig', | 328 | 'WallabagCoreBundle:Entry:entries.html.twig', [ |
290 | [ | ||
291 | 'form' => $form->createView(), | 329 | 'form' => $form->createView(), |
292 | 'entries' => $entries, | 330 | 'entries' => $entries, |
293 | 'currentPage' => $page, | 331 | 'currentPage' => $page, |
332 | 'searchTerm' => $searchTerm, | ||
294 | ] | 333 | ] |
295 | ); | 334 | ); |
296 | } | 335 | } |
@@ -343,6 +382,9 @@ class EntryController extends Controller | |||
343 | $em->persist($entry); | 382 | $em->persist($entry); |
344 | $em->flush(); | 383 | $em->flush(); |
345 | 384 | ||
385 | // entry saved, dispatch event about it! | ||
386 | $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry)); | ||
387 | |||
346 | return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()])); | 388 | return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()])); |
347 | } | 389 | } |
348 | 390 | ||
@@ -431,6 +473,9 @@ class EntryController extends Controller | |||
431 | UrlGeneratorInterface::ABSOLUTE_PATH | 473 | UrlGeneratorInterface::ABSOLUTE_PATH |
432 | ); | 474 | ); |
433 | 475 | ||
476 | // entry deleted, dispatch event about it! | ||
477 | $this->get('event_dispatcher')->dispatch(EntryDeletedEvent::NAME, new EntryDeletedEvent($entry)); | ||
478 | |||
434 | $em = $this->getDoctrine()->getManager(); | 479 | $em = $this->getDoctrine()->getManager(); |
435 | $em->remove($entry); | 480 | $em->remove($entry); |
436 | $em->flush(); | 481 | $em->flush(); |
diff --git a/src/Wallabag/CoreBundle/Controller/ExportController.php b/src/Wallabag/CoreBundle/Controller/ExportController.php index 79653cfe..abc3336a 100644 --- a/src/Wallabag/CoreBundle/Controller/ExportController.php +++ b/src/Wallabag/CoreBundle/Controller/ExportController.php | |||
@@ -48,7 +48,7 @@ class ExportController extends Controller | |||
48 | * | 48 | * |
49 | * @Route("/export/{category}.{format}", name="export_entries", requirements={ | 49 | * @Route("/export/{category}.{format}", name="export_entries", requirements={ |
50 | * "format": "epub|mobi|pdf|json|xml|txt|csv", | 50 | * "format": "epub|mobi|pdf|json|xml|txt|csv", |
51 | * "category": "all|unread|starred|archive|tag_entries|untagged" | 51 | * "category": "all|unread|starred|archive|tag_entries|untagged|search" |
52 | * }) | 52 | * }) |
53 | * | 53 | * |
54 | * @return \Symfony\Component\HttpFoundation\Response | 54 | * @return \Symfony\Component\HttpFoundation\Response |
diff --git a/src/Wallabag/CoreBundle/Controller/RssController.php b/src/Wallabag/CoreBundle/Controller/RssController.php index 38e3b5a0..2290386f 100644 --- a/src/Wallabag/CoreBundle/Controller/RssController.php +++ b/src/Wallabag/CoreBundle/Controller/RssController.php | |||
@@ -3,12 +3,15 @@ | |||
3 | namespace Wallabag\CoreBundle\Controller; | 3 | namespace Wallabag\CoreBundle\Controller; |
4 | 4 | ||
5 | use Pagerfanta\Adapter\DoctrineORMAdapter; | 5 | use Pagerfanta\Adapter\DoctrineORMAdapter; |
6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; | ||
6 | use Pagerfanta\Pagerfanta; | 7 | use Pagerfanta\Pagerfanta; |
7 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; | 8 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; |
8 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; | 9 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; |
10 | use Symfony\Component\HttpFoundation\Request; | ||
9 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | 11 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
10 | use Wallabag\CoreBundle\Entity\Entry; | 12 | use Wallabag\CoreBundle\Entity\Entry; |
11 | use Wallabag\UserBundle\Entity\User; | 13 | use Wallabag\UserBundle\Entity\User; |
14 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | ||
12 | 15 | ||
13 | class RssController extends Controller | 16 | class RssController extends Controller |
14 | { | 17 | { |
@@ -20,9 +23,9 @@ class RssController extends Controller | |||
20 | * | 23 | * |
21 | * @return \Symfony\Component\HttpFoundation\Response | 24 | * @return \Symfony\Component\HttpFoundation\Response |
22 | */ | 25 | */ |
23 | public function showUnreadAction(User $user) | 26 | public function showUnreadAction(Request $request, User $user) |
24 | { | 27 | { |
25 | return $this->showEntries('unread', $user); | 28 | return $this->showEntries('unread', $user, $request->query->get('page', 1)); |
26 | } | 29 | } |
27 | 30 | ||
28 | /** | 31 | /** |
@@ -33,9 +36,9 @@ class RssController extends Controller | |||
33 | * | 36 | * |
34 | * @return \Symfony\Component\HttpFoundation\Response | 37 | * @return \Symfony\Component\HttpFoundation\Response |
35 | */ | 38 | */ |
36 | public function showArchiveAction(User $user) | 39 | public function showArchiveAction(Request $request, User $user) |
37 | { | 40 | { |
38 | return $this->showEntries('archive', $user); | 41 | return $this->showEntries('archive', $user, $request->query->get('page', 1)); |
39 | } | 42 | } |
40 | 43 | ||
41 | /** | 44 | /** |
@@ -46,9 +49,9 @@ class RssController extends Controller | |||
46 | * | 49 | * |
47 | * @return \Symfony\Component\HttpFoundation\Response | 50 | * @return \Symfony\Component\HttpFoundation\Response |
48 | */ | 51 | */ |
49 | public function showStarredAction(User $user) | 52 | public function showStarredAction(Request $request, User $user) |
50 | { | 53 | { |
51 | return $this->showEntries('starred', $user); | 54 | return $this->showEntries('starred', $user, $request->query->get('page', 1)); |
52 | } | 55 | } |
53 | 56 | ||
54 | /** | 57 | /** |
@@ -57,10 +60,11 @@ class RssController extends Controller | |||
57 | * | 60 | * |
58 | * @param string $type Entries type: unread, starred or archive | 61 | * @param string $type Entries type: unread, starred or archive |
59 | * @param User $user | 62 | * @param User $user |
63 | * @param int $page | ||
60 | * | 64 | * |
61 | * @return \Symfony\Component\HttpFoundation\Response | 65 | * @return \Symfony\Component\HttpFoundation\Response |
62 | */ | 66 | */ |
63 | private function showEntries($type, User $user) | 67 | private function showEntries($type, User $user, $page = 1) |
64 | { | 68 | { |
65 | $repository = $this->getDoctrine()->getRepository('WallabagCoreBundle:Entry'); | 69 | $repository = $this->getDoctrine()->getRepository('WallabagCoreBundle:Entry'); |
66 | 70 | ||
@@ -87,8 +91,26 @@ class RssController extends Controller | |||
87 | $perPage = $user->getConfig()->getRssLimit() ?: $this->getParameter('wallabag_core.rss_limit'); | 91 | $perPage = $user->getConfig()->getRssLimit() ?: $this->getParameter('wallabag_core.rss_limit'); |
88 | $entries->setMaxPerPage($perPage); | 92 | $entries->setMaxPerPage($perPage); |
89 | 93 | ||
94 | $url = $this->generateUrl( | ||
95 | $type.'_rss', | ||
96 | [ | ||
97 | 'username' => $user->getUsername(), | ||
98 | 'token' => $user->getConfig()->getRssToken(), | ||
99 | ], | ||
100 | UrlGeneratorInterface::ABSOLUTE_URL | ||
101 | ); | ||
102 | |||
103 | try { | ||
104 | $entries->setCurrentPage((int) $page); | ||
105 | } catch (OutOfRangeCurrentPageException $e) { | ||
106 | if ($page > 1) { | ||
107 | return $this->redirect($url.'?page='.$entries->getNbPages(), 302); | ||
108 | } | ||
109 | } | ||
110 | |||
90 | return $this->render('@WallabagCore/themes/common/Entry/entries.xml.twig', [ | 111 | return $this->render('@WallabagCore/themes/common/Entry/entries.xml.twig', [ |
91 | 'type' => $type, | 112 | 'type' => $type, |
113 | 'url' => $url, | ||
92 | 'entries' => $entries, | 114 | 'entries' => $entries, |
93 | ]); | 115 | ]); |
94 | } | 116 | } |
diff --git a/src/Wallabag/CoreBundle/Controller/TagController.php b/src/Wallabag/CoreBundle/Controller/TagController.php index 707f3bbe..a3e70fd0 100644 --- a/src/Wallabag/CoreBundle/Controller/TagController.php +++ b/src/Wallabag/CoreBundle/Controller/TagController.php | |||
@@ -90,15 +90,15 @@ class TagController extends Controller | |||
90 | 90 | ||
91 | $flatTags = []; | 91 | $flatTags = []; |
92 | 92 | ||
93 | foreach ($tags as $key => $tag) { | 93 | foreach ($tags as $tag) { |
94 | $nbEntries = $this->getDoctrine() | 94 | $nbEntries = $this->getDoctrine() |
95 | ->getRepository('WallabagCoreBundle:Entry') | 95 | ->getRepository('WallabagCoreBundle:Entry') |
96 | ->countAllEntriesByUserIdAndTagId($this->getUser()->getId(), $tag['id']); | 96 | ->countAllEntriesByUserIdAndTagId($this->getUser()->getId(), $tag->getId()); |
97 | 97 | ||
98 | $flatTags[] = [ | 98 | $flatTags[] = [ |
99 | 'id' => $tag['id'], | 99 | 'id' => $tag->getId(), |
100 | 'label' => $tag['label'], | 100 | 'label' => $tag->getLabel(), |
101 | 'slug' => $tag['slug'], | 101 | 'slug' => $tag->getSlug(), |
102 | 'nbEntries' => $nbEntries, | 102 | 'nbEntries' => $nbEntries, |
103 | ]; | 103 | ]; |
104 | } | 104 | } |