зеркало из https://github.com/nextcloud/news.git
251 строка
7.2 KiB
PHP
251 строка
7.2 KiB
PHP
<?php
|
|
/**
|
|
* ownCloud - News
|
|
*
|
|
* This file is licensed under the Affero General Public License version 3 or
|
|
* later. See the COPYING file.
|
|
*
|
|
* @author Alessandro Cosentino <cosenal@gmail.com>
|
|
* @author Bernhard Posselt <dev@bernhard-posselt.com>
|
|
* @copyright Alessandro Cosentino 2012
|
|
* @copyright Bernhard Posselt 2012, 2014
|
|
*/
|
|
|
|
namespace OCA\News\Db;
|
|
|
|
use \OCP\AppFramework\Db\Entity;
|
|
|
|
|
|
/**
|
|
* @method integer getId()
|
|
* @method void setId(integer $value)
|
|
* @method string getGuid()
|
|
* @method void setGuid(string $value)
|
|
* @method string getGuidHash()
|
|
* @method void setGuidHash(string $value)
|
|
* @method string getGuid()
|
|
* @method string getUrl()
|
|
* @method string getTitle()
|
|
* @method string getAuthor()
|
|
* @method string getRtl()
|
|
* @method string getFingerprint()
|
|
* @method integer getPubDate()
|
|
* @method void setPubDate(integer $value)
|
|
* @method string getBody()
|
|
* @method string getEnclosureMime()
|
|
* @method void setEnclosureMime(string $value)
|
|
* @method string getEnclosureLink()
|
|
* @method void setEnclosureLink(string $value)
|
|
* @method integer getFeedId()
|
|
* @method void setFeedId(integer $value)
|
|
* @method integer getStatus()
|
|
* @method void setStatus(integer $value)
|
|
* @method void setRtl(boolean $value)
|
|
* @method integer getLastModified()
|
|
* @method void setLastModified(integer $value)
|
|
* @method void setFingerprint(string $value)
|
|
* @method void setSearchIndex(string $value)
|
|
*/
|
|
class Item extends Entity implements IAPI, \JsonSerializable {
|
|
|
|
use EntityJSONSerializer;
|
|
|
|
protected $guidHash;
|
|
protected $guid;
|
|
protected $url;
|
|
protected $title;
|
|
protected $author;
|
|
protected $pubDate;
|
|
protected $body;
|
|
protected $enclosureMime;
|
|
protected $enclosureLink;
|
|
protected $feedId;
|
|
protected $status = 0;
|
|
protected $lastModified;
|
|
protected $searchIndex;
|
|
protected $rtl;
|
|
protected $fingerprint;
|
|
|
|
public function __construct(){
|
|
$this->addType('pubDate', 'integer');
|
|
$this->addType('feedId', 'integer');
|
|
$this->addType('status', 'integer');
|
|
$this->addType('lastModified', 'integer');
|
|
$this->addType('rtl', 'boolean');
|
|
}
|
|
|
|
|
|
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();
|
|
}
|
|
|
|
/**
|
|
* Turns entitie attributes into an array
|
|
*/
|
|
public function jsonSerialize() {
|
|
return [
|
|
'id' => $this->getId(),
|
|
'guid' => $this->getGuid(),
|
|
'guidHash' => $this->getGuidHash(),
|
|
'url' => $this->getUrl(),
|
|
'title' => $this->getTitle(),
|
|
'author' => $this->getAuthor(),
|
|
'pubDate' => $this->getPubDate(),
|
|
'body' => $this->getBody(),
|
|
'enclosureMime' => $this->getEnclosureMime(),
|
|
'enclosureLink' => $this->getEnclosureLink(),
|
|
'feedId' => $this->getFeedId(),
|
|
'unread' => $this->isUnread(),
|
|
'starred' => $this->isStarred(),
|
|
'lastModified' => $this->getLastModified(),
|
|
'rtl' => $this->getRtl(),
|
|
'intro' => $this->getIntro()
|
|
];
|
|
}
|
|
|
|
public function toAPI() {
|
|
return [
|
|
'id' => $this->getId(),
|
|
'guid' => $this->getGuid(),
|
|
'guidHash' => $this->getGuidHash(),
|
|
'url' => $this->getUrl(),
|
|
'title' => $this->getTitle(),
|
|
'author' => $this->getAuthor(),
|
|
'pubDate' => $this->getPubDate(),
|
|
'body' => $this->getBody(),
|
|
'enclosureMime' => $this->getEnclosureMime(),
|
|
'enclosureLink' => $this->getEnclosureLink(),
|
|
'feedId' => $this->getFeedId(),
|
|
'unread' => $this->isUnread(),
|
|
'starred' => $this->isStarred(),
|
|
'lastModified' => $this->getLastModified(),
|
|
'rtl' => $this->getRtl()
|
|
];
|
|
}
|
|
|
|
|
|
public function toExport($feeds) {
|
|
return [
|
|
'guid' => $this->getGuid(),
|
|
'url' => $this->getUrl(),
|
|
'title' => $this->getTitle(),
|
|
'author' => $this->getAuthor(),
|
|
'pubDate' => $this->getPubDate(),
|
|
'body' => $this->getBody(),
|
|
'enclosureMime' => $this->getEnclosureMime(),
|
|
'enclosureLink' => $this->getEnclosureLink(),
|
|
'unread' => $this->isUnread(),
|
|
'starred' => $this->isStarred(),
|
|
'feedLink' => $feeds['feed'. $this->getFeedId()]->getLink(),
|
|
'rtl' => $this->getRtl()
|
|
];
|
|
}
|
|
|
|
|
|
public function getIntro() {
|
|
return strip_tags($this->getBody());
|
|
}
|
|
|
|
public static function fromImport($import) {
|
|
$item = new static();
|
|
$item->setGuid($import['guid']);
|
|
$item->setGuidHash($import['guid']);
|
|
$item->setUrl($import['url']);
|
|
$item->setTitle($import['title']);
|
|
$item->setAuthor($import['author']);
|
|
$item->setPubDate($import['pubDate']);
|
|
$item->setBody($import['body']);
|
|
$item->setEnclosureMime($import['enclosureMime']);
|
|
$item->setEnclosureLink($import['enclosureLink']);
|
|
$item->setRtl($import['rtl']);
|
|
if($import['unread']) {
|
|
$item->setUnread();
|
|
} else {
|
|
$item->setRead();
|
|
}
|
|
if($import['starred']) {
|
|
$item->setStarred();
|
|
} else {
|
|
$item->setUnstarred();
|
|
}
|
|
|
|
return $item;
|
|
}
|
|
|
|
|
|
public function setAuthor($name) {
|
|
parent::setAuthor(strip_tags($name));
|
|
}
|
|
|
|
|
|
public function setTitle($title) {
|
|
parent::setTitle(strip_tags($title));
|
|
}
|
|
|
|
public function generateSearchIndex() {
|
|
$this->setSearchIndex(
|
|
strtolower(
|
|
html_entity_decode(strip_tags($this->getBody())) .
|
|
html_entity_decode($this->getAuthor()) .
|
|
html_entity_decode($this->getTitle()) .
|
|
$this->getUrl()
|
|
)
|
|
);
|
|
$this->setFingerprint($this->computeFingerprint());
|
|
}
|
|
|
|
private function computeFingerprint() {
|
|
return md5($this->getTitle() . $this->getUrl() . $this->getBody() .
|
|
$this->getEnclosureLink());
|
|
}
|
|
|
|
public function setUrl($url) {
|
|
$url = trim($url);
|
|
if(strpos($url, 'http') === 0 || strpos($url, 'magnet') === 0) {
|
|
parent::setUrl($url);
|
|
}
|
|
}
|
|
|
|
|
|
public function setBody($body) {
|
|
// FIXME: this should not happen if the target="_blank" is already
|
|
// on the link
|
|
parent::setBody(str_replace(
|
|
'<a', '<a target="_blank" rel="noreferrer"', $body
|
|
));
|
|
}
|
|
|
|
}
|