Merge pull request #3881 from nextcloud/downstream-26842

Backbone Webdav Adapter MKCOL support
This commit is contained in:
Joas Schilling 2017-03-17 13:53:04 +01:00 committed by GitHub
commit 0c0ce25b3c
1 changed files with 41 additions and 5 deletions

View File

@ -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,10 +288,17 @@
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') {
// if a model has an inner collection, it must define an
// 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 // use PUT instead of PROPPATCH
params.type = 'PUT'; params.type = 'PUT';
} }
}
// Ensure that we have a URL. // Ensure that we have a URL.
if (!options.url) { if (!options.url) {