From 464ff6c4c1bda3edbd0f132c4d3d866539d3a117 Mon Sep 17 00:00:00 2001 From: Bernhard Posselt Date: Mon, 15 Apr 2013 16:02:32 +0200 Subject: renamed bl to businesslayer, handle exception in update routine, fix #69 --- backgroundjob/task.php | 4 +- bl/bl.php | 59 --- bl/blexception.php | 39 -- bl/feedbl.php | 162 -------- bl/folderbl.php | 94 ----- bl/itembl.php | 143 ------- businesslayer/businesslayer.php | 59 +++ businesslayer/businesslayerexception.php | 39 ++ businesslayer/feedbusinesslayer.php | 167 ++++++++ businesslayer/folderbusinesslayer.php | 94 +++++ businesslayer/itembusinesslayer.php | 143 +++++++ controller/exportcontroller.php | 22 +- controller/feedcontroller.php | 56 +-- controller/foldercontroller.php | 25 +- controller/itemcontroller.php | 21 +- dependencyinjection/dicontainer.php | 32 +- js/app/app.coffee | 6 +- js/app/controllers/feedcontroller.coffee | 39 +- js/app/controllers/itemcontroller.coffee | 18 +- js/app/controllers/settingscontroller.coffee | 8 +- js/app/services/bl/bl.coffee | 45 --- js/app/services/bl/feedbl.coffee | 177 --------- js/app/services/bl/folderbl.coffee | 158 -------- js/app/services/bl/itembl.coffee | 113 ------ js/app/services/bl/starredbl.coffee | 54 --- js/app/services/bl/subscriptionsbl.coffee | 57 --- js/app/services/businesslayer/businesslayer.coffee | 45 +++ .../businesslayer/feedbusinesslayer.coffee | 177 +++++++++ .../businesslayer/folderbusinesslayer.coffee | 160 ++++++++ .../businesslayer/itembusinesslayer.coffee | 115 ++++++ .../businesslayer/starredbusinesslayer.coffee | 55 +++ .../subscriptionsbusinesslayer.coffee | 58 +++ js/public/app.js | 294 +++++++------- js/tests/controllers/feedcontrollerSpec.coffee | 24 +- js/tests/controllers/itemcontrollerSpec.coffee | 10 +- js/tests/controllers/settingscontrollerSpec.coffee | 3 +- js/tests/services/bl/blSpec.coffee | 86 ---- js/tests/services/bl/feedblSpec.coffee | 346 ---------------- js/tests/services/bl/folderblSpec.coffee | 440 --------------------- js/tests/services/bl/itemblSpec.coffee | 217 ---------- js/tests/services/bl/starredblSpec.coffee | 60 --- js/tests/services/bl/subscriptionsblSpec.coffee | 83 ---- .../businesslayer/businesslayerSpec.coffee | 87 ++++ .../businesslayer/feedbusinesslayerSpec.coffee | 346 ++++++++++++++++ .../businesslayer/folderbusinesslayerSpec.coffee | 440 +++++++++++++++++++++ .../businesslayer/itembusinesslayerSpec.coffee | 217 ++++++++++ .../businesslayer/starredbusinesslayerSpec.coffee | 61 +++ .../subsriptionsbusinesslayerSpec.coffee | 83 ++++ templates/part.addnew.php | 2 +- templates/part.feed.starred.php | 10 +- templates/part.feed.unread.php | 18 +- templates/part.items.php | 20 +- templates/part.listfeed.php | 20 +- templates/part.listfolder.php | 28 +- templates/part.settings.php | 4 +- templates/part.showall.php | 8 +- tests/unit/bl/BlTest.php | 110 ------ tests/unit/bl/FeedBlTest.php | 341 ---------------- tests/unit/bl/FolderBlTest.php | 164 -------- tests/unit/bl/ItemBlTest.php | 276 ------------- tests/unit/bl/StatusFlagTest.php | 74 ---- tests/unit/businesslayer/BusinessLayerTest.php | 110 ++++++ tests/unit/businesslayer/FeedBusinessLayerTest.php | 405 +++++++++++++++++++ .../unit/businesslayer/FolderBusinessLayerTest.php | 164 ++++++++ tests/unit/businesslayer/ItemBusinessLayerTest.php | 276 +++++++++++++ tests/unit/businesslayer/StatusFlagTest.php | 74 ++++ tests/unit/controller/ExportControllerTest.php | 14 +- tests/unit/controller/FeedControllerTest.php | 64 ++- tests/unit/controller/FolderControllerTest.php | 30 +- tests/unit/controller/ItemControllerTest.php | 24 +- 70 files changed, 3800 insertions(+), 3677 deletions(-) delete mode 100644 bl/bl.php delete mode 100644 bl/blexception.php delete mode 100644 bl/feedbl.php delete mode 100644 bl/folderbl.php delete mode 100644 bl/itembl.php create mode 100644 businesslayer/businesslayer.php create mode 100644 businesslayer/businesslayerexception.php create mode 100644 businesslayer/feedbusinesslayer.php create mode 100644 businesslayer/folderbusinesslayer.php create mode 100644 businesslayer/itembusinesslayer.php delete mode 100644 js/app/services/bl/bl.coffee delete mode 100644 js/app/services/bl/feedbl.coffee delete mode 100644 js/app/services/bl/folderbl.coffee delete mode 100644 js/app/services/bl/itembl.coffee delete mode 100644 js/app/services/bl/starredbl.coffee delete mode 100644 js/app/services/bl/subscriptionsbl.coffee create mode 100644 js/app/services/businesslayer/businesslayer.coffee create mode 100644 js/app/services/businesslayer/feedbusinesslayer.coffee create mode 100644 js/app/services/businesslayer/folderbusinesslayer.coffee create mode 100644 js/app/services/businesslayer/itembusinesslayer.coffee create mode 100644 js/app/services/businesslayer/starredbusinesslayer.coffee create mode 100644 js/app/services/businesslayer/subscriptionsbusinesslayer.coffee delete mode 100644 js/tests/services/bl/blSpec.coffee delete mode 100644 js/tests/services/bl/feedblSpec.coffee delete mode 100644 js/tests/services/bl/folderblSpec.coffee delete mode 100644 js/tests/services/bl/itemblSpec.coffee delete mode 100644 js/tests/services/bl/starredblSpec.coffee delete mode 100644 js/tests/services/bl/subscriptionsblSpec.coffee create mode 100644 js/tests/services/businesslayer/businesslayerSpec.coffee create mode 100644 js/tests/services/businesslayer/feedbusinesslayerSpec.coffee create mode 100644 js/tests/services/businesslayer/folderbusinesslayerSpec.coffee create mode 100644 js/tests/services/businesslayer/itembusinesslayerSpec.coffee create mode 100644 js/tests/services/businesslayer/starredbusinesslayerSpec.coffee create mode 100644 js/tests/services/businesslayer/subsriptionsbusinesslayerSpec.coffee delete mode 100644 tests/unit/bl/BlTest.php delete mode 100644 tests/unit/bl/FeedBlTest.php delete mode 100644 tests/unit/bl/FolderBlTest.php delete mode 100644 tests/unit/bl/ItemBlTest.php delete mode 100644 tests/unit/bl/StatusFlagTest.php create mode 100644 tests/unit/businesslayer/BusinessLayerTest.php create mode 100644 tests/unit/businesslayer/FeedBusinessLayerTest.php create mode 100644 tests/unit/businesslayer/FolderBusinessLayerTest.php create mode 100644 tests/unit/businesslayer/ItemBusinessLayerTest.php create mode 100644 tests/unit/businesslayer/StatusFlagTest.php diff --git a/backgroundjob/task.php b/backgroundjob/task.php index 2274f7b99..820d36cc7 100644 --- a/backgroundjob/task.php +++ b/backgroundjob/task.php @@ -34,8 +34,8 @@ class Task { static public function run() { $container = new DIContainer(); - $container['FeedBl']->updateAll(); - $container['ItemBl']->autoPurgeOld(); + $container['FeedBusinessLayer']->updateAll(); + $container['ItemBusinessLayer']->autoPurgeOld(); } diff --git a/bl/bl.php b/bl/bl.php deleted file mode 100644 index ee4ace588..000000000 --- a/bl/bl.php +++ /dev/null @@ -1,59 +0,0 @@ -. -* -*/ - -namespace OCA\News\Bl; - -use \OCA\AppFramework\Db\DoesNotExistException; -use \OCA\AppFramework\Db\MultipleObjectsReturnedException; - -use \OCA\News\Db\IMapper; - - -abstract class Bl { - - protected $mapper; - - public function __construct(IMapper $mapper){ - $this->mapper = $mapper; - } - - - public function delete($id, $userId){ - $entity = $this->find($id, $userId); - $this->mapper->delete($entity); - } - - - public function find($id, $userId){ - try { - return $this->mapper->find($id, $userId); - } catch(DoesNotExistException $ex){ - throw new BLException($ex->getMessage()); - } catch(MultipleObjectsReturnedException $ex){ - throw new BLException($ex->getMessage()); - } - } - -} \ No newline at end of file diff --git a/bl/blexception.php b/bl/blexception.php deleted file mode 100644 index fca362ea7..000000000 --- a/bl/blexception.php +++ /dev/null @@ -1,39 +0,0 @@ -. -* -*/ - -namespace OCA\News\Bl; - - -class BLException extends \Exception { - - /** - * Constructor - * @param string $msg the error message - */ - public function __construct($msg){ - parent::__construct($msg); - } - -} \ No newline at end of file diff --git a/bl/feedbl.php b/bl/feedbl.php deleted file mode 100644 index 97deaeff0..000000000 --- a/bl/feedbl.php +++ /dev/null @@ -1,162 +0,0 @@ -. -* -*/ - -namespace OCA\News\Bl; - -use \OCA\AppFramework\Db\DoesNotExistException; -use \OCA\AppFramework\Core\API; - -use \OCA\News\Db\Feed; -use \OCA\News\Db\FeedMapper; -use \OCA\News\Db\ItemMapper; -use \OCA\News\Utility\Fetcher; -use \OCA\News\Utility\FetcherException; - -class FeedBl extends Bl { - - private $feedFetcher; - private $itemMapper; - private $api; - - public function __construct(FeedMapper $feedMapper, Fetcher $feedFetcher, - ItemMapper $itemMapper, API $api){ - parent::__construct($feedMapper); - $this->feedFetcher = $feedFetcher; - $this->itemMapper = $itemMapper; - $this->api = $api; - } - - - public function findAll($userId){ - return $this->mapper->findAllFromUser($userId); - } - - - public function create($feedUrl, $folderId, $userId){ - // first try if the feed exists already - try { - $this->mapper->findByUrlHash(md5($feedUrl), $userId); - throw new BLException( - $this->api->getTrans()->t('Can not add feed: Exists already')); - } catch(DoesNotExistException $ex){} - - try { - list($feed, $items) = $this->feedFetcher->fetch($feedUrl); - - // insert feed - $feed->setFolderId($folderId); - $feed->setUserId($userId); - $feed = $this->mapper->insert($feed); - - // insert items in reverse order because the first one is usually the - // newest item - for($i=count($items)-1; $i>=0; $i--){ - $item = $items[$i]; - $item->setFeedId($feed->getId()); - $this->itemMapper->insert($item); - } - - // set unread count - $feed->setUnreadCount(count($items)); - - return $feed; - } catch(FetcherException $ex){ - $this->api->log($ex->getMessage()); - throw new BLException( - $this->api->getTrans()->t( - 'Can not add feed: URL does not exist or has invalid xml')); - } - } - - - // FIXME: this method is not covered by any tests - public function updateAll(){ - $feeds = $this->mapper->findAll(); - foreach($feeds as $feed){ - try { - $this->update($feed->getId(), $feed->getUserId()); - } catch(BLException $ex){ - continue; - } - } - } - - - public function update($feedId, $userId){ - $existingFeed = $this->mapper->find($feedId, $userId); - try { - list($feed, $items) = $this->feedFetcher->fetch($existingFeed->getUrl()); - - // insert items in reverse order because the first one is usually the - // newest item - for($i=count($items)-1; $i>=0; $i--){ - $item = $items[$i]; - $item->setFeedId($existingFeed->getId()); - - // if a doesnotexist exception is being thrown the entry does not - // exist and the item needs to be created, otherwise - // update it - try { - $existing = $this->itemMapper->findByGuidHash( - $item->getGuidHash(), $feedId, $userId); - - // in case of an update the existing item has to be deleted - // if the pub_date changed because we sort by id on the - // client side since this is the only reliable way to do it - // to not get weird behaviour - if($existing->getPubDate() !== $item->getPubDate()){ - - // because the item is being replaced we need to keep - // status flags but we want the new entry to be unread - $item->setStatus($existing->getStatus()); - $item->setUnread(); - - $this->itemMapper->delete($existing); - $this->itemMapper->insert($item); - } - - } catch(DoesNotExistException $ex){ - $this->itemMapper->insert($item); - } - } - - } catch(FetcherException $ex){ - // failed updating is not really a problem, so only log it - $this->api->log('Can not update feed with url' . $existingFeed->getUrl() . - ': Not found or bad source'); - } - - return $this->mapper->find($feedId, $userId); - } - - - public function move($feedId, $folderId, $userId){ - $feed = $this->find($feedId, $userId); - $feed->setFolderId($folderId); - $this->mapper->update($feed); - } - - -} diff --git a/bl/folderbl.php b/bl/folderbl.php deleted file mode 100644 index 59fdddf16..000000000 --- a/bl/folderbl.php +++ /dev/null @@ -1,94 +0,0 @@ -. -* -*/ - -namespace OCA\News\Bl; - -use \OCA\AppFramework\Core\API; - -use \OCA\News\Db\Folder; -use \OCA\News\Db\FolderMapper; - - -class FolderBl extends Bl { - - private $api; - - public function __construct(FolderMapper $folderMapper, - API $api){ - parent::__construct($folderMapper); - $this->api = $api; - } - - - public function findAll($userId) { - return $this->mapper->findAllFromUser($userId); - } - - - private function allowNoNameTwice($folderName, $userId){ - $existingFolders = $this->mapper->findByName($folderName, $userId); - if(count($existingFolders) > 0){ - - throw new BLException( - $this->api->getTrans()->t('Can not add folder: Exists already')); - } - } - - /** - * @throws BLException if name exists already - */ - public function create($folderName, $userId, $parentId=0) { - $this->allowNoNameTwice($folderName, $userId); - - $folder = new Folder(); - $folder->setName($folderName); - $folder->setUserId($userId); - $folder->setParentId($parentId); - $folder->setOpened(true); - return $this->mapper->insert($folder); - } - - - public function open($folderId, $opened, $userId){ - $folder = $this->find($folderId, $userId); - $folder->setOpened($opened); - $this->mapper->update($folder); - } - - - /** - * @throws BLException if name exists already - */ - public function rename($folderId, $folderName, $userId){ - $this->allowNoNameTwice($folderName, $userId); - - $folder = $this->find($folderId, $userId); - $folder->setName($folderName); - $this->mapper->update($folder); - } - - - -} diff --git a/bl/itembl.php b/bl/itembl.php deleted file mode 100644 index 504e48016..000000000 --- a/bl/itembl.php +++ /dev/null @@ -1,143 +0,0 @@ -. -* -*/ - -namespace OCA\News\Bl; - -use \OCA\News\Db\Item; -use \OCA\News\Db\ItemMapper; -use \OCA\News\Db\StatusFlag; -use \OCA\News\Db\FeedType; - - -class ItemBl extends Bl { - - private $statusFlag; - private $autoPurgeCount; - - public function __construct(ItemMapper $itemMapper, StatusFlag $statusFlag, - $autoPurgeCount=0){ - parent::__construct($itemMapper); - $this->statusFlag = $statusFlag; - $this->autoPurgeCount = $autoPurgeCount; - } - - - public function findAllNew($id, $type, $updatedSince, - $showAll, $userId){ - $status = $this->statusFlag->typeToStatus($type, $showAll); - - switch($type){ - case FeedType::FEED: - $items = $this->mapper->findAllNewFeed($id, $updatedSince, - $status, $userId); - break; - case FeedType::FOLDER: - $items = $this->mapper->findAllNewFolder($id, $updatedSince, - $status, $userId); - break; - default: - $items = $this->mapper->findAllNew($updatedSince, $status, - $userId); - } - - return $items; - } - - - public function findAll($id, $type, $limit, $offset, - $showAll, $userId){ - $status = $this->statusFlag->typeToStatus($type, $showAll); - - switch($type){ - case FeedType::FEED: - $items = $this->mapper->findAllFeed($id, $limit, $offset, - $status, $userId); - break; - case FeedType::FOLDER: - $items = $this->mapper->findAllFolder($id, $limit, $offset, - $status, $userId); - break; - default: - $items = $this->mapper->findAll($limit, $offset, $status, - $userId); - } - - return $items; - } - - - public function starredCount($userId){ - return $this->mapper->starredCount($userId); - } - - - public function star($feedId, $guidHash, $isStarred, $userId){ - // FIXME: this can throw two possible exceptions - $item = $this->mapper->findByGuidHash($guidHash, $feedId, $userId); - if($isStarred){ - $item->setStarred(); - } else { - $item->setUnstarred(); - } - $this->mapper->update($item); - } - - - public function read($itemId, $isRead, $userId){ - $item = $this->find($itemId, $userId); - if($isRead){ - $item->setRead(); - } else { - $item->setUnread(); - } - $this->mapper->update($item); - } - - - public function readFeed($feedId, $highestItemId, $userId){ - $this->mapper->readFeed($feedId, $highestItemId, $userId); - } - - - /** - * This method deletes all unread feeds that are not starred and over the - * count of $this->autoPurgeCount starting by the oldest. This is to clean - * up the database so that old entries dont spam your db. As criteria for - * old, the id is taken - */ - public function autoPurgeOld(){ - $readAndNotStarred = - $this->mapper->getReadOlderThanThreshold($this->autoPurgeCount); - - // delete entries with a lower id than last item - if($this->autoPurgeCount > 0 - && isset($readAndNotStarred[$this->autoPurgeCount-1])){ - $this->mapper->deleteReadOlderThanId( - $readAndNotStarred[$this->autoPurgeCount-1]->getId()); - } - } - - -} diff --git a/businesslayer/businesslayer.php b/businesslayer/businesslayer.php new file mode 100644 index 000000000..4ce6f1625 --- /dev/null +++ b/businesslayer/businesslayer.php @@ -0,0 +1,59 @@ +. +* +*/ + +namespace OCA\News\BusinessLayer; + +use \OCA\AppFramework\Db\DoesNotExistException; +use \OCA\AppFramework\Db\MultipleObjectsReturnedException; + +use \OCA\News\Db\IMapper; + + +abstract class BusinessLayer { + + protected $mapper; + + public function __construct(IMapper $mapper){ + $this->mapper = $mapper; + } + + + public function delete($id, $userId){ + $entity = $this->find($id, $userId); + $this->mapper->delete($entity); + } + + + public function find($id, $userId){ + try { + return $this->mapper->find($id, $userId); + } catch(DoesNotExistException $ex){ + throw new BusinessLayerException($ex->getMessage()); + } catch(MultipleObjectsReturnedException $ex){ + throw new BusinessLayerException($ex->getMessage()); + } + } + +} \ No newline at end of file diff --git a/businesslayer/businesslayerexception.php b/businesslayer/businesslayerexception.php new file mode 100644 index 000000000..03219a20f --- /dev/null +++ b/businesslayer/businesslayerexception.php @@ -0,0 +1,39 @@ +. +* +*/ + +namespace OCA\News\BusinessLayer; + + +class BusinessLayerException extends \Exception { + + /** + * Constructor + * @param string $msg the error message + */ + public function __construct($msg){ + parent::__construct($msg); + } + +} \ No newline at end of file diff --git a/businesslayer/feedbusinesslayer.php b/businesslayer/feedbusinesslayer.php new file mode 100644 index 000000000..f7666fc1c --- /dev/null +++ b/businesslayer/feedbusinesslayer.php @@ -0,0 +1,167 @@ +. +* +*/ + +namespace OCA\News\BusinessLayer; + +use \OCA\AppFramework\Db\DoesNotExistException; +use \OCA\AppFramework\Core\API; + +use \OCA\News\Db\Feed; +use \OCA\News\Db\FeedMapper; +use \OCA\News\Db\ItemMapper; +use \OCA\News\Utility\Fetcher; +use \OCA\News\Utility\FetcherException; + +class FeedBusinessLayer extends BusinessLayer { + + private $feedFetcher; + private $itemMapper; + private $api; + + public function __construct(FeedMapper $feedMapper, Fetcher $feedFetcher, + ItemMapper $itemMapper, API $api){ + parent::__construct($feedMapper); + $this->feedFetcher = $feedFetcher; + $this->itemMapper = $itemMapper; + $this->api = $api; + } + + + public function findAll($userId){ + return $this->mapper->findAllFromUser($userId); + } + + + public function create($feedUrl, $folderId, $userId){ + // first try if the feed exists already + try { + $this->mapper->findByUrlHash(md5($feedUrl), $userId); + throw new BusinessLayerException( + $this->api->getTrans()->t('Can not add feed: Exists already')); + } catch(DoesNotExistException $ex){} + + try { + list($feed, $items) = $this->feedFetcher->fetch($feedUrl); + + // insert feed + $feed->setFolderId($folderId); + $feed->setUserId($userId); + $feed = $this->mapper->insert($feed); + + // insert items in reverse order because the first one is usually the + // newest item + for($i=count($items)-1; $i>=0; $i--){ + $item = $items[$i]; + $item->setFeedId($feed->getId()); + $this->itemMapper->insert($item); + } + + // set unread count + $feed->setUnreadCount(count($items)); + + return $feed; + } catch(FetcherException $ex){ + $this->api->log($ex->getMessage()); + throw new BusinessLayerException( + $this->api->getTrans()->t( + 'Can not add feed: URL does not exist or has invalid xml')); + } + } + + + // FIXME: this method is not covered by any tests + public function updateAll(){ + $feeds = $this->mapper->findAll(); + foreach($feeds as $feed){ + try { + $this->update($feed->getId(), $feed->getUserId()); + } catch(BusinessLayerException $ex){ + continue; + } + } + } + + + public function update($feedId, $userId){ + try { + $existingFeed = $this->mapper->find($feedId, $userId); + try { + list($feed, $items) = $this->feedFetcher->fetch($existingFeed->getUrl()); + + // insert items in reverse order because the first one is usually the + // newest item + for($i=count($items)-1; $i>=0; $i--){ + $item = $items[$i]; + $item->setFeedId($existingFeed->getId()); + + // if a doesnotexist exception is being thrown the entry does not + // exist and the item needs to be created, otherwise + // update it + try { + $existing = $this->itemMapper->findByGuidHash( + $item->getGuidHash(), $feedId, $userId); + + // in case of an update the existing item has to be deleted + // if the pub_date changed because we sort by id on the + // client side since this is the only reliable way to do it + // to not get weird behaviour + if($existing->getPubDate() !== $item->getPubDate()){ + + // because the item is being replaced we need to keep + // status flags but we want the new entry to be unread + $item->setStatus($existing->getStatus()); + $item->setUnread(); + + $this->itemMapper->delete($existing); + $this->itemMapper->insert($item); + } + + } catch(DoesNotExistException $ex){ + $this->itemMapper->insert($item); + } + } + + } catch(FetcherException $ex){ + // failed updating is not really a problem, so only log it + $this->api->log('Can not update feed with url' . $existingFeed->getUrl() . + ': Not found or bad source'); + } + + return $this->mapper->find($feedId, $userId); + + } catch (DoesNotExistException $ex){ + throw new BusinessLayerException('Feed does not exist'); + } + } + + + public function move($feedId, $folderId, $userId){ + $feed = $this->find($feedId, $userId); + $feed->setFolderId($folderId); + $this->mapper->update($feed); + } + + +} diff --git a/businesslayer/folderbusinesslayer.php b/businesslayer/folderbusinesslayer.php new file mode 100644 index 000000000..916476896 --- /dev/null +++ b/businesslayer/folderbusinesslayer.php @@ -0,0 +1,94 @@ +. +* +*/ + +namespace OCA\News\BusinessLayer; + +use \OCA\AppFramework\Core\API; + +use \OCA\News\Db\Folder; +use \OCA\News\Db\FolderMapper; + + +class FolderBusinessLayer extends BusinessLayer { + + private $api; + + public function __construct(FolderMapper $folderMapper, + API $api){ + parent::__construct($folderMapper); + $this->api = $api; + } + + + public function findAll($userId) { + return $this->mapper->findAllFromUser($userId); + } + + + private function allowNoNameTwice($folderName, $userId){ + $existingFolders = $this->mapper->findByName($folderName, $userId); + if(count($existingFolders) > 0){ + + throw new BusinessLayerException( + $this->api->getTrans()->t('Can not add folder: Exists already')); + } + } + + /** + * @throws BusinessLayerException if name exists already + */ + public function create($folderName, $userId, $parentId=0) { + $this->allowNoNameTwice($folderName, $userId); + + $folder = new Folder(); + $folder->setName($folderName); + $folder->setUserId($userId); + $folder->setParentId($parentId); + $folder->setOpened(true); + return $this->mapper->insert($folder); + } + + + public function open($folderId, $opened, $userId){ + $folder = $this->find($folderId, $userId); + $folder->setOpened($opened); + $this->mapper->update($folder); + } + + + /** + * @throws BusinessLayerException if name exists already + */ + public function rename($folderId, $folderName, $userId){ + $this->allowNoNameTwice($folderName, $userId); + + $folder = $this->find($folderId, $userId); + $folder->setName($folderName); + $this->mapper->update($folder); + } + + + +} diff --git a/businesslayer/itembusinesslayer.php b/businesslayer/itembusinesslayer.php new file mode 100644 index 000000000..fd01506a6 --- /dev/null +++ b/businesslayer/itembusinesslayer.php @@ -0,0 +1,143 @@ +. +* +*/ + +namespace OCA\News\BusinessLayer; + +use \OCA\News\Db\Item; +use \OCA\News\Db\ItemMapper; +use \OCA\News\Db\StatusFlag; +use \OCA\News\Db\FeedType; + + +class ItemBusinessLayer extends BusinessLayer { + + private $statusFlag; + private $autoPurgeCount; + + public function __construct(ItemMapper $itemMapper, StatusFlag $statusFlag, + $autoPurgeCount=0){ + parent::__construct($itemMapper); + $this->statusFlag = $statusFlag; + $this->autoPurgeCount = $autoPurgeCount; + } + + + public function findAllNew($id, $type, $updatedSince, + $showAll, $userId){ + $status = $this->statusFlag->typeToStatus($type, $showAll); + + switch($type){ + case FeedType::FEED: + $items = $this->mapper->findAllNewFeed($id, $updatedSince, + $status, $userId); + break; + case FeedType::FOLDER: + $items = $this->mapper->findAllNewFolder($id, $updatedSince, + $status, $userId); + break; + default: + $items = $this->mapper->findAllNew($updatedSince, $status, + $userId); + } + + return $items; + } + + + public function findAll($id, $type, $limit, $offset, + $showAll, $userId){ + $status = $this->statusFlag->typeToStatus($type, $showAll); + + switch($type){ + case FeedType::FEED: + $items = $this->mapper->findAllFeed($id, $limit, $offset, + $status, $userId); + break; + case FeedType::FOLDER: + $items = $this->mapper->findAllFolder($id, $limit, $offset, + $status, $userId); + break; + default: + $items = $this->mapper->findAll($limit, $offset, $status, + $userId); + } + + return $items; + } + + + public function starredCount($userId){ + return $this->mapper->starredCount($userId); + } + + + public function star($feedId, $guidHash, $isStarred, $userId){ + // FIXME: this can throw two possible exceptions + $item = $this->mapper->findByGuidHash($guidHash, $feedId, $userId); + if($isStarred){ + $item->setStarred(); + } else { + $item->setUnstarred(); + } + $this->mapper->update($item); + } + + + public function read($itemId, $isRead, $userId){ + $item = $this->find($itemId, $userId); + if($isRead){ + $item->setRead(); + } else { + $item->setUnread(); + } + $this->mapper->update($item); + } + + + public function readFeed($feedId, $highestItemId, $userId){ + $this->mapper->readFeed($feedId, $highestItemId, $userId); + } + + + /** + * This method deletes all unread feeds that are not starred and over the + * count of $this->autoPurgeCount starting by the oldest. This is to clean + * up the database so that old entries dont spam your db. As criteria for + * old, the id is taken + */ + public function autoPurgeOld(){ + $readAndNotStarred = + $this->mapper->getReadOlderThanThreshold($this->autoPurgeCount); + + // delete entries with a lower id than last item + if($this->autoPurgeCount > 0 + && isset($readAndNotStarred[$this->autoPurgeCount-1])){ + $this->mapper->deleteReadOlderThanId( + $readAndNotStarred[$this->autoPurgeCount-1]->getId()); + } + } + + +} diff --git a/controller/exportcontroller.php b/controller/exportcontroller.php index 960748d3e..023a4d39d 100644 --- a/controller/exportcontroller.php +++ b/controller/exportcontroller.php @@ -30,21 +30,23 @@ use \OCA\AppFramework\Core\API; use \OCA\AppFramework\Http\Request; use \OCA\AppFramework\Http\TextDownloadResponse; -use \OCA\News\Bl\FeedBl; -use \OCA\News\Bl\FolderBl; +use \OCA\News\BusinessLayer\FeedBusinessLayer; +use \OCA\News\BusinessLayer\FolderBusinessLayer; use \OCA\News\Utility\OPMLExporter; class ExportController extends Controller { private $opmlExporter; - private $folderBl; - private $feedBl; + private $folderBusinessLayer; + private $feedBusinessLayer; - public function __construct(API $api, Request $request, FeedBl $feedBl, - FolderBl $folderBl, OPMLExporter $opmlExporter){ + public function __construct(API $api, Request $request, + FeedBusinessLayer $feedBusinessLayer, + FolderBusinessLayer $folderBusinessLayer, + OPMLExporter $opmlExporter){ parent::__construct($api, $request); - $this->feedBl = $feedBl; - $this->folderBl = $folderBl; + $this->feedBusinessLayer = $feedBusinessLayer; + $this->folderBusinessLayer = $folderBusinessLayer; $this->opmlExporter = $opmlExporter; } @@ -56,8 +58,8 @@ class ExportController extends Controller { */ public function opml(){ $user = $this->api->getUserId(); - $feeds = $this->feedBl->findAll($user); - $folders = $this->folderBl->findAll($user); + $feeds = $this->feedBusinessLayer->findAll($user); + $folders = $this->folderBusinessLayer->findAll($user); $opml = $this->opmlExporter->build($folders, $feeds)->saveXML(); return new TextDownloadResponse($opml, 'subscriptions.opml', 'text/xml'); } diff --git a/controller/feedcontroller.php b/controller/feedcontroller.php index 5e2a91f24..53257d73c 100644 --- a/controller/feedcontroller.php +++ b/controller/feedcontroller.php @@ -29,22 +29,23 @@ use \OCA\AppFramework\Controller\Controller; use \OCA\AppFramework\Core\API; use \OCA\AppFramework\Http\Request; -use \OCA\News\Bl\FeedBl; -use \OCA\News\Bl\FolderBl; -use \OCA\News\Bl\BLException; +use \OCA\News\BusinessLayer\FeedBusinessLayer; +use \OCA\News\BusinessLayer\FolderBusinessLayer; +use \OCA\News\BusinessLayer\BusinessLayerException; use \OCA\News\Db\FeedType; class FeedController extends Controller { - private $feedBl; - private $folderBl; + private $feedBusinessLayer; + private $folderBusinessLayer; - public function __construct(API $api, Request $request, FeedBl $feedBl, - FolderBl $folderBl){ + public function __construct(API $api, Request $request, + FeedBusinessLayer $feedBusinessLayer, + FolderBusinessLayer $folderBusinessLayer){ parent::__construct($api, $request); - $this->feedBl = $feedBl; - $this->folderBl = $folderBl; + $this->feedBusinessLayer = $feedBusinessLayer; + $this->folderBusinessLayer = $folderBusinessLayer; } @@ -55,7 +56,7 @@ class FeedController extends Controller { */ public function feeds(){ $userId = $this->api->getUserId(); - $result = $this->feedBl->findAll($userId); + $result = $this->feedBusinessLayer->findAll($userId); $params = array( 'feeds' => $result @@ -83,17 +84,17 @@ class FeedController extends Controller { // check if feed or folder exists try { if($feedType === FeedType::FOLDER){ - $this->folderBl->find($feedId, $userId); + $this->folderBusinessLayer->find($feedId, $userId); } elseif ($feedType === FeedType::FEED){ - $this->feedBl->find($feedId, $userId); + $this->feedBusinessLayer->find($feedId, $userId); // if its the first launch, those values will be null } elseif($feedType === null){ - throw new BLException(''); + throw new BusinessLayerException(''); } - } catch (BLException $ex){ + } catch (BusinessLayerException $ex){ $feedId = 0; $feedType = FeedType::SUBSCRIPTIONS; } @@ -120,13 +121,13 @@ class FeedController extends Controller { $userId = $this->api->getUserId(); try { - $feed = $this->feedBl->create($url, $parentFolderId, $userId); + $feed = $this->feedBusinessLayer->create($url, $parentFolderId, $userId); $params = array( 'feeds' => array($feed) ); return $this->renderJSON($params); - } catch(BLException $ex) { + } catch(BusinessLayerException $ex) { return $this->renderJSON(array(), $ex->getMessage()); } @@ -142,7 +143,7 @@ class FeedController extends Controller { $feedId = (int) $this->params('feedId'); $userId = $this->api->getUserId(); - $this->feedBl->delete($feedId, $userId); + $this->feedBusinessLayer->delete($feedId, $userId); return $this->renderJSON(); } @@ -154,16 +155,21 @@ class FeedController extends Controller { * @Ajax */ public function update(){ - $feedId = (int) $this->params('feedId'); - $userId = $this->api->getUserId(); + try { + $feedId = (int) $this->params('feedId'); + $userId = $this->api->getUserId(); - $feed = $this->feedBl->update($feedId, $userId); + $feed = $this->feedBusinessLayer->update($feedId, $userId); - $params = array( - 'feeds' => array($feed) - ); + $params = array( + 'feeds' => array($feed) + ); - return $this->renderJSON($params); + return $this->renderJSON($params); + + } catch(BusinessLayerException $ex) { + return $this->renderJSON(array(), $ex->getMessage()); + } } @@ -177,7 +183,7 @@ class FeedController extends Controller { $parentFolderId = (int) $this->params('parentFolderId'); $userId = $this->api->getUserId(); - $this->feedBl->move($feedId, $parentFolderId, $userId); + $this->feedBusinessLayer->move($feedId, $parentFolderId, $userId); return $this->renderJSON(); } diff --git a/controller/foldercontroller.php b/controller/foldercontroller.php index f905ddddf..f7934ae67 100644 --- a/controller/foldercontroller.php +++ b/controller/foldercontroller.php @@ -29,17 +29,18 @@ use \OCA\AppFramework\Controller\Controller; use \OCA\AppFramework\Core\API; use \OCA\AppFramework\Http\Request; -use \OCA\News\Bl\FolderBl; -use \OCA\News\Bl\BLException; +use \OCA\News\BusinessLayer\FolderBusinessLayer; +use \OCA\News\BusinessLayer\BusinessLayerException; class FolderController extends Controller { - private $folderBl; + private $folderBusinessLayer; - public function __construct(API $api, Request $request, FolderBl $folderBl){ + public function __construct(API $api, Request $request, + FolderBusinessLayer $folderBusinessLayer){ parent::__construct($api, $request); - $this->folderBl = $folderBl; + $this->folderBusinessLayer = $folderBusinessLayer; } @@ -49,7 +50,7 @@ class FolderController extends Controller { * @Ajax */ public function folders(){ - $folders = $this->folderBl->findAll($this->api->getUserId()); + $folders = $this->folderBusinessLayer->findAll($this->api->getUserId()); $result = array( 'folders' => $folders ); @@ -61,7 +62,7 @@ class FolderController extends Controller { $userId = $this->api->getUserId(); $folderId = (int) $this->params('folderId'); - $this->folderBl->open($folderId, $isOpened, $userId); + $this->folderBusinessLayer->open($folderId, $isOpened, $userId); } /** @@ -96,14 +97,14 @@ class FolderController extends Controller { $folderName = $this->params('folderName'); try { - $folder = $this->folderBl->create($folderName, $userId); + $folder = $this->folderBusinessLayer->create($folderName, $userId); $params = array( 'folders' => array($folder) ); return $this->renderJSON($params); - } catch (BLException $ex){ + } catch (BusinessLayerException $ex){ return $this->renderJSON(array(), $ex->getMessage()); } @@ -120,7 +121,7 @@ class FolderController extends Controller { $userId = $this->api->getUserId(); $folderId = (int) $this->params('folderId'); - $this->folderBl->delete($folderId, $userId); + $this->folderBusinessLayer->delete($folderId, $userId); return $this->renderJSON(); } @@ -137,14 +138,14 @@ class FolderController extends Controller { $folderId = (int) $this->params('folderId'); try { - $folder = $this->folderBl->rename($folderId, $folderName, $userId); + $folder = $this->folderBusinessLayer->rename($folderId, $folderName, $userId); $params = array( 'folders' => array($folder) ); return $this->renderJSON($params); - } catch (BLException $ex){ + } catch (BusinessLayerException $ex){ return $this->renderJSON(array(), $ex->getMessage()); } diff --git a/controller/itemcontroller.php b/controller/itemcontroller.php index c911fa3c6..cfdfc4156 100644 --- a/controller/itemcontroller.php +++ b/controller/itemcontroller.php @@ -29,16 +29,17 @@ use \OCA\AppFramework\Controller\Controller; use \OCA\AppFramework\Core\API; use \OCA\AppFramework\Http\Request; -use \OCA\News\Bl\ItemBl; +use \OCA\News\BusinessLayer\ItemBusinessLayer; class ItemController extends Controller { - private $itemBl; + private $itemBusinessLayer; - public function __construct(API $api, Request $request, ItemBl $itemBl){ + public function __construct(API $api, Request $request, + ItemBusinessLayer $itemBusinessLayer){ parent::__construct($api, $request); - $this->itemBl = $itemBl; + $this->itemBusinessLayer = $itemBusinessLayer; } @@ -60,11 +61,11 @@ class ItemController extends Controller { if($limit !== null){ $offset = (int) $this->params('offset', 0); - $items = $this->itemBl->findAll($id, $type, (int) $limit, $offset, + $items = $this->itemBusinessLayer->findAll($id, $type, (int) $limit, $offset, $showAll, $userId); } else { $updatedSince = (int) $this->params('updatedSince'); - $items = $this->itemBl->findAllNew($id, $type, $updatedSince, + $items = $this->itemBusinessLayer->findAllNew($id, $type, $updatedSince, $showAll, $userId); } @@ -83,7 +84,7 @@ class ItemController extends Controller { */ public function starred(){ $userId = $this->api->getUserId(); - $starredCount = $this->itemBl->starredCount($userId); + $starredCount = $this->itemBusinessLayer->starredCount($userId); $params = array( 'starred' => (int) $starredCount @@ -98,7 +99,7 @@ class ItemController extends Controller { $feedId = (int) $this->params('feedId'); $guidHash = $this->params('guidHash'); - $this->itemBl->star($feedId, $guidHash, $isStarred, $userId); + $this->itemBusinessLayer->star($feedId, $guidHash, $isStarred, $userId); } @@ -130,7 +131,7 @@ class ItemController extends Controller { $userId = $this->api->getUserId(); $itemId = (int) $this->params('itemId'); - $this->itemBl->read($itemId, $isRead, $userId); + $this->itemBusinessLayer->read($itemId, $isRead, $userId); } /** @@ -167,7 +168,7 @@ class ItemController extends Controller { $feedId = (int) $this->params('feedId'); $highestItemId = (int) $this->params('highestItemId'); - $this->itemBl->readFeed($feedId, $highestItemId, $userId); + $this->itemBusinessLayer->readFeed($feedId, $highestItemId, $userId); return $this->renderJSON(); } diff --git a/dependencyinjection/dicontainer.php b/dependencyinjection/dicontainer.php index c2d4b44e4..d828dd9fb 100644 --- a/dependencyinjection/dicontainer.php +++ b/dependencyinjection/dicontainer.php @@ -34,9 +34,9 @@ use OCA\News\Controller\ItemController; use OCA\News\Controller\ExportController; use OCA\News\Controller\UserSettingsController; -use OCA\News\Bl\FolderBl; -use OCA\News\Bl\FeedBl; -use OCA\News\Bl\ItemBl; +use OCA\News\BusinessLayer\FolderBusinessLayer; +use OCA\News\BusinessLayer\FeedBusinessLayer; +use OCA\News\BusinessLayer\ItemBusinessLayer; use OCA\News\Db\FolderMapper; use OCA\News\Db\FeedMapper; @@ -78,43 +78,43 @@ class DIContainer extends BaseContainer { }); $this['FolderController'] = $this->share(function($c){ - return new FolderController($c['API'], $c['Request'], $c['FolderBl']); + return new FolderController($c['API'], $c['Request'], $c['FolderBusinessLayer']); }); $this['FeedController'] = $this->share(function($c){ - return new FeedController($c['API'], $c['Request'], $c['FeedBl'], - $c['FolderBl']); + return new FeedController($c['API'], $c['Request'], $c['FeedBusinessLayer'], + $c['FolderBusinessLayer']); }); $this['ItemController'] = $this->share(function($c){ - return new ItemController($c['API'], $c['Request'], $c['ItemBl']); + return new ItemController($c['API'], $c['Request'], $c['ItemBusinessLayer']); }); $this['ExportController'] = $this->share(function($c){ - return new ExportController($c['API'], $c['Request'], $c['FeedBl'], - $c['FolderBl'], $c['OPMLExporter']); + return new ExportController($c['API'], $c['Request'], $c['FeedBusinessLayer'], + $c['FolderBusinessLayer'], $c['OPMLExporter']); }); $this['UserSettingsController'] = $this->share(function($c){ return new UserSettingsController($c['API'], $c['Request'], - $c['ItemBl']); + $c['ItemBusinessLayer']); }); /** * Business Layer */ - $this['FolderBl'] = $this->share(function($c){ - return new FolderBl($c['FolderMapper'], $c['API']); + $this['FolderBusinessLayer'] = $this->share(function($c){ + return new FolderBusinessLayer($c['FolderMapper'], $c['API']); }); - $this['FeedBl'] = $this->share(function($c){ - return new FeedBl($c['FeedMapper'], $c['Fetcher'], + $this['FeedBusinessLayer'] = $this->share(function($c){ + return new FeedBusinessLayer($c['FeedMapper'], $c['Fetcher'], $c['ItemMapper'], $c['API']); }); - $this['ItemBl'] = $this->share(function($c){ - return new ItemBl($c['ItemMapper'], $c['StatusFlag'], + $this['ItemBusinessLayer'] = $this->share(function($c){ + return new ItemBusinessLayer($c['ItemMapper'], $c['StatusFlag'], $c['autoPurgeCount']); }); diff --git a/js/app/app.coffee b/js/app/app.coffee index 9a8e54d6a..2042a9ebf 100644 --- a/js/app/app.coffee +++ b/js/app/app.coffee @@ -30,13 +30,13 @@ angular.module('News', ['OC', 'ui']).config ($provide) -> itemBatchSize: 20 -angular.module('News').run ['Persistence', 'Config', 'FeedBl', -(Persistence, Config, FeedBl) -> +angular.module('News').run ['Persistence', 'Config', 'FeedBusinessLayer', +(Persistence, Config, FeedBusinessLayer) -> Persistence.init() setInterval -> - FeedBl.updateFeeds() + FeedBusinessLayer.updateFeeds() , Config.feedUpdateInterval ] diff --git a/js/app/controllers/feedcontroller.coffee b/js/app/controllers/feedcontroller.coffee index e9171a455..3d8755cad 100644 --- a/js/app/controllers/feedcontroller.coffee +++ b/js/app/controllers/feedcontroller.coffee @@ -22,25 +22,27 @@ License along with this library. If not, see . angular.module('News').controller 'FeedController', -['$scope', '_ExistsError', 'Persistence', 'FolderBl', 'FeedBl', -'SubscriptionsBl', 'StarredBl', 'unreadCountFormatter', -($scope, _ExistsError, Persistence, FolderBl, FeedBl, SubscriptionsBl, -StarredBl, unreadCountFormatter) -> +['$scope', '_ExistsError', 'Persistence', 'FolderBusinessLayer', +'FeedBusinessLayer', 'SubscriptionsBusinessLayer', 'StarredBusinessLayer', +'unreadCountFormatter', +($scope, _ExistsError, Persistence, FolderBusinessLayer, FeedBusinessLayer, +SubscriptionsBusinessLayer, StarredBusinessLayer, unreadCountFormatter) -> class FeedController - constructor: (@_$scope, @_persistence, @_folderBl, @_feedBl, - @_subscriptionsBl, @_starredBl, @_unreadCountFormatter) -> + constructor: (@_$scope, @_persistence, @_folderBusinessLayer, + @_feedBusinessLayer, @_subscriptionsBusinessLayer, + @_starredBusinessLayer, @_unreadCountFormatter) -> @_isAddingFolder = false @_isAddingFeed = false # bind internal stuff to scope - @_$scope.folderBl = @_folderBl - @_$scope.feedBl = @_feedBl - @_$scope.subscriptionsBl = @_subscriptionsBl - @_$scope.starredBl = @_starredBl + @_$scope.folderBusinessLayer = @_folderBusinessLayer + @_$scope.feedBusinessLayer = @_feedBusinessLayer + @_$scope.subscriptionsBusinessLayer = @_subscriptionsBusinessLayer + @_$scope.starredBusinessLayer = @_starredBusinessLayer @_$scope.unreadCountFormatter = @_unreadCountFormatter @@ -58,13 +60,13 @@ StarredBl, unreadCountFormatter) -> @_isAddingFeed = true # set folder to open if parentFolderId != 0 - @_folderBl.open(parentFolderId) - @_feedBl.create feedUrl, parentFolderId + @_folderBusinessLayer.open(parentFolderId) + @_feedBusinessLayer.create feedUrl, parentFolderId # on success , (data) => @_$scope.feedUrl = '' @_isAddingFeed = false - @_feedBl.load(data['feeds'][0].id) + @_feedBusinessLayer.load(data['feeds'][0].id) # on error , => @_isAddingFeed = false @@ -83,7 +85,7 @@ StarredBl, unreadCountFormatter) -> try @_isAddingFolder = true - @_folderBl.create folderName + @_folderBusinessLayer.create folderName # on success , (data) => @@ -91,7 +93,7 @@ StarredBl, unreadCountFormatter) -> @_$scope.addNewFolder = false @_isAddingFolder = false activeId = data['folders'][0].id - @_$scope.folderId = @_folderBl.getById(activeId) + @_$scope.folderId = @_folderBusinessLayer.getById(activeId) # on error , => @_isAddingFolder = false @@ -106,10 +108,11 @@ StarredBl, unreadCountFormatter) -> @_$scope.$on 'moveFeedToFolder', (scope, data) => - @_feedBl.move(data.feedId, data.folderId) + @_feedBusinessLayer.move(data.feedId, data.folderId) - return new FeedController($scope, Persistence, FolderBl, FeedBl, - SubscriptionsBl, StarredBl, unreadCountFormatter) + return new FeedController($scope, Persistence, FolderBusinessLayer, + FeedBusinessLayer, SubscriptionsBusinessLayer, + StarredBusinessLayer, unreadCountFormatter) ] \ No newline at end of file diff --git a/js/app/controllers/itemcontroller.coffee b/js/app/controllers/itemcontroller.coffee index 52f1c271a..bdc35c855 100644 --- a/js/app/controllers/itemcontroller.coffee +++ b/js/app/controllers/itemcontroller.coffee @@ -22,15 +22,17 @@ License along with this library. If not, see . angular.module('News').controller 'ItemController', -['$scope', 'ItemBl', 'FeedModel', 'FeedLoading', 'FeedBl', 'Language', -($scope, ItemBl, FeedModel, FeedLoading, FeedBl, Language) -> +['$scope', 'ItemBusinessLayer', 'FeedModel', 'FeedLoading', 'FeedBusinessLayer', +'Language', +($scope, ItemBusinessLayer, FeedModel, FeedLoading, FeedBusinessLayer, +Language) -> class ItemController - constructor: (@_$scope, @_itemBl, @_feedModel, @_feedLoading, - @_feedBl, @_language) -> - @_$scope.itemBl = @_itemBl - @_$scope.feedBl = @_feedBl + constructor: (@_$scope, @_itemBusinessLayer, @_feedModel, @_feedLoading, + @_feedBusinessLayer, @_language) -> + @_$scope.itemBusinessLayer = @_itemBusinessLayer + @_$scope.feedBusinessLayer = @_feedBusinessLayer @_$scope.isLoading = => return @_feedLoading.isLoading() @@ -50,6 +52,6 @@ angular.module('News').controller 'ItemController', - return new ItemController($scope, ItemBl, FeedModel, FeedLoading, FeedBl, - Language) + return new ItemController($scope, ItemBusinessLayer, FeedModel, FeedLoading, + FeedBusinessLayer, Language) ] \ No newline at end of file diff --git a/js/app/controllers/settingscontroller.coffee b/js/app/controllers/settingscontroller.coffee index 3c6a7771e..a1632a761 100644 --- a/js/app/controllers/settingscontroller.coffee +++ b/js/app/controllers/settingscontroller.coffee @@ -22,17 +22,17 @@ License along with this library. If not, see . angular.module('News').controller 'SettingsController', -['$scope', 'FeedBl', 'FolderBl', 'ShowAll', -($scope, FeedBl, FolderBl, ShowAll) -> +['$scope', 'FeedBusinessLayer', 'FolderBusinessLayer', 'ShowAll', +($scope, FeedBusinessLayer, FolderBusinessLayer, ShowAll) -> - $scope.feedBl = FeedBl + $scope.feedBusinessLayer = FeedBusinessLayer $scope.import = (fileContent) => $scope.error = false ShowAll.setShowAll(true) try - FolderBl.import(fileContent) + FolderBusinessLayer.import(fileContent) catch error console.error error $scope.error = true diff --git a/js/app/services/bl/bl.coffee b/js/app/services/bl/bl.coffee deleted file mode 100644 index 27e4d321a..000000000 --- a/js/app/services/bl/bl.coffee +++ /dev/null @@ -1,45 +0,0 @@ -### - -ownCloud - News - -@author Bernhard Posselt -@copyright 2012 Bernhard Posselt nukeawhale@gmail.com - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE -License as published by the Free Software Foundation; either -version 3 of the License, or any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU AFFERO GENERAL PUBLIC LICENSE for more details. - -You should have received a copy of the GNU Affero General Public -License along with this library. If not, see . - -### - - -angular.module('News').factory '_Bl', -> - - class Bl - - constructor: (@_activeFeed, @_persistence, @_itemModel, @_type) -> - - - load: (id) -> - if @_type != @_activeFeed.getType() or id != @_activeFeed.getId() - @_itemModel.clear() - @_persistence.getItems(@_type, id, 0) - @_activeFeed.handle({id: id, type: @_type}) - else - lastModified = @_itemModel.getHighestId() - @_persistence.getItems(@_type, id, 0, null, lastModified) - - - isActive: (id) -> - return @_activeFeed.getType() == @_type && @_activeFeed.getId() == id - - - return Bl \ No newline at end of file diff --git a/js/app/services/bl/feedbl.coffee b/js/app/services/bl/feedbl.coffee deleted file mode 100644 index 38aa5bff0..000000000 --- a/js/app/services/bl/feedbl.coffee +++ /dev/null @@ -1,177 +0,0 @@ -### - -ownCloud - News - -@author Bernhard Posselt -@copyright 2012 Bernhard Posselt nukeawhale@gmail.com - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE -License as published by the Free Software Foundation; either -version 3 of the License, or any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU AFFERO GENERAL PUBLIC LICENSE for more details. - -You should have received a copy of the GNU Affero General Public -License along with this library. If not, see . - -### - - -angular.module('News').factory 'FeedBl', -['_Bl', 'ShowAll', 'Persistence', 'ActiveFeed', 'FeedType', 'ItemModel', -'FeedModel', 'NewLoading', '_ExistsError', 'Utils', -(_Bl, ShowAll, Persistence, ActiveFeed, FeedType, ItemModel, FeedModel, -NewLoading, _ExistsError, Utils) -> - - class FeedBl extends _Bl - - constructor: (@_showAll, @_feedModel, persistence, activeFeed, feedType, - itemModel, @_newLoading, @_utils) -> - super(activeFeed, persistence, itemModel, feedType.Feed) - - - getUnreadCount: (feedId) -> - @_feedModel.getFeedUnreadCount(feedId) - - - getFeedsOfFolder: (folderId) -> - return @_feedModel.getAllOfFolder(folderId) - - - getFolderUnreadCount: (folderId) -> - @_feedModel.getFolderUnreadCount(folderId) - - - getAllUnreadCount: -> - return @_feedModel.getUnreadCount() - - - delete: (feedId) -> - @_feedModel.removeById(feedId) - @_persistence.deleteFeed(feedId) - - - markFeedRead: (feedId) -> - feed = @_feedModel.getById(feedId) - if angular.isDefined(feed) - feed.unreadCount = 0 - highestItemId = @_itemModel.getHighestId() - @_persistence.setFeedRead(feedId, highestItemId) - for item in @_itemModel.getAll() - item.setRead() - - - markAllRead: -> - for feed in @_feedModel.getAll() - @markFeedRead(feed.id) - - - getNumberOfFeeds: -> - return @_feedModel.size() - - - isVisible: (feedId) -> - if @isActive(feedId) or @_showAll.getShowAll() - return true - else - return @_feedModel.getFeedUnreadCount(feedId) > 0 - - - move: (feedId, folderId) -> - feed = @_feedModel.getById(feedId) - if angular.isDefined(feed) and feed.folderId != folderId - @_feedModel.update({ - id: feedId, - folderId: folderId, - urlHash: feed.urlHash}) - @_persistence.moveFeed(feedId, folderId) - - - setShowAll: (showAll) -> - @_showAll.setShowAll(showAll) - - # TODO: this callback is not tested with a unittest - callback = => - @_itemModel.clear() - @_newLoading.increase() - @_persistence.getItems( - @_activeFeed.getType(), - @_activeFeed.getId(), - 0, - => - @_newLoading.decrease() - ) - if showAll - @_persistence.userSettingsReadShow(callback) - else - @_persistence.userSettingsReadHide(callback) - - - isShowAll: -> - return @_showAll.getShowAll() - - - getAll: -> - return @_feedModel.getAll() - - - getFeedLink: (feedId) -> - feed = @_feedModel.getById(feedId) - if angular.isDefined(feed) - return feed.link - - - create: (url, parentId=0, onSuccess=null, onFailure=null) -> - onSuccess or= -> - onFailure or= -> - parentId = parseInt(parentId, 10) - - if angular.isUndefined(url) or url.trim() == '' - throw new Error() - - url = url.trim() - urlHash = hex_md5(url) - - if @_feedModel.getByUrlHash(urlHash) - throw new _ExistsError() - - feed = - title: url.replace( - /^(?:https?:\/\/)?(?:www\.)?([a-z0-9_\-\.]+)(?:\/.*)?$/gi, - '$1') - url: url - urlHash: urlHash - folderId: parentId - unreadCount: 0 - faviconLink: 'url('+@_utils.imagePath('core', 'loading.gif')+')' - - @_feedModel.add(feed) - - success = (response) => - if response.status == 'error' - feed.error = response.msg - onFailure() - else - onSuccess(response.data) - - @_persistence.createFeed(url, parentId, success) - - - markErrorRead: (urlHash) -> - @_feedModel.removeByUrlHash(urlHash) - - - updateFeeds: -> - for feed in @_feedModel.getAll() - if angular.isDefined(feed.id) - @_persistence.updateFeed(feed.id) - - - return new FeedBl(ShowAll, FeedModel,