Files
livetrail/src/scripts/api.js
T

75 lines
1.9 KiB
JavaScript

export default class Api {
constructor({server, processPage, timezone, csrfToken, errorCode, lang}) {
this.server = server;
this.processPage = processPage;
this.timezone = timezone;
this.csrfToken = csrfToken;
this.errorCode = errorCode;
this.lang = lang;
}
async get(sAction, asParams = {}) {
const oResponse = await this.request(sAction, asParams, 'GET');
return oResponse.data;
}
async getAsset(sAssetPath) {
const oRequest = await fetch(sAssetPath, {headers: {'Accept': 'application/geo+json'}});
if(!oRequest.ok) {
throw new Error('Error HTTP ' + oRequest.status + ': ' + oRequest.statusText);
}
return oRequest.json();
}
async post(sAction, asParams = {}) {
const oResponse = await this.request(sAction, asParams, 'POST');
return oResponse.data;
}
async request(sAction, asParams = {}, method = 'GET') {
const oUrl = new URL(this.processPage, this.server);
const sUrlParams = new URLSearchParams({
...asParams,
a: sAction,
t: this.timezone
}).toString();
const asOptions = {
method,
headers: {'Accept': 'application/json'}
};
if(method === 'GET') {
oUrl.search = sUrlParams;
}
else {
asOptions.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
asOptions.headers['X-CSRF-Token'] = this.csrfToken;
asOptions.body = sUrlParams;
}
const oRequest = await fetch(oUrl, asOptions);
if(!oRequest.ok) {
throw new Error('Error HTTP ' + oRequest.status + ': ' + oRequest.statusText);
}
const oResponse = await oRequest.json();
oResponse.desc_lang_text = this.lang.get(oResponse.desc_lang_id, oResponse.desc_lang_params);
if(oResponse.result == this.errorCode) {
const oError = new Error(oResponse.desc_lang_text);
oError.desc_lang_id = oResponse.desc_lang_id;
oError.desc_lang_params = oResponse.desc_lang_params;
oError.desc_lang_text = oResponse.desc_lang_text;
throw oError;
}
return oResponse;
}
}