. * */ /** * This class maps a feed to an entry in the feeds table of the database. */ class OC_News_FeedMapper { const tableName = '*PREFIX*news_feeds'; /** * @brief Fetch a feed from remote * @param url remote url of the feed * @returns */ public function fetch($url){ $spfeed = new SimplePie_Core(); $spfeed->set_feed_url( $url ); $spfeed->enable_cache( false ); $spfeed->init(); $spfeed->handle_content_type(); $title = $spfeed->get_title(); $spitems = $spfeed->get_items(); $items = array(); foreach($spitems as $spitem) { //FIXME: maybe we can avoid this loop $itemUrl = $spitem->get_permalink(); $itemTitle = $spitem->get_title(); $items[] = new OC_News_Item($itemUrl, $itemTitle); } $feed = new OC_News_Feed($url, $title, $items); return $feed; } /** * @brief Retrieve a feed from the database * @param id The id of the feed in the database table. * @returns */ public function find($id){ $stmt = OCP\DB::prepare('SELECT * FROM ' . self::tableName . ' WHERE id = ?'); $result = $stmt->execute(array($id)); $row = $result->fetchRow(); $url = $row['url']; $title = $row['title']; $feed = new OC_News_Feed($url, $title, null, $id); return $feed; } /** * @brief Retrieve a feed and all its items from the database * @param id The id of the feed in the database table. * @returns */ public function findWithItems($id){ $stmt = OCP\DB::prepare('SELECT * FROM ' . self::tableName . ' WHERE id = ?'); $result = $stmt->execute(array($id)); $row = $result->fetchRow(); $url = $row['url']; $title = $row['title']; $feed = new OC_News_Feed($url, $title, null,$id); $itemMapper = new OC_News_ItemMapper($feed); $items = $itemMapper->findAll(); $feed->setItems($items); return $feed; } /** * @brief Save the feed and all its items into the database * @param feed the feed to be saved * @returns The id of the feed in the database table. */ public function insert(OC_News_Feed $feed){ $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()"; } //FIXME: Detect when user adds a known feed //FIXME: specify folder where you want to add $query = OCP\DB::prepare(' INSERT INTO ' . self::tableName . '(url, title, added, lastmodified) VALUES (?, ?, $_ut, $_ut) '); $title = $feed->getTitle(); if(empty($title)) { $l = OC_L10N::get('news'); $title = $l->t('no title'); } $params=array( htmlspecialchars_decode($feed->getUrl()), htmlspecialchars_decode($title) //FIXME: user_id is going to move to the folder properties //OCP\USER::getUser() ); $query->execute($params); $feedid = OCP\DB::insertid(self::tableName); $feed->setId($feedid); $itemMapper = new OC_News_ItemMapper($feed); $items = $feed->getItems(); foreach($items as $item){ $itemMapper->insert($item); } return $feedid; } }