verae-middleware/src/routes/receiptRoutes.js

45 lines
1.5 KiB
JavaScript

/**
* Mock certified retrieval receipt (JSON). Not a payment invoice.
* @module routes/receiptRoutes
*/
import { Router } from 'express';
import { asyncHandler, AppError } from '../errors.js';
import { getJobStatus } from '../services/timestampService.js';
import { buildReceiptPdf } from '../lib/receiptPdf.js';
export const receiptRoutes = Router();
receiptRoutes.get(
'/:jobId',
asyncHandler(async (req, res) => {
const { jobId } = req.params;
const format = String(req.query.format || 'json').toLowerCase();
const status = await getJobStatus(req.auth, jobId);
if (status.status !== 'completed') {
throw new AppError('Receipt only for completed jobs', { status: 409, code: 'NOT_COMPLETE' });
}
const retrievedAt = new Date().toISOString();
const receipt = {
type: 'verae.retrieval-receipt',
format: 'json',
jobId,
sha256: status.sha256 ?? status.metadata?.sha256,
timestamp: status.completedAt ?? status.metadata?.timestamp,
certificate: status.result,
extraSeal: {
event: 'document.retrieved',
retrievedAt,
tenantId: req.auth.tenantId,
},
};
if (format === 'pdf') {
const pdf = buildReceiptPdf({ ...receipt, format: 'pdf' });
res.setHeader('content-type', 'application/pdf');
res.setHeader('content-disposition', `attachment; filename="verae-receipt-${jobId}.pdf"`);
res.send(pdf);
return;
}
res.json(receipt);
}),
);