summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--appinfo/app.php2
-rw-r--r--lib/feed.php30
-rw-r--r--lib/feedmapper.php43
-rw-r--r--lib/folder.php87
-rw-r--r--lib/item.php19
-rw-r--r--lib/itemmapper.php81
-rw-r--r--templates/main.php4
7 files changed, 248 insertions, 18 deletions
diff --git a/appinfo/app.php b/appinfo/app.php
index 213295ac0..279969872 100644
--- a/appinfo/app.php
+++ b/appinfo/app.php
@@ -24,6 +24,8 @@
OC::$CLASSPATH['OC_News_Item'] = 'apps/news/lib/item.php';
OC::$CLASSPATH['OC_News_Feed'] = 'apps/news/lib/feed.php';
OC::$CLASSPATH['OC_News_FeedMapper'] = 'apps/news/lib/feedmapper.php';
+OC::$CLASSPATH['OC_News_ItemMapper'] = 'apps/news/lib/itemmapper.php';
+
$l = new OC_l10n('news');
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
diff --git a/templates/main.php b/templates/main.php
index f6eabb799..d4cc21082 100644
--- a/templates/main.php
+++ b/templates/main.php
@@ -2,8 +2,8 @@
$feed = new OC_News_Feed( 'http://algorithmsforthekitchen.com/blog/?feed=rss2' );
$mapper = new OC_News_FeedMapper();
-$feed_id = $mapper->insert($feed);
-
+$mapper->insert($feed);
+$mapper->find($feed->getId());
echo "<br>" . $feed->getTitle() . "<br>";
/*