diff options
author | Bernhard Posselt <dev@bernhard-posselt.com> | 2014-05-23 12:53:03 +0200 |
---|---|---|
committer | Bernhard Posselt <dev@bernhard-posselt.com> | 2014-05-23 12:53:03 +0200 |
commit | f1261587eb4f8283915f18d162173a6a3a8012b0 (patch) | |
tree | 1b617ad37c0e35f051d75716c2c4d58e0ea7e6a5 /js | |
parent | c12a2504cd25ea03077a09101155654efc10d971 (diff) |
cache unread count
Diffstat (limited to 'js')
-rw-r--r-- | js/build/app.js | 81 | ||||
-rw-r--r-- | js/controller/NavigationController.js | 14 | ||||
-rw-r--r-- | js/service/FeedResource.js | 45 | ||||
-rw-r--r-- | js/service/ItemResource.js | 8 | ||||
-rw-r--r-- | js/tests/unit/controller/NavigationControllerSpec.js | 36 | ||||
-rw-r--r-- | js/tests/unit/service/FeedResourceSpec.js | 44 | ||||
-rw-r--r-- | js/tests/unit/service/ItemResourceSpec.js | 6 |
7 files changed, 209 insertions, 25 deletions
diff --git a/js/build/app.js b/js/build/app.js index cdee3ea75..40e1a4bb6 100644 --- a/js/build/app.js +++ b/js/build/app.js @@ -192,10 +192,21 @@ var $__build_47_app__ = function () { }; } ]); - app.controller('NavigationController', function () { - 'use strict'; - console.log('here'); - }); + app.controller('NavigationController', [ + 'FeedResource', + 'FolderResource', + 'ItemResource', + function (FeedResource, FolderResource, ItemResource) { + 'use strict'; + this.getFeeds = function () { + return FeedResource.getAll(); + }; + this.getFolders = function () { + return FolderResource.getAll(); + }; + console.log(ItemResource); + } + ]); app.controller('SettingsController', [ '$route', 'SettingsResource', @@ -245,9 +256,36 @@ var $__build_47_app__ = function () { 'url' ]); this.ids = {}; + this.unreadCount = 0; + this.folderUnreadCount = {}; }; var $FeedResource = FeedResource; $traceurRuntime.createClass(FeedResource, { + receive: function (data) { + $traceurRuntime.superCall(this, $FeedResource.prototype, 'receive', [data]); + this.updateUnreadCache(); + }, + updateUnreadCache: function () { + var $__14, $__15, $__16, $__17, $__18; + this.unreadCount = 0; + this.folderUnreadCount = {}; + for (var $__3 = this.values[$traceurRuntime.toProperty(Symbol.iterator)](), $__4; !($__4 = $__3.next()).done;) { + try { + throw undefined; + } catch (value) { + value = $__4.value; + { + if (value.unreadCount) { + this.unreadCount += value.unreadCount; + } + if (value.folderId !== undefined) { + $traceurRuntime.setProperty(this.folderUnreadCount, value.folderId, this.folderUnreadCount[$traceurRuntime.toProperty(value.folderId)] || 0); + $__14 = this.folderUnreadCount, $__15 = value.folderId, $__16 = value.unreadCount, $__17 = $__14[$traceurRuntime.toProperty($__15)], $__18 = $__17 + $__16, $traceurRuntime.setProperty($__14, $__15, $__18), $__18; + } + } + } + } + }, add: function (value) { $traceurRuntime.superCall(this, $FeedResource.prototype, 'add', [value]); if (value.id !== undefined) { @@ -270,20 +308,41 @@ var $__build_47_app__ = function () { } } } + this.unreadCount = 0; + this.folderUnreadCount = {}; }, markFeedRead: function (feedId) { this.ids[$traceurRuntime.toProperty(feedId)].unreadCount = 0; + this.updateUnreadCache(); + }, + markFolderRead: function (folderId) { + for (var $__3 = this.values[$traceurRuntime.toProperty(Symbol.iterator)](), $__4; !($__4 = $__3.next()).done;) { + try { + throw undefined; + } catch (feed) { + feed = $__4.value; + { + if (feed.folderId === folderId) { + feed.unreadCount = 0; + } + } + } + } + this.updateUnreadCache(); }, markItemOfFeedRead: function (feedId) { this.ids[$traceurRuntime.toProperty(feedId)].unreadCount -= 1; + this.updateUnreadCache(); }, markItemOfFeedUnread: function (feedId) { this.ids[$traceurRuntime.toProperty(feedId)].unreadCount += 1; + this.updateUnreadCache(); }, getUnreadCount: function () { - return this.values.reduce(function (sum, feed) { - return sum + feed.unreadCount; - }, 0); + return this.unreadCount; + }, + getFolderUnreadCount: function (folderId) { + return this.folderUnreadCount[$traceurRuntime.toProperty(folderId)] || 0; } }, {}, Resource); return new FeedResource($http, BASE_URL); @@ -371,7 +430,7 @@ var $__build_47_app__ = function () { data: { isStarred: isStarred } }); }, - read: function (itemId) { + markItemRead: function (itemId) { var isRead = arguments[1] !== void 0 ? arguments[1] : true; this.get(itemId).unread = !isRead; return this.http({ @@ -380,7 +439,7 @@ var $__build_47_app__ = function () { data: { isRead: isRead } }); }, - readFeed: function (feedId) { + markFeedRead: function (feedId) { var read = arguments[1] !== void 0 ? arguments[1] : true; for (var $__3 = this.values.filter(function (i) { return i.feedId === feedId; @@ -396,7 +455,7 @@ var $__build_47_app__ = function () { } return this.http.post(this.BASE_URL + '/feeds/' + feedId + '/read'); }, - readAll: function () { + markRead: function () { for (var $__3 = this.values[$traceurRuntime.toProperty(Symbol.iterator)](), $__4; !($__4 = $__3.next()).done;) { try { throw undefined; @@ -417,7 +476,7 @@ var $__build_47_app__ = function () { }, keepUnread: function (itemId) { this.get(itemId).keepUnread = true; - return this.read(itemId, false); + return this.markItemRead(itemId, false); }, clear: function () { this.highestId = 0; diff --git a/js/controller/NavigationController.js b/js/controller/NavigationController.js index 700e6bd02..bc0c13d13 100644 --- a/js/controller/NavigationController.js +++ b/js/controller/NavigationController.js @@ -7,8 +7,18 @@ * @author Bernhard Posselt <dev@bernhard-posselt.com> * @copyright Bernhard Posselt 2014 */ -app.controller('NavigationController', function () { +app.controller('NavigationController', +function (FeedResource, FolderResource, ItemResource) { 'use strict'; - console.log('here'); + this.getFeeds = () => { + return FeedResource.getAll(); + }; + + this.getFolders = () => { + return FolderResource.getAll(); + }; + + console.log(ItemResource); + });
\ No newline at end of file diff --git a/js/service/FeedResource.js b/js/service/FeedResource.js index 548c5a27c..5880c83fd 100644 --- a/js/service/FeedResource.js +++ b/js/service/FeedResource.js @@ -15,6 +15,31 @@ app.factory('FeedResource', (Resource, $http, BASE_URL) => { constructor ($http, BASE_URL) { super($http, BASE_URL, 'url'); this.ids = {}; + this.unreadCount = 0; + this.folderUnreadCount = {}; + } + + + receive (data) { + super.receive(data); + this.updateUnreadCache(); + } + + + updateUnreadCache () { + this.unreadCount = 0; + this.folderUnreadCount = {}; + + for (let value of this.values) { + if (value.unreadCount) { + this.unreadCount += value.unreadCount; + } + if (value.folderId !== undefined) { + this.folderUnreadCount[value.folderId] = + this.folderUnreadCount[value.folderId] || 0; + this.folderUnreadCount[value.folderId] += value.unreadCount; + } + } } @@ -37,29 +62,47 @@ app.factory('FeedResource', (Resource, $http, BASE_URL) => { for (let feed of this.values) { feed.unreadCount = 0; } + this.unreadCount = 0; + this.folderUnreadCount = {}; } markFeedRead (feedId) { this.ids[feedId].unreadCount = 0; + this.updateUnreadCache(); + } + + markFolderRead (folderId) { + for (let feed of this.values) { + if (feed.folderId === folderId) { + feed.unreadCount = 0; + } + } + this.updateUnreadCache(); } markItemOfFeedRead (feedId) { this.ids[feedId].unreadCount -= 1; + this.updateUnreadCache(); } markItemOfFeedUnread (feedId) { this.ids[feedId].unreadCount += 1; + this.updateUnreadCache(); } getUnreadCount () { - return this.values.reduce((sum, feed) => sum + feed.unreadCount, 0); + return this.unreadCount; } + getFolderUnreadCount (folderId) { + return this.folderUnreadCount[folderId] || 0; + } + } return new FeedResource($http, BASE_URL); diff --git a/js/service/ItemResource.js b/js/service/ItemResource.js index 67a6d23e6..983b9b39a 100644 --- a/js/service/ItemResource.js +++ b/js/service/ItemResource.js @@ -84,7 +84,7 @@ app.factory('ItemResource', (Resource, $http, BASE_URL) => { } - read (itemId, isRead=true) { + markItemRead (itemId, isRead=true) { this.get(itemId).unread = !isRead; return this.http({ url: `${this.BASE_URL}/items/${itemId}/read`, @@ -96,7 +96,7 @@ app.factory('ItemResource', (Resource, $http, BASE_URL) => { } - readFeed (feedId, read=true) { + markFeedRead (feedId, read=true) { for (let item of this.values.filter(i => i.feedId === feedId)) { item.unread = !read; } @@ -104,7 +104,7 @@ app.factory('ItemResource', (Resource, $http, BASE_URL) => { } - readAll () { + markRead () { for (let item of this.values) { item.unread = false; } @@ -124,7 +124,7 @@ app.factory('ItemResource', (Resource, $http, BASE_URL) => { keepUnread (itemId) { this.get(itemId).keepUnread = true; - return this.read(itemId, false); + return this.markItemRead(itemId, false); } diff --git a/js/tests/unit/controller/NavigationControllerSpec.js b/js/tests/unit/controller/NavigationControllerSpec.js new file mode 100644 index 000000000..a8d3a0f76 --- /dev/null +++ b/js/tests/unit/controller/NavigationControllerSpec.js @@ -0,0 +1,36 @@ +/** + * ownCloud - News + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Bernhard Posselt <dev@bernhard-posselt.com> + * @copyright Bernhard Posselt 2014 + */ +describe('NavigationController', () => { + 'use strict'; + + let controller; + + beforeEach(module('News', ($provide) => { + $provide.value('BASE_URL', 'base'); + })); + + beforeEach(inject(($controller) => { + controller = $controller('NavigationController'); + })); + + + it('should expose Feeds', inject((FeedResource) => { + FeedResource.add({url: 1}); + expect(controller.getFeeds()).toBe(FeedResource.getAll()); + })); + + + it('should expose Folders', inject((FolderResource) => { + FolderResource.add({name: 1}); + expect(controller.getFolders()).toBe(FolderResource.getAll()); + })); + + +});
\ No newline at end of file diff --git a/js/tests/unit/service/FeedResourceSpec.js b/js/tests/unit/service/FeedResourceSpec.js index 8b941d99d..a12536a9f 100644 --- a/js/tests/unit/service/FeedResourceSpec.js +++ b/js/tests/unit/service/FeedResourceSpec.js @@ -7,7 +7,7 @@ * @author Bernhard Posselt <dev@bernhard-posselt.com> * @copyright Bernhard Posselt 2014 */ -describe('ItemResource', () => { +describe('FeedResource', () => { 'use strict'; let resource; @@ -19,9 +19,11 @@ describe('ItemResource', () => { beforeEach(inject((FeedResource) => { resource = FeedResource; - FeedResource.add({id: 1, url: 'ye', unreadCount: 45}); - FeedResource.add({id: 2, url: 'sye', unreadCount: 25}); - FeedResource.add({id: 3, url: '1sye', unreadCount: 0}); + FeedResource.receive([ + {id: 1, folderId: 3, url: 'ye', unreadCount: 45}, + {id: 2, folderId: 4, url: 'sye', unreadCount: 25}, + {id: 3, folderId: 3, url: '1sye', unreadCount: 0} + ]); })); it('should mark all read', inject((FeedResource) => { @@ -52,4 +54,38 @@ describe('ItemResource', () => { expect(FeedResource.get('ye').unreadCount).toBe(46); })); + + + it('should cache unreadcount', inject((FeedResource) => { + expect(FeedResource.getUnreadCount()).toBe(70); + + FeedResource.markItemOfFeedRead(3); + expect(FeedResource.getUnreadCount()).toBe(69); + + FeedResource.markItemOfFeedUnread(3); + expect(FeedResource.getUnreadCount()).toBe(70); + + FeedResource.markFolderRead(3); + expect(FeedResource.getUnreadCount()).toBe(25); + + FeedResource.markRead(); + expect(FeedResource.getUnreadCount()).toBe(0); + })); + + + it('should cache folder unreadcount', inject((FeedResource) => { + expect(FeedResource.getFolderUnreadCount(3)).toBe(45); + + FeedResource.markItemOfFeedRead(3); + expect(FeedResource.getFolderUnreadCount(3)).toBe(44); + + FeedResource.markItemOfFeedUnread(3); + expect(FeedResource.getFolderUnreadCount(3)).toBe(45); + + FeedResource.markFolderRead(3); + expect(FeedResource.getFolderUnreadCount(3)).toBe(0); + + FeedResource.markRead(); + expect(FeedResource.getFolderUnreadCount(4)).toBe(0); + })); }); diff --git a/js/tests/unit/service/ItemResourceSpec.js b/js/tests/unit/service/ItemResourceSpec.js index bfdaf4b4a..4f2a572a9 100644 --- a/js/tests/unit/service/ItemResourceSpec.js +++ b/js/tests/unit/service/ItemResourceSpec.js @@ -76,7 +76,7 @@ describe('ItemResource', () => { } ], 'items'); - ItemResource.read(3); + ItemResource.markItemRead(3); http.flush(); @@ -132,7 +132,7 @@ describe('ItemResource', () => { } ], 'items'); - ItemResource.readFeed(4); + ItemResource.markFeedRead(4); http.flush(); @@ -162,7 +162,7 @@ describe('ItemResource', () => { } ], 'items'); - ItemResource.readAll(4); + ItemResource.markRead(); http.flush(); |