]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Add ability to reset some datas
authorJeremy Benoist <jeremy.benoist@gmail.com>
Sat, 1 Oct 2016 07:26:32 +0000 (09:26 +0200)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Sat, 22 Oct 2016 11:13:06 +0000 (13:13 +0200)
- annotations
- tags
- entries

18 files changed:
app/DoctrineMigrations/Version20161001072726.php [new file with mode: 0644]
src/Wallabag/AnnotationBundle/Entity/Annotation.php
src/Wallabag/CoreBundle/Controller/ConfigController.php
src/Wallabag/CoreBundle/Entity/Entry.php
src/Wallabag/CoreBundle/Repository/TagRepository.php
src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php

diff --git a/app/DoctrineMigrations/Version20161001072726.php b/app/DoctrineMigrations/Version20161001072726.php
new file mode 100644 (file)
index 0000000..2e11294
--- /dev/null
@@ -0,0 +1,54 @@
+<?php
+
+namespace Application\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+class Version20161001072726 extends AbstractMigration implements ContainerAwareInterface
+{
+    /**
+     * @var ContainerInterface
+     */
+    private $container;
+
+    public function setContainer(ContainerInterface $container = null)
+    {
+        $this->container = $container;
+    }
+
+    private function getTable($tableName)
+    {
+        return $this->container->getParameter('database_table_prefix') . $tableName;
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $this->addSql('ALTER TABLE '.$this->getTable('entry_tag').' DROP FOREIGN KEY FK_F035C9E5BA364942');
+        $this->addSql('ALTER TABLE '.$this->getTable('entry_tag').' DROP FOREIGN KEY FK_F035C9E5BAD26311');
+        $this->addSql('ALTER TABLE '.$this->getTable('entry_tag').' ADD CONSTRAINT FK_F035C9E5BA364942 FOREIGN KEY (entry_id) REFERENCES `entry` (id) ON DELETE CASCADE');
+        $this->addSql('ALTER TABLE '.$this->getTable('entry_tag').' ADD CONSTRAINT FK_F035C9E5BAD26311 FOREIGN KEY (tag_id) REFERENCES `tag` (id) ON DELETE CASCADE');
+        $this->addSql('ALTER TABLE '.$this->getTable('annotation').' DROP FOREIGN KEY FK_2E443EF2BA364942');
+        $this->addSql('ALTER TABLE '.$this->getTable('annotation').' ADD CONSTRAINT FK_2E443EF2BA364942 FOREIGN KEY (entry_id) REFERENCES `entry` (id) ON DELETE CASCADE');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $this->abortIf($this->connection->getDatabasePlatform()->getName() == 'sqlite', 'Migration can only be executed safely on \'mysql\' or \'postgresql\'.');
+
+        $this->addSql('ALTER TABLE '.$this->getTable('annotation').' DROP FOREIGN KEY FK_2E443EF2BA364942');
+        $this->addSql('ALTER TABLE '.$this->getTable('annotation').' ADD CONSTRAINT FK_2E443EF2BA364942 FOREIGN KEY (entry_id) REFERENCES entry (id)');
+        $this->addSql('ALTER TABLE '.$this->getTable('entry_tag').' DROP FOREIGN KEY FK_F035C9E5BA364942');
+        $this->addSql('ALTER TABLE '.$this->getTable('entry_tag').' DROP FOREIGN KEY FK_F035C9E5BAD26311');
+        $this->addSql('ALTER TABLE '.$this->getTable('entry_tag').' ADD CONSTRAINT FK_F035C9E5BA364942 FOREIGN KEY (entry_id) REFERENCES entry (id)');
+        $this->addSql('ALTER TABLE '.$this->getTable('entry_tag').' ADD CONSTRAINT FK_F035C9E5BAD26311 FOREIGN KEY (tag_id) REFERENCES tag (id)');
+    }
+}
index c48d873100e2a38a25fa37e06a04a465ea49f0c1..0838f5aa9153cb2a4c84f53fdd67779ee9828cad 100644 (file)
@@ -82,7 +82,7 @@ class Annotation
      * @Exclude
      *
      * @ORM\ManyToOne(targetEntity="Wallabag\CoreBundle\Entity\Entry", inversedBy="annotations")
