import { NextResponse } from "next/server"; import { auth } from "@/app/(auth)/auth"; import { uploadFile } from "@/lib/storage/service"; import { DIRECTOR_MAX_GLB_BYTES, validateDirectorGlb, } from "@/lib/video-canvas/director-glb"; export const runtime = "nodejs"; export async function POST(request: Request) { const session = await auth(); if (!session?.user?.id) return NextResponse.json({ error: "未登录" }, { status: 401 }); try { const form = await request.formData(); const file = form.get("file"); if ( !(file instanceof File) || !/\.glb$/i.test(file.name) || file.size > DIRECTOR_MAX_GLB_BYTES ) return NextResponse.json( { error: "请上传 25 MiB 以内的 GLB 模型" }, { status: 400 }, ); const buffer = await file.arrayBuffer(); try { validateDirectorGlb(buffer); } catch (error) { return NextResponse.json( { error: error instanceof Error ? error.message : "无效 GLB" }, { status: 400 }, ); } const result = await uploadFile( `director-${crypto.randomUUID()}.glb`, buffer, ); return NextResponse.json({ success: true, data: result }); } catch { return NextResponse.json( { error: "模型上传失败,请重试" }, { status: 500 }, ); } }