Add export functions for SeisJSON data.

These functions abstract the creation of SeisJSON payloads
and their various representations as GeoJSON, HTML or PDF.
This commit is contained in:
D. Berge
2021-10-03 21:15:18 +02:00
parent f2de8509cc
commit e1dc970db4
7 changed files with 131 additions and 0 deletions

View File

View File

@@ -0,0 +1,19 @@
const path = require('path');
function filename(sequenceOrFilename, extension) {
if (typeof sequenceOrFilename === "string") {
const name = sequenceOrFilename;
return path.basename(name, path.extname(name))+extension;
} else if (typeof sequenceOrFilename === "object") {
const sequence = sequenceOrFilename;
const lineName = sequence?.meta?.lineName;
const fileName = lineName
? `${lineName}-NavLog${extension}`
: `sequence-${sequence?.sequence}${extension}`;
return fileName;
} else {
return "SequenceData"+extension;
}
}
module.exports = filename;

View File

@@ -0,0 +1,29 @@
const transform = require('../transform');
const prepare = require('../prepare');
const filename = require('./filename');
function makeGeoJSON (events) {
return {
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;
})
};
}
async function geojson ({project, sequence}) {
const {events, sequences} = await prepare(project, {sequence});
const data = makeGeoJSON(events);
const name = filename(sequences.find(i => i.sequence == sequence), ".geojson");
return { name, data, mimetype: "application/geo+json" };
}
module.exports = geojson;

View File

@@ -0,0 +1,21 @@
const db = require('../../db');
const render = require('../../render');
const seisjson = require('./seisjson');
const filename = require('./filename');
// FIXME Refactor when able
const defaultTemplatePath = require('path').resolve(__dirname, "../../../../../../etc/default/templates/sequence.html.njk");
async function html ({project, sequence}, seisdata) {
const sequenceData = async () => db.sequence.get(project, sequence, {summary: true});
const template = (await db.configuration.get(project, "sse/templates/0/template")) || defaultTemplatePath;
const json = seisdata?.data ?? await seisjson({project, sequence});
const data = await render(json, template);
const name = filename(seisdata?.name || await sequenceData(), ".html");
return { name, data, mimetype: "text/html" };
}
module.exports = html;

View File

@@ -0,0 +1,8 @@
module.exports = {
// csv: require('./csv'),
geojson: require('./geojson'),
html: require('./html'),
pdf: require('./pdf'),
seisjson: require('./seisjson'),
};

View File

@@ -0,0 +1,40 @@
const fs = require('fs/promises');
const Path = require('path');
const crypto = require('crypto');
const { url2pdf } = require('../../selenium');
const html = require('./html');
const filename = require('./filename');
function tmpname (tmpdir="/dev/shm") {
return Path.join(tmpdir, crypto.randomBytes(16).toString('hex')+".tmp");
}
async function makePDF (text) {
const fname = tmpname();
try {
await fs.writeFile(fname, text);
const pdf = Buffer.from(await url2pdf("file://"+fname), "base64");
return pdf;
} catch (err) {
if (err.message.startsWith("template")) {
throw {message: err.message};
} else {
throw err;
}
} finally {
await fs.unlink(fname);
}
}
async function pdf ({project, sequence}, seisdata) {
const htmlData = await html({project, sequence}, seisdata);
const text = htmlData.data;
const data = await makePDF(text);
const name = filename(seisdata?.name, ".pdf");
return { name, data, mimetype: "application/pdf" };
}
module.exports = pdf;

View File

@@ -0,0 +1,14 @@
const transform = require('../transform');
const prepare = require('../prepare');
const filename = require('./filename');
async function seisjson ({project, sequence}) {
const {events, sequences} = await prepare(project, {sequence});
const data = transform(events, sequences, {projectId: project});
const name = filename(sequences.find(i => i.sequence == sequence), ".json");
return { name, data, mimetype: "application/vnd.seis+json" };
}
module.exports = seisjson;