168 lines
4.5 KiB
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; ?>();
|