From db25878fdd8ab969e243ed115d96fd714073c05a Mon Sep 17 00:00:00 2001 From: "D. Berge" Date: Wed, 9 Sep 2020 15:55:04 +0200 Subject: [PATCH] Add `info` API endpoint. It queries a project's `info` table. --- lib/www/server/api/index.js | 4 +++ lib/www/server/api/middleware/index.js | 3 +- lib/www/server/api/middleware/info/delete.js | 0 lib/www/server/api/middleware/info/get.js | 18 ++++++++++++ lib/www/server/api/middleware/info/index.js | 8 ++++++ lib/www/server/api/middleware/info/list.js | 0 lib/www/server/api/middleware/info/post.js | 0 lib/www/server/api/middleware/info/put.js | 0 lib/www/server/lib/db/index.js | 1 + lib/www/server/lib/db/info/delete.js | 0 lib/www/server/lib/db/info/get.js | 30 ++++++++++++++++++++ lib/www/server/lib/db/info/index.js | 7 +++++ lib/www/server/lib/db/info/post.js | 0 lib/www/server/lib/db/info/put.js | 0 14 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 lib/www/server/api/middleware/info/delete.js create mode 100644 lib/www/server/api/middleware/info/get.js create mode 100644 lib/www/server/api/middleware/info/index.js create mode 100644 lib/www/server/api/middleware/info/list.js create mode 100644 lib/www/server/api/middleware/info/post.js create mode 100644 lib/www/server/api/middleware/info/put.js create mode 100644 lib/www/server/lib/db/info/delete.js create mode 100644 lib/www/server/lib/db/info/get.js create mode 100644 lib/www/server/lib/db/info/index.js create mode 100644 lib/www/server/lib/db/info/post.js create mode 100644 lib/www/server/lib/db/info/put.js diff --git a/lib/www/server/api/index.js b/lib/www/server/api/index.js index e5e485c..eaac96a 100644 --- a/lib/www/server/api/index.js +++ b/lib/www/server/api/index.js @@ -125,6 +125,10 @@ app.map({ get: [ mw.configuration.get ], // post: [ mw.label.post ], }, + '/project/:project/info/:path(*)': { + get: [ mw.info.get ], +// post: [ mw.info.post ], + }, // // '/project/:id/permissions/:mode(read|write)?': { // get: [ mw.permissions.get ], diff --git a/lib/www/server/api/middleware/index.js b/lib/www/server/api/middleware/index.js index 8d98152..70a65f4 100644 --- a/lib/www/server/api/middleware/index.js +++ b/lib/www/server/api/middleware/index.js @@ -8,5 +8,6 @@ module.exports = { gis: require('./gis'), label: require('./label'), navdata: require('./navdata'), - configuration: require('./configuration') + configuration: require('./configuration'), + info: require('./info') }; diff --git a/lib/www/server/api/middleware/info/delete.js b/lib/www/server/api/middleware/info/delete.js new file mode 100644 index 0000000..e69de29 diff --git a/lib/www/server/api/middleware/info/get.js b/lib/www/server/api/middleware/info/get.js new file mode 100644 index 0000000..195bfae --- /dev/null +++ b/lib/www/server/api/middleware/info/get.js @@ -0,0 +1,18 @@ + +const { info } = require('../../../lib/db'); + +module.exports = async function (req, res, next) { + + try { + res.status(200).json(await info.get(req.params.project, req.params.path, req.query)); + } catch (err) { + if (err instanceof TypeError) { + res.status(404).json(null); + } else { + next(err); + return; + } + } + next(); + +}; diff --git a/lib/www/server/api/middleware/info/index.js b/lib/www/server/api/middleware/info/index.js new file mode 100644 index 0000000..1b5fb45 --- /dev/null +++ b/lib/www/server/api/middleware/info/index.js @@ -0,0 +1,8 @@ + +module.exports = { + list: require('./list'), + get: require('./get'), + post: require('./post'), + put: require('./put'), + delete: require('./delete') +} diff --git a/lib/www/server/api/middleware/info/list.js b/lib/www/server/api/middleware/info/list.js new file mode 100644 index 0000000..e69de29 diff --git a/lib/www/server/api/middleware/info/post.js b/lib/www/server/api/middleware/info/post.js new file mode 100644 index 0000000..e69de29 diff --git a/lib/www/server/api/middleware/info/put.js b/lib/www/server/api/middleware/info/put.js new file mode 100644 index 0000000..e69de29 diff --git a/lib/www/server/lib/db/index.js b/lib/www/server/lib/db/index.js index 5a65e15..543c295 100644 --- a/lib/www/server/lib/db/index.js +++ b/lib/www/server/lib/db/index.js @@ -7,5 +7,6 @@ module.exports = { gis: require('./gis'), label: require('./label'), configuration: require('./configuration'), + info: require('./info'), navdata: require('./navdata') }; diff --git a/lib/www/server/lib/db/info/delete.js b/lib/www/server/lib/db/info/delete.js new file mode 100644 index 0000000..e69de29 diff --git a/lib/www/server/lib/db/info/get.js b/lib/www/server/lib/db/info/get.js new file mode 100644 index 0000000..2710759 --- /dev/null +++ b/lib/www/server/lib/db/info/get.js @@ -0,0 +1,30 @@ +const { setSurvey } = require('../connection'); + +async function get (projectId, path, opts = {}) { + const client = await setSurvey(projectId); + const [key, ...subkey] = path.split("/"); + + const text = ` + SELECT value + FROM info + WHERE key = $1; + `; + + console.log("k, sk", key, subkey); + const res = await client.query(text, [key]); + client.release(); + + const value = res.rows[0] && res.rows[0].value; + + if (subkey.length) { + console.log("Reducing value"); + const res = subkey.reduce( (obj, idx) => typeof obj != "undefined" ? obj[idx] : obj, value); + console.log(res); + return res; + } else { + console.log("Returning value"); + return value; + } +} + +module.exports = get; diff --git a/lib/www/server/lib/db/info/index.js b/lib/www/server/lib/db/info/index.js new file mode 100644 index 0000000..ab357e0 --- /dev/null +++ b/lib/www/server/lib/db/info/index.js @@ -0,0 +1,7 @@ + +module.exports = { + get: require('./get'), + post: require('./post'), + put: require('./put'), + delete: require('./delete') +} diff --git a/lib/www/server/lib/db/info/post.js b/lib/www/server/lib/db/info/post.js new file mode 100644 index 0000000..e69de29 diff --git a/lib/www/server/lib/db/info/put.js b/lib/www/server/lib/db/info/put.js new file mode 100644 index 0000000..e69de29