import { NextRequest, NextResponse } from "next/server"; import { auth } from "@/auth"; import { db } from "@/lib/db"; function requireRole(role: string) { return ["ADMIN", "PRODUCER", "SUPERVISOR"].includes(role); } // GET /api/shoot-log/setups/[setupId]/takes export async function GET( _req: NextRequest, { params }: { params: Promise<{ setupId: string }> } ) { const session = await auth(); if (!session?.user) return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); if (!requireRole(session.user.role)) return NextResponse.json({ error: "Forbidden" }, { status: 403 }); const { setupId } = await params; const takes = await db.take.findMany({ where: { setupId }, orderBy: { takeNumber: "asc" }, include: { attachments: { orderBy: { sortOrder: "asc" } } }, }); return NextResponse.json({ takes }); } // POST /api/shoot-log/setups/[setupId]/takes export async function POST( req: NextRequest, { params }: { params: Promise<{ setupId: string }> } ) { const session = await auth(); if (!session?.user) return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); if (!requireRole(session.user.role)) return NextResponse.json({ error: "Forbidden" }, { status: 403 }); const { setupId } = await params; const body = await req.json(); const last = await db.take.findFirst({ where: { setupId }, orderBy: { takeNumber: "desc" }, }); const takeNumber = (last?.takeNumber ?? 0) + 1; const take = await db.take.create({ data: { setupId, takeNumber, createdById: session.user.id, ...sanitize(body), }, include: { attachments: { orderBy: { sortOrder: "asc" } } }, }); return NextResponse.json({ take }, { status: 201 }); } function sanitize(data: Record) { const allowed = new Set([ "scene","shotLabel","unitLabel","cameraLetter","clipName","roll","cameraModel", "resolution","codec","fps","shutter","iso","whiteBalance","colourSpace", "lensSet","lens","tStop","filters","isAnamorphic", "hasHdri","hasChromeBall","hasGreyBall","hasMacbeth","hasCleanPlate", "hasSurvey","hasLidar","hasWitnessCamera","hasLensGrid","hasTexturePhotos","hasPhotogrammetry", "weather","sunDirection","artificialLights", "supervisorNotes","continuityNotes","vfxRequirements","quality", ]); return Object.fromEntries( Object.entries(data) .filter(([k]) => allowed.has(k)) .map(([k, v]) => [k, v === "" ? null : v]) ); }