diff options
-rw-r--r-- | lib/Service/ItemServiceV2.php | 67 | ||||
-rw-r--r-- | lib/Service/ShareService.php | 115 | ||||
-rw-r--r-- | tests/Unit/Service/ItemServiceTest.php | 11 |
3 files changed, 115 insertions, 78 deletions
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; @@ -41,29 +40,19 @@ 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 @@ +<?php +/** + * Nextcloud - News + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Marco Nassabain <marco.nassabain@hotmail.com> + */ + +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); + } +} diff --git a/tests/Unit/Service/ItemServiceTest.php b/tests/Unit/Service/ItemServiceTest.php index 1f77a92e2..e67756468 100644 --- a/tests/Unit/Service/ItemServiceTest.php +++ b/tests/Unit/Service/ItemServiceTest.php @@ -18,7 +18,6 @@ use OCA\News\Service\Exceptions\ServiceConflictException; use OCA\News\Service\Exceptions\ServiceValidationException; use OCA\News\Service\Exceptions\ServiceNotFoundException; use OCA\News\Service\ItemServiceV2; -use OCA\News\Service\FeedServiceV2; use \OCP\AppFramework\Db\DoesNotExistException; use \OCA\News\Db\Item; @@ -44,11 +43,6 @@ class ItemServiceTest extends TestCase private $mapper; /** - * @var MockObject|FeedServiceV2 - */ - private $feedService; - - /** * @var ItemServiceV2 */ private $class; @@ -78,10 +72,6 @@ class ItemServiceTest extends TestCase ->disableOriginalConstructor() ->getMock(); - $this->feedService = $this->getMockBuilder(FeedServiceV2::class) - ->disableOriginalConstructor() - ->getMock(); - $this->config = $this->getMockBuilder(IConfig::class) ->disableOriginalConstructor() ->getMock(); @@ -92,7 +82,6 @@ class ItemServiceTest extends TestCase $this->class = new ItemServiceV2( $this->mapper, - $this->feedService, $this->config, $this->logger ); |