summaryrefslogtreecommitdiffstats
path: root/js-old/service/FeedResource.js
diff options
context:
space:
mode:
Diffstat (limited to 'js-old/service/FeedResource.js')
-rw-r--r--js-old/service/FeedResource.js348
1 files changed, 348 insertions, 0 deletions
diff --git a/js-old/service/FeedResource.js b/js-old/service/FeedResource.js
new file mode 100644
index 000000000..275bb1936
--- /dev/null
+++ b/js-old/service/FeedResource.js
@@ -0,0 +1,348 @@
+/**
+ * Nextcloud - 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
+ */
+app.factory('FeedResource', function (Resource, $http, BASE_URL, $q) {
+ 'use strict';
+
+ var FeedResource = function ($http, BASE_URL, $q) {
+ Resource.call(this, $http, BASE_URL, 'url');
+ this.ids = {};
+ this.locations = {};
+ this.unreadCount = 0;
+ this.folderUnreadCount = {};
+ this.folderIds = {};
+ this.$q = $q;
+ };
+
+ FeedResource.prototype = Object.create(Resource.prototype);
+
+ FeedResource.prototype.receive = function (data) {
+ Resource.prototype.receive.call(this, data);
+ this.updateUnreadCache();
+ this.updateFolderCache();
+ };
+
+ FeedResource.prototype.clear = function () {
+ Resource.prototype.clear.call(this);
+ this.unreadCount = 0;
+ this.folderUnreadCount = {};
+ this.folderIds = {};
+ this.ids = {};
+ this.locations = {};
+ };
+
+ FeedResource.prototype.updateUnreadCache = function () {
+ this.unreadCount = 0;
+ this.folderUnreadCount = {};
+
+ var self = this;
+ this.values.forEach(function (feed) {
+ if (feed.unreadCount) {
+ self.unreadCount += feed.unreadCount;
+ }
+ if (feed.folderId !== undefined) {
+ self.folderUnreadCount[feed.folderId] =
+ self.folderUnreadCount[feed.folderId] || 0;
+ self.folderUnreadCount[feed.folderId] += feed.unreadCount;
+ }
+ });
+ };
+
+
+ FeedResource.prototype.updateFolderCache = function () {
+ this.folderIds = {};
+
+ var self = this;
+ this.values.forEach(function (feed) {
+ self.folderIds[feed.folderId] =
+ self.folderIds[feed.folderId] || [];
+ self.folderIds[feed.folderId].push(feed);
+ });
+ };
+
+
+ FeedResource.prototype.add = function (value) {
+ Resource.prototype.add.call(this, value);
+ if (value.id !== undefined) {
+ this.ids[value.id] = this.hashMap[value.url];
+ }
+ if (value.location !== undefined) {
+ this.locations[value.location] = this.hashMap[value.url];
+ }
+ };
+
+
+ FeedResource.prototype.markRead = function () {
+ this.values.forEach(function (feed) {
+ feed.unreadCount = 0;
+ });
+
+ this.updateUnreadCache();
+ };
+
+
+ FeedResource.prototype.markFeedRead = function (feedId) {
+ this.ids[feedId].unreadCount = 0;
+ this.updateUnreadCache();
+ };
+
+
+ FeedResource.prototype.markFolderRead = function (folderId) {
+ this.values.forEach(function (feed) {
+ if (feed.folderId === folderId) {
+ feed.unreadCount = 0;
+ }
+ });
+
+ this.updateUnreadCache();
+ };
+
+
+ FeedResource.prototype.markItemOfFeedRead = function (feedId) {
+ this.ids[feedId].unreadCount -= 1;
+ this.updateUnreadCache();
+ };
+
+
+ FeedResource.prototype.markItemsOfFeedsRead = function (feedIds) {
+ var self = this;
+ feedIds.forEach(function (feedId) {
+ self.ids[feedId].unreadCount -= 1;
+ });
+
+ this.updateUnreadCache();
+ };
+
+
+ FeedResource.prototype.markItemOfFeedUnread = function (feedId) {
+ this.ids[feedId].unreadCount += 1;
+ this.updateUnreadCache();
+ };
+
+
+ FeedResource.prototype.getUnreadCount = function () {
+ return this.unreadCount;
+ };
+
+
+ FeedResource.prototype.getFolderUnreadCount = function (folderId) {
+ return this.folderUnreadCount[folderId];
+ };
+
+
+ FeedResource.prototype.getByFolderId = function (folderId) {
+ return this.folderIds[folderId] || [];
+ };
+
+
+ FeedResource.prototype.getById = function (feedId) {
+ return this.ids[feedId];
+ };
+
+
+ FeedResource.prototype.getByLocation = function (location) {
+ return this.locations[location];
+ };
+
+
+ FeedResource.prototype.move = function (feedId, folderId) {
+ var feed = this.getById(feedId);
+ feed.folderId = folderId;
+
+ this.updateFolderCache();
+ this.updateUnreadCache();
+
+ return this.patch(feedId, {folderId: folderId});
+
+ };
+
+
+ FeedResource.prototype.create = function (url, folderId, title, user, password, fullDiscover) {
+ url = url.trim();
+ if (!url.startsWith('http')) {
+ url = 'https://' + url;
+ }
+
+ if (title !== undefined) {
+ title = title.trim();
+ }
+
+ var feed = {
+ url: url,
+ folderId: folderId || 0,
+ title: title || url,
+ unreadCount: 0
+ };
+
+ this.add(feed);
+ this.updateFolderCache();
+
+ return this.http({
+ method: 'POST',
+ url: this.BASE_URL + '/feeds',
+ data: {
+ url: url,
+ parentFolderId: folderId || 0,
+ title: title,
+ user: user || null,
+ password: password || null,
+ fullDiscover: fullDiscover
+ }
+ }).then(function (response) {
+ return response.data;
+ }, function (response) {
+ feed.faviconLink = '';
+ feed.error = response.data.message;
+ });
+ };
+
+
+ FeedResource.prototype.reversiblyDelete = function (id, updateCache, isFolder) {
+ var feed = this.getById(id);
+
+ // if a folder is deleted it does not have to trigger the delete
+ // attribute for the feed because the feed is not deleted, its just not
+ // displayed. Otherwise this causes the feed to also be deleted again
+ // because the folder destroys the feed's scope
+ if (feed && isFolder !== true) {
+ feed.deleted = true;
+ }
+
+ if (updateCache !== false) {
+ this.updateUnreadCache();
+ }
+
+ return this.http.delete(this.BASE_URL + '/feeds/' + id);
+ };
+
+
+ FeedResource.prototype.reversiblyDeleteFolder = function (folderId) {
+ var self = this;
+ var promises = [];
+ this.getByFolderId(folderId).forEach(function (feed) {
+ promises.push(self.reversiblyDelete(feed.id, false, true));
+ });
+
+ this.updateUnreadCache();
+
+ var deferred = this.$q.all(promises);
+ return deferred.promise;
+ };
+
+
+ FeedResource.prototype.delete = function (url, updateCache) {
+ var feed = this.get(url);
+ if (feed !== undefined && feed.id) {
+ delete this.ids[feed.id];
+ }
+
+ if (feed !== undefined && feed.location) {
+ delete this.locations[feed.location];
+ }
+
+ Resource.prototype.delete.call(this, url);
+
+ if (updateCache !== false) {
+ this.updateUnreadCache();
+ this.updateFolderCache();
+ }
+
+ return feed;
+ };
+
+
+ FeedResource.prototype.deleteFolder = function (folderId) {
+ var self = this;
+ this.getByFolderId(folderId).forEach(function (feed) {
+ self.delete(feed.url, false);
+ });
+
+ this.updateUnreadCache();
+ this.updateFolderCache();
+ };
+
+
+ FeedResource.prototype.undoDelete = function (id, updateCache) {
+ var feed = this.getById(id);
+
+ if (feed) {
+ feed.deleted = false;
+ }
+
+ if (updateCache !== false) {
+ this.updateUnreadCache();
+ }
+
+ return this.http.post(this.BASE_URL + '/feeds/' + id + '/restore');
+ };
+
+
+ FeedResource.prototype.undoDeleteFolder = function (folderId) {
+ var self = this;
+ var promises = [];
+
+ this.getByFolderId(folderId).forEach(function (feed) {
+ promises.push(self.undoDelete(feed.id, false));
+ });
+
+ this.updateUnreadCache();
+
+ var deferred = this.$q.all(promises);
+ return deferred.promise;
+ };
+
+
+ FeedResource.prototype.setOrdering = function (feedId, ordering) {
+ var feed = this.getById(feedId);
+
+ if (feed) {
+ feed.ordering = ordering;
+ var url = this.BASE_URL + '/feeds/' + feedId;
+ return this.http.patch(url, {
+ ordering: ordering
+ });
+ }
+ };
+
+
+ FeedResource.prototype.setPinned = function (feedId, isPinned) {
+ var feed = this.getById(feedId);
+
+ if (feed) {
+ feed.pinned = isPinned;
+ var url = this.BASE_URL + '/feeds/' + feedId;
+ return this.http.patch(url, {
+ pinned: isPinned
+ });
+ }
+ };
+
+
+ FeedResource.prototype.patch = function (feedId, diff) {
+ var feed = this.getById(feedId);
+
+ if (feed) {
+ Object.keys(diff).forEach(function (key) {
+ feed[key] = diff[key];
+ });
+ var url = this.BASE_URL + '/feeds/' + feedId;
+ return this.http.patch(url, diff);
+ }
+ };
+
+
+ FeedResource.prototype.toggleFullText = function (feedId) {
+ var feed = this.getById(feedId);
+
+ return this.patch(feedId, {fullTextEnabled: !feed.fullTextEnabled});
+ };
+
+
+ return new FeedResource($http, BASE_URL, $q);
+});