56 lines
2.1 KiB
JavaScript
56 lines
2.1 KiB
JavaScript
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);
|
|
}
|