summaryrefslogtreecommitdiffstats
path: root/js/app/services/businesslayer
diff options
context:
space:
mode:
authorBernhard Posselt <nukeawhale@gmail.com>2013-04-15 16:02:32 +0200
committerBernhard Posselt <nukeawhale@gmail.com>2013-04-15 16:02:32 +0200
commit464ff6c4c1bda3edbd0f132c4d3d866539d3a117 (patch)
tree96b8fd57e24ebaab762a190a933cd98e1c7a4881 /js/app/services/businesslayer
parent89c31ab5fcb2f931fecc5ce82608ff7c8129510a (diff)
renamed bl to businesslayer, handle exception in update routine, fix #69
Diffstat (limited to 'js/app/services/businesslayer')
-rw-r--r--js/app/services/businesslayer/businesslayer.coffee45
-rw-r--r--js/app/services/businesslayer/feedbusinesslayer.coffee177
-rw-r--r--js/app/services/businesslayer/folderbusinesslayer.coffee160
-rw-r--r--js/app/services/businesslayer/itembusinesslayer.coffee115
-rw-r--r--js/app/services/businesslayer/starredbusinesslayer.coffee55
-rw-r--r--js/app/services/businesslayer/subscriptionsbusinesslayer.coffee58
6 files changed, 610 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>.
+
+###
+
+
+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 <http://www.gnu.org/licenses/>.
+
+###
+
+
+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 <http://www.gnu.org/licenses/>.
+
+###
+
+
+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 <http://www.gnu.org/licenses/>.
+
+###
+
+
+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 <http://www.gnu.org/licenses/>.
+
+###
+
+
+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 <http://www.gnu.org/licenses/>.
+
+###
+
+
+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)
+]