51 lines
2.3 KiB
JavaScript
51 lines
2.3 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.REPORT_JOB_TYPE = void 0;
|
|
exports.createReportJobHandler = createReportJobHandler;
|
|
const HTMLReportGenerator_1 = require("../../modules/reporting/infrastructure/generators/HTMLReportGenerator");
|
|
const JSONReportGenerator_1 = require("../../modules/reporting/infrastructure/generators/JSONReportGenerator");
|
|
const PDFReportGenerator_1 = require("../../modules/reporting/infrastructure/generators/PDFReportGenerator");
|
|
exports.REPORT_JOB_TYPE = 'report:generate';
|
|
function createReportJobHandler(deps) {
|
|
const htmlGen = new HTMLReportGenerator_1.HTMLReportGenerator();
|
|
const jsonGen = new JSONReportGenerator_1.JSONReportGenerator();
|
|
const pdfGen = new PDFReportGenerator_1.PDFReportGenerator();
|
|
return async (payload) => {
|
|
const log = deps.logger.child({ jobType: exports.REPORT_JOB_TYPE, reportId: payload.reportId });
|
|
log.info({ format: payload.format }, 'Report generation job executing');
|
|
const report = await deps.reportRepository.findById(payload.reportId);
|
|
if (!report) {
|
|
throw new Error(`Report not found: ${payload.reportId}`);
|
|
}
|
|
report.markGenerating();
|
|
await deps.reportRepository.update(report);
|
|
// Load findings with filters from report
|
|
const findings = await deps.findingRepository.findAll({
|
|
sessionId: report.filters.sessionId,
|
|
severity: report.filters.severity,
|
|
});
|
|
let filePath;
|
|
try {
|
|
if (payload.format === 'pdf') {
|
|
filePath = await pdfGen.generate(report, findings);
|
|
}
|
|
else if (payload.format === 'json') {
|
|
filePath = await jsonGen.generate(report, findings);
|
|
}
|
|
else {
|
|
filePath = await htmlGen.generate(report, findings);
|
|
}
|
|
}
|
|
catch (err) {
|
|
const msg = err instanceof Error ? err.message : String(err);
|
|
report.markFailed(msg);
|
|
await deps.reportRepository.update(report);
|
|
throw err;
|
|
}
|
|
report.markReady(filePath, findings.length);
|
|
await deps.reportRepository.update(report);
|
|
log.info({ filePath, totalFindings: findings.length }, 'Report job complete');
|
|
return { reportId: payload.reportId, filePath };
|
|
};
|
|
}
|