hkopendata
Version:
Access different Opendata API and data in Hong Kong
79 lines (75 loc) • 2.86 kB
JavaScript
const Middleware = (request) => {
let result = {
error: false
};
return new Promise((resolve, reject) => {
request.then((res) => {
if (typeof res === "object" && res["error"]) {
result.error = true;
result.message = res["message"] || "Something went wrong";
reject(result);
} else {
result.data = res || "Request Success";
resolve(result);
}
}).catch((err) => {
result.error = true;
let message = "";
if (typeof err === "object") {
if (err.response && err.response.data) {
message = findMessage(err.response.data);
}
if (!message && err.response) {
if (err.response.status && err.response.status != 200) {
message = `Error ${err.response.status}: ${err.response.statusText}`
}
}
if (!message && err.error && err.message) message = err.message;
if (!message) {
message = findMessage(err);
}
} else if (typeof err === "string") message = err;
result.message = message || "Request Fail";
reject(result);
});
});
}
Middleware.init = (type) => {
if (typeof type !== "string" || !/^(bank|gov|org)$/.test(type)) throw "Invalid Middleware configuration";
const Config = require(`../${type}`);
const Handler = (config) => {
let local = {};
for (let key in config) {
if (typeof config[key] === "object") {
local[key] = Handler(config[key]);
} else if (typeof config[key] === "function") {
local[key] = (...args) => Middleware(config[key](...args));
} else {
local[key] = config[key];
}
}
return local;
}
return Handler(Config);
}
function findMessage(obj) {
let message = "";
if (typeof obj === "object") {
for (let key in obj) {
if (message) continue;
if (/message|error/i.test(key)) {
if (typeof obj[key] === "object") {
let val = obj[key],
keys = Object.keys(val).filter(v => /message|text|value/i.test(v));
while (typeof val === "object" && keys.length > 0) {
val = val[keys[0]];
keys = Object.keys(val).filter(v => /message|text|value/i.test(v));
}
if (typeof val === "string") message = val;
} else message = obj[key];
} else message = findMessage(obj[key]);
}
}
return message;
}
module.exports = Middleware;