зеркало из https://github.com/nextcloud/news.git
findAll functions in the itemmapper
This commit is contained in:
Родитель
97855d5d6a
Коммит
843f5e0fd2
|
@ -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
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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){
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
*/
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
Двоичный файл не отображается.
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
[Project]
|
||||
Manager=KDevGenericManager
|
||||
Name=news
|
|
@ -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>
|
||||
|
|
@ -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_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);
|
||||
|
||||
$this->setExpectedException('\OCA\AppFramework\Db\MultipleObjectsReturnedException');
|
||||
$result = $this->itemMapper->find($id, $userId);
|
||||
}
|
||||
|
||||
public function testFindAllFromFolder() {
|
||||
$userId = 'john';
|
||||
$folderId = 3;
|
||||
$status = 2;
|
||||
$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_feeds`.`user_id` = ? ' .
|
||||
'AND `*dbprefix*news_feeds`.`folder_id` = ? ' .
|
||||
'AND ((`*dbprefix*news_items`.`status` & ?) > 0)';
|
||||
|
||||
$this->setMapperResult($sql, array($userId, $folderId, $status));
|
||||
$result = $this->findAllFromFolder($userId, $folderId, $status);
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,141 @@
|
|||
<?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;
|
||||
|
||||
require_once(__DIR__ . "/../classloader.php");
|
||||
|
||||
|
||||
class ItemMapperTest extends \OCA\AppFramework\Utility\MapperTestUtility {
|
||||
|
||||
private $itemMapper;
|
||||
private $items;
|
||||
|
||||
protected function setUp(){
|
||||
$this->beforeEach();
|
||||
|
||||
$this->itemMapper = new ItemMapper($this->api);
|
||||
|
||||
// create mock items
|
||||
$item1 = new Item();
|
||||
$item2 = new Item();
|
||||
|
||||
$this->items = array(
|
||||
$item1,
|
||||
$item2
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
public function testFindAllFromFeed(){
|
||||
$userId = 'john';
|
||||
$feedId = 3;
|
||||
$rows = array(
|
||||
array('id' => $this->items[0]->getId()),
|
||||
array('id' => $this->items[1]->getId())
|
||||
);
|
||||
$sql = 'SELECT * FROM `*PREFIX*news_items` ' .
|
||||
'WHERE user_id = ? ' .
|
||||
'AND feed_id = ?';
|
||||
|
||||
$this->setMapperResult($sql, array($feedId, $userId), $rows);
|
||||
|
||||
$result = $this->itemMapper->findAllFromFeed($feedId, $userId);
|
||||
|
||||
$this->assertEquals($this->items, $result);
|
||||
|
||||
}
|
||||
|
||||
public function testFind(){
|
||||
$userId = 'john';
|
||||
$id = 3;
|
||||
$rows = array(
|
||||
array('id' => $this->items[0]->getId()),
|
||||
);
|
||||
$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);
|
||||
$this->assertEquals($this->items[0], $result);
|
||||
|
||||
}
|
||||
|
||||
public function testFindNotFound(){
|
||||
$userId = 'john';
|
||||
$id = 3;
|
||||
$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');
|
||||
$result = $this->itemMapper->find($id, $userId);
|
||||
}
|
||||
|
||||
public function testFindMoreThanOneResultFound(){
|
||||
$userId = 'john';
|
||||
$id = 3;
|
||||
$rows = array(
|
||||
array('id' => $this->items[0]->getId()),
|
||||
array('id' => $this->items[1]->getId())
|
||||
);
|
||||
$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);
|
||||
|
||||
$this->setExpectedException('\OCA\AppFramework\Db\MultipleObjectsReturnedException');
|
||||
$result = $this->itemMapper->find($id, $userId);
|
||||
}
|
||||
|
||||
public function testFindAllFromFolder() {
|
||||
$userId = 'john';
|
||||
$folderId = 3;
|
||||
$status = 2;
|
||||
$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_feeds`.`user_id` = ? ' .
|
||||
'AND `*dbprefix*news_feeds`.`folder_id` = ? ' .
|
||||
'AND ((`*dbprefix*news_items`.`status` & ?) > 0)';
|
||||
|
||||
$this->setMapperResult($sql, array($userId, $folderId, $status));
|
||||
$result = $this->findAllFromFolder($userId, $folderId, $status);
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
<?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;
|
||||
|
||||
require_once(__DIR__ . "/../classloader.php");
|
||||
|
||||
|
||||
class Test extends \OCA\AppFramework\Utility\MapperTestUtility {
|
||||
|
||||
private $itemMapper;
|
||||
private $items;
|
||||
|
||||
protected function setUp(){
|
||||
$this->beforeEach();
|
||||
|
||||
$this->itemMapper = new ItemMapper($this->api);
|
||||
|
||||
// create mock items
|
||||
$item1 = new Item();
|
||||
$item2 = new Item();
|
||||
|
||||
$this->items = array(
|
||||
$item1,
|
||||
$item2
|
||||
);
|
||||
}
|
||||
}
|
Загрузка…
Ссылка в новой задаче