From ad013ea642cc86ad46d40510e4702d79937739d6 Mon Sep 17 00:00:00 2001 From: "D. Berge" Date: Fri, 1 Aug 2025 17:07:37 +0200 Subject: [PATCH] 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. --- .../api/middleware/sequence/list/binary.js | 17 ++++++++++ .../api/middleware/sequence/list/geojson.js | 33 +++++++++++++++++++ .../api/middleware/sequence/list/index.js | 25 ++++++++++++++ .../sequence/{list.js => list/json.js} | 3 +- 4 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 lib/www/server/api/middleware/sequence/list/binary.js create mode 100644 lib/www/server/api/middleware/sequence/list/geojson.js create mode 100644 lib/www/server/api/middleware/sequence/list/index.js rename lib/www/server/api/middleware/sequence/{list.js => list/json.js} (71%) diff --git a/lib/www/server/api/middleware/sequence/list/binary.js b/lib/www/server/api/middleware/sequence/list/binary.js new file mode 100644 index 0000000..d8e1a83 --- /dev/null +++ b/lib/www/server/api/middleware/sequence/list/binary.js @@ -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); + } + +}; diff --git a/lib/www/server/api/middleware/sequence/list/geojson.js b/lib/www/server/api/middleware/sequence/list/geojson.js new file mode 100644 index 0000000..5e39343 --- /dev/null +++ b/lib/www/server/api/middleware/sequence/list/geojson.js @@ -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); + } + + +}; diff --git a/lib/www/server/api/middleware/sequence/list/index.js b/lib/www/server/api/middleware/sequence/list/index.js new file mode 100644 index 0000000..189e68a --- /dev/null +++ b/lib/www/server/api/middleware/sequence/list/index.js @@ -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); + } +} diff --git a/lib/www/server/api/middleware/sequence/list.js b/lib/www/server/api/middleware/sequence/list/json.js similarity index 71% rename from lib/www/server/api/middleware/sequence/list.js rename to lib/www/server/api/middleware/sequence/list/json.js index 14e7ba0..a4281e1 100644 --- a/lib/www/server/api/middleware/sequence/list.js +++ b/lib/www/server/api/middleware/sequence/list/json.js @@ -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) {