import { NextResponse } from "next/server" import { getInvitationByToken } from "@/lib/db/queries/invitations" import { isRsvpClosed } from "@/lib/rsvp-deadline" import { createInvitationUploadKey, createPresignedUploadUrl, } from "@/lib/storage/uploads" import { presignUploadSchema } from "@/lib/validation/upload" export const runtime = "nodejs" export async function POST(request: Request) { if (isRsvpClosed()) { return NextResponse.json({ message: "Upload deadline has passed" }, { status: 403 }) } let body: unknown try { body = await request.json() } catch { return NextResponse.json({ message: "Invalid upload request" }, { status: 400 }) } const parsed = presignUploadSchema.safeParse(body) if (!parsed.success) { return NextResponse.json({ message: "Invalid upload request" }, { status: 400 }) } const invitation = await getInvitationByToken(parsed.data.token) if (!invitation) { return NextResponse.json({ message: "Invitation not found" }, { status: 404 }) } const objectKey = createInvitationUploadKey( invitation.invitation.id, parsed.data.filename, ) const uploadUrl = await createPresignedUploadUrl({ objectKey, contentType: parsed.data.contentType, sizeBytes: parsed.data.sizeBytes, }) return NextResponse.json({ objectKey, uploadUrl }) }