Implement GET middleware for events.

Produces a choice of outputs: JSON, GeoJSON, Seis+JSON and HTML.
This commit is contained in:
D. Berge
2021-05-11 23:12:42 +02:00
parent 95647337aa
commit d9f4583224
6 changed files with 112 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
const { event } = require('../../../../lib/db');
const geojson = async function (req, res, next) {
try {
const query = req.query;
query.sequence = req.params.sequence;
const events = await event.list(req.params.project, query);
const response = {
type: "FeatureCollection",
features: events.filter(event => event.geometry).map(event => {
const feature = {
type: "Feature",
geometry: event.geometry,
properties: event
};
delete feature.properties.geometry;
return feature;
})
};
res.status(200).send(response);
next();
} catch (err) {
next(err);
}
}
module.exports = geojson;

View File

@@ -0,0 +1,23 @@
const { event, sequence, configuration } = require('../../../../lib/db');
const { transform } = require('../../../../lib/sse');
const render = require('../../../../lib/render');
const html = async function (req, res, next) {
try {
const query = req.query;
query.sequence = req.params.sequence;
const events = await event.list(req.params.project, query);
const sequences = await sequence.list(req.params.project, query);
const seis = transform(events, sequences, {projectId: req.params.project});
const templates = await configuration.get(req.params.project, "sse/templates");
const template = templates[0].template;
const response = await render(seis, template);
res.status(200).send(response);
next();
} catch (err) {
next(err);
}
};
module.exports = html;

View File

@@ -0,0 +1,27 @@
const json = require('./json');
const geojson = require('./geojson');
const seis = require('./seis');
const html = require('./html');
module.exports = async function (req, res, next) {
try {
const handlers = {
"application/json": json,
"application/geo+json": geojson,
"application/vnd.seis+json": seis,
"text/html": html,
};
const mimetype = (handlers[req.query.mime] && req.query.mime) || req.accepts(Object.keys(handlers));
if (mimetype) {
res.set("Content-Type", mimetype);
await handlers[mimetype](req, res, next);
} else {
res.status(406).send();
next();
}
} catch (err) {
next(err);
}
}

View File

@@ -0,0 +1,16 @@
const { event } = require('../../../../lib/db');
const json = async function (req, res, next) {
try {
const query = req.query;
query.sequence = req.params.sequence;
const response = await event.list(req.params.project, query);
res.status(200).send(response);
next();
} catch (err) {
next(err);
}
};
module.exports = json;

View File

@@ -0,0 +1,18 @@
const { event, sequence } = require('../../../../lib/db');
const { transform } = require('../../../../lib/sse');
const seis = async function (req, res, next) {
try {
const query = req.query;
query.sequence = req.params.sequence;
const events = await event.list(req.params.project, query);
const sequences = await sequence.list(req.params.project, query);
const response = transform(events, sequences, {projectId: req.params.project});
res.status(200).send(response);
next();
} catch (err) {
next(err);
}
};
module.exports = seis;