From 762b4d89bc0876d8d514a21bf22babcb012cf298 Mon Sep 17 00:00:00 2001 From: Alessandro Cosentino Date: Mon, 28 May 2012 14:27:18 -0400 Subject: decoupled fetcher and database mapper --- lib/feedmapper.php | 25 ----------- lib/fetcher.php | 50 ++++++++++++++++++++++ lib/folder.php | 18 +++++++- lib/foldermapper.php | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 181 insertions(+), 26 deletions(-) create mode 100644 lib/fetcher.php create mode 100644 lib/foldermapper.php diff --git a/lib/feedmapper.php b/lib/feedmapper.php index 004e443f1..c0e0b03a5 100644 --- a/lib/feedmapper.php +++ b/lib/feedmapper.php @@ -27,31 +27,6 @@ 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. diff --git a/lib/fetcher.php b/lib/fetcher.php new file mode 100644 index 000000000..e5ea27626 --- /dev/null +++ b/lib/fetcher.php @@ -0,0 +1,50 @@ +. +* +*/ + + +class OC_News_Utils { + + /** + * @brief Fetch a feed from remote + * @param url remote url of the feed + * @returns + */ + public static 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; + } +} \ No newline at end of file diff --git a/lib/folder.php b/lib/folder.php index 129110ae7..a7036e8a7 100644 --- a/lib/folder.php +++ b/lib/folder.php @@ -28,9 +28,13 @@ class OC_News_Folder { private $name; private $id; private $feeds; + private $children; + private $parent; - public function __construct($name){ + public function __construct($name, $parent = null){ $this->name = $name; + $this->parent = $parent; + $this->feeds = array(); } public function getName(){ @@ -41,4 +45,16 @@ class OC_News_Folder { $this->name = $name; } + public function getId(){ + return $this->id; + } + + public function setId($id){ + $this->$id = $id; + } + + public function addFeed(OC_News_Feed $feed){ + $this->feeds[] = $feed; + } + } \ No newline at end of file diff --git a/lib/foldermapper.php b/lib/foldermapper.php new file mode 100644 index 000000000..23ced832c --- /dev/null +++ b/lib/foldermapper.php @@ -0,0 +1,114 @@ +. +* +*/ + +/** + * This class maps a feed to an entry in the feeds table of the database. + */ +class OC_News_FolderMapper { + + const tableName = '*PREFIX*news_folders'; + + /** + * @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; + } -- cgit v1.2.3