import { prisma } from "@/lib/db"; import type { EpisodeStatus } from "@prisma/client"; /** Update an episode's pipeline status (and optional human-readable stage / error). */ export async function setEpisodeStatus( episodeId: string, status: EpisodeStatus, opts: { stage?: string; errorMessage?: string | null } = {} ): Promise { await prisma.episode.update({ where: { id: episodeId }, data: { status, stage: opts.stage ?? null, ...(opts.errorMessage !== undefined ? { errorMessage: opts.errorMessage } : {}), }, }); } /** Mark a GenerationJob as running. */ export async function startJob(jobId: string, pgBossJobId?: string): Promise { await prisma.generationJob.update({ where: { id: jobId }, data: { status: "running", startedAt: new Date(), pgBossJobId: pgBossJobId ?? undefined }, }); } /** Mark a GenerationJob as completed or failed. */ export async function finishJob( jobId: string, result: { status: "completed" | "failed"; error?: string; stage?: string } ): Promise { await prisma.generationJob.update({ where: { id: jobId }, data: { status: result.status, error: result.error ?? null, stage: result.stage, finishedAt: new Date(), }, }); } /** Terminal episode states — used by the UI/SSE to stop polling. */ export function isTerminal(status: EpisodeStatus): boolean { return status === "READY" || status === "FAILED"; }