added custom workspace client

This commit is contained in:
dcore94 2024-11-20 18:52:01 +01:00
parent 5501b6e8f6
commit a7198db4a3
1 changed files with 117 additions and 0 deletions

117
i-gene/d4s-workspace.js Normal file
View File

@ -0,0 +1,117 @@
class D4SWorkspace {
#d4sboot = null;
#workspaceURL = null;
constructor(workspaceURL, d4sboot) {
this.#workspaceURL = workspaceURL;
if (d4sboot) {
this.#d4sboot = d4sboot;
} else {
this.#d4sboot = document.querySelector("d4s-boot-2");
}
}
/**
* Calls with a secure fetch the workspace with provided data.
* To upload data by using a <code>FormData</code> object you have to leave the <code>mime</code> attribute as <code>null</code>.
* @param {*} method the method to use for the call, default to <code>GET</code>
* @param {*} uri the uri to invoke, relative to <code>workspaceURL</code> provided in the object's constructor
* @param {*} body the payload to send
* @param {*} mime the mime type of the payload
* @param {*} extraHeaders extra HTTP headers to send
* @returns the reponse payload as a promise, JSON data promise if the returned data is "application/json", a String data promise if "text/*" or a blob data promise in other cases
*/
callWorkspace(method, uri, body, mime, extraHeaders) {
let req = { };
if (method) {
req.method = method;
}
if (body) {
req.body = body;
}
if (extraHeaders) {
req.headers = extraHeaders;
}
if (mime) {
if (req.headers) {
req.headers["Content-Type"] = mime;
} else {
req.headers = { "Content-Type" : mime };
}
}
const url = this.#workspaceURL + (uri.startsWith('/') ? uri : '/' + uri);
return this.#d4sboot.secureFetch(url, req)
.then(resp => {
if (resp.ok) {
const contentType = resp.headers.get("content-type");
if (contentType && contentType.indexOf("application/json") !== -1) {
return resp.json();
} else if (contentType && contentType.indexOf("text/") !== -1) {
return resp.text();
} else {
return resp.blob();
}
} else {
throw "Cannot invoke workspace via secure fetch for URL: " + url;
}
}).catch(err => {
console.error(err);
throw err;
});
}
getWorkspace($extraHeaders) {
return this.callWorkspace("GET", "", null, null, $extraHeaders)
.then(json => {
return json.item.id;
}).catch(err => {
const msg = "Cannot get workspace root ID";
console.error(msg);
throw msg;
});
}
checkOrCreateFolder(parentFolderId, name, description, extraHeaders) {
const baseURI = "/items/" + parentFolderId;
console.log("Checking existance of folder: " + name);
let uri = baseURI + "/items/" + name;
return this.callWorkspace("GET", uri, null, null, extraHeaders)
.then(json => {
if (json.itemlist[0]) {
const id = json.itemlist[0].id;
console.log("'" + name + "' folder exists with and has id: " + id);
return id;
} else {
console.info("'" + name + "' folder doesn't exist, creating it: " + name);
uri = baseURI + "/create/FOLDER";
const params = new URLSearchParams({ name : name, description : description, hidden : false });
return this.callWorkspace("POST", uri, params.toString(), "application/x-www-form-urlencoded", extraHeaders).then(id => {
console.log("New '" + name + "' folder successfully created with id: " + id);
return id
});
}
});
};
uploadFile(parentFolderId, name, description, data, contentType, extraHeaders) {
const uri = "/items/" + parentFolderId + "/create/FILE";
const request = new FormData();
request.append("name", name);
request.append("description", description);
request.append(
"file",
new Blob([data], {
type: contentType
})
);
return this.callWorkspace("POST", uri, request, null, extraHeaders)
.then(id => {
console.info("File '" + name + "' successfully uploaded and its id is: " + id);
return true;
}).catch(err => {
console.error("Cannot upload file '" + name + "'. Error: " + err);
return false;
});
};
}