mirror of
https://gitlab.com/wgp/dougal/software.git
synced 2025-12-06 13:27:08 +00:00
55 lines
2.0 KiB
JavaScript
55 lines
2.0 KiB
JavaScript
const fs = require('fs/promises');
|
|
const Path = require('path');
|
|
const crypto = require('crypto');
|
|
const { configuration } = require('../../../../lib/db');
|
|
const { transform, prepare } = require('../../../../lib/sse');
|
|
const render = require('../../../../lib/render');
|
|
const { url2pdf } = require('../../../../lib/selenium');
|
|
|
|
// FIXME Refactor when able
|
|
const defaultTemplatePath = require('path').resolve(__dirname, "../../../../../../../etc/default/templates/sequence.html.njk");
|
|
|
|
function tmpname (tmpdir="/dev/shm") {
|
|
return Path.join(tmpdir, crypto.randomBytes(16).toString('hex')+".tmp");
|
|
}
|
|
|
|
const pdf = async function (req, res, next) {
|
|
const fname = tmpname();
|
|
try {
|
|
const query = req.query;
|
|
query.sequence = req.params.sequence;
|
|
const {events, sequences} = await prepare(req.params.project, query);
|
|
const seis = transform(events, sequences, {projectId: req.params.project, missingAsEvent: true});
|
|
const template = (await configuration.get(req.params.project, "sse/templates/0/template")) || defaultTemplatePath;
|
|
|
|
const html = await render(seis, template);
|
|
|
|
await fs.writeFile(fname, html);
|
|
const pdf = Buffer.from(await url2pdf("file://"+fname), "base64");
|
|
|
|
if ("download" in query || "d" in query) {
|
|
const extension = "pdf";
|
|
// Get the sequence number(s) (more than one sequence can be selected)
|
|
const seqNums = query.sequence.split(";");
|
|
// If we've only been asked for a single sequence, get its line name
|
|
const lineName = (sequences.find(i => i.sequence == seqNums[0]) || {})?.meta?.lineName;
|
|
const filename = (seqNums.length == 1 && lineName)
|
|
? `${lineName}-NavLog.${extension}`
|
|
: `${req.params.project}-${query.sequence}.${extension}`;
|
|
res.set("Content-Disposition", `attachment; filename="${filename}"`);
|
|
}
|
|
res.status(200).send(pdf);
|
|
next();
|
|
} catch (err) {
|
|
if (err.message.startsWith("template")) {
|
|
next({message: err.message});
|
|
} else {
|
|
next(err);
|
|
}
|
|
} finally {
|
|
await fs.unlink(fname);
|
|
}
|
|
};
|
|
|
|
module.exports = pdf;
|