summaryrefslogtreecommitdiffstats
path: root/lib/Controller/FeedController.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Controller/FeedController.php')
-rw-r--r--lib/Controller/FeedController.php301
1 files changed, 301 insertions, 0 deletions
diff --git a/lib/Controller/FeedController.php b/lib/Controller/FeedController.php
new file mode 100644
index 000000000..2b95794a3
--- /dev/null
+++ b/lib/Controller/FeedController.php
@@ -0,0 +1,301 @@
+<?php
+/**
+ * ownCloud - 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 Alessandro Cosentino 2012
+ * @copyright Bernhard Posselt 2012, 2014
+ */
+
+namespace OCA\News\Controller;
+
+use OCP\IRequest;
+use OCP\IConfig;
+use OCP\AppFramework\Controller;
+use OCP\AppFramework\Http;
+
+use OCA\News\Service\ItemService;
+use OCA\News\Service\FeedService;
+use OCA\News\Service\FolderService;
+use OCA\News\Service\ServiceNotFoundException;
+use OCA\News\Service\ServiceConflictException;
+use OCA\News\Db\FeedType;
+
+
+class FeedController extends Controller {
+
+ use JSONHttpError;
+
+ private $feedService;
+ private $folderService;
+ private $itemService;
+ private $userId;
+ private $settings;
+
+ public function __construct($AppName,
+ IRequest $request,
+ FolderService $folderService,
+ FeedService $feedService,
+ ItemService $itemService,
+ IConfig $settings,
+ $UserId){
+ parent::__construct($AppName, $request);
+ $this->feedService = $feedService;
+ $this->folderService = $folderService;
+ $this->itemService = $itemService;
+ $this->userId = $UserId;
+ $this->settings = $settings;
+ }
+
+
+ /**
+ * @NoAdminRequired
+ */
+ public function index(){
+
+ // this method is also used to update the interface
+ // because of this we also pass the starred count and the newest
+ // item id which will be used for marking feeds read
+ $params = [
+ 'feeds' => $this->feedService->findAll($this->userId),
+ 'starred' => $this->itemService->starredCount($this->userId)
+ ];
+
+ try {
+ $params['newestItemId'] =
+ $this->itemService->getNewestItemId($this->userId);
+
+ // An exception occurs if there is a newest item. If there is none,
+ // simply ignore it and do not add the newestItemId
+ } catch (ServiceNotFoundException $ex) {}
+
+ return $params;
+ }
+
+
+ /**
+ * @NoAdminRequired
+ */
+ public function active(){
+ $feedId = (int) $this->settings->getUserValue($this->userId,
+ $this->appName,'lastViewedFeedId');
+ $feedType = $this->settings->getUserValue($this->userId, $this->appName,
+ 'lastViewedFeedType');
+
+ // cast from null to int is 0
+ if($feedType !== null){
+ $feedType = (int) $feedType;
+ }
+
+ // check if feed or folder exists
+ try {
+ if($feedType === FeedType::FOLDER){
+ $this->folderService->find($feedId, $this->userId);
+
+ } elseif ($feedType === FeedType::FEED){
+ $this->feedService->find($feedId, $this->userId);
+
+ // if its the first launch, those values will be null
+ } elseif($feedType === null){
+ throw new ServiceNotFoundException('');
+ }
+
+ } catch (ServiceNotFoundException $ex){
+ $feedId = 0;
+ $feedType = FeedType::SUBSCRIPTIONS;
+ }
+
+ return [
+ 'activeFeed' => [
+ 'id' => $feedId,
+ 'type' => $feedType
+ ]
+ ];
+ }
+
+
+ /**
+ * @NoAdminRequired
+ *
+ * @param string $url
+ * @param int $parentFolderId
+ * @param string $title
+ * @param string $user
+ * @param string $password
+ * @return array|\OCP\AppFramework\Http\JSONResponse
+ */
+ public function create($url, $parentFolderId, $title=null,
+ $user=null, $password=null){
+ try {
+ // we need to purge deleted feeds if a feed is created to
+ // prevent already exists exceptions
+ $this->feedService->purgeDeleted($this->userId, false);
+
+ $feed = $this->feedService->create($url, $parentFolderId,
+ $this->userId, $title,
+ $user, $password);
+ $params = ['feeds' => [$feed]];
+
+ try {
+ $params['newestItemId'] =
+ $this->itemService->getNewestItemId($this->userId);
+
+ // An exception occurs if there is a newest item. If there is none,
+ // simply ignore it and do not add the newestItemId
+ } catch (ServiceNotFoundException $ex) {}
+
+ return $params;
+
+ } catch(ServiceConflictException $ex) {
+ return $this->error($ex, Http::STATUS_CONFLICT);
+ } catch(ServiceNotFoundException $ex) {
+ return $this->error($ex, Http::STATUS_UNPROCESSABLE_ENTITY);
+ }
+
+ }
+
+
+ /**
+ * @NoAdminRequired
+ *
+ * @param int $feedId
+ * @return array|\OCP\AppFramework\Http\JSONResponse
+ */
+ public function delete($feedId){
+ try {
+ $this->feedService->markDeleted($feedId, $this->userId);
+ } catch(ServiceNotFoundException $ex) {
+ return $this->error($ex, Http::STATUS_NOT_FOUND);
+ }
+
+ return [];
+ }
+
+
+ /**
+ * @NoAdminRequired
+ *
+ * @param int $feedId
+ * @return array|\OCP\AppFramework\Http\JSONResponse
+ */
+ public function update($feedId){
+ try {
+ $feed = $this->feedService->update($feedId, $this->userId);
+
+ return [
+ 'feeds' => [
+ // only pass unread count to not accidentally readd
+ // the feed again
+ [
+ 'id' => $feed->getId(),
+ 'unreadCount' => $feed->getUnreadCount()
+ ]
+ ]
+ ];
+
+ } catch(ServiceNotFoundException $ex) {
+ return $this->error($ex, Http::STATUS_NOT_FOUND);
+ }
+
+ }
+
+
+ /**
+ * @NoAdminRequired
+ *
+ * @param array $json
+ * @return array
+ */
+ public function import($json) {
+ $feed = $this->feedService->importArticles($json, $this->userId);
+
+ $params = [
+ 'starred' => $this->itemService->starredCount($this->userId)
+ ];
+
+ if($feed) {
+ $params['feeds'] = [$feed];
+ }
+
+ return $params;
+ }
+
+
+ /**
+ * @NoAdminRequired
+ *
+ * @param int $feedId
+ * @param int $highestItemId
+ * @return array
+ */
+ public function read($feedId, $highestItemId){
+ $this->itemService->readFeed($feedId, $highestItemId, $this->userId);
+
+ return [
+ 'feeds' => [
+ [
+ 'id' => $feedId,
+ 'unreadCount' => 0
+ ]
+ ]
+ ];
+ }
+
+
+ /**
+ * @NoAdminRequired
+ *
+ * @param int $feedId
+ * @return array|\OCP\AppFramework\Http\JSONResponse
+ */
+ public function restore($feedId){
+ try {
+ $this->feedService->unmarkDeleted($feedId, $this->userId);
+ } catch(ServiceNotFoundException $ex) {
+ return $this->error($ex, Http::STATUS_NOT_FOUND);
+ }
+
+ return [];
+ }
+
+ /**
+ * @NoAdminRequired
+ *
+ * @param int $feedId
+ * @param bool $pinned
+ * @param bool $fullTextEnabled
+ * @param int $updateMode
+ * @param int $ordering
+ * @param int $folderId
+ * @param string $title
+ */
+ public function patch($feedId, $pinned=null, $fullTextEnabled=null,
+ $updateMode=null, $ordering=null, $title=null,
+ $folderId=null) {
+ $attributes = [
+ 'pinned' => $pinned,
+ 'fullTextEnabled' => $fullTextEnabled,
+ 'updateMode' => $updateMode,
+ 'ordering' => $ordering,
+ 'title' => $title,
+ 'folderId' => $folderId
+ ];
+
+ $diff = array_filter($attributes, function ($value) {
+ return $value !== null;
+ });
+
+ try {
+ $this->feedService->patch($feedId, $this->userId, $diff);
+ } catch(ServiceNotFoundException $ex) {
+ return $this->error($ex, Http::STATUS_NOT_FOUND);
+ }
+
+ return [];
+ }
+
+}