]> git.immae.eu Git - github/wallabag/wallabag.git/blobdiff - src/Wallabag/CoreBundle/Controller/EntryController.php
First draft for tests
[github/wallabag/wallabag.git] / src / Wallabag / CoreBundle / Controller / EntryController.php
index 85144a5ccace8fcde1a08817e8abca764ff6049e..56759adba0625ad5b71b74680bde2dbb1ad980d6 100644 (file)
@@ -15,14 +15,56 @@ use Wallabag\CoreBundle\Event\EntryDeletedEvent;
 use Wallabag\CoreBundle\Event\EntrySavedEvent;
 use Wallabag\CoreBundle\Form\Type\EditEntryType;
 use Wallabag\CoreBundle\Form\Type\EntryFilterType;
+use Wallabag\CoreBundle\Form\Type\EntrySortType;
 use Wallabag\CoreBundle\Form\Type\NewEntryType;
 use Wallabag\CoreBundle\Form\Type\SearchEntryType;
 
 class EntryController extends Controller
 {
     /**
-     * @param Request $request
-     * @param int     $page
+     * @Route("/mass", name="mass_action")
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function massAction(Request $request)
+    {
+        $em = $this->getDoctrine()->getManager();
+        $values = $request->request->all();
+
+        $action = 'toggle-read';
+        if (isset($values['toggle-star'])) {
+            $action = 'toggle-star';
+        } elseif (isset($values['delete'])) {
+            $action = 'delete';
+        }
+
+        if (isset($values['entry-checkbox'])) {
+            foreach ($values['entry-checkbox'] as $id) {
+                /** @var Entry * */
+                $entry = $this->get('wallabag_core.entry_repository')->findById((int) $id)[0];
+
+                $this->checkUserAction($entry);
+
+                if ('toggle-read' === $action) {
+                    $entry->toggleArchive();
+                } elseif ('toggle-star' === $action) {
+                    $entry->toggleStar();
+                } elseif ('delete' === $action) {
+                    $this->get('event_dispatcher')->dispatch(EntryDeletedEvent::NAME, new EntryDeletedEvent($entry));
+                    $em->remove($entry);
+                }
+            }
+
+            $em->flush();
+        }
+
+        $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'));
+
+        return $this->redirect($redirectUrl);
+    }
+
+    /**
+     * @param int $page
      *
      * @Route("/search/{page}", name="search", defaults={"page" = 1})
      *
@@ -53,8 +95,6 @@ class EntryController extends Controller
     }
 
     /**
-     * @param Request $request
-     *
      * @Route("/new-entry", name="new_entry")
      *
      * @return \Symfony\Component\HttpFoundation\Response
@@ -97,8 +137,6 @@ class EntryController extends Controller
     }
 
     /**
-     * @param Request $request
-     *
      * @Route("/bookmarklet", name="bookmarklet")
      *
      * @return \Symfony\Component\HttpFoundation\Response
@@ -135,9 +173,6 @@ class EntryController extends Controller
     /**
      * Edit an entry content.
      *
-     * @param Request $request
-     * @param Entry   $entry
-     *
      * @Route("/edit/{id}", requirements={"id" = "\d+"}, name="edit")
      *
      * @return \Symfony\Component\HttpFoundation\Response
@@ -171,8 +206,7 @@ class EntryController extends Controller
     /**
      * Shows all entries for current user.
      *
-     * @param Request $request
-     * @param int     $page
+     * @param int $page
      *
      * @Route("/all/list/{page}", name="all", defaults={"page" = "1"})
      *
@@ -186,8 +220,7 @@ class EntryController extends Controller
     /**
      * Shows unread entries for current user.
      *
-     * @param Request $request
-     * @param int     $page
+     * @param int $page
      *
      * @Route("/unread/list/{page}", name="unread", defaults={"page" = "1"})
      *
@@ -206,8 +239,7 @@ class EntryController extends Controller
     /**
      * Shows read entries for current user.
      *
-     * @param Request $request
-     * @param int     $page
+     * @param int $page
      *
      * @Route("/archive/list/{page}", name="archive", defaults={"page" = "1"})
      *
@@ -221,8 +253,7 @@ class EntryController extends Controller
     /**
      * Shows starred entries for current user.
      *
-     * @param Request $request
-     * @param int     $page
+     * @param int $page
      *
      * @Route("/starred/list/{page}", name="starred", defaults={"page" = "1"})
      *
@@ -236,8 +267,7 @@ class EntryController extends Controller
     /**
      * Shows untagged articles for current user.
      *
-     * @param Request $request
-     * @param int     $page
+     * @param int $page
      *
      * @Route("/untagged/list/{page}", name="untagged", defaults={"page" = "1"})
      *
@@ -276,8 +306,6 @@ class EntryController extends Controller
     /**
      * Shows entry content.
      *
-     * @param Entry $entry
-     *
      * @Route("/view/{id}", requirements={"id" = "\d+"}, name="view")
      *
      * @return \Symfony\Component\HttpFoundation\Response
@@ -296,8 +324,6 @@ class EntryController extends Controller
      * Reload an entry.
      * Refetch content from the website and make it readable again.
      *
-     * @param Entry $entry
-     *
      * @Route("/reload/{id}", requirements={"id" = "\d+"}, name="reload_entry")
      *
      * @return \Symfony\Component\HttpFoundation\RedirectResponse
@@ -330,9 +356,6 @@ class EntryController extends Controller
     /**
      * Changes read status for an entry.
      *
-     * @param Request $request
-     * @param Entry   $entry
-     *
      * @Route("/archive/{id}", requirements={"id" = "\d+"}, name="archive_entry")
      *
      * @return \Symfony\Component\HttpFoundation\RedirectResponse
@@ -362,9 +385,6 @@ class EntryController extends Controller
     /**
      * Changes starred status for an entry.
      *
-     * @param Request $request
-     * @param Entry   $entry
-     *
      * @Route("/star/{id}", requirements={"id" = "\d+"}, name="star_entry")
      *
      * @return \Symfony\Component\HttpFoundation\RedirectResponse
@@ -395,8 +415,6 @@ class EntryController extends Controller
     /**
      * Deletes entry and redirect to the homepage or the last viewed page.
      *
-     * @param Entry $entry
-     *
      * @Route("/delete/{id}", requirements={"id" = "\d+"}, name="delete_entry")
      *
      * @return \Symfony\Component\HttpFoundation\RedirectResponse
@@ -437,8 +455,6 @@ class EntryController extends Controller
     /**
      * Get public URL for entry (and generate it if necessary).
      *
-     * @param Entry $entry
-     *
      * @Route("/share/{id}", requirements={"id" = "\d+"}, name="share")
      *
      * @return \Symfony\Component\HttpFoundation\Response
@@ -463,8 +479,6 @@ class EntryController extends Controller
     /**
      * Disable public sharing for an entry.
      *
-     * @param Entry $entry
-     *
      * @Route("/share/delete/{id}", requirements={"id" = "\d+"}, name="delete_share")
      *
      * @return \Symfony\Component\HttpFoundation\Response
@@ -487,8 +501,6 @@ class EntryController extends Controller
     /**
      * Ability to view a content publicly.
      *
-     * @param Entry $entry
-     *
      * @Route("/share/{uid}", requirements={"uid" = ".+"}, name="share_entry")
      * @Cache(maxage="25200", smaxage="25200", public=true)
      *
@@ -510,9 +522,8 @@ class EntryController extends Controller
      * Global method to retrieve entries depending on the given type
      * It returns the response to be send.
      *
-     * @param string  $type    Entries type: unread, starred or archive
-     * @param Request $request
-     * @param int     $page
+     * @param string $type Entries type: unread, starred or archive
+     * @param int    $page
      *
      * @return \Symfony\Component\HttpFoundation\Response
      */
