summaryrefslogtreecommitdiffstats
path: root/core/js/oc-backbone-webdav.js
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2016-12-15 15:11:56 +0100
committerMorris Jobke <hey@morrisjobke.de>2017-03-17 00:08:48 -0600
commit6488ed3cff41d5cf14ca260cc26bcd9b518d5c28 (patch)
treed2799c3b002d6978bff5f91b1c43c63978d70508 /core/js/oc-backbone-webdav.js
parent39afcbd49feb4ba333746762fe7c9d4701db9860 (diff)
downloadnextcloud-server-6488ed3cff41d5cf14ca260cc26bcd9b518d5c28.tar.gz
nextcloud-server-6488ed3cff41d5cf14ca260cc26bcd9b518d5c28.zip
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>
Diffstat (limited to 'core/js/oc-backbone-webdav.js')
-rw-r--r--core/js/oc-backbone-webdav.js46
1 files changed, 41 insertions, 5 deletions
diff --git a/core/js/oc-backbone-webdav.js b/core/js/oc-backbone-webdav.js
index 1c1b5c71d81..4e3f11ce091 100644
--- a/core/js/oc-backbone-webdav.js
+++ b/core/js/oc-backbone-webdav.js
@@ -120,7 +120,15 @@
}
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) {
@@ -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) {
headers['Content-Type'] = 'application/json';
return client.request(
@@ -206,7 +233,7 @@
}
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
// does not return anything
var responseJson = result.body || model.toJSON();
@@ -247,6 +274,8 @@
return callPropFind(client, options, model, headers);
} else if (options.type === 'PROPPATCH') {
return callPropPatch(client, options, model, headers);
+ } else if (options.type === 'MKCOL') {
+ return callMkCol(client, options, model, headers);
} else {
return callMethod(client, options, model, headers);
}
@@ -259,9 +288,16 @@
var params = {type: methodMap[method] || method};
var isCollection = (model instanceof Backbone.Collection);
- if (method === 'update' && (model.usePUT || (model.collection && model.collection.usePUT))) {
- // use PUT instead of PROPPATCH
- params.type = 'PUT';
+ 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
+ params.type = 'PUT';
+ }
}
// Ensure that we have a URL.