Some checks failed
Deploy to Production / Deploy to Server (push) Failing after 20s
- Include compiled TypeScript with new /impressum, /privacy, /terms routes - Temporary commit of dist files for Docker deployment
40 lines
1.5 KiB
JavaScript
40 lines
1.5 KiB
JavaScript
import { Router } from "express";
|
|
import { renderPdf } from "../services/browser.js";
|
|
import logger from "../services/logger.js";
|
|
import { templates, renderTemplate } from "../services/templates.js";
|
|
export const templatesRouter = Router();
|
|
// GET /v1/templates — list available templates
|
|
templatesRouter.get("/", (_req, res) => {
|
|
const list = Object.entries(templates).map(([id, t]) => ({
|
|
id,
|
|
name: t.name,
|
|
description: t.description,
|
|
fields: t.fields,
|
|
}));
|
|
res.json({ templates: list });
|
|
});
|
|
// POST /v1/templates/:id/render — render template to PDF
|
|
templatesRouter.post("/:id/render", async (req, res) => {
|
|
try {
|
|
const id = req.params.id;
|
|
const template = templates[id];
|
|
if (!template) {
|
|
res.status(404).json({ error: `Template '${id}' not found` });
|
|
return;
|
|
}
|
|
const data = req.body.data || req.body;
|
|
const html = renderTemplate(id, data);
|
|
const pdf = await renderPdf(html, {
|
|
format: data._format || "A4",
|
|
margin: data._margin,
|
|
});
|
|
const filename = data._filename || `${id}.pdf`;
|
|
res.setHeader("Content-Type", "application/pdf");
|
|
res.setHeader("Content-Disposition", `inline; filename="${filename}"`);
|
|
res.send(pdf);
|
|
}
|
|
catch (err) {
|
|
logger.error({ err }, "Template render error");
|
|
res.status(500).json({ error: "Template rendering failed", detail: err.message });
|
|
}
|
|
});
|