@@ -521,31 +532,44 @@ class EntryController extends Controller
         $repository = $this->get('wallabag_core.entry_repository');
         $searchTerm = (isset($request->get('search_entry')['term']) ? $request->get('search_entry')['term'] : '');
         $currentRoute = (null !== $request->query->get('currentRoute') ? $request->query->get('currentRoute') : '');
+        $direction = 'asc';
+        $sortBy = null;
+
+        if (null !== ($request->query->get('entry_sort'))) {
+            $direction = (null !== $request->query->get('entry_sort')['sortOrder'] ? $request->query->get('entry_sort')['sortOrder'] : 'asc');
+
+            // defined as null by default because each repository method have the right field as default value too
+            // like `getBuilderForStarredByUser` will have `starredAt` sort by default
+            if (\in_array($request->get('entry_sort')['sortType'], ['id', 'title', 'createdAt', 'updatedAt', 'starredAt', 'archivedAt'], true)) {
+                $sortBy = $request->get('entry_sort')['sortType'];
+            }
+        }
 
         switch ($type) {
             case 'search':
                 $qb = $repository->getBuilderForSearchByUser($this->getUser()->getId(), $searchTerm, $currentRoute);
                 break;
             case 'untagged':
-                $qb = $repository->getBuilderForUntaggedByUser($this->getUser()->getId());
+                $qb = $repository->getBuilderForUntaggedByUser($this->getUser()->getId(), $sortBy, $direction);
                 break;
             case 'starred':
-                $qb = $repository->getBuilderForStarredByUser($this->getUser()->getId());
+                $qb = $repository->getBuilderForStarredByUser($this->getUser()->getId(), $sortBy, $direction);
                 break;
             case 'archive':
-                $qb = $repository->getBuilderForArchiveByUser($this->getUser()->getId());
+                $qb = $repository->getBuilderForArchiveByUser($this->getUser()->getId(), $sortBy, $direction);
                 break;
             case 'unread':
-                $qb = $repository->getBuilderForUnreadByUser($this->getUser()->getId());
+                $qb = $repository->getBuilderForUnreadByUser($this->getUser()->getId(), $sortBy, $direction);
                 break;
             case 'all':
-                $qb = $repository->getBuilderForAllByUser($this->getUser()->getId());
+                $qb = $repository->getBuilderForAllByUser($this->getUser()->getId(), $sortBy, $direction);
                 break;
             default:
                 throw new \InvalidArgumentException(sprintf('Type "%s" is not implemented.', $type));
         }
 
         $form = $this->createForm(EntryFilterType::class);
