diff options
| author | Jan-Hendrik Willms <tleilax+studip@gmail.com> | 2024-05-28 08:47:35 +0000 |
|---|---|---|
| committer | Jan-Hendrik Willms <tleilax+studip@gmail.com> | 2024-05-28 08:47:35 +0000 |
| commit | 0afb9c16eab3f9c1fd069b350d4fa9fee4c0ec73 (patch) | |
| tree | e68d8b304a4bcae48510b4454f740a839059ee8e /resources/assets/javascripts/lib/abstract-api.js | |
| parent | fe2b584cb79ba8a2c642be085cacdd82d526df25 (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.js | 40 |
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 |