-     * @ORM\JoinColumn(name="entry_id", referencedColumnName="id")
+     * @ORM\JoinColumn(name="entry_id", referencedColumnName="id", onDelete="cascade")
      */
     private $entry;
 
index abd35c028b8aa3681e552ef62557d21eca514ad3..ccbf550a9f2eeed96f1ffc13f5f54ceef895f6e5 100644 (file)
@@ -224,6 +224,48 @@ class ConfigController extends Controller
         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)
+    {
+        $em = $this->getDoctrine()->getManager();
+
+        switch ($type) {
+            case 'annotations':
+                $em->createQuery('DELETE FROM Wallabag\AnnotationBundle\Entity\Annotation a WHERE a.user = '.$this->getUser()->getId())
+                    ->execute();
+                break;
+
+            case 'tags':
+                $tags = $this->getDoctrine()->getRepository('WallabagCoreBundle:Tag')->findAllTags($this->getUser()->getId());
+
+                if (empty($tags)) {
+                    break;
+                }
+
+                $this->getDoctrine()
+                    ->getRepository('WallabagCoreBundle:Entry')
+                    ->removeTags($this->getUser()->getId(), $tags);
+                break;
+
+            case 'entries':
+                $em->createQuery('DELETE FROM Wallabag\CoreBundle\Entity\Entry e WHERE e.user = '.$this->getUser()->getId())
+                    ->execute();
+        }
+
+        $this->get('session')->getFlashBag()->add(
+            'notice',
+            'flashes.config.notice.'.$type.'_reset'
+        );
+
+        return $this->redirect($this->generateUrl('config').'#set3');
+    }
+
     /**
      * Validate that a rule can be edited/deleted by the current user.
      *
index f2da3f4def670d5a0e08af123a1617a2cb3fa509..dd49acf0aa60427c5952e51a2273927d26f36715 100644 (file)
@@ -190,10 +190,10 @@ class Entry
      * @ORM\JoinTable(
      *  name="entry_tag",
      *  joinColumns={
-     *      @ORM\JoinColumn(name="entry_id", referencedColumnName="id")
+     *      @ORM\JoinColumn(name="entry_id", referencedColumnName="id", onDelete="cascade")
      *  },
      *  inverseJoinColumns={
-     *      @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
+     *      @ORM\JoinColumn(name="tag_id", referencedColumnName="id", onDelete="cascade")
      *  }
      * )
      */
index e76878d49d6e7cc5bb06c0f2a1d8227ef2bec4bc..69661b128374a2a905e7b7b77a1f4b3fb39a71b3 100644 (file)
@@ -52,6 +52,23 @@ class TagRepository extends EntityRepository
             ->getArrayResult();
     }
 
