. * */ /** * This class manages bookmarks */ class OC_Bookmarks_Bookmarks{ /** * @brief Find People with whome we shared bookmarks and how much */ public static function findSharing($offset = 0, $limit = 10){ $query = OCP\DB::prepare('SELECT \'@public\' as name, count(*) as nbr from *PREFIX*bookmarks where public=1 group by public LIMIT '.$offset.', '.$limit); $tags = $query->execute()->fetchAll(); return $tags; } /** * @brief Finds all tags for bookmarks */ public static function findTags($filterTags = array(), $offset = 0, $limit = 10){ //$query = OCP\DB::prepare('SELECT tag, count(*) as nbr from *PREFIX*bookmarks_tags group by tag LIMIT '.$offset.', '.$limit); $params = array_merge($filterTags,$filterTags); $not_in = ''; if(!empty($filterTags) ) { $not_in = ' where tag not in ('. implode(',',array_fill(0, count($filterTags) ,'?') ) .')'. str_repeat(" AND exists (select 1 from *PREFIX*bookmarks_tags t2 where t2.bookmark_id = t.bookmark_id and tag = ?) ", count($filterTags)); } $sql = 'SELECT tag, count(*) as nbr from *PREFIX*bookmarks_tags t '.$not_in. 'group by tag Order by nbr DESC LIMIT '.$offset.', '.$limit; $query = OCP\DB::prepare($sql); $tags = $query->execute($params)->fetchAll(); return $tags; } /** * @brief Finds all bookmarks, matching the filter * @param offset result offset * @param sqlSortColumn sort result with this column * @param filter can be: empty -> no filter, a string -> filter this, a string array -> filter for all strings * @param filterTagOnly if true, filter affects only tags, else filter affects url, title and tags * @return void */ public static function findBookmarks($offset, $sqlSortColumn, $filter, $filterTagOnly){ //$CONFIG_DBTYPE = OCP\Config::getSystemValue( 'dbtype', 'sqlite' ); $limit = 10; $params=array(OCP\USER::getUser()); //@TODO replace GROUP_CONCAT for postgresql $sql = "SELECT *, (select GROUP_CONCAT(tag) from *PREFIX*bookmarks_tags where bookmark_id = b.id) as tags FROM *PREFIX*bookmarks b WHERE user_id = ? "; if($filterTagOnly) { if(is_string($filter)) $filter = array($filter); $sql .= str_repeat(" AND exists (select id from *PREFIX*bookmarks_tags t2 where t2.bookmark_id = b.id and tag = ?) ", count($filter)); $params = array_merge($params, $filter); } $sql .= " ORDER BY ".$sqlSortColumn." DESC LIMIT $limit OFFSET $offset"; $query = OCP\DB::prepare($sql); $results = $query->execute($params)->fetchAll(); $bookmarks = array(); foreach($results as $result){ $result['tags'] = explode(',', $result['tags']); $bookmarks[] = $result; } return $bookmarks; } public static function deleteUrl($id) { $user = OCP\USER::getUser(); $query = OCP\DB::prepare(" SELECT `id` FROM `*PREFIX*bookmarks` WHERE `id` = ? AND `user_id` = ? "); $result = $query->execute(array($id, $user)); $id = $result->fetchOne(); if ($id === false) { return false; } $query = OCP\DB::prepare(" DELETE FROM `*PREFIX*bookmarks` WHERE `id` = $id "); $result = $query->execute(); $query = OCP\DB::prepare(" DELETE FROM `*PREFIX*bookmarks_tags` WHERE `bookmark_id` = $id "); $result = $query->execute(); return true; } public static function renameTag($old, $new) { $user_id = OCP\USER::getUser(); // Update the record $query = OCP\DB::prepare(" UPDATE *PREFIX*bookmarks_tags SET tag = ? WHERE tag = ? AND exists( select id from *PREFIX*bookmarks where user_id = ? and bookmark_id = id) "); $params=array( $new, $old, $user_id, ); $result = $query->execute($params); return true; } public static function deleteTag($old) { $user_id = OCP\USER::getUser(); // Update the record $query = OCP\DB::prepare(" DELETE FROM *PREFIX*bookmarks_tags WHERE tag = ? AND exists( select id from *PREFIX*bookmarks where user_id = ? and bookmark_id = id) "); $params=array( $old, $user_id, ); $result = $query->execute($params); return true; } /** * get a string corresponding to the current time depending * of the OC database system * @return string */ protected static function getNowValue() { $CONFIG_DBTYPE = OCP\Config::getSystemValue( "dbtype", "sqlite" ); if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ $_ut = "strftime('%s','now')"; } elseif($CONFIG_DBTYPE == 'pgsql') { $_ut = 'date_part(\'epoch\',now())::integer'; } else { $_ut = "UNIX_TIMESTAMP()"; } return $_ut; } /** * Edit a bookmark * @param int $id The id of the bookmark to edit * @param string $url * @param string $title Name of the bookmark * @param array $tags Simple array of tags to qualify the bookmark (different tags are taken from values) * @param string $description A longer description about the bookmark * @param boolean $is_public True if the bookmark is publishable to not registered users * @return null */ public static function editBookmark($id, $url, $title, $tags = array(), $description='', $is_public=false) { $is_public = $is_public ? 1 : 0; $user_id = OCP\USER::getUser(); // Update the record $query = OCP\DB::prepare(" UPDATE *PREFIX*bookmarks SET url = ?, title = ?, public = ?, description = ?, lastmodified = ".self::getNowValue() ." WHERE id = ? AND user_id = ? "); $params=array( htmlspecialchars_decode($url), htmlspecialchars_decode($title), $is_public, htmlspecialchars_decode($description), $id, $user_id, ); $result = $query->execute($params); // Abort the operation if bookmark couldn't be set // (probably because the user is not allowed to edit this bookmark) if ($result->numRows() == 0) exit(); // Remove old tags $sql = "DELETE from *PREFIX*bookmarks_tags WHERE bookmark_id = ?"; $query = OCP\DB::prepare($sql); $query->execute(array($id)); // Add New Tags self::addTags($id, $tags); } /** * Add a bookmark * @param string $url * @param string $title Name of the bookmark * @param array $tags Simple array of tags to qualify the bookmark (different tags are taken from values) * @param string $description A longer description about the bookmark * @param boolean $is_public True if the bookmark is publishable to not registered users * @return int The id of the bookmark created */ public static function addBookmark($url, $title, $tags=array(), $description='', $is_public=false) { $is_public = $is_public ? 1 : 0; //FIXME: Detect and do smth when user adds a known URL $_ut = self::getNowValue(); $query = OCP\DB::prepare(" INSERT INTO *PREFIX*bookmarks (url, title, user_id, public, added, lastmodified, description) VALUES (?, ?, ?, ?, $_ut, $_ut, ?) "); $params=array( htmlspecialchars_decode($url), htmlspecialchars_decode($title), OCP\USER::getUser(), $is_public, $description, ); $query->execute($params); $b_id = OCP\DB::insertid('*PREFIX*bookmarks'); if($b_id !== false) { self::addTags($b_id, $tags); return $b_id; } } /** * Add a set of tags for a bookmark * @param int $bookmark_id The bookmark reference * @param array $tags Set of tags to add to the bookmark * @return null **/ private static function addTags($bookmark_id, $tags) { $query = OCP\DB::prepare(" INSERT INTO *PREFIX*bookmarks_tags (bookmark_id, tag) VALUES (?, ?)"); foreach ($tags as $tag) { if(empty($tag)) { //avoid saving blankspaces continue; } $params = array($bookmark_id, trim($tag)); $query->execute($params); } } }