aboutsummaryrefslogtreecommitdiff
path: root/resources/assets/javascripts/lib/abstract-api.js
diff options
context:
space:
mode:
authorJan-Hendrik Willms <tleilax+studip@gmail.com>2024-05-28 08:47:35 +0000
committerJan-Hendrik Willms <tleilax+studip@gmail.com>2024-05-28 08:47:35 +0000
commit0afb9c16eab3f9c1fd069b350d4fa9fee4c0ec73 (patch)
treee68d8b304a4bcae48510b4454f740a839059ee8e /resources/assets/javascripts/lib/abstract-api.js
parentfe2b584cb79ba8a2c642be085cacdd82d526df25 (diff)
allow abstract api to work with real promises instead of deferreds and use it, fixes #3643
Closes #3643 Merge request studip/studip!2885
Diffstat (limited to 'resources/assets/javascripts/lib/abstract-api.js')
-rw-r--r--resources/assets/javascripts/lib/abstract-api.js40
1 files changed, 40 insertions, 0 deletions
diff --git a/resources/assets/javascripts/lib/abstract-api.js b/resources/assets/javascripts/lib/abstract-api.js
index 70a88db..95ae015 100644
--- a/resources/assets/javascripts/lib/abstract-api.js
+++ b/resources/assets/javascripts/lib/abstract-api.js
@@ -1,5 +1,20 @@
import Overlay from './overlay.js';
+class APIError extends Error
+{
+ static createWithJqXhr(message, jqXhr) {
+ const error = new APIError(message);
+ error.setJqXhr(jqXhr);
+ return error;
+ }
+
+ jqXhr = null;
+
+ setJqXhr(jqXhr) {
+ this.jqXhr = jqXhr;
+ }
+}
+
class AbstractAPI
{
static get supportedMethods() {
@@ -118,6 +133,31 @@ class AbstractAPI
}
}).join('&');
}
+
+ withPromises() {
+ return new Proxy(this, {
+ get(target, prop, receiver) {
+ // This will allow http methods to be written as lowercase when called as methods
+ // (e.g. api.patch() instead of api.PATCH())
+ if (target[prop] === undefined && AbstractAPI.supportedMethods.includes(prop.toUpperCase())) {
+ prop = prop.toUpperCase();
+ }
+
+ // Only handle calls to request methods
+ if (prop !== 'request') {
+ return Reflect.get(target, prop, receiver);
+ }
+
+ // Return a wrapped promise that handles the deferred
+ return (url, options = {}) => new Promise((resolve, reject) => {
+ target[prop].apply(target, [url, options]).then(
+ (response) => resolve(response),
+ (jqXhr, textStatus, errorThrown) => reject(APIError.createWithJqXhr(errorThrown || textStatus, jqXhr))
+ );
+ });
+ }
+ })
+ }
}
// Create shortcut methods for easier access by method