diff options
author | Bernhard Posselt <nukeawhale@gmail.com> | 2013-01-27 04:15:53 +0100 |
---|---|---|
committer | Bernhard Posselt <nukeawhale@gmail.com> | 2013-01-27 04:15:53 +0100 |
commit | ae7393db3d99a7ac223ae917129cccd9f49888e3 (patch) | |
tree | 7f54b72b0d01c38afd1378365a67e4f192922423 /controllers | |
parent | 483784caa38bd6131405ac474347a215584e30a5 (diff) |
merged the angularjs branch
Diffstat (limited to 'controllers')
-rw-r--r-- | controllers/controller.php | 100 | ||||
-rw-r--r-- | controllers/news.ajax.controller.php | 428 | ||||
-rw-r--r-- | controllers/news.controller.php | 231 |
3 files changed, 498 insertions, 261 deletions
diff --git a/controllers/controller.php b/controllers/controller.php deleted file mode 100644 index 032cb45ee..000000000 --- a/controllers/controller.php +++ /dev/null @@ -1,100 +0,0 @@ -<?php -/** -* ownCloud - News app -* -* @author Bernhard Posselt -* Copyright (c) 2012 - Bernhard Posselt <nukeawhale@gmail.com> -* -* This file is licensed under the Affero General Public License version 3 or later. -* See the COPYING-README file -* -*/ - -namespace OCA\News; - -class Controller { - - protected $userId; - protected $trans; - - - public function __construct(){ - $this->userId = \OCP\USER::getUser(); - $this->trans = \OC_L10N::get('news'); - $this->safeParams = array(); - } - - - protected function addScript($name){ - \OCP\Util::addScript('news', $name); - } - - - protected function addStyle($name){ - \OCP\Util::addStyle('news', $name); - } - - - protected function add3rdPartyScript($name){ - \OCP\Util::addScript('news/3rdparty', $name); - } - - - protected function add3rdPartyStyle($name){ - \OCP\Util::addStyle('news/3rdparty', $name); - } - - - /** - * Shortcut for setting a user defined value - * @param $key the key under which the value is being stored - * @param $value the value that you want to store - */ - protected function setUserValue($key, $value){ - \OCP\Config::setUserValue($this->userId, 'news', $key, $value); - } - - - /** - * Shortcut for getting a user defined value - * @param $key the key under which the value is being stored - */ - protected function getUserValue($key){ - return \OCP\Config::getUserValue($this->userId, 'news', $key); - } - - - /** - * Binds variables to the template and prints it - * The following values are always assigned: userId, trans - * @param $arguments an array with arguments in $templateVar => $content - * @param $template the name of the template - * @param $safeParams template parameters which should not be escaped - * @param $fullPage if true, it will render a full page, otherwise only a part - * defaults to true - */ - protected function render($template, $arguments=array(), $safeParams=array(), - $fullPage=true){ - - if($fullPage){ - $template = new \OCP\Template('news', $template, 'user'); - } else { - $template = new \OCP\Template('news', $template); - } - - foreach($arguments as $key => $value){ - if(array_key_exists($key, $safeParams)) { - $template->assign($key, $value, false); - } else { - $template->assign($key, $value); - } - - } - - $template->assign('userId', $this->userId); - $template->assign('trans', $this->trans); - $template->printPage(); - } - - -} diff --git a/controllers/news.ajax.controller.php b/controllers/news.ajax.controller.php new file mode 100644 index 000000000..4defd8f9c --- /dev/null +++ b/controllers/news.ajax.controller.php @@ -0,0 +1,428 @@ +<?php +/** +* ownCloud - News app +* +* @author Bernhard Posselt +* Copyright (c) 2012 - Bernhard Posselt <nukeawhale@gmail.com> +* +* This file is licensed under the Affero General Public License version 3 or later. +* See the COPYING-README file +* +*/ + +namespace OCA\News; + +/** + * Class which handles all ajax calls + */ +class NewsAjaxController extends Controller { + + private $feedMapper; + private $folderMapper; + private $itemMapper; + + /** + * @param Request $request: the object with the request instance + * @param string $api: an instance of the api wrapper + * @param FeedMapper $feedMapepr an instance of the feed mapper + * @param FolderMapper $folderMapper an instance of the folder mapper + * @param ItemMapper $itemMapper an instance of the item mapper + */ + public function __construct($request, $api, $feedMapper, $folderMapper, + $itemMapper){ + parent::__construct($request, $api); + $this->feedMapper = $feedMapper; + $this->folderMapper = $folderMapper; + $this->itemMapper = $itemMapper; + } + + + /** + * @brief turns a post parameter which got a boolean from javascript to + * a boolean in PHP + * @param string $param the post parameter that should be turned into a bool + * @return a PHP boolean + */ + public function postParamToBool($param){ + if($param === 'false') { + return false; + } else { + return true; + } + } + + + /** + * This turns a folder result into an array which can be sent to the client + * as JSON + * @param array $folders the database query result for folders + * @return an array ready for sending as JSON + */ + private function foldersToArray($folders){ + $foldersArray = array(); + foreach($folders as $folder){ + if($folder instanceof \OCA\News\Folder){ + array_push($foldersArray, array( + 'id' => (int)$folder->getId(), + 'name' => $folder->getName(), + 'open' => $folder->getOpened()==="1", + 'hasChildren' => count($folder->getChildren()) > 0, + 'show' => true + ) + ); + } + } + return $foldersArray; + } + + + /** + * This turns a feed result into an array which can be sent to the client + * as JSON + * @param array $feeds the database query result for feeds + * @return an array ready for sending as JSON + */ + private function feedsToArray($feeds){ + $feedsArray = array(); + foreach($feeds as $feed){ + array_push($feedsArray, array( + 'id' => (int)$feed->getId(), + 'name' => $feed->getTitle(), + 'unreadCount' => (int)$this->itemMapper->getUnreadCount(FeedType::FEED, + $feed->getId()), + 'folderId' => (int)$feed->getFolderId(), + 'show' => true, + 'icon' => 'url(' . $feed->getFavicon() .')', + 'url' => $feed->getUrl() + ) + ); + } + return $feedsArray; + } + + + /** + * This turns an items result into an array which can be sent to the client + * as JSON + * @param array $items the database query result for items + * @return an array ready for sending as JSON + */ + private function itemsToArray($items){ + $itemsArray = array(); + foreach($items as $item){ + + $enclosure = $item->getEnclosure(); + if($enclosure){ + $enclosure = array( + 'link' => $enclosure->getLink(), + 'type' => $enclosure->getMimeType() + ); + } + + array_push($itemsArray, array( + 'id' => (int)$item->getId(), + 'title' => $item->getTitle(), + 'isRead' => (bool)$item->isRead(), + 'isImportant' => (bool)$item->isImportant(), + 'feedId' => (int)$item->getFeedId(), + 'feedTitle' => $item->getFeedTitle(), + 'date' => (int)$item->getDate(), + 'body' => $item->getBody(), + 'author' => $item->getAuthor(), + 'url' => $item->getUrl(), + 'enclosure' => $enclosure + ) + ); + } + return $itemsArray; + } + + + /** + * This is being called when the app starts and all feeds + * and folders are requested + */ + public function init(){ + $folders = $this->folderMapper->childrenOfWithFeeds(0); + $foldersArray = $this->foldersToArray($folders); + + $feeds = $this->feedMapper->findAll(); + $feedsArray = $this->feedsToArray($feeds); + + $activeFeed = array(); + $activeFeed['id'] = (int)$this->api->getUserValue('lastViewedFeed'); + $activeFeed['type'] = (int)$this->api->getUserValue('lastViewedFeedType'); + + $showAll = $this->api->getUserValue('showAll') === "1"; + + $starredCount = $this->itemMapper->getUnreadCount(\OCA\News\FeedType::STARRED, 0); + + $result = array( + 'folders' => $foldersArray, + 'feeds' => $feedsArray, + 'activeFeed' => $activeFeed, + 'showAll' => $showAll, + 'userId' => $this->userId, + 'starredCount' => $starredCount + ); + + return $this->renderJSON($result); + } + + + /** + * loads the next X feeds from the server + */ + public function loadFeed(){ + $feedType = (int)$this->params('type'); + $feedId = (int)$this->params('id'); + $latestFeedId = (int)$this->params('latestFeedId'); + $latestTimestamp = (int)$this->params('latestTimestamp'); + $limit = (int)$this->params('limit'); + + // FIXME: integrate latestFeedId, latestTimestamp and limit + $this->api->setUserValue('lastViewedFeed', $feedId); + $this->api->setUserValue('lastViewedFeedType', $feedType); + + $showAll = $this->api->getUserValue('showAll'); + + $items = $this->itemMapper->getItems($feedType, $feedId, $showAll); + $itemsArray = $this->itemsToArray($items); + + // update unread count of all feeds + $feeds = $this->feedMapper->findAll(); + $feedsArray = array(); + + foreach($feeds as $feed){ + $unreadCount = $this->itemMapper->countAllStatus($feed->getId(), StatusFlag::UNREAD); + $unreadArray = array( + 'id' => (int)$feed->getId(), + 'unreadCount' => (int)$unreadCount + ); + array_push($feedsArray, $unreadArray); + } + + $result = array( + 'items' => $itemsArray, + 'feeds' => $feedsArray + ); + + return $this->renderJSON($result); + + } + + + /** + * Used for setting the showAll value from a post request + */ + public function setShowAll(){ + $showAll = $this->postParamToBool($this->params('showAll')); + $this->api->setUserValue('showAll', $showAll); + return $this->renderJSON(); + } + + + /** + * Used for setting the showAll value from a post request + */ + public function collapseFolder(){ + $folderId = (int)$this->params('folderId'); + $opened = $this->postParamToBool($this->params('opened')); + + $folder = $this->folderMapper->find($folderId); + $folder->setOpened($opened); + $this->folderMapper->update($folder); + return $this->renderJSON(); + } + + + /** + * Deletes a feed + */ + public function deleteFeed(){ + $feedId = (int)$this->params('feedId'); + $this->feedMapper->deleteById($feedId); + return $this->renderJSON(); + } + + + /** + * Deletes a folder + */ + public function deleteFolder(){ + $folderId = (int)$this->params('folderId'); + $this->folderMapper->deleteById($folderId); + return $this->renderJSON(); + } + + + /** + * Sets the status of an item + */ + public function setItemStatus(){ + $itemId = (int)$this->params('itemId'); + $status = $this->params('status'); + $item = $this->itemMapper->findById($itemId); + + switch ($status) { + case 'read': + $item->setRead(); + break; + case 'unread': + $item->setUnread(); + break; + case 'important': + $item->setImportant(); + break; + case 'unimportant': + $item->setUnimportant(); + break; + default: + exit(); + break; + } + + $this->itemMapper->update($item); + return $this->renderJSON(); + } + + + /** + * Changes the name of a folder + */ + public function changeFolderName(){ + $folderId = (int)$this->params('folderId'); + $folderName = $this->params('folderName'); + $folder = $this->folderMapper->find($folderId); + $folder->setName($folderName); + $this->folderMapper->update($folder); + return $this->renderJSON(); + } + + + /** + * Moves a feed to a new folder + */ + public function moveFeedToFolder(){ + $feedId = (int)$this->params('feedId'); + $folderId = (int)$this->params('folderId'); + $feed = $this->feedMapper->findById($feedId); + if($folderId === 0) { + $this->feedMapper->save($feed, $folderId); + } else { + $folder = $this->folderMapper->find($folderId); + if(!$folder){ + $msgString = 'Can not move feed %s to folder %s'; + $msg = $this->trans->t($msgString, array($feedId, $folderId)); + return $this->renderJSONError($msg, __FILE__); + } + $this->feedMapper->save($feed, $folder->getId()); + } + return $this->renderJSON(); + } + + + /** + * Pulls new feed items from its url + */ + public function updateFeed(){ + $feedId = (int)$this->params('feedId'); + $feed = $this->feedMapper->findById($feedId); + $newFeed = Utils::fetch($feed->getUrl()); + + $newFeedId = false; + if ($newFeed !== null) { + $newFeedId = $this->feedMapper->save($newFeed, $feed->getFolderId()); + } + + if($newFeedId){ + $feeds = array($this->feedMapper->findById($feedId)); + $feedsArray = array( + 'feeds' => $this->feedsToArray($feeds) + ); + return $this->renderJSON($feedsArray); + } else { + $msgString = 'Error updating feed %s'; + $msg = $this->trans->t($msgString, array($feed->getUrl())); + return $this->renderJSONError($msg, __FILE__); + } + + } + + + /** + * Creates a new folder + */ + public function createFolder(){ + $folderName = $this->params('folderName'); + $folder = new Folder($folderName); + $folderId = $this->folderMapper->save($folder); + $folders = array($this->folderMapper->findById($folderId)); + $foldersArray = array( + 'folders' => $this->foldersToArray($folders) + ); + return $this->renderJSON($foldersArray); + } + + + /** + * Creates a new feed + */ + public function createFeed(){ + $feedUrl = trim($this->params('feedUrl')); + $folderId = (int)$this->params('folderId'); + + $folder = $this->folderMapper->findById($folderId); + + if(!$folder && $folderId !== 0){ + $msgString = 'Folder with id %s does not exist'; + $msg = $this->trans->t($msgString, array($folderId)); + var_dump($folder); + return $this->renderJSONError($msg, __FILE__); + } + + if($this->feedMapper->findIdFromUrl($feedUrl)){ + $msgString = 'Feed %s does already exist'; + $msg = $this->trans->t($msgString, array($feedUrl)); + return $this->renderJSONError($msg, __FILE__); + } + + $feed = Utils::fetch($feedUrl); + if($feed){ + $feedId = $this->feedMapper->save($feed, $folderId); + $feeds = array($this->feedMapper->findById($feedId)); + $feedsArray = array( + 'feeds' => $this->feedsToArray($feeds) + ); + return $this->renderJSON($feedsArray); + } else { + $msgString = 'Could not create feed %s'; + $msg = $this->trans->t($msgString, array($feedUrl)); + return $this->renderJSONError($msg, __FILE__); + } + } + + + /** + * Sets all items read that are older than the current transmitted + * dates and ids + */ + public function setAllItemsRead($feedId, $mostRecentItemId){ + $feedId = (int)$this->params('feedId'); + $mostRecentItemId = (int)$this->params('mostRecentItemId'); + + $feed = $this->feedMapper->findById($feedId); + + if($feed){ + $this->itemMapper->markAllRead($feed->getId(), $mostRecentItemId); + + $feeds = array($this->feedMapper->findById($feed->getId())); + $feedsArray = array( + 'feeds' => $this->feedsToArray($feeds) + ); + return $this->renderJSON($feedsArray); + } + + } + +} diff --git a/controllers/news.controller.php b/controllers/news.controller.php index daa84d13f..d12783205 100644 --- a/controllers/news.controller.php +++ b/controllers/news.controller.php @@ -12,169 +12,78 @@ namespace OCA\News; + class NewsController extends Controller { - /** - * Decides wether to show the feedpage or the firstrun page - */ - public function index(){ - $feedMapper = new FeedMapper($this->userId); - - if($feedMapper->feedCount() > 0){ - $this->feedPage(); - } else { - $this->firstRun(); - } - } - - - public function firstRun(){ - $this->addScript('news'); - $this->addScript('firstrun'); - $this->addStyle('firstrun'); - $this->render('firstrun'); - } - - - public function feedPage(){ - $this->addScript('main'); - $this->addScript('news'); - $this->addScript('menu'); - $this->addScript('items'); - - $this->addStyle('news'); - $this->addStyle('settings'); - - $folderMapper = new FolderMapper($this->userId); - $feedMapper = new FeedMapper($this->userId); - $itemMapper = new ItemMapper($this->userId); - - // if no feed id is passed as parameter, then show the last viewed feed on reload - $lastViewedFeedId = isset( $_GET['feedid'] ) ? $_GET['feedid'] : (int)$this->getUserValue('lastViewedFeed'); - $lastViewedFeedType = isset( $_GET['feedid'] ) ? FeedType::FEED : (int)$this->getUserValue('lastViewedFeedType'); - - $showAll = $this->getUserValue('showAll'); - - if( $lastViewedFeedId === null || $lastViewedFeedType === null) { - $lastViewedFeedId = $feedMapper->mostRecent(); - } else { - // check if the last selected feed or folder exists - if( ( - $lastViewedFeedType === FeedType::FEED && - $feedMapper->findById($lastViewedFeedId) === null - ) || - ( - $lastViewedFeedType === FeedType::FOLDER && - $folderMapper->findById($lastViewedFeedId) === null - ) ){ - $lastViewedFeedId = $feedMapper->mostRecent(); - } - } - - $feeds = $folderMapper->childrenOfWithFeeds(0); - $folderForest = $folderMapper->childrenOf(0); //retrieve all the folders - $starredCount = $itemMapper->countEveryItemByStatus(StatusFlag::IMPORTANT); - $items = $this->getItems($lastViewedFeedType, $lastViewedFeedId, $showAll); - - $params = array( - 'allfeeds' => $feeds, - 'folderforest' => $folderForest, - 'showAll' => $showAll, - 'lastViewedFeedId' => $lastViewedFeedId, - 'lastViewedFeedType' => $lastViewedFeedType, - 'starredCount' => $starredCount, - 'items' => $items - ); - - $this->render('main', $params, array('items' => true)); - } - - - /** - * Returns all items - * @param $feedType the type of the feed - * @param $feedId the id of the feed or folder - * @param $showAll if true, it will also include unread items - * @return an array with all items - */ - public function getItems($feedType, $feedId, $showAll){ - $items = array(); - $itemMapper = new ItemMapper($this->userId); - - // starred or subscriptions - if ($feedType === FeedType::STARRED || $feedType === FeedType::SUBSCRIPTIONS) { - - if($feedType === FeedType::STARRED){ - $statusFlag = StatusFlag::IMPORTANT; - } - - if($feedType === FeedType::SUBSCRIPTIONS){ - $statusFlag = StatusFlag::UNREAD; - } - - $items = $itemMapper->findEveryItemByStatus($statusFlag); - - // feed - } elseif ($feedType === FeedType::FEED){ - - if($showAll) { - $items = $itemMapper->findByFeedId($feedId); - } else { - $items = $itemMapper->findAllStatus($feedId, StatusFlag::UNREAD); - } - - // folder - } elseif ($feedType === FeedType::FOLDER){ - $feedMapper = new FeedMapper($this->userId); - $feeds = $feedMapper->findByFolderId($feedId); - - foreach($feeds as $feed){ - if($showAll) { - $items = array_merge($items, $itemMapper->findByFeedId($feed->getId())); - } else { - $items = array_merge($items, - $itemMapper->findAllStatus($feed->getId(), StatusFlag::UNREAD)); - } - } - } - return $items; - } - - - /** - * Returns the unread count - * @param $feedType the type of the feed - * @param $feedId the id of the feed or folder - * @return the unread count - */ - public function getItemUnreadCount($feedType, $feedId){ - $unreadCount = 0; - $itemMapper = new ItemMapper($this->userId); - - switch ($feedType) { - case FeedType::STARRED: - $unreadCount = $itemMapper->countEveryItemByStatus(StatusFlag::IMPORTANT); - break; - - case FeedType::SUBSCRIPTIONS: - $unreadCount = $itemMapper->countEveryItemByStatus(StatusFlag::UNREAD); - break; - - case FeedType::FOLDER: - $feedMapper = new FeedMapper($this->userId); - $feeds = $feedMapper->findByFolderId($feedId); - foreach($feeds as $feed){ - $unreadCount += $itemMapper->countAllStatus($feed->getId(), StatusFlag::UNREAD); - } - break; - - case FeedType::FEED: - $unreadCount = $itemMapper->countAllStatus($feedId, StatusFlag::UNREAD); - break; - } - - return $unreadCount; - } + private $feedMapper; + private $folderMapper; + + /** + * @param Request $request: the object with the request instance + * @param string $api: an instance of the api wrapper object + * @param FolderMapper $folderMapper: an instance of the folder mapper + * @param FeedMapper $feedMapper: an instance of the feed mapper + */ + public function __construct($request, $api, $feedMapper, $folderMapper){ + parent::__construct($request, $api); + $this->feedMapper = $feedMapper; + $this->folderMapper = $folderMapper; + $this->api->activateNavigationEntry(); + } + + + /** + * OPML export download page + */ + public function exportOPML($urlParams=array()){ + $opmlExporter = new OPMLExporter($this->api); + + $allFeeds = $this->folderMapper->childrenOfWithFeeds(0); + $opml = $opmlExporter->buildOPML($allFeeds); + + $fileName = 'ownCloud ' . $this->trans->t('News') . ' ' . $this->userId . '.opml'; + $contentType = 'application/x.opml+xml'; + $response = new TextDownloadResponse($opml, $fileName, $contentType); + + return $response; + } + + + /** + * Decides wether to show the feedpage or the firstrun page + */ + public function index($urlParams=array()){ + $this->api->add3rdPartyScript('angular-1.0.2/angular.min'); + $this->api->add3rdPartyScript('moment.min'); + $this->api->addScript('app'); + $this->api->addStyle('news'); + + + if($urlParams['feedid']){ + $this->api->setUserValue('lastViewedFeed', $urlParams['feedid']); + $this->api->setUserValue('lastViewedFeedType', FeedType::FEED); + } + + $lastViewedFeedId = $this->api->getUserValue('lastViewedFeed'); + $lastViewedFeedType = $this->api->getUserValue('lastViewedFeedType'); + + if( $lastViewedFeedId === null || $lastViewedFeedType === null) { + $this->api->setUserValue('lastViewedFeed', $this->feedMapper->mostRecent());; + $this->api->setUserValue('lastViewedFeedType', FeedType::FEED); + + } else { + // check if the last selected feed or folder exists + if(($lastViewedFeedType === FeedType::FEED && + $this->feedMapper->findById($lastViewedFeedId) === null) || + ($lastViewedFeedType === FeedType::FOLDER && + $this->folderMapper->findById($lastViewedFeedId) === null)){ + $this->api->setUserValue('lastViewedFeed', $this->feedMapper->mostRecent());; + $this->api->setUserValue('lastViewedFeedType', FeedType::FEED); + } + } + + return $this->render('main'); + } } |