Add additional formats for sequence list endpoint.

The original and default "Accept: application/json" will return
a sequence summary.

"Accept: application/geo+json" will return a GeoJSON of the
entire project.

"Accept: application/vnd.aaltronav.dougal+octet-stream" will
return the entire project in Dougal's binary format.
This commit is contained in:
D. Berge
2025-08-01 17:07:37 +02:00
parent 48d5986415
commit ad013ea642
4 changed files with 77 additions and 1 deletions

View File

@@ -0,0 +1,17 @@
const { bundle } = require('../../../../lib/binary');
const { sequence } = require('../../../../lib/db');
module.exports = async function (req, res, next) {
try {
const json = await sequence.get(req.params.project, null, req.query);
const data = bundle(json, {type: req.query.type});
console.log("bundle", data);
res.status(200).send(Buffer.from(data));
next();
} catch (err) {
next(err);
}
};

View File

@@ -0,0 +1,33 @@
const { ERROR, INFO, DEBUG } = require('DOUGAL_ROOT/debug')(__filename);
const { sequence } = require('../../../../lib/db');
module.exports = async function (req, res, next) {
try {
const ts0 = Date.now();
const json = await sequence.get(req.params.project, null, req.query);
const geometry = req.query.geometry || "geometrypreplot";
const δt = Date.now()-ts0;
DEBUG("Full-project data retrieval completed in %.3f s", δt / 1000);
const geojson = {
type: "FeatureCollection",
features: json.map(feature => {
return {
type: "Feature",
geometry: feature[geometry],
properties: {...feature}
}
})
};
res.status(200).send(geojson);
next();
} catch (err) {
next(err);
}
};

View File

@@ -0,0 +1,25 @@
const json = require('./json');
const geojson = require('./geojson');
const binary = require('./binary');
module.exports = async function (req, res, next) {
try {
const handlers = {
"application/json": json,
"application/geo+json": geojson,
"application/vnd.aaltronav.dougal+octet-stream": binary
};
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

@@ -1,9 +1,10 @@
const { sequence } = require('../../../lib/db');
const { sequence } = require('../../../../lib/db');
module.exports = async function (req, res, next) {
try {
console.log("JSON");
res.status(200).send(await sequence.list(req.params.project, req.query));
next();
} catch (err) {