mirror of
https://gitlab.com/wgp/dougal/software.git
synced 2025-12-06 11:07:08 +00:00
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:
0
lib/www/server/lib/sse/present/csv.js
Normal file
0
lib/www/server/lib/sse/present/csv.js
Normal file
19
lib/www/server/lib/sse/present/filename.js
Normal file
19
lib/www/server/lib/sse/present/filename.js
Normal 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;
|
||||
29
lib/www/server/lib/sse/present/geojson.js
Normal file
29
lib/www/server/lib/sse/present/geojson.js
Normal 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;
|
||||
21
lib/www/server/lib/sse/present/html.js
Normal file
21
lib/www/server/lib/sse/present/html.js
Normal 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;
|
||||
8
lib/www/server/lib/sse/present/index.js
Normal file
8
lib/www/server/lib/sse/present/index.js
Normal file
@@ -0,0 +1,8 @@
|
||||
|
||||
module.exports = {
|
||||
// csv: require('./csv'),
|
||||
geojson: require('./geojson'),
|
||||
html: require('./html'),
|
||||
pdf: require('./pdf'),
|
||||
seisjson: require('./seisjson'),
|
||||
};
|
||||
40
lib/www/server/lib/sse/present/pdf.js
Normal file
40
lib/www/server/lib/sse/present/pdf.js
Normal 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;
|
||||
14
lib/www/server/lib/sse/present/seisjson.js
Normal file
14
lib/www/server/lib/sse/present/seisjson.js
Normal 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;
|
||||
Reference in New Issue
Block a user