mirror of
https://github.com/chylex/Nextcloud-News.git
synced 2024-11-24 13:42:47 +01:00
b5186b01f1
This is done to set the id to null BEFORE resetting the updated fields. The purpose of this is to avoid explicitly adding a NULL id into the DB, which provokes an error in some DBMS (like postgres). Fixes #1375 Signed-off-by: Marco Nassabain <marco.nassabain@hotmail.com>
163 lines
4.3 KiB
PHP
163 lines
4.3 KiB
PHP
<?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;
|
|
use OCP\IURLGenerator;
|
|
use OCP\IUserManager;
|
|
use \OCP\IL10N;
|
|
|
|
use OCA\News\Service\Exceptions\ServiceNotFoundException;
|
|
use OCP\AppFramework\Db\DoesNotExistException;
|
|
|
|
/**
|
|
* Class ShareService
|
|
*
|
|
* @package OCA\News\Service
|
|
*/
|
|
class ShareService
|
|
{
|
|
/**
|
|
* Items service.
|
|
*
|
|
* @var ItemServiceV2
|
|
*/
|
|
protected $itemService;
|
|
|
|
/**
|
|
* Feeds service.
|
|
*
|
|
* @var FeedServiceV2
|
|
*/
|
|
protected $feedService;
|
|
|
|
/**
|
|
* @var LoggerInterface
|
|
*/
|
|
protected $logger;
|
|
|
|
/**
|
|
* @var IURLGenerator
|
|
*/
|
|
private $urlGenerator;
|
|
|
|
/**
|
|
* @var IUserManager
|
|
*/
|
|
private $userManager;
|
|
|
|
/**
|
|
* @var IL10N
|
|
*/
|
|
private $l10n;
|
|
|
|
/**
|
|
* ShareService constructor
|
|
*
|
|
* @param FeedServiceV2 $feedService Service for feeds
|
|
* @param ItemServiceV2 $itemService Service to manage items
|
|
* @param IURLGenerator $urlGenerator URL Generator
|
|
* @param IUserManager $userManager User Manager
|
|
* @param IL10N $l10n Localization interface
|
|
* @param LoggerInterface $logger Logger
|
|
*/
|
|
public function __construct(
|
|
FeedServiceV2 $feedService,
|
|
ItemServiceV2 $itemService,
|
|
IURLGenerator $urlGenerator,
|
|
IUserManager $userManager,
|
|
IL10N $l10n,
|
|
LoggerInterface $logger
|
|
) {
|
|
$this->itemService = $itemService;
|
|
$this->feedService = $feedService;
|
|
$this->urlGenerator = $urlGenerator;
|
|
$this->userManager = $userManager;
|
|
$this->l10n = $l10n;
|
|
$this->logger = $logger;
|
|
}
|
|
|
|
/**
|
|
* Share an item with a user
|
|
*
|
|
* @param string $userId ID of user sharing the item
|
|
* @param int $itemId Item ID
|
|
* @param string $shareRecipientId 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 Shared item
|
|
* @throws ServiceNotFoundException|ServiceConflictException
|
|
*/
|
|
public function shareItemWithUser(string $userId, int $itemId, string $shareRecipientId)
|
|
{
|
|
// Find item to share
|
|
$item = $this->itemService->find($userId, $itemId);
|
|
|
|
// Duplicate item & initialize fields
|
|
$sharedItem = clone $item;
|
|
$sharedItem->setUnread(true);
|
|
$sharedItem->setStarred(false);
|
|
$sharedItem->setSharedBy($userId);
|
|
|
|
// Get 'shared with me' dummy feed
|
|
$feedUrl = $this->urlGenerator->getBaseUrl() . '/news/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($this->l10n->t('Shared with me'))
|
|
->setAdded(time())
|
|
->setFolderId(null)
|
|
->setPreventUpdate(true);
|
|
|
|
$feed = $this->feedService->insert($feed);
|
|
}
|
|
|
|
$sharedItem->setFeedId($feed->getId());
|
|
|
|
return $this->itemService->insertOrUpdate($sharedItem);
|
|
}
|
|
|
|
/**
|
|
* Map sharers display names to shared items.
|
|
*
|
|
* Loops through an array of news items. For all shared items, the function
|
|
* fetches the sharers display name and adds it into the item.
|
|
*
|
|
* @param Item[] Array containing items that are shared or not
|
|
* @return Item[]
|
|
*/
|
|
public function mapSharedByDisplayNames(array $items): array
|
|
{
|
|
foreach ($items as $item) {
|
|
$sharedBy = $item->getSharedBy();
|
|
if (!is_null($sharedBy)) {
|
|
$user = $this->userManager->get($sharedBy);
|
|
if (!is_null($user)) {
|
|
$item->setSharedByDisplayName($user->getDisplayName());
|
|
}
|
|
}
|
|
}
|
|
|
|
return $items;
|
|
}
|
|
}
|