Files
APIlite/src/javascript.tpl.php

168 lines
4.5 KiB
PHP

/**
* Generated by APIlite
* https://gitea.tpsoft.org/TPsoft.org/APIlite
*
* <?php echo date('Y-m-d H:i:s'); ?>
*/
class <?php echo $this->apiName; ?> {
endpoint = <?php echo sprintf(substr($this->endpoint, 0, 4) == 'http' ? '"%s"' : '%s', $this->endpoint); ?>;
bearerStorageKey = 'apilite_bearer_token';
responseHandlers = [];
errorHandlers = [];
normalizeBearerToken(token) {
if (typeof token !== 'string') return null;
token = token.trim();
return token === '' ? null : token;
}
getStorage() {
try {
if (typeof window !== 'undefined' && window.localStorage) return window.localStorage;
} catch (error) {
return null;
}
return null;
}
getBearerToken() {
var storage = this.getStorage();
if (storage == null) return null;
return this.normalizeBearerToken(storage.getItem(this.bearerStorageKey));
}
getRequestHeaders(headers = {}) {
var requestHeaders = Object.assign({}, headers);
if (typeof requestHeaders.Authorization === 'undefined') {
var token = this.getBearerToken();
if (token != null) requestHeaders.Authorization = 'Bearer ' + token;
}
return requestHeaders;
}
applyHeaders(xhttp, headers) {
Object.keys(headers).forEach(key => {
var value = headers[key];
if (typeof value === 'undefined' || value === null) return;
xhttp.setRequestHeader(key, value);
});
}
bearerSet(token) {
var storage = this.getStorage();
if (storage == null) return;
token = this.normalizeBearerToken(token);
if (token == null) {
storage.removeItem(this.bearerStorageKey);
return;
}
storage.setItem(this.bearerStorageKey, token);
}
addResponseHandler(handler) {
this.responseHandlers.push(handler);
return () => {
this.responseHandlers = this.responseHandlers.filter(registeredHandler => registeredHandler !== handler);
};
}
addErrorHandler(handler) {
this.errorHandlers.push(handler);
return () => {
this.errorHandlers = this.errorHandlers.filter(registeredHandler => registeredHandler !== handler);
};
}
emitResponseHandlers(response, context) {
this.responseHandlers.forEach(handler => {
try {
handler(response, context);
} catch (error) {
// Response handlers must not change the API request result.
}
});
}
emitErrorHandlers(response, context) {
this.errorHandlers.forEach(handler => {
try {
handler(response, context);
} catch (error) {
// Error handlers must not change the API request result.
}
});
}
emitHandlers(response, context) {
this.emitResponseHandlers(response, context);
if (response.status === 'ERROR') this.emitErrorHandlers(response, context);
}
/* ----------------------------------------------------
* General API call
*/
call(method, data, callback) {
var xhttp = new XMLHttpRequest();
var headers = this.getRequestHeaders();
var api = this;
xhttp.withCredentials = true;
xhttp.onreadystatechange = function() {
if (this.readyState === 4) {
var response;
if (this.status === 200) {
response = JSON.parse(this.responseText);
} else {
response = {'status': 'ERROR', 'msg': 'HTTP STATUS ' + this.status};
}
var context = {method: method, data: data, httpStatus: this.status};
api.emitHandlers(response, context);
if (callback != null) callback(response);
}
}
var form_data = new FormData();
Object.keys(data).forEach(key => {
let val = data[key];
if (typeof val === 'undefined') return;
if (typeof val == 'object') val = JSON.stringify(val);
form_data.append(key, val);
});
xhttp.open('POST', this.endpoint + '?action=' + method);
this.applyHeaders(xhttp, headers);
xhttp.send(form_data);
}
callPromise(method, data) {
return new Promise((resolve, reject) => {
this.call(method, data, function(response) {
if (method === '__HELP__') {
resolve(response);
return;
}
if (response.status === 'OK') {
resolve(response.data);
} else {
reject(response.msg);
}
});
})
}
/* ----------------------------------------------------
* API actions
*/
help() {
return this.callPromise('__HELP__', {});
}
<?php if (is_array($this->methods)) foreach ($this->methods as $method) {
echo "\t".$method['name'].'('.implode(', ', array_map(function($param) { return $param['name']; }, $method['params'])).') {';
echo "\n\t\treturn this.callPromise('".$method['name']."', {".implode(', ', array_map(function($param) { return $param['name'].': '.$param['name']; }, $method['params']))."});";
echo "\n\t}\n\n";
}
?>
};
export default new <?php echo $this->apiName; ?>();