Generalize store quering functions
This commit is contained in:
1 parent
93c6a4dfcd
commit
9b827c5f5e
26 files changed
+1362
-321
No files matched your search
+12
-11
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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")}`);
|
||||
});
|
||||
Reference in new issue
Block a user