summaryrefslogtreecommitdiffstats
path: root/lib/Db/Item.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Db/Item.php')
-rw-r--r--lib/Db/Item.php256
1 files changed, 256 insertions, 0 deletions
diff --git a/lib/Db/Item.php b/lib/Db/Item.php
new file mode 100644
index 000000000..e0d8b069b
--- /dev/null
+++ b/lib/Db/Item.php
@@ -0,0 +1,256 @@
+<?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 getUrl()
+ * @method string getTitle()
+ * @method string getAuthor()
+ * @method string getRtl()
+ * @method string getFingerprint()
+ * @method string getContentHash()
+ * @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 setContentHash(string $value)
+ * @method void setSearchIndex(string $value)
+ */
+class Item extends Entity implements IAPI, \JsonSerializable {
+
+ use EntityJSONSerializer;
+
+ protected $contentHash;
+ 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(),
+ 'fingerprint' => $this->getFingerprint(),
+ ];
+ }
+
+ 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(),
+ 'fingerprint' => $this->getFingerprint(),
+ 'contentHash' => $this->getContentHash()
+ ];
+ }
+
+ 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(
+ mb_strtolower(
+ html_entity_decode(strip_tags($this->getBody())) .
+ html_entity_decode($this->getAuthor()) .
+ html_entity_decode($this->getTitle()) .
+ $this->getUrl(),
+ 'UTF-8'
+ )
+ );
+ $this->setFingerprint($this->computeFingerprint());
+ $this->setContentHash($this->computeContentHash());
+ }
+
+ private function computeContentHash() {
+ return md5($this->getTitle() . $this->getUrl() . $this->getBody() .
+ $this->getEnclosureLink() . $this->getEnclosureMime() .
+ $this->getAuthor());
+ }
+
+ 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
+ ));
+ }
+
+}