Use nested config structure

This commit is contained in:
Zaid Abdulla committed 2018-12-26 00:22:07 -08:00
1 parent 581a510960
commit 30dbf0cf40
15 files changed
+366 -251

No files matched your search

+8 -8
View File
@@ -92,7 +92,7 @@ function count(resource, filter, limit) {
if (limit) qs.limit = limit;
let options = url.parse(
`${config.get("server.nbi")}${resource}?${querystring.stringify(qs)}`
`${config.server.nbi}${resource}?${querystring.stringify(qs)}`
);
options.method = "HEAD";
@@ -133,7 +133,7 @@ function query(resource, filter, limit, skip, projection, callback) {
qs.sort = JSON.stringify({ _id: 1 });
let options = url.parse(
`${config.get("server.nbi")}${resource}?${querystring.stringify(qs)}`
`${config.server.nbi}${resource}?${querystring.stringify(qs)}`
);
let _http = options.protocol === "https:" ? https : http;
@@ -209,7 +209,7 @@ function query(resource, filter, limit, skip, projection, callback) {
function deleteResource(resource, id) {
return new Promise((resolve, reject) => {
let options = url.parse(
`${config.get("server.nbi")}${resource}/${encodeURIComponent(id)}`
`${config.server.nbi}${resource}/${encodeURIComponent(id)}`
);
options.method = "DELETE";
@@ -229,7 +229,7 @@ function deleteResource(resource, id) {
function postTask(task, connectionRequest, callback) {
let options = url.parse(
`${config.get("server.nbi")}devices/${task.device}/tasks${
`${config.server.nbi}devices/${task.device}/tasks${
connectionRequest ? "?connection_request" : ""
}`
);
@@ -346,9 +346,9 @@ function updateTags(deviceId, tags) {
([tag, onOff]) =>
new Promise((resolve, reject) => {
const options = url.parse(
`${config.get(
"server.nbi"
)}devices/${deviceId}/tags/${encodeURIComponent(tag)}`
`${config.server.nbi}devices/${deviceId}/tags/${encodeURIComponent(
tag
)}`
);
if (onOff) options.method = "POST";
else options.method = "DELETE";
@@ -370,7 +370,7 @@ function updateTags(deviceId, tags) {
function ping(host) {
return new Promise((resolve, reject) => {
const options = url.parse(
`${config.get("server.nbi")}ping/${encodeURIComponent(host)}`
`${config.server.nbi}ping/${encodeURIComponent(host)}`
);
let _http = options.protocol === "https:" ? https : http;
+29 -64
View File
@@ -1,72 +1,37 @@
"use strict";
const filterParser = require("../common/filter-parser.js");
const Filter = require("../common/filter.js");
const configFile = require("../config.json");
const cache = {};
function parse(name, value) {
if (/^ui\.overview\.charts\.[^.]+\.slices\.[^.]+\.filter$/.test(name))
return new Filter(value);
else if (/^permissions\.[^.]+\.[^.]+\.devices\.filter$/.test(name))
return new Filter(value);
else if (/^auth\.[^.]+\.users\.[^.]+\.roles$/.test(name))
return value
.split(",")
.map(x => x.trim())
.sort();
return value;
}
function get(name) {
let v = cache[name];
if (v === undefined) {
v = configFile[name];
if (v != null) {
v = parse(name, v);
} else {
const prefix = `${name}.`;
for (let k of Object.keys(configFile))
if (k.startsWith(prefix)) {
v = v || {};
let ar = k.slice(prefix.length).split(".");
let ref = v;
for (let a of ar.slice(0, -1)) ref = ref[a] = ref[a] || {};
ref[ar[ar.length - 1]] = parse(k, configFile[k]);
}
}
if (v) cache[name] = v;
else cache[name] = null;
}
return v;
}
let config;
function getClientConfig() {
const regex = [
/^ui\.pageSize$/,
/^ui\.filters\.[^.]+\.label$/,
/^ui\.filters\.[^.]+\.parameter$/,
/^ui\.filters\.[^.]+\.type$/,
/^ui\.index\./,
/^ui\.overview\.groups\./,
/^ui\.overview\.charts\./,
/^ui\.device/
];
const clientConfig = {};
for (let [k, v] of Object.entries(configFile))
for (let r of regex)
if (r.test(k)) {
clientConfig[k] = v;
break;
}
return clientConfig;
return Object.assign({}, config, {
server: null,
auth: null,
permissions: null
});
}
exports.get = get;
exports.getClientConfig = getClientConfig;
function loadConfig(conf, root = {}) {
for (const [key, value] of Object.entries(conf)) {
const keys = key.split(".");
let ref = root;
while (keys.length > 1) {
const k = keys.shift();
if (typeof ref[k] !== "object") ref[k] = {};
ref = ref[k];
}
if (typeof value === "object") {
if (typeof ref[keys[0]] !== "object") ref[keys[0]] = {};
loadConfig(value, ref[keys[0]]);
} else {
ref[keys[0]] = value;
}
}
return root;
}
config = loadConfig(configFile);
module.exports = Object.assign({}, config, { getClientConfig });
+1 -1
View File
@@ -10,7 +10,7 @@ function getClient() {
if (_client) return Promise.resolve(_client);
return new Promise((resolve, reject) => {
const CONNECTION_URL = config.get("server.mongodbConnectionUrl");
const CONNECTION_URL = config.server.mongodbConnectionUrl;
MongoClient.connect(CONNECTION_URL, (err, client) => {
if (err) return reject(err);
resolve((_client = client.db("genieacs-ui")));
+9 -6
View File
@@ -15,11 +15,11 @@ const Authorizer = require("../common/authorizer");
const koa = new Koa();
const router = new Router();
const JWT_SECRET = config.get("server.jwtSecret");
const JWT_SECRET = config.server.jwtSecret;
const JWT_COOKIE = "genieacs-ui-jwt";
function getPermissionSets(roles) {
const allPermissions = config.get("permissions");
const allPermissions = config.permissions;
const permissionSets = roles.map(r => Object.values(allPermissions[r] || {}));
return permissionSets;
}
@@ -46,7 +46,7 @@ router.post("/login", async ctx => {
const username = ctx.request.body.username;
const password = ctx.request.body.password;
const user = config.get(`auth.simple.users.${username}`);
const user = config.auth.simple.users[username];
if (!user || user.password !== password) {
ctx.status = 400;
@@ -54,7 +54,10 @@ router.post("/login", async ctx => {
return;
}
let token = jwt.sign({ username: username, roles: user.roles }, JWT_SECRET);
let token = jwt.sign(
{ username: username, roles: user.roles.split(",") },
JWT_SECRET
);
ctx.cookies.set(JWT_COOKIE, token);
ctx.body = JSON.stringify(token);
});
@@ -101,7 +104,7 @@ koa.use(
koa.use(router.routes());
koa.use(koaStatic("./public"));
koa.listen(config.get("server.port"), () => {
koa.listen(config.server.port, () => {
// eslint-disable-next-line no-console
console.log(`Server listening on port ${config.get("server.port")}`);
console.log(`Server listening on port ${config.server.port}`);
});