diff options
author | Alessandro Cosentino <cosenal@gmail.com> | 2012-05-17 22:59:49 -0400 |
---|---|---|
committer | Alessandro Cosentino <cosenal@gmail.com> | 2012-05-17 22:59:49 -0400 |
commit | 4d612fa6f06d9d1c1e68806aef607a36a04f4f38 (patch) | |
tree | 1d528ad67f0a69e72512d9bb50cf627ccfa6fd33 /lib | |
parent | 482377467900901cee323c7b6375f57f22fd1458 (diff) |
new classes for the data mapping
Diffstat (limited to 'lib')
-rw-r--r-- | lib/feed.php | 30 | ||||
-rw-r--r-- | lib/feedmapper.php | 43 | ||||
-rw-r--r-- | lib/folder.php | 87 | ||||
-rw-r--r-- | lib/item.php | 19 | ||||
-rw-r--r-- | lib/itemmapper.php | 81 |
5 files changed, 244 insertions, 16 deletions
diff --git a/lib/feed.php b/lib/feed.php index bd2e3b1e4..215ac7c1f 100644 --- a/lib/feed.php +++ b/lib/feed.php @@ -26,18 +26,35 @@ class OC_News_Feed { private $url; - private $spfeed; //we encapsulate a SimplePie_Core object + private $feedid; //id of the feed in the database + private $spfeed; //encapsulate a SimplePie_Core object + private $items; //array that contains all the items of the feed + private $fetched; public function __construct($url){ $this->url = $url; $this->spfeed = new SimplePie_Core(); - $this->spfeed->set_item_class('OC_News_Item'); $this->spfeed->set_feed_url( $url ); $this->spfeed->enable_cache( false ); + $this->fetched = false; + } - //FIXME: figure out if constructor is the right place for these + public function fetch(){ $this->spfeed->init(); $this->spfeed->handle_content_type(); + $this->fetched = true; + } + + public function isFetched(){ + return $this->fetched; + } + + public function getId(){ + return $this->feedid; + } + + public function setId($id){ + $this->feedid = $id; } public function getUrl(){ @@ -45,6 +62,13 @@ class OC_News_Feed { } public function getTitle(){ + if (!$this->isFetched()) { + $this->fetch(); + } return $this->spfeed->get_title(); } + + public function getItems(){ + return $this->items; + } } diff --git a/lib/feedmapper.php b/lib/feedmapper.php index e0c81a2b3..f3dde51ba 100644 --- a/lib/feedmapper.php +++ b/lib/feedmapper.php @@ -22,15 +22,31 @@ /** * This class maps a feed to an entry in the feeds table of the database. - * It follows the Data Mapper pattern. + * It follows the Data Mapper pattern (see http://martinfowler.com/eaaCatalog/dataMapper.html). */ class OC_News_FeedMapper { - + + private $tableName = '*PREFIX*news_feeds'; + + /** + * @brief Retrieve a feed from the database + * @param id The id of the feed in the database table. + */ + public function find($id){ + $stmt = OCP\DB::prepare('SELECT * FROM ' . $this->tableName . ' WHERE id = ?'); + $result = $stmt->execute(array($id)); + $row = $result->fetchRow(); + + $url = $row['url']; + $title = $row['title']; + + } + /** - * @brief Save the feed into the database + * @brief Save the feed and all its items into the database * @returns The id of the feed in the database table. */ - public function insert(OC_News_Feed $feed) { + 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')"; @@ -42,11 +58,11 @@ class OC_News_FeedMapper { //FIXME: Detect when user adds a known feed //FIXME: specify folder where you want to add - $query = OCP\DB::prepare(" - INSERT INTO *PREFIX*news_feeds - (url, title, added, lastmodified) + $query = OCP\DB::prepare(' + INSERT INTO ' . $this->tableName . + '(url, title, added, lastmodified) VALUES (?, ?, $_ut, $_ut) - "); + '); $title = $feed->getTitle(); @@ -64,8 +80,15 @@ class OC_News_FeedMapper { ); $query->execute($params); - $feed_id = OCP\DB::insertid('*PREFIX*news_feeds'); + $feedid = OCP\DB::insertid($this->tableName); + $feed->setId($feedid); + + $itemMapper = new OC_News_ItemMapper($feed); - return $feed_id; + $items = $feed->getItems(); + foreach($items as $item){ + $itemMapper->insert($item); + } + return $feedid; } }
\ No newline at end of file diff --git a/lib/folder.php b/lib/folder.php new file mode 100644 index 000000000..ead03c0e4 --- /dev/null +++ b/lib/folder.php @@ -0,0 +1,87 @@ +<?php +/** +* ownCloud - News app +* +* @author Alessandro Cosentino +* @copyright 2012 Alessandro Cosentino cosenal@gmail.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +/** + * This class models a folder that contains feeds. + */ +class OC_News_Folder { + + private $name; + private $feed_id; + + public function __construct($name){ + $this->name = $name; + } + + public function getName(){ + return $this->name; + } + + public function setName($name){ + $this->name = $name; + } + + + + /** + * @brief Save the folder into the database + * @returns The id of the feed in the database table. + */ + public function saveToDB() { + $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 *PREFIX*news_feeds + (url, title, added, lastmodified) + VALUES (?, ?, $_ut, $_ut) + "); + + $title = $this->get_title(); + + if(empty($title)) { + $l = OC_L10N::get('news'); + $title = $l->t('no title'); + } + + $params=array( + htmlspecialchars_decode($this->url), + htmlspecialchars_decode($title) + + //FIXME: user_id is going to move to the folder properties + //OCP\USER::getUser() + ); + $query->execute($params); + + $feed_id = OCP\DB::insertid('*PREFIX*news_feeds'); + + return $feed_id; + } +}
\ No newline at end of file diff --git a/lib/item.php b/lib/item.php index 528dd5487..0c397c18d 100644 --- a/lib/item.php +++ b/lib/item.php @@ -31,15 +31,25 @@ class StatusFlag{ /* * This class models an item. * -* It extends the SimplePie_Item class by adding a status flag to it +* It encapsulate a SimplePie_Item object and adds a status flag to it */ class OC_News_Item extends SimplePie_Item { private $status; //a bit-field set with status flags + private $spitem; //encapsulate a SimplePie_Item object + private $itemid; - public function __construct($feed, $data){ + public function __construct($spitem){ $this->status |= StatusFlag::Unread; - parent::__construct($feed, $data); + $this->spitem = $spitem; + } + + public function getId(){ + return $this->itemid; + } + + public function setId($id){ + $this->itemid = $id; } public function setRead(){ @@ -53,4 +63,7 @@ class OC_News_Item extends SimplePie_Item { public function isRead(){ return ($this->status & ~StatusFlag::Unread); } + + + } diff --git a/lib/itemmapper.php b/lib/itemmapper.php new file mode 100644 index 000000000..177a95fd6 --- /dev/null +++ b/lib/itemmapper.php @@ -0,0 +1,81 @@ +<?php +/** +* ownCloud - News app +* +* @author Alessandro Cosentino +* @copyright 2012 Alessandro Cosentino cosenal@gmail.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +/** + * This class maps an item to a row of the items table in the database. + * It follows the Data Mapper pattern (see http://martinfowler.com/eaaCatalog/dataMapper.html). + */ +class OC_News_ItemMapper { + + private $tableName = '*PREFIX*news_items'; + private $feed; + + public function __construct(OC_News_Feed $feed){ + $this->feed = $feed; + } + + /** + * @brief Retrieve a feed from the database + * @param id The id of the feed in the database table. + */ + public function find($id){ + $stmt = OCP\DB::prepare('SELECT * FROM ' . $this->feedTableName . ' WHERE id = ?'); + $result = $stmt->execute(array($id)); + $row = $result->fetchRow(); + + $url = $row['url']; + $title = $row['title']; + + } + + /** + * @brief Save the feed and all its items into the database + * @returns The id of the feed in the database table. + */ + public function insert(OC_News_Item $item){ + + $feedid = $this->feed->getId(); + + $query = OCP\DB::prepare(' + INSERT INTO ' . $this->tableName . + '(url, title, feedid) + VALUES (?, ?, $feedid) + '); + + $title = $item->getTitle(); +echo $title; + if(empty($title)) { + $l = OC_L10N::get('news'); + $title = $l->t('no title'); + } + + $params=array( + htmlspecialchars_decode($feed->getUrl()), + htmlspecialchars_decode($title) + ); + $query->execute($params); + + $itemid = OCP\DB::insertid($this->tableName); + $item->setId($itemid); + return $itemid; + } +}
\ No newline at end of file |