Generalize store quering functions

This commit is contained in:
Zaid Abdulla committed 2018-12-26 00:22:07 -08:00
1 parent 93c6a4dfcd
commit 9b827c5f5e
26 files changed
+1362 -321

No files matched your search

+12 -11
View File
@@ -80,11 +80,10 @@ function count(resource, filter, limit) {
return new Promise((resolve, reject) => {
let qs = {};
if (filter) {
let f = filterParser.parse(filter);
f = filterParser.evaluateExpressions(f);
f = unpackTimestamps(f);
filter = filter.evaluateExpressions();
let ast = unpackTimestamps(filter.ast);
let q = filterToQuery(f);
let q = filterToQuery(ast);
if (resource === "devices") q = device.transposeQuery(q);
qs.query = JSON.stringify(q);
}
@@ -92,7 +91,7 @@ function count(resource, filter, limit) {
if (limit) qs.limit = limit;
let options = url.parse(
`${config.GENIEACS_NBI}${resource}?${querystring.stringify(qs)}`
`${config.get("server.nbi")}${resource}?${querystring.stringify(qs)}`
);
options.method = "HEAD";
@@ -112,26 +111,28 @@ function count(resource, filter, limit) {
});
}
function query(resource, filter, limit, callback) {
function query(resource, filter, limit, skip, projection, callback) {
return new Promise((resolve, reject) => {
let ret;
if (!callback) ret = [];
let qs = {};
if (filter) {
let f = filterParser.parse(filter);
f = filterParser.evaluateExpressions(f);
f = unpackTimestamps(f);
filter = filter.evaluateExpressions();
let ast = unpackTimestamps(filter.ast);
let q = filterToQuery(f);
let q = filterToQuery(ast);
if (resource === "devices") q = device.transposeQuery(q);
qs.query = JSON.stringify(q);
}
if (limit) qs.limit = limit;
if (skip) qs.skip = skip;
if (projection) qs.projection = projection;
qs.sort = JSON.stringify({ _id: 1 });
let options = url.parse(
`${config.GENIEACS_NBI}${resource}?${querystring.stringify(qs)}`
`${config.get("server.nbi")}${resource}?${querystring.stringify(qs)}`
);
let _http = options.protocol === "https:" ? https : http;
+14 -6
View File
@@ -3,6 +3,7 @@
const Router = require("koa-router");
const apiFunctions = require("./api-functions");
const Filter = require("../common/filter");
const router = new Router();
@@ -17,7 +18,7 @@ const resources = {
for (let [resource, update] of Object.entries(resources)) {
router.head(`/${resource}`, async ctx => {
let filter, limit;
if (ctx.request.query.filter) filter = ctx.request.query.filter;
if (ctx.request.query.filter) filter = new Filter(ctx.request.query.filter);
if (ctx.request.query.limit) limit = +ctx.request.query.limit;
let count = await apiFunctions.count(resource, filter, limit);
@@ -26,22 +27,29 @@ for (let [resource, update] of Object.entries(resources)) {
});
router.get(`/${resource}`, async ctx => {
let filter, limit;
if (ctx.request.query.filter) filter = ctx.request.query.filter;
let filter, limit, skip;
if (ctx.request.query.filter) filter = new Filter(ctx.request.query.filter);
if (ctx.request.query.limit) limit = +ctx.request.query.limit;
if (ctx.request.query.skip) skip = +ctx.request.query.skip;
ctx.body = await apiFunctions.query(resource, filter, limit);
ctx.body = await apiFunctions.query(
resource,
filter,
limit,
skip,
ctx.request.query.projection
);
});
router.head(`/${resource}/:id`, async (ctx, next) => {
let filter = `DeviceID.ID = "${ctx.params.id}"`;
let filter = new Filter(`DeviceID.ID = "${ctx.params.id}"`);
let res = await apiFunctions.query(resource, filter);
if (!res.length) return next();
ctx.body = "";
});
router.get(`/${resource}/:id`, async (ctx, next) => {
let filter = `DeviceID.ID = "${ctx.params.id}"`;
let filter = new Filter(`DeviceID.ID = "${ctx.params.id}"`);
let res = await apiFunctions.query(resource, filter);
if (!res.length) return next();
ctx.body = res[0];
+61 -2
View File
@@ -1,6 +1,65 @@
"use strict";
const filterParser = require("../common/filter-parser.js");
const Filter = require("../common/filter.js");
exports.PORT = 3000;
exports.GENIEACS_NBI = "http://127.0.0.1:7557/";
const configFile = require("../config.json");
const cache = {};
function parse(name, value) {
if (/^ui\.overview\.charts\.[^.]+\.slices\.[^.]+\.filter$/.test(name))
return new Filter(value);
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;
}
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;
}
exports.get = get;
exports.getClientConfig = getClientConfig;
+4 -4
View File
@@ -5,7 +5,7 @@ function recursive(input, root, output, timestamp) {
if (root.length === 0)
if (name === "_lastInform") {
output["Events.Inform"] = {
value: [timestamp, "xsd:dateTime"],
value: [Date.parse(tree), "xsd:dateTime"],
valueTimestamp: timestamp,
writable: false,
writableTimestamp: timestamp,
@@ -14,7 +14,7 @@ function recursive(input, root, output, timestamp) {
};
} else if (name === "_registered") {
output["Events.Registered"] = {
value: [timestamp, "xsd:dateTime"],
value: [Date.parse(tree), "xsd:dateTime"],
valueTimestamp: timestamp,
writable: false,
writableTimestamp: timestamp,
@@ -23,7 +23,7 @@ function recursive(input, root, output, timestamp) {
};
} else if (name === "_lastBoot") {
output["Events.1_BOOT"] = {
value: [timestamp, "xsd:dateTime"],
value: [Date.parse(tree), "xsd:dateTime"],
valueTimestamp: timestamp,
writable: false,
writableTimestamp: timestamp,
@@ -32,7 +32,7 @@ function recursive(input, root, output, timestamp) {
};
} else if (name === "_lastBootstrap") {
output["Events.0_BOOTSTRAP"] = {
value: [timestamp, "xsd:dateTime"],
value: [Date.parse(tree), "xsd:dateTime"],
valueTimestamp: timestamp,
writable: false,
writableTimestamp: timestamp,
+20 -2
View File
@@ -12,10 +12,28 @@ const router = new Router();
router.use("/api", api.routes(), api.allowedMethods());
router.get("/", async ctx => {
ctx.body = `
<html>
<head>
<title>GenieACS</title>
<link rel="shortcut icon" type="image/png" href="favicon.png" />
<link rel="stylesheet" href="app.css">
</head>
<body>
<script>
window.clientConfig = ${JSON.stringify(config.getClientConfig())};
</script>
<script src="app.js"></script>
</body>
</html>
`;
});
koa.use(router.routes());
koa.use(koaStatic("./public"));
koa.listen(config.PORT, () => {
koa.listen(config.get("server.port"), () => {
// eslint-disable-next-line no-console
console.log(`Server listening on port ${config.PORT}`);
console.log(`Server listening on port ${config.get("server.port")}`);
});