+    /**
+     * Find all tags.
+     *
+     * @param int $userId
+     *
+     * @return array
+     */
+    public function findAllTags($userId)
+    {
+        return $this->createQueryBuilder('t')
+            ->select('t')
+            ->leftJoin('t.entries', 'e')
+            ->where('e.user = :userId')->setParameter('userId', $userId)
+            ->getQuery()
+            ->getResult();
+    }
+
     /**
      * Used only in test case to get a tag for our entry.
      *
index f5548a217a42b0e553c7a0cc85a6fe804a9d858d..7c8ae66e555c5bd41984dcbdadda42ee31f64527 100644 (file)
@@ -89,10 +89,17 @@ config:
         email_label: 'Emailadresse'
         # twoFactorAuthentication_label: 'Two factor authentication'
         delete:
-            # title: Delete my account (danger zone !)
+            # title: Delete my account (a.k.a danger zone)
             # description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
-            # confirm: Are you really sure? (it can't be UNDONE)
+            # confirm: Are you really sure? (THIS CAN'T BE UNDONE)
             # button: Delete my account
+    reset:
+        # title: Reset area (a.k.a danger zone)
+        # description: By hiting buttons below you'll have ability to remove some informations from your account. Be aware that these actions are IRREVERSIBLE.
+        # annotations: Remove ALL annotations
+        # tags: Remove ALL tags
+        # entries: Remove ALL entries
+        # confirm: Are you really really sure? (THIS CAN'T BE UNDONE)
     form_password:
         old_password_label: 'Gammel adgangskode'
         new_password_label: 'Ny adgangskode'
@@ -462,6 +469,9 @@ flashes:
             # tagging_rules_deleted: 'Tagging rule deleted'
             # user_added: 'User "%username%" added'
             # rss_token_updated: 'RSS token updated'
+            # annotations_reset: Annotations reset
+            # tags_reset: Tags reset
+            # entries_reset: Entries reset
     entry:
         notice:
             # entry_already_saved: 'Entry already saved on %date%'
index 9edd7fb702a5693c8dc19c689ea56a1c2aa8d039..20f9753be53dd70adf8fb51e845ebb3d2dfc3032 100644 (file)
@@ -89,10 +89,17 @@ config:
         email_label: 'E-Mail-Adresse'
         twoFactorAuthentication_label: 'Zwei-Faktor-Authentifizierung'
         delete:
-            # title: Delete my account (danger zone !)
+            # title: Delete my account (a.k.a danger zone)
             # description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
-            # confirm: Are you really sure? (it can't be UNDONE)
+            # confirm: Are you really sure? (THIS CAN'T BE UNDONE)
             # button: Delete my account
+    reset:
+        # title: Reset area (a.k.a danger zone)
+        # description: By hiting buttons below you'll have ability to remove some informations from your account. Be aware that these actions are IRREVERSIBLE.
+        # annotations: Remove ALL annotations
+        # tags: Remove ALL tags
+        # entries: Remove ALL entries
+        # confirm: Are you really really sure? (THIS CAN'T BE UNDONE)
     form_password:
         old_password_label: 'Altes Kennwort'
         new_password_label: 'Neues Kennwort'
@@ -462,6 +469,9 @@ flashes:
             tagging_rules_deleted: 'Tagging-Regel gelöscht'
             user_added: 'Benutzer "%username%" erstellt'
             rss_token_updated: 'RSS-Token aktualisiert'
+            # annotations_reset: Annotations reset
+            # tags_reset: Tags reset
+            # entries_reset: Entries reset
     entry:
         notice:
             entry_already_saved: 'Eintrag bereits am %date% gespeichert'
index b86145a0f05c0a45a9b424a03fc1a43d5c7d884a..35dde5353bcc4d43c13582dc725ccfcb92d3fd0c 100644 (file)
@@ -89,10 +89,17 @@ config:
         email_label: 'Email'
         twoFactorAuthentication_label: 'Two factor authentication'
         delete:
-            title: Delete my account (danger zone !)
+            title: Delete my account (a.k.a danger zone)
             description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
-            confirm: Are you really sure? (it can't be UNDONE)
+            confirm: Are you really sure? (THIS CAN'T BE UNDONE)
             button: Delete my account
+    reset:
+        title: Reset area (a.k.a danger zone)
+        description: By hiting buttons below you'll have ability to remove some informations from your account. Be aware that these actions are IRREVERSIBLE.
+        annotations: Remove ALL annotations
+        tags: Remove ALL tags
+        entries: Remove ALL entries
+        confirm: Are you really really sure? (THIS CAN'T BE UNDONE)
     form_password:
         old_password_label: 'Current password'
         new_password_label: 'New password'
@@ -461,6 +468,9 @@ flashes:
             tagging_rules_updated: 'Tagging rules updated'
             tagging_rules_deleted: 'Tagging rule deleted'
             rss_token_updated: 'RSS token updated'
+            annotations_reset: Annotations reset
+            tags_reset: Tags reset
+            entries_reset: Entries reset
     entry:
         notice:
             entry_already_saved: 'Entry already saved on %date%'
index b7187f50a20eb6f6bbb2c3ecd278af9cf7c5dd2a..13f2e9776e831fc46d57ca4d881553c966cc417a 100644 (file)
@@ -89,10 +89,17 @@ config:
         email_label: 'Direccion e-mail'
         twoFactorAuthentication_label: 'Autentificación de dos factores'
         delete:
-            # title: Delete my account (danger zone !)
+            # title: Delete my account (a.k.a danger zone)
             # description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
-            # confirm: Are you really sure? (it can't be UNDONE)
+            # confirm: Are you really sure? (THIS CAN'T BE UNDONE)
             # button: Delete my account
+    reset:
+        # title: Reset area (a.k.a danger zone)
+        # description: By hiting buttons below you'll have ability to remove some informations from your account. Be aware that these actions are IRREVERSIBLE.
+        # annotations: Remove ALL annotations
+        # tags: Remove ALL tags
+        # entries: Remove ALL entries
+        # confirm: Are you really really sure? (THIS CAN'T BE UNDONE)
     form_password:
         old_password_label: 'Contraseña actual'
         new_password_label: 'Nueva contraseña'
@@ -462,6 +469,9 @@ flashes:
             tagging_rules_deleted: 'Regla de etiquetado actualizada'
             user_added: 'Usuario "%username%" añadido'
             rss_token_updated: 'RSS token actualizado'
+            # annotations_reset: Annotations reset
+            # tags_reset: Tags reset
+            # entries_reset: Entries reset
     entry:
         notice:
             entry_already_saved: 'Entrada ya guardada por %fecha%'
index 0751752b762b790374f324831b4b58b0bbfe8ffb..5ee1f62d194247d81ddacca3faa67990c97f73dd 100644 (file)
@@ -89,10 +89,17 @@ config:
         email_label: 'نشانی ایمیل'
         twoFactorAuthentication_label: 'تأیید ۲مرحله‌ای'
         delete:
-            # title: Delete my account (danger zone !)
+            # title: Delete my account (a.k.a danger zone)
             # description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
-            # confirm: Are you really sure? (it can't be UNDONE)
+            # confirm: Are you really sure? (THIS CAN'T BE UNDONE)
             # button: Delete my account
+    reset:
+        # title: Reset area (a.k.a danger zone)
+        # description: By hiting buttons below you'll have ability to remove some informations from your account. Be aware that these actions are IRREVERSIBLE.
+        # annotations: Remove ALL annotations
+        # tags: Remove ALL tags
+        # entries: Remove ALL entries
+        # confirm: Are you really really sure? (THIS CAN'T BE UNDONE)
     form_password:
         old_password_label: 'رمز قدیمی'
         new_password_label: 'رمز تازه'
@@ -461,6 +468,9 @@ flashes:
             tagging_rules_deleted: 'قانون برچسب‌گذاری پاک شد'
             user_added: 'کابر "%username%" افزوده شد'
             rss_token_updated: 'کد آر-اس-اس به‌روز شد'
+            # annotations_reset: Annotations reset
+            # tags_reset: Tags reset
+            # entries_reset: Entries reset
     entry:
         notice:
             entry_already_saved: 'این مقاله در تاریخ %date% ذخیره شده بود'
index 8d19ccb1f39df12660e6621433190416d74bd728..7a98f1333f17eb148a35d56f8cc95056826275f5 100644 (file)
@@ -91,8 +91,15 @@ config:
         delete:
             title: Supprimer mon compte (attention danger !)
             description: Si vous confirmez la suppression de votre compte, TOUS les articles, TOUS les tags, TOUTES les annotations et votre compte seront DÉFINITIVEMENT supprimé (c'est IRRÉVERSIBLE). Vous serez ensuite déconnecté.
-            confirm: Vous êtes vraiment sûr ? (c'est IRRÉVERSIBLE !)
+            confirm: Vous êtes vraiment sûr ? (C'EST IRREVERSIBLE)
             button: 'Supprimer mon compte'
+    reset:
+        title: Réinitialisation (attention danger !)
+        description: En cliquant sur les boutons ci-dessous vous avez la possibilité de supprimer certaines informations de votre compte. Attention, ces actions sont IRREVERSIBLES !
+        annotations: Supprimer TOUTES les annotations
+        tags: Supprimer TOUS les tags
+        entries: Supprimer TOUS les articles
+        confirm: Êtes-vous vraiment vraiment sûr ? (C'EST IRREVERSIBLE)
     form_password:
         old_password_label: 'Mot de passe actuel'
         new_password_label: 'Nouveau mot de passe'
@@ -462,6 +469,9 @@ flashes:
             tagging_rules_deleted: 'Règle supprimée'
             user_added: 'Utilisateur "%username%" ajouté'
             rss_token_updated: 'Jeton RSS mis à jour'
+            annotations_reset: Annotations supprimées
+            tags_reset: Tags supprimés
+            entries_reset: Articles supprimés
     entry:
         notice:
             entry_already_saved: 'Article déjà sauvergardé le %date%'
index 4d3452ea7762131b0c3e8b0c2210453219e8a02f..bc4448bddb73227d4fe8507149b063ae8eb3f60b 100644 (file)
@@ -89,10 +89,17 @@ config:
         email_label: 'E-mail'
         twoFactorAuthentication_label: 'Two factor authentication'
         delete:
-            # title: Delete my account (danger zone !)
+            # title: Delete my account (a.k.a danger zone)
             # description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
-            # confirm: Are you really sure? (it can't be UNDONE)
+            # confirm: Are you really sure? (THIS CAN'T BE UNDONE)
             # button: Delete my account
+    reset:
+        # title: Reset area (a.k.a danger zone)
+        # description: By hiting buttons below you'll have ability to remove some informations from your account. Be aware that these actions are IRREVERSIBLE.
+        # annotations: Remove ALL annotations
+        # tags: Remove ALL tags
+        # entries: Remove ALL entries
+        # confirm: Are you really really sure? (THIS CAN'T BE UNDONE)
     form_password:
         old_password_label: 'Password corrente'
         new_password_label: 'Nuova password'
@@ -462,6 +469,9 @@ flashes:
             tagging_rules_deleted: 'Regola di tagging aggiornate'
             user_added: 'Utente "%username%" aggiunto'
             rss_token_updated: 'RSS token aggiornato'
+            # annotations_reset: Annotations reset
+            # tags_reset: Tags reset
+            # entries_reset: Entries reset
     entry:
         notice:
             entry_already_saved: 'Contenuto già salvato in data %date%'
index f14213c606a8c85882452ee6f88e5b3e81e191a6..7d1a801a2907462fa2b6efd4c235542fe466d58c 100644 (file)
@@ -89,10 +89,17 @@ config:
         email_label: 'Adreça de corrièl'
         twoFactorAuthentication_label: 'Dobla autentificacion'
         delete:
-            # title: Delete my account (danger zone !)
+            # title: Delete my account (a.k.a danger zone)
             # description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
-            # confirm: Are you really sure? (it can't be UNDONE)
+            # confirm: Are you really sure? (THIS CAN'T BE UNDONE)
             # button: Delete my account
+    reset:
+        # title: Reset area (a.k.a danger zone)
+        # description: By hiting buttons below you'll have ability to remove some informations from your account. Be aware that these actions are IRREVERSIBLE.
+        # annotations: Remove ALL annotations
+        # tags: Remove ALL tags
+        # entries: Remove ALL entries
+        # confirm: Are you really really sure? (THIS CAN'T BE UNDONE)
     form_password:
         old_password_label: 'Senhal actual'
         new_password_label: 'Senhal novèl'
@@ -462,6 +469,9 @@ flashes:
             tagging_rules_deleted: 'Règla suprimida'
             user_added: 'Utilizaire "%username%" ajustat'
             rss_token_updated: 'Geton RSS mes a jorn'
+            # annotations_reset: Annotations reset
+            # tags_reset: Tags reset
+            # entries_reset: Entries reset
     entry:
         notice:
             entry_already_saved: 'Article ja salvargardat lo %date%'
index 6f22f90d1a0019e3a81474382649b5c21b891222..b05a9dfd9a62a18547d424e826dafd058c69c7de 100644 (file)
@@ -93,6 +93,13 @@ config:
             description: Jeżeli usuniesz swoje konto, wszystkie twoje artykuły, tagi, adnotacje, oraz konto zostaną trwale usunięte (operacja jest NIEODWRACALNA). Następnie zostaniesz wylogowany.
             confirm: Jesteś pewien? (tej operacji NIE MOŻNA cofnąć)
             button: Usuń moje konto
+    reset:
+        # title: Reset area (a.k.a danger zone)
+        # description: By hiting buttons below you'll have ability to remove some informations from your account. Be aware that these actions are IRREVERSIBLE.
+        # annotations: Remove ALL annotations
+        # tags: Remove ALL tags
+        # entries: Remove ALL entries
+        # confirm: Are you really really sure? (THIS CAN'T BE UNDONE)
     form_password:
         old_password_label: 'Stare hasło'
         new_password_label: 'Nowe hasło'
@@ -462,6 +469,9 @@ flashes:
             tagging_rules_deleted: 'Reguła tagowania usunięta'
             user_added: 'Użytkownik "%username%" dodany'
             rss_token_updated: 'Token kanału RSS zaktualizowany'
+            # annotations_reset: Annotations reset
+            # tags_reset: Tags reset
+            # entries_reset: Entries reset
     entry:
         notice:
             entry_already_saved: 'Wpis już został dodany %date%'
index 29db9c3e473d088f778b21f328afc7f001d9df7d..571452c042e11da74d4b6189cd7f2a4cefa3dbff 100644 (file)
@@ -89,10 +89,17 @@ config:
         email_label: 'E-mail'
         # twoFactorAuthentication_label: 'Two factor authentication'
         delete:
-            # title: Delete my account (danger zone !)
+            # title: Delete my account (a.k.a danger zone)
             # description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
-            # confirm: Are you really sure? (it can't be UNDONE)
+            # confirm: Are you really sure? (THIS CAN'T BE UNDONE)
             # button: Delete my account
+    reset:
+        # title: Reset area (a.k.a danger zone)
+        # description: By hiting buttons below you'll have ability to remove some informations from your account. Be aware that these actions are IRREVERSIBLE.
+        # annotations: Remove ALL annotations
+        # tags: Remove ALL tags
+        # entries: Remove ALL entries
+        # confirm: Are you really really sure? (THIS CAN'T BE UNDONE)
     form_password:
         old_password_label: 'Parola veche'
         new_password_label: 'Parola nouă'
@@ -462,6 +469,9 @@ flashes:
             # tagging_rules_deleted: 'Tagging rule deleted'
             # user_added: 'User "%username%" added'
             # rss_token_updated: 'RSS token updated'
+            # annotations_reset: Annotations reset
+            # tags_reset: Tags reset
+            # entries_reset: Entries reset
     entry:
         notice:
             # entry_already_saved: 'Entry already saved on %date%'
index 41e8e576e8060210c2f5b53ee7024c4c7a32fd13..8e42965337f2a08e1cc0dbd1ba19ff744677421e 100644 (file)
@@ -89,10 +89,17 @@ config:
         email_label: 'E-posta'
         twoFactorAuthentication_label: 'İki adımlı doğrulama'
         delete:
-            # title: Delete my account (danger zone !)
+            # title: Delete my account (a.k.a danger zone)
             # description: If you remove your account, ALL your articles, ALL your tags, ALL your annotations and your account will be PERMANENTLY removed (it can't be UNDONE). You'll then be logged out.
-            # confirm: Are you really sure? (it can't be UNDONE)
+            # confirm: Are you really sure? (THIS CAN'T BE UNDONE)
             # button: Delete my account
+    reset:
+        # title: Reset area (a.k.a danger zone)
+        # description: By hiting buttons below you'll have ability to remove some informations from your account. Be aware that these actions are IRREVERSIBLE.
+        # annotations: Remove ALL annotations
+        # tags: Remove ALL tags
+        # entries: Remove ALL entries
+        # confirm: Are you really really sure? (THIS CAN'T BE UNDONE)
     form_password:
         old_password_label: 'Eski şifre'
         new_password_label: 'Yeni şifre'
@@ -461,6 +468,9 @@ flashes:
             tagging_rules_deleted: 'Tagging rule deleted'
             user_added: 'User "%username%" added'
             rss_token_updated: 'RSS token updated'
+            # annotations_reset: Annotations reset
+            # tags_reset: Tags reset
+            # entries_reset: Entries reset
     entry:
         notice:
             entry_already_saved: 'Entry already saved on %date%'
index 8434508d0552e3b5c9b3217983a928ca8e2e0b53..79826e0f1d2061817a33e6ebaba98c62d23ece53 100644 (file)
                             {{ form_widget(form.user._token) }}
                         </form>
 
+                        <br /><hr /><br />
+
+                        <div class="row">
+                            <h5>{{ 'config.reset.title'|trans }}</h5>
+                            <p>{{ 'config.reset.description'|trans }}</p>
+                            <a href="{{ path('config_reset', { type: 'annotations'}) }}" onclick="return confirm('{{ 'config.reset.confirm'|trans|escape('js') }}')" class="waves-effect waves-light btn red">
+                                {{ 'config.reset.annotations'|trans }}
+                            </a>
+                            <a href="{{ path('config_reset', { type: 'tags'}) }}" onclick="return confirm('{{ 'config.reset.confirm'|trans|escape('js') }}')" class="waves-effect waves-light btn red">
+                                {{ 'config.reset.tags'|trans }}
+                            </a>
+                            <a href="{{ path('config_reset', { type: 'entries'}) }}" onclick="return confirm('{{ 'config.reset.confirm'|trans|escape('js') }}')" class="waves-effect waves-light btn red">
+                                {{ 'config.reset.entries'|trans }}
+                            </a>
+                        </div>
+
                         {% if enabled_users > 1 %}
                             <br /><hr /><br />
 
index 5faa0130bece27ee59f15b3b0743290f682272cb..8d0644d1c46ea9f9ea2cf8fb2298f7de18dd9867 100644 (file)
@@ -5,6 +5,9 @@ namespace Tests\Wallabag\CoreBundle\Controller;
 use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
 use Wallabag\CoreBundle\Entity\Config;
 use Wallabag\UserBundle\Entity\User;
+use Wallabag\CoreBundle\Entity\Entry;
+use Wallabag\CoreBundle\Entity\Tag;
+use Wallabag\AnnotationBundle\Entity\Annotation;
 
 class ConfigControllerTest extends WallabagCoreTestCase
 {
@@ -690,4 +693,146 @@ class ConfigControllerTest extends WallabagCoreTestCase
 
         $this->assertEmpty($entries);
     }
+
+    public function testReset()
+    {
+        $this->logInAs('empty');
+        $client = $this->getClient();
+
+        $em = $client->getContainer()->get('doctrine.orm.entity_manager');
+
+        $user = static::$kernel->getContainer()->get('security.token_storage')->getToken()->getUser();
+
+        $tag = new Tag();
+        $tag->setLabel('super');
+        $em->persist($tag);
+
+        $entry = new Entry($user);
+        $entry->setUrl('http://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html');
+        $entry->setContent('Youhou');
+        $entry->setTitle('Youhou');
+        $entry->addTag($tag);
+        $em->persist($entry);
+
+        $entry2 = new Entry($user);
+        $entry2->setUrl('http://www.lemonde.de/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html');
+        $entry2->setContent('Youhou');
+        $entry2->setTitle('Youhou');
+        $entry2->addTag($tag);
+        $em->persist($entry2);
+
+        $annotation = new Annotation($user);
+        $annotation->setText('annotated');
+        $annotation->setQuote('annotated');
+        $annotation->setRanges([]);
+        $annotation->setEntry($entry);
+        $em->persist($annotation);
+
+        $em->flush();
+
+        // reset annotations
+        $crawler = $client->request('GET', '/config#set3');
+
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+        $crawler = $client->click($crawler->selectLink('config.reset.annotations')->link());
+
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
+        $this->assertContains('flashes.config.notice.annotations_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
+
+        $annotationsReset = $em
+            ->getRepository('WallabagAnnotationBundle:Annotation')
+            ->findAnnotationsByPageId($entry->getId(), $user->getId());
+
+        $this->assertEmpty($annotationsReset, 'Annotations were reset');
+
+        // reset tags
+        $crawler = $client->request('GET', '/config#set3');
+
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+        $crawler = $client->click($crawler->selectLink('config.reset.tags')->link());
+
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
+        $this->assertContains('flashes.config.notice.tags_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
+
+        $tagReset = $em
+            ->getRepository('WallabagCoreBundle:Tag')
+            ->countAllTags($user->getId());
+
+        $this->assertEquals(0, $tagReset, 'Tags were reset');
+
+        // reset entries
+        $crawler = $client->request('GET', '/config#set3');
+
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+        $crawler = $client->click($crawler->selectLink('config.reset.entries')->link());
+
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
+        $this->assertContains('flashes.config.notice.entries_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
+
+        $entryReset = $em
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->countAllEntriesByUsername($user->getId());
+
+        $this->assertEquals(0, $entryReset, 'Entries were reset');
+    }
+
+    public function testResetEntriesCascade()
+    {
+        $this->logInAs('empty');
+        $client = $this->getClient();
+
+        $em = $client->getContainer()->get('doctrine.orm.entity_manager');
+
+        $user = static::$kernel->getContainer()->get('security.token_storage')->getToken()->getUser();
+
+        $tag = new Tag();
+        $tag->setLabel('super');
+        $em->persist($tag);
+
+        $entry = new Entry($user);
+        $entry->setUrl('http://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html');
+        $entry->setContent('Youhou');
+        $entry->setTitle('Youhou');
+        $entry->addTag($tag);
+        $em->persist($entry);
+
+        $annotation = new Annotation($user);
+        $annotation->setText('annotated');
+        $annotation->setQuote('annotated');
+        $annotation->setRanges([]);
+        $annotation->setEntry($entry);
+        $em->persist($annotation);
+
+        $em->flush();
+
+        $crawler = $client->request('GET', '/config#set3');
+
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+        $crawler = $client->click($crawler->selectLink('config.reset.entries')->link());
+
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
+        $this->assertContains('flashes.config.notice.entries_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
+
+        $entryReset = $em
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->countAllEntriesByUsername($user->getId());
+
+        $this->assertEquals(0, $entryReset, 'Entries were reset');
+
+        $tagReset = $em
+            ->getRepository('WallabagCoreBundle:Tag')
+            ->countAllTags($user->getId());
+
+        $this->assertEquals(0, $tagReset, 'Tags were reset');
+
+        $annotationsReset = $em
+            ->getRepository('WallabagAnnotationBundle:Annotation')
+            ->findAnnotationsByPageId($entry->getId(), $user->getId());
+
+        $this->assertEmpty($annotationsReset, 'Annotations were reset');
+    }
 }