+
+ /**
+ * Switch view mode for current user.
+ *
+ * @Route("/config/view-mode", name="switch_view_mode")
+ *
+ * @param Request $request
+ *
+ * @return \Symfony\Component\HttpFoundation\RedirectResponse
+ */
+ public function changeViewModeAction(Request $request)
+ {
+ $user = $this->getUser();
+ $user->getConfig()->setListMode(!$user->getConfig()->getListMode());
+
+ $em = $this->getDoctrine()->getManager();
+ $em->persist($user);
+ $em->flush();
+
+ return $this->redirect($request->headers->get('referer'));
+ }
+
+ /**
+ * Remove all tags for given tags and a given user and cleanup orphan tags.
+ *
+ * @param array $tags
+ * @param int $userId
+ */
+ private function removeAllTagsByStatusAndUserId($tags, $userId)
+ {
+ if (empty($tags)) {
+ return;
+ }
+
+ $this->get('wallabag_core.entry_repository')
+ ->removeTags($userId, $tags);
+
+ // cleanup orphan tags
+ $em = $this->getDoctrine()->getManager();
+
+ foreach ($tags as $tag) {
+ if (0 === count($tag->getEntries())) {
+ $em->remove($tag);
+ }
+ }
+
+ $em->flush();
+ }
+
+ /**
+ * Remove all tags for a given user and cleanup orphan tags.
+ *
+ * @param int $userId
+ */
+ private function removeAllTagsByUserId($userId)
+ {
+ $tags = $this->get('wallabag_core.tag_repository')->findAllTags($userId);
+ $this->removeAllTagsByStatusAndUserId($tags, $userId);
+ }
+
+ /**
+ * Remove all tags for a given user and cleanup orphan tags.
+ *
+ * @param int $userId
+ */
+ private function removeTagsForArchivedByUserId($userId)
+ {
+ $tags = $this->get('wallabag_core.tag_repository')->findForArchivedArticlesByUser($userId);
+ $this->removeAllTagsByStatusAndUserId($tags, $userId);
+ }
+
+ private function removeAnnotationsForArchivedByUserId($userId)
+ {
+ $em = $this->getDoctrine()->getManager();
+
+ $archivedEntriesAnnotations = $this->getDoctrine()
+ ->getRepository('WallabagAnnotationBundle:Annotation')
+ ->findAllArchivedEntriesByUser($userId);
+
+ foreach ($archivedEntriesAnnotations as $archivedEntriesAnnotation) {
+ $em->remove($archivedEntriesAnnotation);
+ }
+
+ $em->flush();
+ }
+
+ /**
+ * Validate that a rule can be edited/deleted by the current user.
+ *
+ * @param TaggingRule $rule
+ */
+ private function validateRuleAction(TaggingRule $rule)
+ {
+ if ($this->getUser()->getId() !== $rule->getConfig()->getUser()->getId()) {
+ throw $this->createAccessDeniedException('You can not access this tagging rule.');
+ }
+ }
+
+ /**
+ * Retrieve config for the current user.
+ * If no config were found, create a new one.
+ *
+ * @return Config
+ */
+ private function getConfig()
+ {
+ $config = $this->getDoctrine()
+ ->getRepository('WallabagCoreBundle:Config')
+ ->findOneByUser($this->getUser());
+
+ // should NEVER HAPPEN ...
+ if (!$config) {
+ $config = new Config($this->getUser());
+ }
+
+ return $config;
+ }