Files
triggershell/src/app/api/runs/[runId]/cancel/route.ts
T
valknarandClaude Sonnet 5 96a66fc857
CI / Checks (push) Successful in 47s
CI / Publish to npm registry (push) Successful in 50s
Add structured backend logging with pino
Wires leveled, structured logging (pretty in dev, JSON in prod) through
the server lifecycle, HTTP/WS request handling, run engine, auth, db,
and config loading. CLI command output is left untouched since it's
user-facing terminal UX, not backend logs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 09:54:16 +02:00

46 lines
1.3 KiB
TypeScript

export const dynamic = "force-dynamic";
import { eq } from "drizzle-orm";
import { requireAuth, unauthorizedResponse } from "@/lib/auth/guard";
import { getDb } from "@/lib/db/client";
import { runs } from "@/lib/db/schema";
import { cancelRun } from "@/lib/runner/registry";
import { logger } from "@/lib/logger";
const log = logger.child({ mod: "api" });
export async function POST(
request: Request,
{ params }: { params: Promise<{ runId: string }> },
) {
const auth = await requireAuth(request);
if (!auth.authenticated) return unauthorizedResponse();
const { runId } = await params;
const db = getDb();
const run = db.select().from(runs).where(eq(runs.id, runId)).get();
if (!run) return Response.json({ error: "Run not found" }, { status: 404 });
if (run.status !== "queued" && run.status !== "running") {
return Response.json(
{ error: `Run already ${run.status}` },
{ status: 409 },
);
}
const cancelled = cancelRun(runId);
if (!cancelled) {
log.warn(
{ runId },
"cancel requested for a run not tracked by this process",
);
return Response.json(
{ error: "Run is not active in this server process" },
{ status: 409 },
);
}
log.info({ runId, requestedBy: auth.identity }, "cancel requested via API");
return Response.json({ status: "cancelling" }, { status: 202 });
}