Files
Jyotisha/frontend/src/app/api/rectification/cases/[caseId]/upgrade-skill/route.ts
T

82 lines
2.3 KiB
TypeScript

import { NextResponse } from "next/server";
import { z } from "zod";
import { createAdminSupabaseClient } from "@/lib/supabase/admin";
import { createServerSupabaseClient } from "@/lib/supabase/server";
import {
RectificationCaseServiceError,
mapRectificationRpcError,
upgradeRectificationSkill,
} from "@/lib/rectification-agentic/v9/case-service";
export const runtime = "nodejs";
type RouteContext = { params: Promise<{ caseId: string }> };
const upgradeRequestSchema = z
.object({
skillVersion: z.string().trim().min(1).max(64),
})
.strict();
/**
* POST /api/rectification/cases/[caseId]/upgrade-skill
*
* Explicit skill-version migration for a running case; terminal cases are
* rejected and new cases pin the current default version.
*/
export async function POST(request: Request, context: RouteContext) {
let supabase;
let accounting;
try {
supabase = await createServerSupabaseClient();
accounting = createAdminSupabaseClient();
} catch {
return NextResponse.json({ error: "服务尚未配置" }, { status: 503 });
}
const {
data: { user },
error: authError,
} = await supabase.auth.getUser();
if (authError || !user) {
return NextResponse.json({ error: "请先登录" }, { status: 401 });
}
const { caseId } = await context.params;
if (!z.string().uuid().safeParse(caseId).success) {
return NextResponse.json(
{ error: "请求内容不正确", code: "invalid_case_id" },
{ status: 400 },
);
}
const parsed = upgradeRequestSchema.safeParse(
await request.json().catch(() => null),
);
if (!parsed.success) {
return NextResponse.json(
{ error: "请求内容不正确", code: "invalid_upgrade_request" },
{ status: 400 },
);
}
try {
const result = await upgradeRectificationSkill(
accounting,
user.id,
caseId,
parsed.data.skillVersion,
);
return NextResponse.json(result);
} catch (error) {
if (error instanceof RectificationCaseServiceError) {
const view = mapRectificationRpcError(
new Error(`agentic_rectification_${error.code}`),
);
return NextResponse.json({ error: view.message, code: view.code }, { status: view.status });
}
return NextResponse.json(
{ error: "校正服务暂时不可用", code: "rectification_service_failed" },
{ status: 500 },
);
}
}