/** * 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); }), );