1
0
mirror of https://github.com/chylex/Nextcloud-News.git synced 2024-12-22 05:42:49 +01:00
Nextcloud-News/lib/Service/ImportService.php
Benjamin Brahmer 835f295ece Release 18.0.1
No major changes since the beta versions.

Signed-off-by: Benjamin Brahmer <info@b-brahmer.de>
2022-04-24 10:29:33 +02:00

127 lines
3.4 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 \OCP\AppFramework\Db\Entity|null
*/
public function importArticles(string $userId, array $json): ?\OCP\AppFramework\Db\Entity
{
// build assoc array for fast access
$feeds = $this->feedService->findAllForUser($userId);
$feedsDict = [];
foreach ($feeds as $feed) {
$feedsDict[$feed->getLink()] = $feed;
}
$createdFeed = false;
$feedLink = "";
// 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
if (array_key_exists($feedLink, $feedsDict)) {
$feed = $feedsDict[$feedLink];
} else {
$this->logger->info("Creating new feed for import of {url}", ['url' => $feedLink]);
$createdFeed = true;
$feed = new Feed();
$feed->setUserId($userId)
->setUrlHash(md5($feedLink))
->setLink($feedLink)
->setUrl($feedLink)
->setTitle('No Title')
->setAdded(time())
->setFolderId(null)
->setPreventUpdate(false);
/** @var Feed $feed */
$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, $feedLink);
}
}