over / src /app /api /commitments /execute /route.ts
luguog's picture
Deploy mailbox-automation Next.js app
9646e24 verified
Raw
History Blame Contribute Delete
2.02 kB
import { NextRequest, NextResponse } from "next/server";
import {
getCommitmentById,
listCommitments,
loadMetrics,
upsertCommitment,
addCommitmentAuditEvent,
} from "@/lib/commitment/store";
import { executeCommitment } from "@/lib/commitment/executor";
export const dynamic = "force-dynamic";
export const maxDuration = 120;
export async function POST(request: NextRequest) {
try {
const body = await request.json().catch(() => ({}));
const executeAll = !!body.executeAll;
const id = typeof body.id === "string" ? body.id : "";
if (!executeAll && !id) {
return NextResponse.json({ error: "id is required (or executeAll=true)" }, { status: 400 });
}
let targets = [];
if (executeAll) {
targets = listCommitments().filter((c) => c.status === "detected");
} else {
const found = getCommitmentById(id);
if (!found) {
return NextResponse.json({ error: `Commitment not found: ${id}` }, { status: 404 });
}
targets = [found];
}
let metrics = loadMetrics();
const executed: any[] = [];
for (const c of targets) {
try {
addCommitmentAuditEvent(c.id, "execute_requested", executeAll ? "Bulk execution requested" : "Execution requested");
} catch (e) {
console.error("[commitments/execute] audit error:", e);
}
const result = executeCommitment(c, metrics);
metrics = result.metrics;
const saved = upsertCommitment(result.contract);
executed.push({
id: saved.id,
emailId: saved.emailId,
status: saved.status,
staged: result.staged,
deliverableCount: saved.deliverables?.length ?? 0,
});
}
return NextResponse.json({
success: true,
executedCount: executed.length,
executed,
metrics,
timestamp: new Date().toISOString(),
});
} catch (e: any) {
console.error("[commitments/execute] error:", e);
return NextResponse.json({ error: e.message }, { status: 500 });
}
}