From dd818c6203961a82aeef58bcf526aced7b361f04 Mon Sep 17 00:00:00 2001 From: Marco Nassabain Date: Thu, 4 Mar 2021 00:02:21 +0100 Subject: =?UTF-8?q?=F0=9F=9A=91=20Fix=20circular=20inclusion:=20create=20S?= =?UTF-8?q?hareService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marco Nassabain --- lib/Service/ItemServiceV2.php | 67 ------------------------ lib/Service/ShareService.php | 115 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 67 deletions(-) create mode 100644 lib/Service/ShareService.php (limited to 'lib/Service') diff --git a/lib/Service/ItemServiceV2.php b/lib/Service/ItemServiceV2.php index a57f67338..3b1a81400 100644 --- a/lib/Service/ItemServiceV2.php +++ b/lib/Service/ItemServiceV2.php @@ -17,7 +17,6 @@ use OCA\News\Db\Feed; use OCA\News\Db\ListType; use OCA\News\Db\Item; use OCA\News\Db\ItemMapperV2; -use OCA\News\Service\FeedServiceV2; use OCA\News\Service\Exceptions\ServiceConflictException; use OCA\News\Service\Exceptions\ServiceNotFoundException; use OCA\News\Service\Exceptions\ServiceValidationException; @@ -40,30 +39,20 @@ class ItemServiceV2 extends Service */ protected $config; - /** - * Feeds service. - * - * @var FeedServiceV2 - */ - protected $feedService; - /** * ItemService constructor. * * @param ItemMapperV2 $mapper - * @param FeedServiceV2 $feedService * @param IConfig $config * @param LoggerInterface $logger */ public function __construct( ItemMapperV2 $mapper, - FeedServiceV2 $feedService, IConfig $config, LoggerInterface $logger ) { parent::__construct($mapper, $logger); $this->config = $config; - $this->feedService = $feedService; } /** @@ -404,60 +393,4 @@ class ItemServiceV2 extends Service ): array { return $this->mapper->findAllItems($userId, $type, $limit, $offset, $oldestFirst, $search); } - - - /** - * Share an item with a user - * - * @param string $userId Item owner - * @param int $id Item ID - * @param bool $shareWithId User to share with - * - * Sharing by copying - the item is duplicated, and the 'sharedBy' - * field is filled accordingly. - * The item is then placed in a dummy feed reserved for items - * shared with the user - * - * @return Item - * @throws ServiceNotFoundException|ServiceConflictException - */ - public function share(string $userId, int $id, string $shareWithId): Entity - { - // find item to share - try { - $item = $this->find($userId, $id); - } catch (DoesNotExistException $ex) { - throw ServiceNotFoundException::from($ex); - } - - // duplicate the item - $sharedItem = clone $item; - - // initialize fields - $sharedItem->setUnread(true); - $sharedItem->setStarred(false); - $sharedItem->setSharedBy($userId); - - // get 'shared with me' dummy feed - // TODO: move to feedService->createSharedWithMeFeed() ? - $feedUrl = 'http://nextcloud/sharedwithme'; - $feed = $this->feedService->findByUrl($shareWithId, $feedUrl); - if (is_null($feed)) { - $feed = new Feed(); - $feed->setUserId($shareWithId) - ->setUrlHash(md5($feedUrl)) - ->setLink($feedUrl) - ->setUrl($feedUrl) - ->setTitle('Shared with me') - ->setAdded(time()) - ->setFolderId(null) - ->setPreventUpdate(true); - - $feed = $this->feedService->insert($feed); - } - - $sharedItem->setFeedId($feed->getId()); - - return $this->mapper->insert($sharedItem); - } } diff --git a/lib/Service/ShareService.php b/lib/Service/ShareService.php new file mode 100644 index 000000000..bb9bee241 --- /dev/null +++ b/lib/Service/ShareService.php @@ -0,0 +1,115 @@ + + */ + +namespace OCA\News\Service; + +use \OCA\News\Db\Item; +use \OCA\News\Db\Feed; + +use \Psr\Log\LoggerInterface; + +/** + * Class ImportService + * + * @package OCA\News\Service + */ +class ShareService +{ + /** + * Items service. + * + * @var ItemServiceV2 + */ + protected $itemService; + + /** + * Feeds service. + * + * @var FeedServiceV2 + */ + protected $feedService; + + /** + * @var LoggerInterface + */ + protected $logger; + + /** + * ShareService constructor + * + * @param FeedServiceV2 $feedService Service for feeds + * @param ItemServiceV2 $itemService Service to manage items + * @param LoggerInterface $logger Logger + */ + public function __construct( + FeedServiceV2 $feedService, + ItemServiceV2 $itemService, + LoggerInterface $logger + ) { + $this->itemService = $itemService; + $this->feedService = $feedService; + $this->logger = $logger; + } + + /** + * Share an item with a user + * + * @param string $userId ID of user sharing the item + * @param int $id Item ID + * @param string $shareWithId ID of user to share with + * + * Sharing by copying - the item is duplicated, and the 'sharedBy' + * field is filled accordingly. + * The item is then placed in a dummy feed reserved for items + * shared with the user + * + * @return Item + * @throws ServiceNotFoundException|ServiceConflictException + */ + public function shareItemWithUser(string $userId, int $id, string $shareRecipientId) + { + // find item to share + try { + $item = $this->itemService->find($userId, $itemId); + } catch (DoesNotExistException $ex) { + throw ServiceNotFoundException::from($ex); + } + + // duplicate the item + $sharedItem = clone $item; + + // initialize fields + $sharedItem->setUnread(true); + $sharedItem->setStarred(false); + $sharedItem->setSharedBy($userId); + + // get 'shared with me' dummy feed + // TODO: move to feedService->createSharedWithMeFeed() ? + $feedUrl = 'http://nextcloud/sharedwithme'; + $feed = $this->feedService->findByUrl($shareRecipientId, $feedUrl); + if (is_null($feed)) { + $feed = new Feed(); + $feed->setUserId($shareRecipientId) + ->setUrlHash(md5($feedUrl)) + ->setLink($feedUrl) + ->setUrl($feedUrl) + ->setTitle('Shared with me') + ->setAdded(time()) + ->setFolderId(null) + ->setPreventUpdate(true); + + $feed = $this->feedService->insert($feed); + } + + $sharedItem->setFeedId($feed->getId()); + + return $this->itemService->insertOrUpdate($sharedItem); + } +} -- cgit v1.2.3