import fs from 'node:fs'; import { getJobOutputFile, listJobOutputs, listJobOutputsForJob } from '../models/jobOutputModel.js'; import { getJob } from '../models/jobModel.js'; import { generateJobOutputs } from '../services/jobOutputService.js'; function isAdmin(req) { return req.user.role === 'admin'; } export function index(req, res) { res.json(listJobOutputs(req.user.id, isAdmin(req))); } export function byJob(req, res) { res.json(listJobOutputsForJob(req.params.jobId, req.user.id, isAdmin(req))); } export async function generate(req, res) { const job = getJob(req.params.jobId, req.user.id, isAdmin(req)); if (!job) return res.status(404).json({ error: 'Job not found' }); await generateJobOutputs(req.params.jobId); const outputs = listJobOutputsForJob(req.params.jobId, req.user.id, isAdmin(req)); if (!outputs.length) return res.status(409).json({ error: 'Job is not ready for output generation' }); res.json(outputs); } export function content(req, res) { const result = getJobOutputFile(req.params.id, req.user.id, isAdmin(req)); if (!result) return res.status(404).json({ error: 'Job output not found' }); if (result.output.mimeType === 'application/json') { return res.json({ output: result.output, table: JSON.parse(fs.readFileSync(result.filePath, 'utf8')) }); } if (result.output.mimeType.startsWith('text/')) { return res.json({ output: result.output, text: fs.readFileSync(result.filePath, 'utf8') }); } return res.json({ output: result.output }); } export function view(req, res) { const result = getJobOutputFile(req.params.id, req.user.id, isAdmin(req)); if (!result) return res.status(404).json({ error: 'Job output not found' }); res.type(result.output.mimeType || 'application/octet-stream'); res.setHeader('Content-Disposition', `inline; filename="${encodeURIComponent(result.output.name)}"`); res.sendFile(result.filePath); } export function download(req, res) { const result = getJobOutputFile(req.params.id, req.user.id, isAdmin(req)); if (!result) return res.status(404).json({ error: 'Job output not found' }); res.download(result.filePath, result.output.name); }