summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore48
-rw-r--r--.kdev4/news.kdev45
-rw-r--r--db/entity.php~36
-rw-r--r--db/item.php~84
-rw-r--r--db/itemmapper.php52
-rw-r--r--db/itemmapper.php~493
-rw-r--r--db/newsmapper.php53
-rw-r--r--db/newsmapper.php~53
-rw-r--r--doc/.mapper spec.md.kate-swpbin0 -> 530 bytes
-rw-r--r--doc/mapper spec.md10
-rw-r--r--doc/mapper spec.md~15
-rw-r--r--news.kdev43
-rw-r--r--templates/part.subscribelet.php~19
-rw-r--r--tests/db/ItemMapperTest.php47
-rw-r--r--tests/db/ItemMapperTest.php~141
-rw-r--r--tests/db/NewsMapperTest.php~50
16 files changed, 1073 insertions, 36 deletions
diff --git a/.gitignore b/.gitignore
index 76b9e2418..d9460eb67 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,43 @@
-coffee/build/
-node_modules/
-*.log
-build/
-test-results.xml
+# just sane ignores
+.*.sw[po]
+*.bak
+*.BAK
+*~
+*.orig
+*.class
+.cvsignore
+Thumbs.db
+*.py[co]
+_darcs/*
+CVS/*
+.svn/*
+RCS/*
+
+# kdevelop
+.kdev
+*.kdev4
+
+# Lokalize
+*lokalize*
+
+# eclipse
+.project
+.settings
+
+# netbeans
+nbproject
+
+# phpStorm
+.idea
+
+# geany
+*.geany
+
+# Cloud9IDE
+.settings.xml
+
+# vim ex mode
+.vimrc
+
+# Mac OS
+.DS_Store \ No newline at end of file
diff --git a/.kdev4/news.kdev4 b/.kdev4/news.kdev4
new file mode 100644
index 000000000..fe496cc80
--- /dev/null
+++ b/.kdev4/news.kdev4
@@ -0,0 +1,5 @@
+[Buildset]
+BuildItems=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x01\x00\x00\x00\x08\x00n\x00e\x00w\x00s)
+
+[Project]
+VersionControlSupport=kdevgit
diff --git a/db/entity.php~ b/db/entity.php~
new file mode 100644
index 000000000..9adab3b7f
--- /dev/null
+++ b/db/entity.php~
@@ -0,0 +1,36 @@
+<?php
+
+/**
+* ownCloud - News
+*
+* @author Alessandro Copyright
+* @author Bernhard Posselt
+* @copyright 2012 Alessandro Cosentino cosenal@gmail.com
+* @copyright 2012 Bernhard Posselt nukeawhale@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 Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+namespace OCA\News\Db;
+
+abstract class Entity {
+
+ public function fromRow($row){
+ foreach($row as $key => $value){
+ $this->$key = $value;
+ }
+ }
+
+} \ No newline at end of file
diff --git a/db/item.php~ b/db/item.php~
new file mode 100644
index 000000000..8c4ef2b4a
--- /dev/null
+++ b/db/item.php~
@@ -0,0 +1,84 @@
+<?php
+
+/**
+* ownCloud - News
+*
+* @author Alessandro Cosentino
+* @author Bernhard Posselt
+* @copyright 2012 Alessandro Cosentino cosenal@gmail.com
+* @copyright 2012 Bernhard Posselt nukeawhale@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 Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+namespace OCA\News\Db;
+
+use \OCA\AppFramework\Db\Entity;
+
+
+class Item extends Entity {
+
+ public $guidHash;
+ public $guid;
+ public $url;
+ public $title;
+ public $author;
+ public $pubDate;
+ public $body;
+ public $enclosureMime;
+ public $enclosureLink;
+ public $feedId;
+ public $status;
+ public $feedTitle;
+ public $lastModified;
+
+======= public function setRead() {
+ $this->markFieldUpdated('status');
+ $this->status &= ~StatusFlag::UNREAD;
+ }
+
+ public function isRead() {
+ return !(($this->status & StatusFlag::UNREAD) === StatusFlag::UNREAD);
+ }
+
+ public function setUnread() {
+ $this->markFieldUpdated('status');
+ $this->status |= StatusFlag::UNREAD;
+ }
+
+ public function isUnread() {
+ return !$this->isRead();
+ }
+
+ public function setStarred() {
+ $this->markFieldUpdated('status');
+ $this->status |= StatusFlag::STARRED;
+ }
+
+ public function isStarred() {
+ return ($this->status & StatusFlag::STARRED) === StatusFlag::STARRED;
+ }
+
+ public function setUnstarred() {
+ $this->markFieldUpdated('status');
+ $this->status &= ~StatusFlag::STARRED;
+ }
+
+ public function isUnstarred() {
+ return !$this->isStarred();
+ }
+
+}
+
diff --git a/db/itemmapper.php b/db/itemmapper.php
index c6ea67209..0bf9b4d87 100644
--- a/db/itemmapper.php
+++ b/db/itemmapper.php
@@ -17,18 +17,14 @@ use \OCA\AppFramework\Db\MultipleObjectsReturnedException;
use \OCA\AppFramework\Db\Mapper;
use \OCA\AppFramework\Core\API;
-class ItemMapper extends Mapper {
+class ItemMapper extends NewsMapper {
public function __construct(API $api){
parent::__construct($api, 'news_items');
}
-
- public function findAllFromFeed($feedId, $userId){
- $sql = 'SELECT * FROM `*PREFIX*news_items` ' .
- 'WHERE user_id = ? ' .
- 'AND feed_id = ?';
-
- $result = $this->execute($sql, array($feedId, $userId));
+
+ protected function findAllRows($sql, $params) {
+ $result = $this->execute($sql, $params);
$items = array();
while($row = $result->fetchRow()){
@@ -40,21 +36,37 @@ class ItemMapper extends Mapper {
return $items;
}
-
- public function find($id, $userId){
+
+ public function findAllFromFeed($feedId, $userId){
$sql = 'SELECT * FROM `*PREFIX*news_items` ' .
'WHERE user_id = ? ' .
- 'AND id = ?';
+ 'AND feed_id = ?';
- $result = $this->execute($sql, array($id, $userId));
+ $params = array($feedId, $userId);
+ return $this->findAllRows($sql, $params);
+
- $row = $result->fetchRow();
- if ($row === false) {
- throw new DoesNotExistException('Item ' . $id .
- ' from user ' . $userId . ' not found');
- } elseif($result->fetchRow() !== false) {
- throw new MultipleObjectsReturnedException('More than one result for Item with id ' . $id . ' from user ' . $userId . '!');
- }
+ }
+ /*
+ request: get all items of a folder of a user (unread and read)
+ SELECT * FROM items
+ JOIN feeds
+ ON feed.id = feed_id
+ WHERE user_id = ? AND status = ? AND feed.folder_id = ?
+ (AND id < ? LIMIT ?)
+ (AND items.lastmodified >= ?)
+ */
+
+
+
+ public function find($id, $userId){
+ $sql = 'SELECT `*dbprefix*news_items`.* FROM `*dbprefix*news_items` ' .
+ 'JOIN `*dbprefix*news_feeds` ' .
+ 'ON `*dbprefix*news_feeds`.`id` = `*dbprefix*news_items`.`feed_id` ' .
+ 'WHERE `*dbprefix*news_items`.`id` = ? ' .
+ 'AND `*dbprefix*news_feeds`.`user_id` = ? ';
+
+ $row = $this->findRow($sql, $id, $userId);
$item = new Item();
$item->fromRow($row);
@@ -62,7 +74,9 @@ class ItemMapper extends Mapper {
return $item;
}
+ public function findAllFromFolder($status, $feedId, $userId){
+ }
}
diff --git a/db/itemmapper.php~ b/db/itemmapper.php~
new file mode 100644
index 000000000..0bf9b4d87
--- /dev/null
+++ b/db/itemmapper.php~
@@ -0,0 +1,493 @@
+<?php
+/**
+* ownCloud - News app
+*
+* @author Alessandro Cosentino
+* Copyright (c) 2012 - Alessandro Cosentino <cosenal@gmail.com>
+*
+* This file is licensed under the Affero General Public License version 3 or later.
+* See the COPYING-README file
+*
+*/
+
+namespace OCA\News\Db;
+
+use \OCA\AppFramework\Db\DoesNotExistException;
+use \OCA\AppFramework\Db\MultipleObjectsReturnedException;
+use \OCA\AppFramework\Db\Mapper;
+use \OCA\AppFramework\Core\API;
+
+class ItemMapper extends NewsMapper {
+
+ public function __construct(API $api){
+ parent::__construct($api, 'news_items');
+ }
+
+ protected function findAllRows($sql, $params) {
+ $result = $this->execute($sql, $params);
+ $items = array();
+
+ while($row = $result->fetchRow()){
+ $item = new Item();
+ $item->fromRow($row);
+
+ array_push($items, $item);
+ }
+
+ return $items;
+ }
+
+ public function findAllFromFeed($feedId, $userId){
+ $sql = 'SELECT * FROM `*PREFIX*news_items` ' .
+ 'WHERE user_id = ? ' .
+ 'AND feed_id = ?';
+
+ $params = array($feedId, $userId);
+ return $this->findAllRows($sql, $params);
+
+
+ }
+ /*
+ request: get all items of a folder of a user (unread and read)
+ SELECT * FROM items
+ JOIN feeds
+ ON feed.id = feed_id
+ WHERE user_id = ? AND status = ? AND feed.folder_id = ?
+ (AND id < ? LIMIT ?)
+ (AND items.lastmodified >= ?)
+ */
+
+
+
+ public function find($id, $userId){
+ $sql = 'SELECT `*dbprefix*news_items`.* FROM `*dbprefix*news_items` ' .
+ 'JOIN `*dbprefix*news_feeds` ' .
+ 'ON `*dbprefix*news_feeds`.`id` = `*dbprefix*news_items`.`feed_id` ' .
+ 'WHERE `*dbprefix*news_items`.`id` = ? ' .
+ 'AND `*dbprefix*news_feeds`.`user_id` = ? ';
+
+ $row = $this->findRow($sql, $id, $userId);
+
+ $item = new Item();
+ $item->fromRow($row);
+
+ return $item;
+ }
+
+ public function findAllFromFolder($status, $feedId, $userId){
+
+ }
+
+}
+
+
+/**
+ * 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 ItemMapper {
+
+ const tableName = '*PREFIX*news_items';
+ private $userid;
+
+ public function __construct($userid = null) {
+ if ($userid !== null) {
+ $this->userid = $userid;
+ }
+ else {
+ $this->userid = \OCP\USER::getUser();
+ }
+ }
+
+
+ * @brief
+ * @param row a row from the items table of the database
+ * @returns an object of the class OC_News_Item
+ *
+ public function fromRow($row) {
+ $url = $row['url'];
+ $title = $row['title'];
+ $guid = $row['guid'];
+ $body = $row['body'];
+ $id = $row['id'];
+
+ $item = new Item($url, $title, $guid, $body, $id);
+ $item->setStatus($row['status']);
+ $item->setAuthor($row['author']);
+ $item->setFeedId($row['feed_id']);
+ $item->setDate(Utils::dbtimestampToUnixtime($row['pub_date']));
+
+ $feedmapper = new FeedMapper($this->userid);
+ $feed = $feedmapper->findById($row['feed_id']);
+ $item->setFeedTitle($feed->getTitle());
+
+ if($row['enclosure_mime'] !== null && $row['enclosure_link'] !== null) {
+ $enclosure = new Enclosure();
+ $enclosure->setMimeType($row['enclosure_mime']);
+ $enclosure->setLink($row['enclosure_link']);
+ $item->setEnclosure($enclosure);
+ }
+
+ return $item;
+ }
+
+ /**
+ * @brief Retrieve all the item corresponding to a feed from the database
+ * @param feedid The id of the feed in the database table.
+ *
+ public function findByFeedId($feedid) {
+ $stmt = \OCP\DB::prepare('SELECT * FROM ' . self::tableName . ' WHERE feed_id = ? ORDER BY pub_date DESC');
+ $result = $stmt->execute(array($feedid));
+
+ $items = array();
+ while ($row = $result->fetchRow()) {
+ $item = $this->fromRow($row);
+ $items[] = $item;
+ }
+
+ return $items;
+ }
+
+
+ /**
+ * @brief Retrieve all the items corresponding to a feed from the database with a particular status
+ * @param feedid The id of the feed in the database table.
+ * @param status one of the constants defined in OCA\News\StatusFlag
+ *
+ public function findAllStatus($feedid, $status) {
+ $stmt = \OCP\DB::prepare('SELECT * FROM ' . self::tableName . '
+ WHERE feed_id = ?
+ AND ((status & ?) > 0)
+ ORDER BY pub_date DESC');
+ $result = $stmt->execute(array($feedid, $status));
+
+ $items = array();
+ while ($row = $result->fetchRow()) {
+ $item = $this->fromRow($row);
+ $items[] = $item;
+ }
+
+ return $items;
+ }
+
+ /*
+ * @brief Retrieve all the items from the database with a particular status
+ * @param status one of the constants defined in OCA\News\StatusFlag
+ *
+ public function findEveryItemByStatus($status) {
+ $stmt = \OCP\DB::prepare('SELECT ' . self::tableName . '.* FROM ' . self::tableName . '
+ JOIN '. FeedMapper::tableName .' ON
+ '. FeedMapper::tableName .'.id = ' . self::tableName . '.feed_id
+ WHERE '. FeedMapper::tableName .'.user_id = ?
+ AND ((' . self::tableName . '.status & ?) > 0)
+ ORDER BY ' . self::tableName . '.pub_date DESC');
+ $result = $stmt->execute(array($this->userid, $status));
+
+ $items = array();
+ while ($row = $result->fetchRow()) {
+ $item = $this->fromRow($row);
+ $items[] = $item;
+ }
+
+ return $items;
+ }
+
+ public function countAllStatus($feedid, $status) {
+ $stmt = \OCP\DB::prepare('SELECT COUNT(*) as size FROM ' . self::tableName . '
+ WHERE feed_id = ?
+ AND ((status & ?) > 0)');
+ $result=$stmt->execute(array($feedid, $status))->fetchRow();
+ return $result['size'];
+ }
+
+ /**
+ * @brief Count all the items from the database with a particular status
+ * @param status one of the constants defined in OCA\News\StatusFlag
+ *
+ public function countEveryItemByStatus($status) {
+ $stmt = \OCP\DB::prepare('SELECT COUNT(*) as size FROM ' . self::tableName . '
+ JOIN '. FeedMapper::tableName .' ON
+ '. FeedMapper::tableName .'.id = ' . self::tableName . '.feed_id
+ WHERE '. FeedMapper::tableName .'.user_id = ?
+ AND ((' . self::tableName . '.status & ?) > 0)');
+ $result = $stmt->execute(array($this->userid, $status))->fetchRow();;
+
+ return $result['size'];
+ }
+
+ public function findIdFromGuid($guid_hash, $guid, $feedid) {
+ $stmt = \OCP\DB::prepare('
+ SELECT * FROM ' . self::tableName . '
+ WHERE guid_hash = ?
+ AND feed_id = ?
+ ');
+ $result = $stmt->execute(array($guid_hash, $feedid));
+ //TODO: if there is more than one row, falling back to comparing $guid
+ $row = $result->fetchRow();
+ $id = null;
+ if ($row != null) {
+ $id = $row['id'];
+ }
+ return $id;
+ }
+
+
+ /**
+ * @brief marks all items read
+ * @param int $feedId: the id of the feed
+ * @param int $mostRecentItemId: every item with the same or lower id will
+ * be marked read
+ *
+ public function markAllRead($feedId, $mostRecentItemId){
+ if($mostRecentItemId === 0){
+ $stmt = \OCP\DB::prepare('
+ UPDATE ' . self::tableName .
+ ' SET status = status & ?
+ WHERE
+ feed_id = ?');
+
+ $params = array(
+ ~StatusFlag::UNREAD,
+ $feedId
+ );
+ } else {
+ $stmt = \OCP\DB::prepare('
+ UPDATE ' . self::tableName .
+ ' SET status = status & ?
+ WHERE
+ feed_id = ?
+ AND
+ id <= ?');
+
+ $params = array(
+ ~StatusFlag::UNREAD,
+ $feedId,
+ $mostRecentItemId
+ );
+ }
+
+ $stmt->execute($params);
+ }
+
+
+ /**
+ * @brief Update the item after its status has changed
+ * @returns The item whose status has changed.
+ *
+ public function update(Item $item) {
+
+ $itemid = $item->getId();
+ $status = $item->getStatus();
+
+ $stmt = \OCP\DB::prepare('
+ UPDATE ' . self::tableName .
+ ' SET status = ?
+ WHERE id = ?
+ ');
+
+ $params=array(
+ $status,
+ $itemid
+ );
+
+ $result = $stmt->execute($params);
+
+
+ return true;
+ }
+
+ /**
+ * @brief Save the feed and all its items into the database
+ * @returns The id of the feed in the database table.
+ *
+ public function save(Item $item, $feedid) {
+ $guid = $item->getGuid();
+ $guid_hash = md5($guid);
+
+ $status = $item->getStatus();
+
+ $itemid = $this->findIdFromGuid($guid_hash, $guid, $feedid);
+
+ if ($itemid == null) {
+ $title = $item->getTitle();
+ $body = $item->getBody();
+ $author = $item->getAuthor();
+ $enclosure_mime = null;
+ $enclosure_link = null;
+
+ if($enclosure = $item->getEnclosure()) {
+ $enclosure_mime = $enclosure->getMimeType();
+ $enclosure_link = $enclosure->getLink();
+ }
+
+ $stmt = \OCP\DB::prepare('
+ INSERT INTO ' . self::tableName .
+ '(url, title, body, author, guid, guid_hash, pub_date, enclosure_mime, enclosure_link, feed_id, status)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+ ');
+
+ if(empty($title)) {
+ $l = \OC_L10N::get('news');
+ $title = $l->t('no title');
+ }
+
+ if(empty($body)) {
+ $l = \OC_L10N::get('news');
+ $body = $l->t('no body');
+ }
+
+ $pub_date = Utils::unixtimeToDbtimestamp($item->getDate());
+
+ $params=array(
+ $item->getUrl(),
+ $title,
+ $body,
+ $author,
+ $guid,
+ $guid_hash,
+ $pub_date,
+ $enclosure_mime,
+ $enclosure_link,
+ $feedid,
+ $status
+ );
+
+ $stmt->execute($params);
+
+ $itemid = \OCP\DB::insertid(self::tableName);
+ }
+ else {
+ $this->update($item);
+ }
+ $item->setId($itemid);
+ return $itemid;
+ }
+
+ /**
+ * @brief Retrieve an item from the database
+ * @param id The id of the item in the database table.
+ *
+ public function findById($id) {
+
+ $stmt = \OCP\DB::prepare('SELECT ' . self::tableName . '.id AS id, ' . self::tableName .
+ '.url AS url, ' . self::tableName . '.title AS title, guid, body, status, author, feed_id, pub_date, enclosure_mime, enclosure_link' .
+ ' FROM ' . self::tableName . ' JOIN ' . FeedMapper::tableName .
+ ' ON ' . self::tableName . '.feed_id = ' . FeedMapper::tableName . '.id WHERE (' . self::tableName .
+ '.id = ? AND ' . FeedMapper::tableName . '.user_id = ? )');
+ $result = $stmt->execute(array($id, $this->userid));
+
+ /*
+ $stmt = \OCP\DB::prepare('SELECT * FROM ' . self::tableName . ' WHERE id = ?');
+ $result = $stmt->execute(array($id));
+ *
+ $row = $result->fetchRow();
+
+ $item = $this->fromRow($row);
+
+ return $item;
+
+ }
+
+
+ /**
+ * @brief Permanently delete all items belonging to a feed from the database
+ * @param feedid The id of the feed that we wish to delete
+ * @return
+ *
+ public function deleteAll($feedid) {
+ if ($feedid == null) {
+ return false;
+ }
+ $stmt = \OCP\DB::prepare('DELETE FROM ' . self::tableName .' WHERE feed_id = ?');
+
+ $result = $stmt->execute(array($feedid));
+
+ return $result;
+ }
+
+ /**
+ * Returns the unread count
+ * @param $feedType the type of the feed
+ * @param $feedId the id of the feed or folder
+ * @return the unread count
+ *
+ public function getUnreadCount($feedType, $feedId){
+ $unreadCount = 0;
+
+ switch ($feedType) {
+ case FeedType::STARRED:
+ $unreadCount = $this->countEveryItemByStatus(StatusFlag::IMPORTANT);
+ break;
+
+ case FeedType::SUBSCRIPTIONS:
+ $unreadCount = $this->countEveryItemByStatus(StatusFlag::UNREAD);
+ break;
+
+ case FeedType::FOLDER:
+ $feedMapper = new FeedMapper($this->userid);
+ $feeds = $feedMapper->findByFolderId($feedId);
+ foreach($feeds as $feed){
+ $unreadCount += $this->countAllStatus($feed->getId(), StatusFlag::UNREAD);
+ }
+ break;
+
+ case FeedType::FEED:
+ $unreadCount = $this->countAllStatus($feedId, StatusFlag::UNREAD);
+ break;
+ }
+
+ return (int)$unreadCount;
+ }
+
+
+ /**
+ * Returns all items
+ * @param $feedType the type of the feed
+ * @param $feedId the id of the feed or folder
+ * @param $showAll if true, it will also include unread items
+ * @return an array with all items
+ *
+ public function getItems($feedType, $feedId, $showAll){
+ $items = array();
+
+ // starred or subscriptions
+ if ($feedType === FeedType::STARRED || $feedType === FeedType::SUBSCRIPTIONS) {
+
+ if($feedType === FeedType::STARRED){
+ $statusFlag = StatusFlag::IMPORTANT;
+ }
+
+ if($feedType === FeedType::SUBSCRIPTIONS){
+ $statusFlag = StatusFlag::UNREAD;
+ }
+
+ $items = $this->findEveryItemByStatus($statusFlag);
+
+ // feed
+ } elseif ($feedType === FeedType::FEED){
+
+ if($showAll) {
+ $items = $this->findByFeedId($feedId);
+ } else {
+ $items = $this->findAllStatus($feedId, StatusFlag::UNREAD);
+ }
+
+ // folder
+ } elseif ($feedType === FeedType::FOLDER){
+ $feedMapper = new FeedMapper($this->userid);
+ $feeds = $feedMapper->findByFolderId($feedId);
+
+ foreach($feeds as $feed){
+ if($showAll) {
+ $items = array_merge($items, $this->findByFeedId($feed->getId()));
+ } else {
+ $items = array_merge($items,
+ $this->findAllStatus($feed->getId(), StatusFlag::UNREAD));
+ }
+ }
+ }
+ return $items;
+ }
+}
+*/ \ No newline at end of file
diff --git a/db/newsmapper.php b/db/newsmapper.php
new file mode 100644
index 000000000..da928bd67
--- /dev/null
+++ b/db/newsmapper.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@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 Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCA\News\Db;
+
+use \OCA\AppFramework\Db\DoesNotExistException;
+use \OCA\AppFramework\Db\MultipleObjectsReturnedException;
+use \OCA\AppFramework\Db\Mapper;
+use \OCA\AppFramework\Core\API;
+
+
+abstract class NewsMapper extends Mapper {
+
+ public function __construct(API $api, $tableName) {
+ parent::__construct($api, $tableName);
+ }
+
+ protected function findRow($sql, $id, $userId){
+
+ $result = $this->execute($sql, array($id, $userId));
+
+ $row = $result->fetchRow();
+
+ if($row === false){
+ throw new DoesNotExistException('Item does not exist!');
+ } elseif($result->fetchRow() !== false) {
+ throw new MultipleObjectsReturnedException('More than one result for Item with id ' . $id . '!');
+ } else {
+ return $row;
+ }
+ }
+} \ No newline at end of file
diff --git a/db/newsmapper.php~ b/db/newsmapper.php~
new file mode 100644
index 000000000..acf07c290
--- /dev/null
+++ b/db/newsmapper.php~
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@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 Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCA\News\Db;
+
+use \OCA\AppFramework\Db\DoesNotExistException;
+use \OCA\AppFramework\Db\MultipleObjectsReturnedException;
+use \OCA\AppFramework\Db\Mapper;
+use \OCA\AppFramework\Core\API;
+
+
+abstract class NewsMapper extends Mapper {
+
+ public function __construct(API $api, $tableName) {
+ parent::__construct($api, $tableName);
+ }
+
+ protected function findRow($sqlStmt, $id, $userId){
+
+ $result = $this->execute($sqlStmt, array($id, $userId));
+
+ $row = $result->fetchRow();
+
+ if($row === false){
+ throw new DoesNotExistException('Item does not exist!');
+ } elseif($result->fetchRow() !== false) {
+ throw new MultipleObjectsReturnedException('More than one result for Item with id ' . $id . '!');
+ } else {
+ return $row;
+ }
+ }
+} \ No newline at end of file
diff --git a/doc/.mapper spec.md.kate-swp b/doc/.mapper spec.md.kate-swp
new file mode 100644
index 000000000..4dbdf8137
--- /dev/null
+++ b/doc/.mapper spec.md.kate-swp
Binary files differ
diff --git a/doc/mapper spec.md b/doc/mapper spec.md
index f9b28fe94..725a0d6b2 100644
--- a/doc/mapper spec.md
+++ b/doc/mapper spec.md
@@ -1,5 +1,6 @@
itemmapper
+<<<<<<< Updated upstream
find(int $feedId, $userId)
@@ -35,11 +36,20 @@ request: get all items of a feed of a user (unread and read)
all requests: can be specified using an (offset (id), limit) or (updatedSince (timestamp))
+=======
+findAllFromUser($userId)
+find(int $feedId, $userId)
+
+findAll($status, $feedId, $userId, );
+>>>>>>> Stashed changes
foldermapper
find($feedId, $userId)
+<<<<<<< Updated upstream
findAllFromUser($userId)
+=======
+>>>>>>> Stashed changes
feedmapper
diff --git a/doc/mapper spec.md~ b/doc/mapper spec.md~
new file mode 100644
index 000000000..a5e877734
--- /dev/null
+++ b/doc/mapper spec.md~
@@ -0,0 +1,15 @@
+
+findAllFromUser($userId)
+find(int $feedId, $userId)
+findAllFromFeedWithStatus($status, $feedId, $userId);
+
+foldermapper
+
+find($feedId, $userId)
+
+feedmapper
+
+find($feedId, $userId)
+findAll()
+findAllFromUser($userId)
+
diff --git a/news.kdev4 b/news.kdev4
new file mode 100644
index 000000000..4fee6442d
--- /dev/null
+++ b/news.kdev4
@@ -0,0 +1,3 @@
+[Project]
+Manager=KDevGenericManager
+Name=news
diff --git a/templates/part.subscribelet.php~ b/templates/part.subscribelet.php~
new file mode 100644
index 000000000..2e6c481ee
--- /dev/null
+++ b/templates/part.subscribelet.php~
@@ -0,0 +1,19 @@
+
+<?php
+ p($l->t('Drag this to your bookmarks bar'))
+?>
+<a class="button"
+ href="javascript:(function() {
+ var a=window,
+ b=document,
+ c=encodeURIComponent,
+ d=a.open('<?php print_unescaped(OCP\Util::linkToAbsolute('news', 'subscribe.php'))?>?output=popup&url='+c(b.location),
+ 'bkmk_popup','left='+((a.screenX||a.screenLeft)+10)+',
+ top='+((a.screenY||a.screenTop)+10)+',
+ height=150px,width=360px,resizable=1,alwaysRaised=1');
+ a.setTimeout(function() {
+ d.focus()},300);
+ })();">
+ <?php p($l->t('Subscribe')) ?>
+</a>
+
diff --git a/tests/db/ItemMapperTest.php b/tests/db/ItemMapperTest.php
index 675af7ba2..b3be320e7 100644
--- a/tests/db/ItemMapperTest.php
+++ b/tests/db/ItemMapperTest.php
@@ -28,7 +28,7 @@ namespace OCA\News\Db;
require_once(__DIR__ . "/../classloader.php");
-class Test extends \OCA\AppFramework\Utility\MapperTestUtility {
+class ItemMapperTest extends \OCA\AppFramework\Utility\MapperTestUtility {
private $itemMapper;
private $items;
@@ -74,10 +74,12 @@ class Test extends \OCA\AppFramework\Utility\MapperTestUtility {
$rows = array(
array('id' => $this->items[0]->getId()),
);
- $sql = 'SELECT * FROM `*PREFIX*news_items` ' .
- 'WHERE user_id = ? ' .
- 'AND id = ?';
-
+ $sql = 'SELECT `*dbprefix*news_items`.* FROM `*dbprefix*news_items` ' .
+ 'JOIN `*dbprefix*news_feeds` ' .
+ 'ON `*dbprefix*news_feeds`.`id` = `*dbprefix*news_items`.`feed_id` ' .
+ 'WHERE `*dbprefix*news_items`.`id` = ? ' .
+ 'AND `*dbprefix*news_feeds`.`user_id` = ? ';
+
$this->setMapperResult($sql, array($id, $userId), $rows);
$result = $this->itemMapper->find($id, $userId);
@@ -88,10 +90,12 @@ class Test extends \OCA\AppFramework\Utility\MapperTestUtility {
public function testFindNotFound(){
$userId = 'john';
$id = 3;
- $sql = 'SELECT * FROM `*PREFIX*news_items` ' .
- 'WHERE user_id = ? ' .
- 'AND id = ?';
-
+ $sql = 'SELECT `*dbprefix*news_items`.* FROM `*dbprefix*news_items` ' .
+ 'JOIN `*dbprefix*news_feeds` ' .
+ 'ON `*dbprefix*news_feeds`.`id` = `*dbprefix*news_items`.`feed_id` ' .
+ 'WHERE `*dbprefix*news_items`.`id` = ? ' .
+ 'AND `*dbprefix*news_feeds`.`user_id` = ? ';
+
$this->setMapperResult($sql, array($id, $userId));
$this->setExpectedException('\OCA\AppFramework\Db\DoesNotExistException');
@@ -105,13 +109,32 @@ class Test extends \OCA\AppFramework\Utility\MapperTestUtility {
array('id' => $this->items[0]->getId()),
array('id' => $this->items[1]->getId())
);
- $sql = 'SELECT * FROM `*PREFIX*news_items` ' .
- 'WHERE user_id = ? ' .
- 'AND id = ?';
+ $sql = 'SELECT `*dbprefix*news_items`.* FROM `*dbprefix*news_items` ' .
+ 'JOIN `*dbprefix*news_feeds` ' .
+ 'ON `*dbprefix*news_