prepare release of 0.5.1
[grauphel.git] / lib / notestorage.php
index fb6803029f780b8a00b31c8f6b54685d40daf435..93311e4a4b877f6eadf431e03921c6d90a361f5a 100644 (file)
@@ -245,6 +245,78 @@ class NoteStorage
         return $this->noteFromRow($row);
     }
 
         return $this->noteFromRow($row);
     }
 
+    /**
+     * Load a GUID of a note by the note title.
+     *
+     * The note title is stored html-escaped in the database because we
+     * get it that way from tomboy. Thus we have to escape the search
+     * input, too.
+     *
+     * @param string $title Note title.
+     *
+     * @return string GUID, NULL if note could not be found
+     */
+    public function loadGuidByTitle($title)
+    {
+        $row = \OC_DB::executeAudited(
+            'SELECT note_guid FROM `*PREFIX*grauphel_notes`'
+            . ' WHERE `note_user` = ? AND `note_title` = ?',
+            array($this->username, htmlspecialchars($title))
+        )->fetchRow();
+
+        if ($row === false) {
+            return null;
+        }
+
+        return $row['note_guid'];
+    }
+
+    /**
+     * Search for a note
+     *
+     * @param array $keywords arrays of query strings within keys AND and NOT
+     *
+     * @return array Database rows with note_guid and note_title
+     */
+    public function search($keywordGroups)
+    {
+        if (!isset($keywordGroups['AND'])) {
+            $keywordGroups['AND'] = array();
+        }
+        if (!isset($keywordGroups['NOT'])) {
+            $keywordGroups['NOT'] = array();
+        }
+
+        $sqlTplAnd = ' AND (note_title ILIKE ? OR note_tags ILIKE ? OR note_content ILIKE ?)';
+        $sqlTplNot = ' AND NOT (note_title ILIKE ? OR note_tags ILIKE ? OR note_content ILIKE ?)';
+        $arData = array(
+            $this->username
+        );
+        foreach (array('AND', 'NOT') as $group) {
+            $keywords = $keywordGroups[$group];
+            foreach ($keywords as $keyword) {
+                $arData[] = '%' . $keyword . '%';//title
+                $arData[] = '%' . $keyword . '%';//tags
+                $arData[] = '%' . $keyword . '%';//content
+            }
+        }
+
+        $result = \OC_DB::executeAudited(
+            'SELECT `note_guid`, `note_title`'
+            . ' FROM `*PREFIX*grauphel_notes`'
+            . ' WHERE note_user = ?'
+            . str_repeat($sqlTplAnd, count($keywordGroups['AND']))
+            . str_repeat($sqlTplNot, count($keywordGroups['NOT'])),
+            $arData
+        );
+
+        $notes = array();
+        while ($row = $result->fetchRow()) {
+            $notes[] = $row;
+        }
+        return $notes;
+    }
+
     /**
      * Save a note into storage.
      *
     /**
      * Save a note into storage.
      *
@@ -314,17 +386,20 @@ class NoteStorage
      * 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
      *
-     * @param integer $since  Revision number after which the notes changed
-     * @param string  $rawtag Filter by tag. Special tags:
-     *                        - grauphel:special:all
-     *                        - grauphel:special:untagged
+     * @param integer $since       Revision number after which the notes changed
+     * @param string  $rawtag      Filter by tag. Special tags:
+     *                             - grauphel:special:all
+     *                             - grauphel:special:untagged
+     * @param boolean $includeDate Load the last modification date or not
      *
      * @return array Array of short note objects
      */
      *
      * @return array Array of short note objects
      */
-    public function loadNotesOverview($since = null, $rawtag = null)
-    {
+    public function loadNotesOverview(
+        $since = null, $rawtag = null, $includeDate = false
+    ) {
         $result = \OC_DB::executeAudited(
             'SELECT `note_guid`, `note_title`, `note_last_sync_revision`, `note_tags`'
         $result = \OC_DB::executeAudited(
             'SELECT `note_guid`, `note_title`, `note_last_sync_revision`, `note_tags`'
+            . ', `note_last_change_date`'
             . ' FROM `*PREFIX*grauphel_notes`'
             . ' WHERE note_user = ?',
             array($this->username)
             . ' FROM `*PREFIX*grauphel_notes`'
             . ' WHERE note_user = ?',
             array($this->username)
@@ -345,7 +420,7 @@ class NoteStorage
             if ($rawtag !== null && strpos($row['note_tags'], $jsRawtag) === false) {
                 continue;
             }
             if ($rawtag !== null && strpos($row['note_tags'], $jsRawtag) === false) {
                 continue;
             }
-            $notes[] = array(
+            $note = array(
                 'guid' => $row['note_guid'],
                 'ref'  => array(
                     'api-ref' => $this->urlGen->getAbsoluteURL(
                 'guid' => $row['note_guid'],
                 'ref'  => array(
                     'api-ref' => $this->urlGen->getAbsoluteURL(
@@ -357,10 +432,21 @@ class NoteStorage
                             )
                         )
                     ),
                             )
                         )
                     ),
-                    'href' => null,//FIXME
+                    'href' => $this->urlGen->getAbsoluteURL(
+                        $this->urlGen->linkToRoute(
+                            'grauphel.gui.note',
+                            array(
+                                'guid' => $row['note_guid']
+                            )
+                        )
+                    ),
                 ),
                 'title' => $row['note_title'],
             );
                 ),
                 'title' => $row['note_title'],
             );
+            if ($includeDate) {
+                $note['last-change-date'] = $row['note_last_change_date'];
+            }
+            $notes[] = $note;
         }
 
         return $notes;
         }
 
         return $notes;