Files
wedding-website/app/api/uploads/presign/route.ts
T
2026-09-12 23:50:10 +02:00

48 lines
1.3 KiB
TypeScript

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 })
}