mirror of
https://github.com/chylex/Nextcloud-News.git
synced 2025-05-11 13:34:06 +02:00
126 lines
3.3 KiB
PHP
126 lines
3.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 Alessandro Cosentino <cosenal@gmail.com>
|
|
* @author Bernhard Posselt <dev@bernhard-posselt.com>
|
|
* @copyright 2012 Alessandro Cosentino
|
|
* @copyright 2012-2014 Bernhard Posselt
|
|
*/
|
|
|
|
namespace OCA\News\Service;
|
|
|
|
use \OCA\News\Db\Item;
|
|
use \OCA\News\Db\Feed;
|
|
|
|
use \Psr\Log\LoggerInterface;
|
|
use \HTMLPurifier;
|
|
|
|
/**
|
|
* Class ImportService
|
|
*
|
|
* @package OCA\News\Service
|
|
*/
|
|
class ImportService
|
|
{
|
|
/**
|
|
* Items service.
|
|
*
|
|
* @var ItemServiceV2
|
|
*/
|
|
protected $itemService;
|
|
/**
|
|
* Feeds service.
|
|
*
|
|
* @var FeedServiceV2
|
|
*/
|
|
protected $feedService;
|
|
/**
|
|
* @var LoggerInterface
|
|
*/
|
|
protected $logger;
|
|
/**
|
|
* @var HTMLPurifier
|
|
*/
|
|
protected $purifier;
|
|
|
|
/**
|
|
* FeedService constructor.
|
|
*
|
|
* @param FeedServiceV2 $feedService Service for feeds
|
|
* @param ItemServiceV2 $itemService Service to manage items
|
|
* @param HTMLPurifier $purifier HTML Purifier
|
|
* @param LoggerInterface $logger Logger
|
|
*/
|
|
public function __construct(
|
|
FeedServiceV2 $feedService,
|
|
ItemServiceV2 $itemService,
|
|
HTMLPurifier $purifier,
|
|
LoggerInterface $logger
|
|
) {
|
|
$this->itemService = $itemService;
|
|
$this->feedService = $feedService;
|
|
$this->purifier = $purifier;
|
|
$this->logger = $logger;
|
|
}
|
|
|
|
/**
|
|
* @param string $userId
|
|
* @param array $json
|
|
*
|
|
* @return array|null
|
|
*/
|
|
public function importArticles(string $userId, array $json)
|
|
{
|
|
$url = 'http://nextcloud/nofeed';
|
|
|
|
// build assoc array for fast access
|
|
$feeds = $this->feedService->findAllForUser($userId);
|
|
$feedsDict = [];
|
|
foreach ($feeds as $feed) {
|
|
$feedsDict[$feed->getLink()] = $feed;
|
|
}
|
|
|
|
$createdFeed = false;
|
|
|
|
// loop over all items and get the corresponding feed
|
|
// if the feed does not exist, create a separate feed for them
|
|
foreach ($json as $entry) {
|
|
$item = Item::fromImport($entry);
|
|
$feedLink = $entry['feedLink']; // this is not set on the item yet
|
|
|
|
if (array_key_exists($feedLink, $feedsDict)) {
|
|
$feed = $feedsDict[$feedLink];
|
|
} else {
|
|
$createdFeed = true;
|
|
$feed = new Feed();
|
|
$feed->setUserId($userId)
|
|
->setUrlHash(md5($url))
|
|
->setLink($url)
|
|
->setUrl($url)
|
|
->setTitle('Articles without feed')
|
|
->setAdded(time())
|
|
->setFolderId(null)
|
|
->setPreventUpdate(true);
|
|
|
|
$feed = $this->feedService->insert($feed);
|
|
$feedsDict[$feed->getLink()] = $feed;
|
|
}
|
|
|
|
$item->setFeedId($feed->getId())
|
|
->setBody($this->purifier->purify($item->getBody()))
|
|
->generateSearchIndex();
|
|
$this->itemService->insertOrUpdate($item);
|
|
}
|
|
|
|
if (!$createdFeed) {
|
|
return null;
|
|
}
|
|
|
|
return $this->feedService->findByURL($userId, $url);
|
|
}
|
|
}
|