+        $sortForm = $this->createForm(EntrySortType::class);
 
         if ($request->query->has($form->getName())) {
             // manually bind values from the request
@@ -555,6 +579,11 @@ class EntryController extends Controller
             $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $qb);
         }
 
+        if ($request->query->has($sortForm->getName())) {
+            // manually bind values from the request
+            $sortForm->submit($request->query->get($sortForm->getName()));
+        }
+
         $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false);
 
         $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')->prepare($pagerAdapter);
@@ -573,6 +602,7 @@ class EntryController extends Controller
         return $this->render(
             'WallabagCoreBundle:Entry:entries.html.twig', [
                 'form' => $form->createView(),
+                'sortForm' => $sortForm->createView(),
                 'entries' => $entries,
                 'currentPage' => $page,
                 'searchTerm' => $searchTerm,
@@ -586,7 +616,6 @@ class EntryController extends Controller
      * Fetch content and update entry.
      * In case it fails, $entry->getContent will return an error message.
      *
-     * @param Entry  $entry
      * @param string $prefixMessage Should be the translation key: entry_saved or entry_reloaded
      */
     private function updateEntry(Entry $entry, $prefixMessage = 'entry_saved')
@@ -617,8 +646,6 @@ class EntryController extends Controller
 
     /**
      * Check if the logged user can manage the given entry.
-     *
-     * @param Entry $entry
      */
     private function checkUserAction(Entry $entry)
     {
@@ -630,8 +657,6 @@ class EntryController extends Controller
     /**
      * Check for existing entry, if it exists, redirect to it with a message.
      *
-     * @param Entry $entry
-     *
      * @return Entry|bool
      */
     private function checkIfEntryAlreadyExists(Entry $entry)