summaryrefslogtreecommitdiffstats
path: root/lib/Service/ItemServiceV2.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Service/ItemServiceV2.php')
-rw-r--r--lib/Service/ItemServiceV2.php267
1 files changed, 258 insertions, 9 deletions
diff --git a/lib/Service/ItemServiceV2.php b/lib/Service/ItemServiceV2.php
index f13b249b8..8a518b5bd 100644
--- a/lib/Service/ItemServiceV2.php
+++ b/lib/Service/ItemServiceV2.php
@@ -13,10 +13,16 @@
namespace OCA\News\Service;
use OCA\News\AppInfo\Application;
+use OCA\News\Db\Feed;
+use OCA\News\Db\FeedType;
use OCA\News\Db\Item;
use OCA\News\Db\ItemMapperV2;
+use OCA\News\Service\Exceptions\ServiceConflictException;
+use OCA\News\Service\Exceptions\ServiceNotFoundException;
+use OCA\News\Service\Exceptions\ServiceValidationException;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Entity;
+use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\IConfig;
use Psr\Log\LoggerInterface;
@@ -37,7 +43,7 @@ class ItemServiceV2 extends Service
* ItemService constructor.
*
* @param ItemMapperV2 $mapper
- * @param IConfig $config
+ * @param IConfig $config
* @param LoggerInterface $logger
*/
public function __construct(
@@ -53,7 +59,7 @@ class ItemServiceV2 extends Service
* Finds all items of a user
*
* @param string $userId The ID/name of the user
- * @param array $params Filter parameters
+ * @param array $params Filter parameters
*
*
* @return Item[]
@@ -83,14 +89,15 @@ class ItemServiceV2 extends Service
public function insertOrUpdate(Item $item): Entity
{
try {
- $db_item = $this->mapper->findByGuidHash($item->getFeedId(), $item->getGuidHash());
+ $db_item = $this->findByGuidHash($item->getFeedId(), $item->getGuidHash());
// Transfer user modifications
$item->setUnread($db_item->isUnread())
->setStarred($db_item->isStarred())
->setId($db_item->getId());
- $item->generateSearchIndex();
+ $item->generateSearchIndex();//generates fingerprint
+
// We don't want to update the database record if there is no
// change in the fetched item
if ($db_item->getFingerprint() === $item->getFingerprint()) {
@@ -104,13 +111,36 @@ class ItemServiceV2 extends Service
}
/**
- * @param int $feedId
+ * Return all starred items
*
- * @return array
+ * @param string $userId
+ *
+ * @return Item[]
*/
- public function findAllForFeed(int $feedId): array
+ public function starred(string $userId): array
{
- return $this->mapper->findAllForFeed($feedId);
+ return $this->findAllForUser($userId, ['starred' => 1]);
+ }
+
+ /**
+ * Mark an item as read
+ *
+ * @param string $userId Item owner
+ * @param int $id Item ID
+ * @param bool $read
+ *
+ * @return Item
+ * @throws ServiceNotFoundException
+ * @throws ServiceConflictException
+ */
+ public function read(string $userId, int $id, bool $read): Entity
+ {
+ /** @var Item $item */
+ $item = $this->find($userId, $id);
+
+ $item->setUnread(!$read);
+
+ return $this->mapper->update($item);
}
/**
@@ -133,13 +163,232 @@ class ItemServiceV2 extends Service
return $this->mapper->deleteOverThreshold($threshold, $removeUnread);
}
+ /**
+ * Mark an item as starred
+ *
+ * @param string $userId Item owner
+ * @param int $id Item ID
+ * @param bool $starred
+ *
+ * @return Item
+ * @throws ServiceNotFoundException|ServiceConflictException
+ */
+ public function star(string $userId, int $id, bool $starred): Entity
+ {
+ /** @var Item $item */
+ $item = $this->find($userId, $id);
+
+ $item->setStarred($starred);
+
+ return $this->mapper->update($item);
+ }
+
+ /**
+ * Mark an item as starred by GUID hash
+ *
+ * @param string $userId Item owner
+ * @param int $feedId Item ID
+ * @param string $guidHash
+ * @param bool $starred
+ *
+ * @return Item
+ * @throws ServiceConflictException
+ * @throws ServiceNotFoundException
+ */
+ public function starByGuid(string $userId, int $feedId, string $guidHash, bool $starred): Entity
+ {
+ try {
+ $item = $this->mapper->findForUserByGuidHash($userId, $feedId, $guidHash);
+ } catch (DoesNotExistException $ex) {
+ throw ServiceNotFoundException::from($ex);
+ } catch (MultipleObjectsReturnedException $ex) {
+ throw ServiceConflictException::from($ex);
+ }
+
+ $item->setStarred($starred);
+
+ return $this->mapper->update($item);
+ }
+
+ /**
+ * Mark all items as read
+ *
+ * @param string $userId Item owner
+ * @param int $maxItemId
+ *
+ * @return void
+ */
+ public function readAll(string $userId, int $maxItemId): void
+ {
+ $this->mapper->readAll($userId, $maxItemId);
+ }
+
+ /**
+ * @param string $userId
+ *
+ * @return Item
+ */
+ public function newest(string $userId): Entity
+ {
+ try {
+ return $this->mapper->newest($userId);
+ } catch (DoesNotExistException $e) {
+ throw ServiceNotFoundException::from($e);
+ } catch (MultipleObjectsReturnedException $e) {
+ throw ServiceConflictException::from($e);
+ }
+ }
/**
* @param int $feedId
* @param string $guidHash
+ *
+ * @return Item|Entity
+ *
+ * @throws DoesNotExistException
+ * @throws MultipleObjectsReturnedException
*/
- public function findForGuidHash(int $feedId, string $guidHash)
+ public function findByGuidHash(int $feedId, string $guidHash): Entity
{
return $this->mapper->findByGuidHash($feedId, $guidHash);
}
+
+ /**
+ * Convenience method to find all items in a feed.
+ *
+ * @param string $userId
+ * @param int $feedId
+ *
+ * @return array
+ */
+ public function findAllInFeed(string $userId, int $feedId): array
+ {
+ return $this->findAllInFeedAfter($userId, $feedId, PHP_INT_MIN, false);
+ }
+
+ /**
+ * Returns all new items in a feed
+ * @param string $userId the name of the user
+ * @param int $feedId the id of the feed
+ * @param int $updatedSince a timestamp with the minimal modification date
+ * @param boolean $hideRead if unread items should also be returned
+ *
+ * @return array of items
+ */
+ public function findAllInFeedAfter(string $userId, int $feedId, int $updatedSince, bool $hideRead): array
+ {
+ return $this->mapper->findAllInFeedAfter($userId, $feedId, $updatedSince, $hideRead);
+ }
+
+ /**
+ * Returns all new items in a folder
+ * @param string $userId the name of the user
+ * @param int|null $folderId the id of the folder
+ * @param int $updatedSince a timestamp with the minimal modification date
+ * @param boolean $hideRead if unread items should also be returned
+ *
+ * @return array of items
+ */
+ public function findAllInFolderAfter(string $userId, ?int $folderId, int $updatedSince, bool $hideRead): array
+ {
+ return $this->mapper->findAllInFolderAfter($userId, $folderId, $updatedSince, $hideRead);
+ }
+
+ /**
+ * Returns all new items of a type
+ *
+ * @param string $userId the name of the user
+ * @param int $feedType the type of feed items to fetch. (starred || unread)
+ * @param int $updatedSince a timestamp with the minimal modification date
+ *
+ * @return array of items
+ *
+ * @throws ServiceValidationException
+ */
+ public function findAllAfter(string $userId, int $feedType, int $updatedSince): array
+ {
+ if (!in_array($feedType, [FeedType::STARRED, FeedType::UNREAD])) {
+ throw new ServiceValidationException('Trying to find in unknown type');
+ }
+
+ return $this->mapper->findAllAfter($userId, $feedType, $updatedSince);
+ }
+
+
+ /**
+ * Returns all items
+ *
+ * @param int $feedId the id of the feed
+ * @param int $limit how many items should be returned
+ * @param int $offset the offset
+ * @param boolean $hideRead if unread items should also be returned
+ * @param boolean $oldestFirst if it should be ordered by oldest first
+ * @param string $userId the name of the user
+ * @param string[] $search an array of keywords that the result should
+ * contain in either the author, title, link
+ * or body
+ *
+ * @return array of items
+ */
+ public function findAllInFeedWithFilters(
+ string $userId,
+ int $feedId,
+ int $limit,
+ int $offset,
+ bool $hideRead,
+ bool $oldestFirst,
+ array $search = []
+ ): array {
+ return $this->mapper->findAllFeed($userId, $feedId, $limit, $offset, $hideRead, $oldestFirst, $search);
+ }
+ /**
+ * Returns all items
+ *
+ * @param int|null $folderId the id of the folder
+ * @param int $limit how many items should be returned
+ * @param int $offset the offset
+ * @param boolean $hideRead if unread items should also be returned
+ * @param boolean $oldestFirst if it should be ordered by oldest first
+ * @param string $userId the name of the user
+ * @param string[] $search an array of keywords that the result should
+ * contain in either the author, title, link
+ * or body
+ *
+ * @return array of items
+ */
+ public function findAllInFolderWithFilters(
+ string $userId,
+ ?int $folderId,
+ int $limit,
+ int $offset,
+ bool $hideRead,
+ bool $oldestFirst,
+ array $search = []
+ ): array {
+ return $this->mapper->findAllFolder($userId, $folderId, $limit, $offset, $hideRead, $oldestFirst, $search);
+ }
+ /**
+ * Returns all items
+ *
+ * @param int $type the type of the feed
+ * @param int $limit how many items should be returned
+ * @param int $offset the offset
+ * @param boolean $oldestFirst if it should be ordered by oldest first
+ * @param string $userId the name of the user
+ * @param string[] $search an array of keywords that the result should
+ * contain in either the author, title, link
+ * or body
+ *
+ * @return array of items
+ */
+ public function findAllWithFilters(
+ string $userId,
+ int $type,
+ int $limit,
+ int $offset,
+ bool $oldestFirst,
+ array $search = []
+ ): array {
+ return $this->mapper->findAllItems($userId, $type, $limit, $offset, $oldestFirst, $search);
+ }
}