stage 1
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
import { Router } from 'express';
|
||||
|
||||
import { getReport, listReports, submitReport } from '../services/reportService.js';
|
||||
import { logAuditEvent } from '../services/auditService.js';
|
||||
import { asyncHandler } from '../utils/asyncHandler.js';
|
||||
import { validateParam } from '../middleware/validateParams.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
/*
|
||||
* Report submission accepts the full local report payload (answers, template
|
||||
* binding, status) and stores it server-side. This bridges the offline-first
|
||||
* client workflow with centralized storage for review and archival.
|
||||
*/
|
||||
|
||||
router.get(
|
||||
'/',
|
||||
asyncHandler(async (req, res) => {
|
||||
const reports = await listReports({
|
||||
status: req.query.status || undefined,
|
||||
templateCode: req.query.templateCode || undefined,
|
||||
limit: Math.min(Number(req.query.limit) || 100, 500),
|
||||
offset: Math.max(Number(req.query.offset) || 0, 0)
|
||||
});
|
||||
|
||||
res.json({ items: reports });
|
||||
})
|
||||
);
|
||||
|
||||
router.get(
|
||||
'/:reportId',
|
||||
validateParam('reportId'),
|
||||
asyncHandler(async (req, res) => {
|
||||
const report = await getReport(req.params.reportId);
|
||||
|
||||
if (!report) {
|
||||
return res.status(404).json({ message: 'Report not found.' });
|
||||
}
|
||||
|
||||
return res.json(report);
|
||||
})
|
||||
);
|
||||
|
||||
router.post(
|
||||
'/',
|
||||
asyncHandler(async (req, res) => {
|
||||
const body = req.body;
|
||||
|
||||
if (!body?.id || !body?.reportNumber || !body?.templateCode || !body?.templateVersion || !body?.answers) {
|
||||
return res.status(400).json({
|
||||
message: 'id, reportNumber, templateCode, templateVersion, and answers are required.'
|
||||
});
|
||||
}
|
||||
|
||||
const report = await submitReport({
|
||||
id: String(body.id).trim(),
|
||||
reportNumber: String(body.reportNumber).trim(),
|
||||
templateCode: String(body.templateCode).trim(),
|
||||
templateVersion: Number(body.templateVersion),
|
||||
status: body.status || 'exported',
|
||||
answers: body.answers
|
||||
});
|
||||
|
||||
await logAuditEvent({
|
||||
entityType: 'report',
|
||||
entityCode: report.id,
|
||||
action: 'submit',
|
||||
newValue: { reportNumber: report.reportNumber, templateCode: report.templateCode }
|
||||
});
|
||||
|
||||
return res.status(201).json(report);
|
||||
})
|
||||
);
|
||||
|
||||
export default router;
|
||||
Reference in New Issue
Block a user