Backbone Webdav Adapter MKCOL support

Usually Backbone collections cannot be created and just simply exists.
But in the Webdav world they need to be creatable.

This enhancement makes it possible to use a Backbone Model to represent
such collections and when creating it, it will use MKCOL instead of PUT.

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
pull/3881/head
Vincent Petry 8 years ago committed by Morris Jobke
parent 39afcbd49f
commit 6488ed3cff
No known key found for this signature in database
GPG Key ID: 9CE5ED29E7FCD38A
  1. 46
      core/js/oc-backbone-webdav.js

@ -120,7 +120,15 @@
} }
var parts = url.split('/'); var parts = url.split('/');
return parts[parts.length - 1]; var result;
do {
result = parts[parts.length - 1];
parts.pop();
// note: first result can be empty when there is a trailing slash,
// so we take the part before that
} while (!result && parts.length > 0);
return result;
} }
function isSuccessStatus(status) { function isSuccessStatus(status) {
@ -190,6 +198,25 @@
} }
function callMkCol(client, options, model, headers) {
// call MKCOL without data, followed by PROPPATCH
return client.request(
options.type,
options.url,
headers,
null
).then(function(result) {
if (!isSuccessStatus(result.status)) {
if (_.isFunction(options.error)) {
options.error(result);
}
return;
}
callPropPatch(client, options, model, headers);
});
}
function callMethod(client, options, model, headers) { function callMethod(client, options, model, headers) {
headers['Content-Type'] = 'application/json'; headers['Content-Type'] = 'application/json';
return client.request( return client.request(
@ -206,7 +233,7 @@
} }
if (_.isFunction(options.success)) { if (_.isFunction(options.success)) {
if (options.type === 'PUT' || options.type === 'POST') { if (options.type === 'PUT' || options.type === 'POST' || options.type === 'MKCOL') {
// pass the object's own values because the server // pass the object's own values because the server
// does not return anything // does not return anything
var responseJson = result.body || model.toJSON(); var responseJson = result.body || model.toJSON();
@ -247,6 +274,8 @@
return callPropFind(client, options, model, headers); return callPropFind(client, options, model, headers);
} else if (options.type === 'PROPPATCH') { } else if (options.type === 'PROPPATCH') {
return callPropPatch(client, options, model, headers); return callPropPatch(client, options, model, headers);
} else if (options.type === 'MKCOL') {
return callMkCol(client, options, model, headers);
} else { } else {
return callMethod(client, options, model, headers); return callMethod(client, options, model, headers);
} }
@ -259,9 +288,16 @@
var params = {type: methodMap[method] || method}; var params = {type: methodMap[method] || method};
var isCollection = (model instanceof Backbone.Collection); var isCollection = (model instanceof Backbone.Collection);
if (method === 'update' && (model.usePUT || (model.collection && model.collection.usePUT))) { if (method === 'update') {
// use PUT instead of PROPPATCH // if a model has an inner collection, it must define an
params.type = 'PUT'; // attribute "hasInnerCollection" that evaluates to true
if (model.hasInnerCollection) {
// if the model itself is a Webdav collection, use MKCOL
params.type = 'MKCOL';
} else if (model.usePUT || (model.collection && model.collection.usePUT)) {
// use PUT instead of PROPPATCH
params.type = 'PUT';
}
} }
// Ensure that we have a URL. // Ensure that we have a URL.

Loading…
Cancel
Save