+ return $this->redirect($this->generateUrl('config') . '?tagging-rule=' . $rule->getId() . '#set5');
+ }
+
+ /**
+ * Remove all annotations OR tags OR entries for the current user.
+ *
+ * @Route("/reset/{type}", requirements={"id" = "annotations|tags|entries"}, name="config_reset")
+ *
+ * @return RedirectResponse
+ */
+ public function resetAction($type)
+ {
+ switch ($type) {
+ case 'annotations':
+ $this->getDoctrine()
+ ->getRepository('WallabagAnnotationBundle:Annotation')
+ ->removeAllByUserId($this->getUser()->getId());
+ break;
+ case 'tags':
+ $this->removeAllTagsByUserId($this->getUser()->getId());
+ break;
+ case 'entries':
+ // SQLite doesn't care about cascading remove, so we need to manually remove associated stuff
+ // otherwise they won't be removed ...
+ if ($this->get('doctrine')->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) {
+ $this->getDoctrine()->getRepository('WallabagAnnotationBundle:Annotation')->removeAllByUserId($this->getUser()->getId());
+ }
+
+ // manually remove tags to avoid orphan tag
+ $this->removeAllTagsByUserId($this->getUser()->getId());
+
+ $this->get('wallabag_core.entry_repository')->removeAllByUserId($this->getUser()->getId());
+ break;
+ case 'archived':
+ if ($this->get('doctrine')->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) {
+ $this->removeAnnotationsForArchivedByUserId($this->getUser()->getId());
+ }
+
+ // manually remove tags to avoid orphan tag
+ $this->removeTagsForArchivedByUserId($this->getUser()->getId());
+
+ $this->get('wallabag_core.entry_repository')->removeArchivedByUserId($this->getUser()->getId());
+ break;
+ }
+
+ $this->get('session')->getFlashBag()->add(
+ 'notice',
+ 'flashes.config.notice.' . $type . '_reset'
+ );
+
+ return $this->redirect($this->generateUrl('config') . '#set3');
+ }
+
+ /**
+ * Delete account for current user.
+ *
+ * @Route("/account/delete", name="delete_account")
+ *
+ * @param Request $request
+ *
+ * @throws AccessDeniedHttpException
+ *
+ * @return \Symfony\Component\HttpFoundation\RedirectResponse
+ */
+ public function deleteAccountAction(Request $request)
+ {
+ $enabledUsers = $this->get('wallabag_user.user_repository')
+ ->getSumEnabledUsers();
+
+ if ($enabledUsers <= 1) {
+ throw new AccessDeniedHttpException();
+ }
+
+ $user = $this->getUser();
+
+ // logout current user
+ $this->get('security.token_storage')->setToken(null);
+ $request->getSession()->invalidate();
+
+ $em = $this->get('fos_user.user_manager');
+ $em->deleteUser($user);
+
+ return $this->redirect($this->generateUrl('fos_user_security_login'));
+ }
+
+ /**
+ * 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();