import { NextRequest } from 'next/server'; import { getRun, getRecentRuns, cancelRun } from '@/lib/db'; import { findAutomation } from '@/lib/automations'; import { corsJson, corsPreflight } from '../cors'; function shape(row: NonNullable>) { return { id: row.id, automationId: row.automation_id, automationLabel: findAutomation(row.automation_id)?.automation.label ?? row.automation_id, status: row.status, stepIndex: row.step_index, totalSteps: row.total_steps, log: (() => { try { return JSON.parse(row.log); } catch { return []; } })(), error: row.error, createdAt: row.created_at, updatedAt: row.updated_at, }; } /** `?id=` for one run, otherwise the recent history the dashboard shows. */ export async function GET(req: NextRequest) { const idParam = req.nextUrl.searchParams.get('id'); if (idParam) { const row = getRun(Number(idParam)); if (!row) return corsJson({ error: 'No such run' }, { status: 404 }); return corsJson({ run: shape(row) }); } return corsJson({ runs: getRecentRuns(5).map(shape) }); } /** Stop button. A queued run never starts; a running one halts at the next step. */ export async function DELETE(req: NextRequest) { const id = Number(req.nextUrl.searchParams.get('id')); if (!Number.isInteger(id) || id <= 0) { return corsJson({ error: '`id` is required' }, { status: 400 }); } return corsJson({ cancelled: cancelRun(id) }); } export async function OPTIONS() { return corsPreflight(); }