diff options
Diffstat (limited to 'src/Wallabag/CoreBundle/Controller/EntryController.php')
-rw-r--r-- | src/Wallabag/CoreBundle/Controller/EntryController.php | 269 |
1 files changed, 129 insertions, 140 deletions
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php index f7398e69..3dcfbebe 100644 --- a/src/Wallabag/CoreBundle/Controller/EntryController.php +++ b/src/Wallabag/CoreBundle/Controller/EntryController.php | |||
@@ -4,17 +4,17 @@ namespace Wallabag\CoreBundle\Controller; | |||
4 | 4 | ||
5 | use Pagerfanta\Adapter\DoctrineORMAdapter; | 5 | use Pagerfanta\Adapter\DoctrineORMAdapter; |
6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; | 6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; |
7 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; | ||
7 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; | 8 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; |
8 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | 9 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
9 | use Symfony\Component\HttpFoundation\Request; | 10 | use Symfony\Component\HttpFoundation\Request; |
10 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | 11 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; |
11 | use Wallabag\CoreBundle\Entity\Entry; | 12 | use Wallabag\CoreBundle\Entity\Entry; |
12 | use Wallabag\CoreBundle\Form\Type\EntryFilterType; | 13 | use Wallabag\CoreBundle\Event\EntryDeletedEvent; |
14 | use Wallabag\CoreBundle\Event\EntrySavedEvent; | ||
13 | use Wallabag\CoreBundle\Form\Type\EditEntryType; | 15 | use Wallabag\CoreBundle\Form\Type\EditEntryType; |
16 | use Wallabag\CoreBundle\Form\Type\EntryFilterType; | ||
14 | use Wallabag\CoreBundle\Form\Type\NewEntryType; | 17 | use Wallabag\CoreBundle\Form\Type\NewEntryType; |
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; | 18 | use Wallabag\CoreBundle\Form\Type\SearchEntryType; |
19 | 19 | ||
20 | class EntryController extends Controller | 20 | class EntryController extends Controller |
@@ -52,38 +52,6 @@ class EntryController extends Controller | |||
52 | } | 52 | } |
53 | 53 | ||
54 | /** | 54 | /** |
55 | * Fetch content and update entry. | ||
56 | * In case it fails, entry will return to avod loosing the data. | ||
57 | * | ||
58 | * @param Entry $entry | ||
59 | * @param string $prefixMessage Should be the translation key: entry_saved or entry_reloaded | ||
60 | * | ||
61 | * @return Entry | ||
62 | */ | ||
63 | private function updateEntry(Entry $entry, $prefixMessage = 'entry_saved') | ||
64 | { | ||
65 | // put default title in case of fetching content failed | ||
66 | $entry->setTitle('No title found'); | ||
67 | |||
68 | $message = 'flashes.entry.notice.'.$prefixMessage; | ||
69 | |||
70 | try { | ||
71 | $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl()); | ||
72 | } catch (\Exception $e) { | ||
73 | $this->get('logger')->error('Error while saving an entry', [ | ||
74 | 'exception' => $e, | ||
75 | 'entry' => $entry, | ||
76 | ]); | ||
77 | |||
78 | $message = 'flashes.entry.notice.'.$prefixMessage.'_failed'; | ||
79 | } | ||
80 | |||
81 | $this->get('session')->getFlashBag()->add('notice', $message); | ||
82 | |||
83 | return $entry; | ||
84 | } | ||
85 | |||
86 | /** | ||
87 | * @param Request $request | 55 | * @param Request $request |
88 | * | 56 | * |
89 | * @Route("/new-entry", name="new_entry") | 57 | * @Route("/new-entry", name="new_entry") |
@@ -227,7 +195,7 @@ class EntryController extends Controller | |||
227 | public function showUnreadAction(Request $request, $page) | 195 | public function showUnreadAction(Request $request, $page) |
228 | { | 196 | { |
229 | // load the quickstart if no entry in database | 197 | // load the quickstart if no entry in database |
230 | if ($page == 1 && $this->get('wallabag_core.entry_repository')->countAllEntriesByUsername($this->getUser()->getId()) == 0) { | 198 | if ((int) $page === 1 && $this->get('wallabag_core.entry_repository')->countAllEntriesByUser($this->getUser()->getId()) === 0) { |
231 | return $this->redirect($this->generateUrl('quickstart')); | 199 | return $this->redirect($this->generateUrl('quickstart')); |
232 | } | 200 | } |
233 | 201 | ||
@@ -265,84 +233,6 @@ class EntryController extends Controller | |||
265 | } | 233 | } |
266 | 234 | ||
267 | /** | 235 | /** |
268 | * Global method to retrieve entries depending on the given type | ||
269 | * It returns the response to be send. | ||
270 | * | ||
271 | * @param string $type Entries type: unread, starred or archive | ||
272 | * @param Request $request | ||
273 | * @param int $page | ||
274 | * | ||
275 | * @return \Symfony\Component\HttpFoundation\Response | ||
276 | */ | ||
277 | private function showEntries($type, Request $request, $page) | ||
278 | { | ||
279 | $repository = $this->get('wallabag_core.entry_repository'); | ||
280 | $searchTerm = (isset($request->get('search_entry')['term']) ? $request->get('search_entry')['term'] : ''); | ||
281 | $currentRoute = (!is_null($request->query->get('currentRoute')) ? $request->query->get('currentRoute') : ''); | ||
282 | |||
283 | switch ($type) { | ||
284 | case 'search': | ||
285 | $qb = $repository->getBuilderForSearchByUser($this->getUser()->getId(), $searchTerm, $currentRoute); | ||
286 | |||
287 | break; | ||
288 | case 'untagged': | ||
289 | $qb = $repository->getBuilderForUntaggedByUser($this->getUser()->getId()); | ||
290 | |||
291 | break; | ||
292 | case 'starred': | ||
293 | $qb = $repository->getBuilderForStarredByUser($this->getUser()->getId()); | ||
294 | break; | ||
295 | |||
296 | case 'archive': | ||
297 | $qb = $repository->getBuilderForArchiveByUser($this->getUser()->getId()); | ||
298 | break; | ||
299 | |||
300 | case 'unread': | ||
301 | $qb = $repository->getBuilderForUnreadByUser($this->getUser()->getId()); | ||
302 | break; | ||
303 | |||
304 | case 'all': | ||
305 | $qb = $repository->getBuilderForAllByUser($this->getUser()->getId()); | ||
306 | break; | ||
307 | |||
308 | default: | ||
309 | throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type)); | ||
310 | } | ||
311 | |||
312 | $form = $this->createForm(EntryFilterType::class); | ||
313 | |||
314 | if ($request->query->has($form->getName())) { | ||
315 | // manually bind values from the request | ||
316 | $form->submit($request->query->get($form->getName())); | ||
317 | |||
318 | // build the query from the given form object | ||
319 | $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $qb); | ||
320 | } | ||
321 | |||
322 | $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false); | ||
323 | |||
324 | $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries') | ||
325 | ->prepare($pagerAdapter, $page); | ||
326 | |||
327 | try { | ||
328 | $entries->setCurrentPage($page); | ||
329 | } catch (OutOfRangeCurrentPageException $e) { | ||
330 | if ($page > 1) { | ||
331 | return $this->redirect($this->generateUrl($type, ['page' => $entries->getNbPages()]), 302); | ||
332 | } | ||
333 | } | ||
334 | |||
335 | return $this->render( | ||
336 | 'WallabagCoreBundle:Entry:entries.html.twig', [ | ||
337 | 'form' => $form->createView(), | ||
338 | 'entries' => $entries, | ||
339 | 'currentPage' => $page, | ||
340 | 'searchTerm' => $searchTerm, | ||
341 | ] | ||
342 | ); | ||
343 | } | ||
344 | |||
345 | /** | ||
346 | * Shows entry content. | 236 | * Shows entry content. |
347 | * | 237 | * |
348 | * @param Entry $entry | 238 | * @param Entry $entry |
@@ -495,7 +385,7 @@ class EntryController extends Controller | |||
495 | 385 | ||
496 | // don't redirect user to the deleted entry (check that the referer doesn't end with the same url) | 386 | // don't redirect user to the deleted entry (check that the referer doesn't end with the same url) |
497 | $referer = $request->headers->get('referer'); | 387 | $referer = $request->headers->get('referer'); |
498 | $to = (1 !== preg_match('#'.$url.'$#i', $referer) ? $referer : null); | 388 | $to = (1 !== preg_match('#' . $url . '$#i', $referer) ? $referer : null); |
499 | 389 | ||
500 | $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($to); | 390 | $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($to); |
501 | 391 | ||
@@ -503,30 +393,6 @@ class EntryController extends Controller | |||
503 | } | 393 | } |
504 | 394 | ||
505 | /** | 395 | /** |
506 | * Check if the logged user can manage the given entry. | ||
507 | * | ||
508 | * @param Entry $entry | ||
509 | */ | ||
510 | private function checkUserAction(Entry $entry) | ||
511 | { | ||
512 | if (null === $this->getUser() || $this->getUser()->getId() != $entry->getUser()->getId()) { | ||
513 | throw $this->createAccessDeniedException('You can not access this entry.'); | ||
514 | } | ||
515 | } | ||
516 | |||
517 | /** | ||
518 | * Check for existing entry, if it exists, redirect to it with a message. | ||
519 | * | ||
520 | * @param Entry $entry | ||
521 | * | ||
522 | * @return Entry|bool | ||
523 | */ | ||
524 | private function checkIfEntryAlreadyExists(Entry $entry) | ||
525 | { | ||
526 | return $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($entry->getUrl(), $this->getUser()->getId()); | ||
527 | } | ||
528 | |||
529 | /** | ||
530 | * Get public URL for entry (and generate it if necessary). | 396 | * Get public URL for entry (and generate it if necessary). |
531 | * | 397 | * |
532 | * @param Entry $entry | 398 | * @param Entry $entry |
@@ -612,4 +478,127 @@ class EntryController extends Controller | |||
612 | { | 478 | { |
613 | return $this->showEntries('untagged', $request, $page); | 479 | return $this->showEntries('untagged', $request, $page); |
614 | } | 480 | } |
481 | |||
482 | /** | ||
483 | * Fetch content and update entry. | ||
484 | * In case it fails, $entry->getContent will return an error message. | ||
485 | * | ||
486 | * @param Entry $entry | ||
487 | * @param string $prefixMessage Should be the translation key: entry_saved or entry_reloaded | ||
488 | */ | ||
489 | private function updateEntry(Entry $entry, $prefixMessage = 'entry_saved') | ||
490 | { | ||
491 | $message = 'flashes.entry.notice.' . $prefixMessage; | ||
492 | |||
493 | try { | ||
494 | $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl()); | ||
495 | } catch (\Exception $e) { | ||
496 | $this->get('logger')->error('Error while saving an entry', [ | ||
497 | 'exception' => $e, | ||
498 | 'entry' => $entry, | ||
499 | ]); | ||
500 | |||
501 | $message = 'flashes.entry.notice.' . $prefixMessage . '_failed'; | ||
502 | } | ||
503 | |||
504 | $this->get('session')->getFlashBag()->add('notice', $message); | ||
505 | } | ||
506 | |||
507 | /** | ||
508 | * Global method to retrieve entries depending on the given type | ||
509 | * It returns the response to be send. | ||
510 | * | ||
511 | * @param string $type Entries type: unread, starred or archive | ||
512 | * @param Request $request | ||
513 | * @param int $page | ||
514 | * | ||
515 | * @return \Symfony\Component\HttpFoundation\Response | ||
516 | */ | ||
517 | private function showEntries($type, Request $request, $page) | ||
518 | { | ||
519 | $repository = $this->get('wallabag_core.entry_repository'); | ||
520 | $searchTerm = (isset($request->get('search_entry')['term']) ? $request->get('search_entry')['term'] : ''); | ||
521 | $currentRoute = (null !== $request->query->get('currentRoute') ? $request->query->get('currentRoute') : ''); | ||
522 | |||
523 | switch ($type) { | ||
524 | case 'search': | ||
525 | $qb = $repository->getBuilderForSearchByUser($this->getUser()->getId(), $searchTerm, $currentRoute); | ||
526 | |||
527 | break; | ||
528 | case 'untagged': | ||
529 | $qb = $repository->getBuilderForUntaggedByUser($this->getUser()->getId()); | ||
530 | |||
531 | break; | ||
532 | case 'starred': | ||
533 | $qb = $repository->getBuilderForStarredByUser($this->getUser()->getId()); | ||
534 | break; | ||
535 | case 'archive': | ||
536 | $qb = $repository->getBuilderForArchiveByUser($this->getUser()->getId()); | ||
537 | break; | ||
538 | case 'unread': | ||
539 | $qb = $repository->getBuilderForUnreadByUser($this->getUser()->getId()); | ||
540 | break; | ||
541 | case 'all': | ||
542 | $qb = $repository->getBuilderForAllByUser($this->getUser()->getId()); | ||
543 | break; | ||
544 | default: | ||
545 | throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type)); | ||
546 | } | ||
547 | |||
548 | $form = $this->createForm(EntryFilterType::class); | ||
549 | |||
550 | if ($request->query->has($form->getName())) { | ||
551 | // manually bind values from the request | ||
552 | $form->submit($request->query->get($form->getName())); | ||
553 | |||
554 | // build the query from the given form object | ||
555 | $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $qb); | ||
556 | } | ||
557 | |||
558 | $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false); | ||
559 | |||
560 | $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')->prepare($pagerAdapter); | ||
561 | |||
562 | try { | ||
563 | $entries->setCurrentPage($page); | ||
564 | } catch (OutOfRangeCurrentPageException $e) { | ||
565 | if ($page > 1) { | ||
566 | return $this->redirect($this->generateUrl($type, ['page' => $entries->getNbPages()]), 302); | ||
567 | } | ||
568 | } | ||
569 | |||
570 | return $this->render( | ||
571 | 'WallabagCoreBundle:Entry:entries.html.twig', [ | ||
572 | 'form' => $form->createView(), | ||
573 | 'entries' => $entries, | ||
574 | 'currentPage' => $page, | ||
575 | 'searchTerm' => $searchTerm, | ||
576 | 'isFiltered' => $form->isSubmitted(), | ||
577 | ] | ||
578 | ); | ||
579 | } | ||
580 | |||
581 | /** | ||
582 | * Check if the logged user can manage the given entry. | ||
583 | * | ||
584 | * @param Entry $entry | ||
585 | */ | ||
586 | private function checkUserAction(Entry $entry) | ||
587 | { | ||
588 | if (null === $this->getUser() || $this->getUser()->getId() !== $entry->getUser()->getId()) { | ||
589 | throw $this->createAccessDeniedException('You can not access this entry.'); | ||
590 | } | ||
591 | } | ||
592 | |||
593 | /** | ||
594 | * Check for existing entry, if it exists, redirect to it with a message. | ||
595 | * | ||
596 | * @param Entry $entry | ||
597 | * | ||
598 | * @return Entry|bool | ||
599 | */ | ||
600 | private function checkIfEntryAlreadyExists(Entry $entry) | ||
601 | { | ||
602 | return $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($entry->getUrl(), $this->getUser()->getId()); | ||
603 | } | ||
615 | } | 604 | } |