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 /caldav.js | |
parent | adcd11c2570d2e11eb201ce7d216b5067521afe0 (diff) | |
download | jsCalDAV-b73354819340234dbf20d47c1777e4b486e1195c.tar.gz |
added Caldav.Request.Asset for adding/deleting/updating single assets
Diffstat (limited to 'caldav.js')
-rw-r--r-- | caldav.js | 146 |
1 files changed, 144 insertions, 2 deletions
@@ -2267,7 +2267,7 @@ function write (chunk) { var tag = data[handler.tagField]; var last = this.tagStack[this.tagStack.length - 1]; - if (last.handler === handler) { + if (last.handler && last.handler === handler) { this.stack.push(this.current); this.current = this.current[tag] = []; } else { @@ -2473,6 +2473,147 @@ function write (chunk) { )); (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')] +)); +(function(module, ns) { + var Abstract = ns.require('request/abstract'), Template = ns.require('template'), DavResponse = ns.require('sax/dav_response'); @@ -2847,7 +2988,8 @@ function write (chunk) { CalendarQuery: ns.require('request/calendar_query'), Propfind: ns.require('request/propfind'), CalendarHome: ns.require('request/calendar_home'), - Resources: ns.require('request/resources') + Resources: ns.require('request/resources'), + Asset: ns.require('request/asset') }; }.apply( |