aboutsummaryrefslogtreecommitdiffstats
path: root/apps/comments/src/commentcollection.js
diff options
context:
space:
mode:
Diffstat (limited to 'apps/comments/src/commentcollection.js')
-rw-r--r--apps/comments/src/commentcollection.js167
1 files changed, 167 insertions, 0 deletions
diff --git a/apps/comments/src/commentcollection.js b/apps/comments/src/commentcollection.js
new file mode 100644
index 00000000000..a15039cf484
--- /dev/null
+++ b/apps/comments/src/commentcollection.js
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2016
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+(function(OC, OCA) {
+
+ /**
+ * @class OCA.Comments.CommentCollection
+ * @classdesc
+ *
+ * Collection of comments assigned to a file
+ *
+ */
+ var CommentCollection = OC.Backbone.Collection.extend(
+ /** @lends OCA.Comments.CommentCollection.prototype */ {
+
+ sync: OC.Backbone.davSync,
+
+ model: OCA.Comments.CommentModel,
+
+ /**
+ * Object type
+ *
+ * @type string
+ */
+ _objectType: 'files',
+
+ /**
+ * Object id
+ *
+ * @type string
+ */
+ _objectId: null,
+
+ /**
+ * True if there are no more page results left to fetch
+ *
+ * @type bool
+ */
+ _endReached: false,
+
+ /**
+ * Number of comments to fetch per page
+ *
+ * @type int
+ */
+ _limit : 20,
+
+ /**
+ * Initializes the collection
+ *
+ * @param {string} [options.objectType] object type
+ * @param {string} [options.objectId] object id
+ */
+ initialize: function(models, options) {
+ options = options || {};
+ if (options.objectType) {
+ this._objectType = options.objectType;
+ }
+ if (options.objectId) {
+ this._objectId = options.objectId;
+ }
+ },
+
+ url: function() {
+ return OC.linkToRemote('dav') + '/comments/' +
+ encodeURIComponent(this._objectType) + '/' +
+ encodeURIComponent(this._objectId) + '/';
+ },
+
+ setObjectId: function(objectId) {
+ this._objectId = objectId;
+ },
+
+ hasMoreResults: function() {
+ return !this._endReached;
+ },
+
+ reset: function() {
+ this._endReached = false;
+ this._summaryModel = null;
+ return OC.Backbone.Collection.prototype.reset.apply(this, arguments);
+ },
+
+ /**
+ * Fetch the next set of results
+ */
+ fetchNext: function(options) {
+ var self = this;
+ if (!this.hasMoreResults()) {
+ return null;
+ }
+
+ var body = '<?xml version="1.0" encoding="utf-8" ?>\n' +
+ '<oc:filter-comments xmlns:D="DAV:" xmlns:oc="http://owncloud.org/ns">\n' +
+ // load one more so we know there is more
+ ' <oc:limit>' + (this._limit + 1) + '</oc:limit>\n' +
+ ' <oc:offset>' + this.length + '</oc:offset>\n' +
+ '</oc:filter-comments>\n';
+
+ options = options || {};
+ var success = options.success;
+ options = _.extend({
+ remove: false,
+ parse: true,
+ data: body,
+ davProperties: CommentCollection.prototype.model.prototype.davProperties,
+ success: function(resp) {
+ if (resp.length <= self._limit) {
+ // no new entries, end reached
+ self._endReached = true;
+ } else {
+ // remove last entry, for next page load
+ resp = _.initial(resp);
+ }
+ if (!self.set(resp, options)) {
+ return false;
+ }
+ if (success) {
+ success.apply(null, arguments);
+ }
+ self.trigger('sync', 'REPORT', self, options);
+ }
+ }, options);
+
+ return this.sync('REPORT', this, options);
+ },
+
+ /**
+ * Returns the matching summary model
+ *
+ * @return {OCA.Comments.CommentSummaryModel} summary model
+ */
+ getSummaryModel: function() {
+ if (!this._summaryModel) {
+ this._summaryModel = new OCA.Comments.CommentSummaryModel({
+ id: this._objectId,
+ objectType: this._objectType
+ });
+ }
+ return this._summaryModel;
+ },
+
+ /**
+ * Updates the read marker for this comment thread
+ *
+ * @param {Date} [date] optional date, defaults to now
+ * @param {Object} [options] backbone options
+ */
+ updateReadMarker: function(date, options) {
+ options = options || {};
+
+ return this.getSummaryModel().save({
+ readMarker: (date || new Date()).toUTCString()
+ }, options);
+ }
+ });
+
+ OCA.Comments.CommentCollection = CommentCollection;
+})(OC, OCA);
+