diff options
author | James Lal <james@lightsofapollo.com> | 2012-09-30 14:24:23 -0700 |
---|---|---|
committer | James Lal <james@lightsofapollo.com> | 2012-09-30 14:24:23 -0700 |
commit | b73354819340234dbf20d47c1777e4b486e1195c (patch) | |
tree | 3170a45ff1a84621ec1ab44bb1647cb9d7701a92 /lib/caldav/request/asset.js | |
parent | adcd11c2570d2e11eb201ce7d216b5067521afe0 (diff) | |
download | jsCalDAV-b73354819340234dbf20d47c1777e4b486e1195c.tar.gz |
added Caldav.Request.Asset for adding/deleting/updating single assets
Diffstat (limited to 'lib/caldav/request/asset.js')
-rw-r--r-- | lib/caldav/request/asset.js | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/lib/caldav/request/asset.js b/lib/caldav/request/asset.js new file mode 100644 index 0000000..b26e4f7 --- /dev/null +++ b/lib/caldav/request/asset.js @@ -0,0 +1,141 @@ +(function(module, ns) { + + var XHR = ns.require('xhr'); + + /** + * Creates an Http request for a single webdav resource. + * Thin wrapper over http/xhr each public method has the same + * signature with similar options: + * + * // the intent is that after a larger calendar query + * // the urls are stored and can be used to modify the + * // calendar resources. + * var asset = new Caldav.Request.Asset(con, 'someurl'); + * + * asset.get({ etag: 'foo'}, function(err, data) { + * }); + * + * asset.put({ etag: 'foo' }, body, function(err, data) { + * + * }); + * + * asset.delete(function() { + * + * }); + * + * @param {Caldav.Connection} connection connection details. + * @param {String} url assert url. + */ + function Asset(connection, url) { + if (!connection) { + throw new Error('must pass connection object'); + } + this.connection = connection; + this.url = url; + } + + Asset.prototype = { + + contentType: 'text/calendar', + + _buildRequest: function(method, options) { + var headers = { + 'Content-Type': this.contentType + }; + + if (options && options.contentType) { + headers['Content-Type'] = options.contentType; + } + + if (options && options.etag) { + headers['If-None-Match'] = options.etag; + } + + return this.connection.request({ + url: this.url, + headers: headers, + method: method + }); + }, + + /** + * Find a single calendar asset. + * This method should only be used to either + * confirm a put or delete request. + * + * Calendar query is far more suited for fetching + * large amounts of calendar data. + * + * Options: + * - etag: used to issue a 'If-Not-Match' + * + * @param {Object} [options] calendar options. + * @param {Function} callback node style [err, data, xhr]. + */ + get: function(options, callback) { + if (typeof(options) === 'function') { + callback = options; + options = null; + } + + var req = this._buildRequest('GET', options); + + req.send(function(err, xhr) { + callback(err, xhr.responseText, xhr); + }); + }, + + /** + * Adds or modifies a single calendar resource. + * + * @param {Object} [options] see get. + * @param {String} data post content. + * @param {Function} callback node style [err, data, xhr]. + */ + put: function(options, data, callback) { + if (typeof(options) === 'string') { + data = options; + options = null; + } + + if (typeof(data) === 'function') { + callback = data; + data = null; + } + + var req = this._buildRequest('PUT', options); + req.data = data; + + req.send(function(err, xhr) { + callback(err, xhr.responseText, xhr); + }); + }, + + /** + * Deletes a calendar resource + * + * @param {Object} [options] see get. + * @param {Function} callback node style [err, data, xhr]. + */ + delete: function(options, callback) { + if (typeof(options) === 'function') { + callback = options; + options = null; + } + + var req = this._buildRequest('DELETE', options); + + req.send(function(err, xhr) { + callback(err, xhr.responseText, xhr); + }); + } + }; + + module.exports = Asset; + +}.apply( + this, + (this.Caldav) ? + [Caldav('request/asset'), Caldav] : + [module, require('../caldav')] +)); |