45 lines
1.5 KiB
JavaScript
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);
|
|
}),
|
|
);
|