diff options
-rw-r--r-- | .gitignore | 48 | ||||
-rw-r--r-- | .kdev4/news.kdev4 | 5 | ||||
-rw-r--r-- | db/entity.php~ | 36 | ||||
-rw-r--r-- | db/item.php~ | 84 | ||||
-rw-r--r-- | db/itemmapper.php | 52 | ||||
-rw-r--r-- | db/itemmapper.php~ | 493 | ||||
-rw-r--r-- | db/newsmapper.php | 53 | ||||
-rw-r--r-- | db/newsmapper.php~ | 53 | ||||
-rw-r--r-- | doc/.mapper spec.md.kate-swp | bin | 0 -> 530 bytes | |||
-rw-r--r-- | doc/mapper spec.md | 10 | ||||
-rw-r--r-- | doc/mapper spec.md~ | 15 | ||||
-rw-r--r-- | news.kdev4 | 3 | ||||
-rw-r--r-- | templates/part.subscribelet.php~ | 19 | ||||
-rw-r--r-- | tests/db/ItemMapperTest.php | 47 | ||||
-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 Binary files differnew file mode 100644 index 000000000..4dbdf8137 --- /dev/null +++ b/doc/.mapper spec.md.kate-swp 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')) |