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 --- 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 +++++++ 12 files changed, 610 insertions(+), 604 deletions(-) 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 (limited to 'js/app/services') 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, Persistence, ActiveFeed, FeedType, - ItemModel, NewLoading, Utils) - -] \ No newline at end of file diff --git a/js/app/services/bl/folderbl.coffee b/js/app/services/bl/folderbl.coffee deleted file mode 100644 index 42c1d9752..000000000 --- a/js/app/services/bl/folderbl.coffee +++ /dev/null @@ -1,158 +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 'FolderBl', -['_Bl', 'FolderModel', 'FeedBl', 'Persistence', 'FeedType', 'ActiveFeed', -'ItemModel', 'ShowAll', '_ExistsError', 'OPMLParser', -(_Bl, FolderModel, FeedBl, Persistence, FeedType, ActiveFeed, -ItemModel, ShowAll, _ExistsError, OPMLParser)-> - - class FolderBl extends _Bl - - constructor: (@_folderModel, @_feedBl, @_showAll, activeFeed, - persistence, @_feedType, itemModel, @_opmlParser) -> - super(activeFeed, persistence, itemModel, @_feedType.Folder) - - - getById: (folderId) -> - return @_folderModel.getById(folderId) - - delete: (folderId) -> - @_folderModel.removeById(folderId) - @_persistence.deleteFolder(folderId) - - - hasFeeds: (folderId) -> - return @_feedBl.getFeedsOfFolder(folderId).length - - - open: (folderId) -> - folder = @_folderModel.getById(folderId) - if angular.isDefined(folder) - if not folder.opened - folder.opened = true - @_persistence.openFolder(folder.id) - - - toggleFolder: (folderId) -> - folder = @_folderModel.getById(folderId) - - if angular.isDefined(folder) - folder.opened = !folder.opened - if folder.opened - @_persistence.openFolder(folder.id) - else - @_persistence.collapseFolder(folder.id) - - - markFolderRead: (folderId) -> - for feed in @_feedBl.getFeedsOfFolder(folderId) - @_feedBl.markFeedRead(feed.id) - - - getUnreadCount: (folderId) -> - return @_feedBl.getFolderUnreadCount(folderId) - - - isVisible: (folderId) -> - if @_showAll.getShowAll() - return true - else - if @isActive(folderId) or - @_feedBl.getFolderUnreadCount(folderId) > 0 - return true - if @_activeFeed.getType() == @_feedType.Feed - for feed in @_feedBl.getFeedsOfFolder(folderId) - if feed.id == @_activeFeed.getId() - return true - return false - - - getAll: -> - return @_folderModel.getAll() - - - create: (folderName, onSuccess=null, onFailure=null) -> - onSuccess or= -> - onFailure or= -> - - if angular.isUndefined(folderName) or folderName.trim() == '' - throw new Error() - - folderName = folderName.trim() - - if @_folderModel.getByName(folderName) - throw new _ExistsError() - - folder = - name: folderName - opened: true - - @_folderModel.add(folder) - - success = (response) => - if response.status == 'error' - folder.error = response.msg - onFailure() - else - onSuccess(response.data) - - @_persistence.createFolder folderName, 0, success - - - markErrorRead: (folderName) -> - @_folderModel.removeByName(folderName) - - - import: (xml) -> - opml = @_opmlParser.parseXML(xml) - @_importElement(opml, 0) - - - _importElement: (opml, parentFolderId) -> - for item in opml.getItems() - if item.isFolder() - do (item) => - try - @create item.getName(), (data) => - @_importElement(item, data.folders[0].id) - catch error - if error instanceof _ExistsError - folder = @_folderModel.getByName(item.getName()) - @open(folder.id) - @_importElement(item, folder.id) - else - console.info error - else - try - do (item) => - @_feedBl.create(item.getUrl(), parentFolderId) - catch error - if not error instanceof _ExistsError - console.info error - - - return new FolderBl(FolderModel, FeedBl, ShowAll, ActiveFeed, Persistence, - FeedType, ItemModel, OPMLParser) - -] \ No newline at end of file diff --git a/js/app/services/bl/itembl.coffee b/js/app/services/bl/itembl.coffee deleted file mode 100644 index 6a09400af..000000000 --- a/js/app/services/bl/itembl.coffee +++ /dev/null @@ -1,113 +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 'ItemBl', -['ItemModel', 'FeedModel', 'Persistence', 'ActiveFeed', 'FeedType', 'StarredBl', -(ItemModel, FeedModel, Persistence, ActiveFeed, FeedType, StarredBl) -> - - class ItemBl - - constructor: (@_itemModel, @_feedModel, @_persistence, @_activeFeed, - @_feedType, @_starredBl) -> - - getAll: -> - return @_itemModel.getAll() - - - noFeedActive: -> - return @_activeFeed.getType() != @_feedType.Feed - - - isKeptUnread: (itemId) -> - item = @_itemModel.getById(itemId) - if angular.isDefined(item) and angular.isDefined(item.keptUnread) - return item.keptUnread - return false - - - toggleKeepUnread: (itemId) -> - item = @_itemModel.getById(itemId) - if angular.isDefined(item) and not item.keptUnread - item.keptUnread = true - if item.isRead() - @setUnread(itemId) - else - item.keptUnread = false - - - toggleStarred: (itemId) -> - item = @_itemModel.getById(itemId) - if item.isStarred() - item.setUnstarred() - @_starredBl.decreaseCount() - @_persistence.unstarItem(item.feedId, item.guidHash) - else - item.setStarred() - @_starredBl.increaseCount() - @_persistence.starItem(item.feedId, item.guidHash) - - - setRead: (itemId) -> - item = @_itemModel.getById(itemId) - if angular.isDefined(item) - if not item.isRead() - item.setRead() - @_persistence.readItem(itemId) - - feed = @_feedModel.getById(item.feedId) - if angular.isDefined(feed) - feed.unreadCount -= 1 - - - setUnread: (itemId) -> - item = @_itemModel.getById(itemId) - if angular.isDefined(item) - if item.isRead() - item.setUnread() - @_persistence.unreadItem(itemId) - - feed = @_feedModel.getById(item.feedId) - if angular.isDefined(feed) - feed.unreadCount += 1 - - - getFeedTitle: (itemId) -> - item = @_itemModel.getById(itemId) - if angular.isDefined(item) - feed = @_feedModel.getById(item.feedId) - if angular.isDefined(feed) - return feed.title - - - loadNext: -> - - - - loadNew: -> - - - - return new ItemBl(ItemModel, FeedModel, Persistence, ActiveFeed, FeedType, - StarredBl) - -] \ No newline at end of file diff --git a/js/app/services/bl/starredbl.coffee b/js/app/services/bl/starredbl.coffee deleted file mode 100644 index 176973e04..000000000 --- a/js/app/services/bl/starredbl.coffee +++ /dev/null @@ -1,54 +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 'StarredBl', -['_Bl', 'StarredCount', 'Persistence', 'ActiveFeed', 'FeedType', 'ItemModel', -(_Bl, StarredCount, Persistence, ActiveFeed, FeedType, ItemModel) -> - - class StarredBl extends _Bl - - constructor: (@_starredCount, feedType, - persistence, activeFeed, itemModel) -> - super(activeFeed, persistence, itemModel, feedType.Starred) - - isVisible: -> - if @isActive(0) - return true - else - return @_starredCount.getStarredCount() > 0 - - - getUnreadCount: -> - return @_starredCount.getStarredCount() - - - increaseCount: -> - @_starredCount.setStarredCount(@_starredCount.getStarredCount() + 1) - - - decreaseCount: -> - @_starredCount.setStarredCount(@_starredCount.getStarredCount() - 1) - - return new StarredBl(StarredCount, FeedType, Persistence, - ActiveFeed, ItemModel) -] diff --git a/js/app/services/bl/subscriptionsbl.coffee b/js/app/services/bl/subscriptionsbl.coffee deleted file mode 100644 index 102ae8c44..000000000 --- a/js/app/services/bl/subscriptionsbl.coffee +++ /dev/null @@ -1,57 +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 'SubscriptionsBl', -['_Bl', 'FeedBl', 'Persistence', 'ShowAll', 'ActiveFeed', 'FeedType', -'ItemModel', -(_Bl, FeedBl, Persistence, ShowAll, ActiveFeed, FeedType, ItemModel) -> - - class SubscriptionsBl extends _Bl - - constructor: (@_feedBl, @_showAll, feedType, - persistence, activeFeed, itemModel) -> - super(activeFeed, persistence, itemModel, feedType.Subscriptions) - - isVisible: -> - if @isActive(0) - return true - - if @_showAll.getShowAll() - return @_feedBl.getNumberOfFeeds() > 0 - else - visible = @_feedBl.getNumberOfFeeds() > 0 && - @_feedBl.getAllUnreadCount() > 0 - return visible - - - markAllRead: -> - @_feedBl.markAllRead() - - - getUnreadCount: -> - return @_feedBl.getAllUnreadCount() - - - return new SubscriptionsBl(FeedBl, ShowAll, FeedType, Persistence, - ActiveFeed, ItemModel) -] diff --git a/js/app/services/businesslayer/businesslayer.coffee b/js/app/services/businesslayer/businesslayer.coffee new file mode 100644 index 000000000..7cfbb703c --- /dev/null +++ b/js/app/services/businesslayer/businesslayer.coffee @@ -0,0 +1,45 @@ +### + +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 '_BusinessLayer', -> + + class BusinessLayer + + 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 BusinessLayer \ No newline at end of file diff --git a/js/app/services/businesslayer/feedbusinesslayer.coffee b/js/app/services/businesslayer/feedbusinesslayer.coffee new file mode 100644 index 000000000..2540cfc5f --- /dev/null +++ b/js/app/services/businesslayer/feedbusinesslayer.coffee @@ -0,0 +1,177 @@ +### + +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 'FeedBusinessLayer', +['_BusinessLayer', 'ShowAll', 'Persistence', 'ActiveFeed', 'FeedType', +'ItemModel', 'FeedModel', 'NewLoading', '_ExistsError', 'Utils', +(_BusinessLayer, ShowAll, Persistence, ActiveFeed, FeedType, ItemModel, +FeedModel, NewLoading, _ExistsError, Utils) -> + + class FeedBusinessLayer extends _BusinessLayer + + 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 FeedBusinessLayer(ShowAll, FeedModel, Persistence, ActiveFeed, + FeedType, ItemModel, NewLoading, Utils) + +] \ No newline at end of file diff --git a/js/app/services/businesslayer/folderbusinesslayer.coffee b/js/app/services/businesslayer/folderbusinesslayer.coffee new file mode 100644 index 000000000..969783222 --- /dev/null +++ b/js/app/services/businesslayer/folderbusinesslayer.coffee @@ -0,0 +1,160 @@ +### + +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 'FolderBusinessLayer', +['_BusinessLayer', 'FolderModel', 'FeedBusinessLayer', 'Persistence', +'FeedType', 'ActiveFeed', 'ItemModel', 'ShowAll', '_ExistsError', 'OPMLParser', +(_BusinessLayer, FolderModel, FeedBusinessLayer, Persistence, FeedType, +ActiveFeed, ItemModel, ShowAll, _ExistsError, OPMLParser) -> + + class FolderBusinessLayer extends _BusinessLayer + + constructor: (@_folderModel, @_feedBusinessLayer, @_showAll, activeFeed, + persistence, @_feedType, itemModel, @_opmlParser) -> + super(activeFeed, persistence, itemModel, @_feedType.Folder) + + + getById: (folderId) -> + return @_folderModel.getById(folderId) + + delete: (folderId) -> + @_folderModel.removeById(folderId) + @_persistence.deleteFolder(folderId) + + + hasFeeds: (folderId) -> + return @_feedBusinessLayer.getFeedsOfFolder(folderId).length + + + open: (folderId) -> + folder = @_folderModel.getById(folderId) + if angular.isDefined(folder) + if not folder.opened + folder.opened = true + @_persistence.openFolder(folder.id) + + + toggleFolder: (folderId) -> + folder = @_folderModel.getById(folderId) + + if angular.isDefined(folder) + folder.opened = !folder.opened + if folder.opened + @_persistence.openFolder(folder.id) + else + @_persistence.collapseFolder(folder.id) + + + markFolderRead: (folderId) -> + for feed in @_feedBusinessLayer.getFeedsOfFolder(folderId) + @_feedBusinessLayer.markFeedRead(feed.id) + + + getUnreadCount: (folderId) -> + return @_feedBusinessLayer.getFolderUnreadCount(folderId) + + + isVisible: (folderId) -> + if @_showAll.getShowAll() + return true + else + if @isActive(folderId) or + @_feedBusinessLayer.getFolderUnreadCount(folderId) > 0 + return true + if @_activeFeed.getType() == @_feedType.Feed + for feed in @_feedBusinessLayer.getFeedsOfFolder(folderId) + if feed.id == @_activeFeed.getId() + return true + return false + + + getAll: -> + return @_folderModel.getAll() + + + create: (folderName, onSuccess=null, onFailure=null) -> + onSuccess or= -> + onFailure or= -> + + if angular.isUndefined(folderName) or folderName.trim() == '' + throw new Error() + + folderName = folderName.trim() + + if @_folderModel.getByName(folderName) + throw new _ExistsError() + + folder = + name: folderName + opened: true + + @_folderModel.add(folder) + + success = (response) => + if response.status == 'error' + folder.error = response.msg + onFailure() + else + onSuccess(response.data) + + @_persistence.createFolder folderName, 0, success + + + markErrorRead: (folderName) -> + @_folderModel.removeByName(folderName) + + + import: (xml) -> + opml = @_opmlParser.parseXML(xml) + @_importElement(opml, 0) + + + _importElement: (opml, parentFolderId) -> + for item in opml.getItems() + if item.isFolder() + do (item) => + try + @create item.getName(), (data) => + @_importElement(item, data.folders[0].id) + catch error + if error instanceof _ExistsError + folder = @_folderModel.getByName(item.getName()) + @open(folder.id) + @_importElement(item, folder.id) + else + console.info error + else + try + do (item) => + @_feedBusinessLayer.create(item.getUrl(), + parentFolderId) + catch error + if not error instanceof _ExistsError + console.info error + + + return new FolderBusinessLayer(FolderModel, FeedBusinessLayer, ShowAll, + ActiveFeed, Persistence, FeedType, ItemModel, + OPMLParser) + +] \ No newline at end of file diff --git a/js/app/services/businesslayer/itembusinesslayer.coffee b/js/app/services/businesslayer/itembusinesslayer.coffee new file mode 100644 index 000000000..294be1f40 --- /dev/null +++ b/js/app/services/businesslayer/itembusinesslayer.coffee @@ -0,0 +1,115 @@ +### + +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 'ItemBusinessLayer', +['ItemModel', 'FeedModel', 'Persistence', 'ActiveFeed', 'FeedType', +'StarredBusinessLayer', +(ItemModel, FeedModel, Persistence, ActiveFeed, FeedType, +StarredBusinessLayer) -> + + class ItemBusinessLayer + + constructor: (@_itemModel, @_feedModel, @_persistence, @_activeFeed, + @_feedType, @_starredBusinessLayer) -> + + getAll: -> + return @_itemModel.getAll() + + + noFeedActive: -> + return @_activeFeed.getType() != @_feedType.Feed + + + isKeptUnread: (itemId) -> + item = @_itemModel.getById(itemId) + if angular.isDefined(item) and angular.isDefined(item.keptUnread) + return item.keptUnread + return false + + + toggleKeepUnread: (itemId) -> + item = @_itemModel.getById(itemId) + if angular.isDefined(item) and not item.keptUnread + item.keptUnread = true + if item.isRead() + @setUnread(itemId) + else + item.keptUnread = false + + + toggleStarred: (itemId) -> + item = @_itemModel.getById(itemId) + if item.isStarred() + item.setUnstarred() + @_starredBusinessLayer.decreaseCount() + @_persistence.unstarItem(item.feedId, item.guidHash) + else + item.setStarred() + @_starredBusinessLayer.increaseCount() + @_persistence.starItem(item.feedId, item.guidHash) + + + setRead: (itemId) -> + item = @_itemModel.getById(itemId) + if angular.isDefined(item) + if not item.isRead() + item.setRead() + @_persistence.readItem(itemId) + + feed = @_feedModel.getById(item.feedId) + if angular.isDefined(feed) + feed.unreadCount -= 1 + + + setUnread: (itemId) -> + item = @_itemModel.getById(itemId) + if angular.isDefined(item) + if item.isRead() + item.setUnread() + @_persistence.unreadItem(itemId) + + feed = @_feedModel.getById(item.feedId) + if angular.isDefined(feed) + feed.unreadCount += 1 + + + getFeedTitle: (itemId) -> + item = @_itemModel.getById(itemId) + if angular.isDefined(item) + feed = @_feedModel.getById(item.feedId) + if angular.isDefined(feed) + return feed.title + + + loadNext: -> + + + + loadNew: -> + + + + return new ItemBusinessLayer(ItemModel, FeedModel, Persistence, ActiveFeed, + FeedType, StarredBusinessLayer) + +] \ No newline at end of file diff --git a/js/app/services/businesslayer/starredbusinesslayer.coffee b/js/app/services/businesslayer/starredbusinesslayer.coffee new file mode 100644 index 000000000..656a3befb --- /dev/null +++ b/js/app/services/businesslayer/starredbusinesslayer.coffee @@ -0,0 +1,55 @@ +### + +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 'StarredBusinessLayer', +['_BusinessLayer', 'StarredCount', 'Persistence', 'ActiveFeed', 'FeedType', +'ItemModel', +(_BusinessLayer, StarredCount, Persistence, ActiveFeed, FeedType, ItemModel) -> + + class StarredBusinessLayer extends _BusinessLayer + + constructor: (@_starredCount, feedType, + persistence, activeFeed, itemModel) -> + super(activeFeed, persistence, itemModel, feedType.Starred) + + isVisible: -> + if @isActive(0) + return true + else + return @_starredCount.getStarredCount() > 0 + + + getUnreadCount: -> + return @_starredCount.getStarredCount() + + + increaseCount: -> + @_starredCount.setStarredCount(@_starredCount.getStarredCount() + 1) + + + decreaseCount: -> + @_starredCount.setStarredCount(@_starredCount.getStarredCount() - 1) + + return new StarredBusinessLayer(StarredCount, FeedType, Persistence, + ActiveFeed, ItemModel) +] diff --git a/js/app/services/businesslayer/subscriptionsbusinesslayer.coffee b/js/app/services/businesslayer/subscriptionsbusinesslayer.coffee new file mode 100644 index 000000000..2f08504eb --- /dev/null +++ b/js/app/services/businesslayer/subscriptionsbusinesslayer.coffee @@ -0,0 +1,58 @@ +### + +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 'SubscriptionsBusinessLayer', +['_BusinessLayer', 'FeedBusinessLayer', 'Persistence', 'ShowAll', 'ActiveFeed', +'FeedType', 'ItemModel', +(_BusinessLayer, FeedBusinessLayer, Persistence, ShowAll, ActiveFeed, FeedType, +ItemModel) -> + + class SubscriptionsBusinessLayer extends _BusinessLayer + + constructor: (@_feedBusinessLayer, @_showAll, feedType, + persistence, activeFeed, itemModel) -> + super(activeFeed, persistence, itemModel, feedType.Subscriptions) + + isVisible: -> + if @isActive(0) + return true + + if @_showAll.getShowAll() + return @_feedBusinessLayer.getNumberOfFeeds() > 0 + else + visible = @_feedBusinessLayer.getNumberOfFeeds() > 0 && + @_feedBusinessLayer.getAllUnreadCount() > 0 + return visible + + + markAllRead: -> + @_feedBusinessLayer.markAllRead() + + + getUnreadCount: -> + return @_feedBusinessLayer.getAllUnreadCount() + + + return new SubscriptionsBusinessLayer(FeedBusinessLayer, ShowAll, FeedType, + Persistence, ActiveFeed, ItemModel) +] -- cgit v1.2.3