Add database management page
authorChristian Weiske <cweiske@cweiske.de>
Tue, 14 Oct 2014 21:24:40 +0000 (23:24 +0200)
committerChristian Weiske <cweiske@cweiske.de>
Tue, 14 Oct 2014 21:24:40 +0000 (23:24 +0200)
appinfo/routes.php
controller/guicontroller.php
grauphel.css
lib/notestorage.php
templates/appnavigation.php
templates/gui-database.php [new file with mode: 0644]

index 28ba16d..19a4b93 100644 (file)
@@ -73,6 +73,16 @@ $application->registerRoutes(
                 'name' => 'gui#tokens',
                 'verb' => 'GET',
             ),
                 'name' => 'gui#tokens',
                 'verb' => 'GET',
             ),
+            array(
+                'url'  => '/database',
+                'name' => 'gui#database',
+                'verb' => 'GET',
+            ),
+            array(
+                'url'  => '/database',
+                'name' => 'gui#databaseReset',
+                'verb' => 'POST',
+            ),
 
             array(
                 'url'  => '/tokens/{username}/{tokenKey}',
 
             array(
                 'url'  => '/tokens/{username}/{tokenKey}',
index 58768f2..6f0a15c 100644 (file)
@@ -119,6 +119,41 @@ class GuiController extends Controller
         return $res;
     }
 
         return $res;
     }
 
+    /**
+     * Allow the user to clear his database
+     *
+     * @NoAdminRequired
+     * @NoCSRFRequired
+     */
+    public function database($reset = null)
+    {
+        $res = new TemplateResponse('grauphel', 'gui-database');
+        $res->setParams(array('reset' => $reset));
+        $this->addNavigation($res, null);
+        $this->addStats($res);
+
+        return $res;
+    }
+
+    /**
+     * Resets the database by deleting all notes and deleting the user's
+     * sync data.
+     *
+     * @NoAdminRequired
+     */
+    public function databaseReset()
+    {
+        $reset = false;
+        if ($_POST['username'] != '' && $_POST['username'] == $this->user->getUid()) {
+            $notes = $this->getNotes();
+            $notes->deleteAll();
+            $notes->deleteSyncData();
+            $reset = true;
+        }
+
+        return $this->database($reset);
+    }
+
     protected function addNavigation(TemplateResponse $res, $selectedRawtag = null)
     {
         $nav = new \OCP\Template('grauphel', 'appnavigation', '');
     protected function addNavigation(TemplateResponse $res, $selectedRawtag = null)
     {
         $nav = new \OCP\Template('grauphel', 'appnavigation', '');
index cac269c..6ba1cde 100644 (file)
     text-decoration: underline;
 }
 
     text-decoration: underline;
 }
 
+.app-grauphel #app-content .error {
+    color: red;
+}
+.app-grauphel #app-content .success {
+    color: green;
+}
+
 .app-grauphel .oauth-authorize {
     margin: 2ex;
     text-align: center;
 .app-grauphel .oauth-authorize {
     margin: 2ex;
     text-align: center;
index c665903..fb68030 100644 (file)
@@ -190,6 +190,22 @@ class NoteStorage
     }
 
     /**
     }
 
     /**
+     * Delete synchronization data for the given user.
+     *
+     * @param SyncData $syncdata Synchronization data object
+     *
+     * @return void
+     */
+    public function deleteSyncData()
+    {
+        \OC_DB::executeAudited(
+            'DELETE FROM `*PREFIX*grauphel_syncdata`'
+            . ' WHERE `syncdata_user` = ?',
+            array($this->username)
+        );
+    }
+
+    /**
      * Load a note from the storage.
      *
      * @param string  $guid      Note identifier
      * Load a note from the storage.
      *
      * @param string  $guid      Note identifier
@@ -281,6 +297,20 @@ class NoteStorage
     }
 
     /**
     }
 
     /**
+     * Delete all notes from storage.
+     *
+     * @return void
+     */
+    public function deleteAll()
+    {
+        \OC_DB::executeAudited(
+            'DELETE FROM `*PREFIX*grauphel_notes`'
+            . ' WHERE `note_user` = ?',
+            array($this->username)
+        );
+    }
+
+    /**
      * Load notes for the given user in short form.
      * Optionally only those changed after $since revision
      *
      * Load notes for the given user in short form.
      * Optionally only those changed after $since revision
      *
index 8b15238..b0657e1 100644 (file)
@@ -14,6 +14,7 @@
         <li><a href="<?php p(OCP\Util::linkToRoute('grauphel.gui.index')); ?>">Info and stats</a></li>
       <?php if (OCP\User::isLoggedIn()) { ?>
         <li><a href="<?php p(OCP\Util::linkToRoute('grauphel.gui.tokens')); ?>">Manage access tokens</a></li>
         <li><a href="<?php p(OCP\Util::linkToRoute('grauphel.gui.index')); ?>">Info and stats</a></li>
       <?php if (OCP\User::isLoggedIn()) { ?>
         <li><a href="<?php p(OCP\Util::linkToRoute('grauphel.gui.tokens')); ?>">Manage access tokens</a></li>
+        <li><a href="<?php p(OCP\Util::linkToRoute('grauphel.gui.database')); ?>">Manage database</a></li>
       <?php } ?>
       </ul>
     </div>
       <?php } ?>
       </ul>
     </div>
diff --git a/templates/gui-database.php b/templates/gui-database.php
new file mode 100644 (file)
index 0000000..6fc057a
--- /dev/null
@@ -0,0 +1,40 @@
+<link rel="stylesheet" href="<?php p(OCP\Util::linkTo('grauphel','grauphel.css')); ?>" type="text/css"/>
+
+<?php /** @var $l OC_L10N */ ?>
+<?php $_['appNavigation']->printPage(); ?>
+
+<script type="text/javascript" src="<?php p(OCP\Util::linkTo('grauphel','js/grauphel.js')); ?>"></script>
+
+<div id="app-content" class="content">
+  <h1>Manage database</h1>
+  <p>
+    In case something went seriously wrong during synchronization, you may reset your
+    database.
+    It will delete all your notes and the synchronization status - as if you
+    never synced to this server before.
+  </p>
+
+  <?php isset($_['stats']) && $_['stats']->printPage(); ?>
+
+  <h2>Reset database</h2>
+  <?php if ($_['reset'] === true) { ?>
+  <p class="success">
+   Database has been reset!
+  </p>
+  <?php } else if ($_['reset'] === false) { ?>
+  <p class="error">
+   Database has <b>not</b> been reset!
+  </p>
+  <?php } ?>
+
+  <p>
+   To reset the database, enter your user name and click "reset database":
+  </p>
+  <form method="POST" action="<?php p(OCP\Util::linkToRoute('grauphel.gui.databaseReset')); ?>">
+    <input type="hidden" name="requesttoken" value="<?php p($_['requesttoken']) ?>"/>
+    <p>
+     <label>Username: <input type="text" name="username" value="" autocomplete="off" /></label>
+     <button type="submit">Reset database</button>
+    </p>
+  </form>
+</div>