import { NextRequest, NextResponse } from "next/server"; import { getServerSession } from "@/lib/auth"; import { db } from "@/lib/db"; import { marks, bingoItems } from "@/lib/db/schema"; import { eq, and } from "drizzle-orm"; import { v4 as uuidv4 } from "uuid"; export async function POST(req: NextRequest) { const session = await getServerSession(); if (!session) return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); try { const { campaignId, itemId } = await req.json(); if (!campaignId || !itemId) { return NextResponse.json({ error: "campaignId and itemId required" }, { status: 400 }); } const item = db.select().from(bingoItems) .where(and(eq(bingoItems.id, itemId), eq(bingoItems.campaignId, campaignId))) .get(); if (!item) return NextResponse.json({ error: "Item not found" }, { status: 404 }); const existing = db.select().from(marks) .where(and(eq(marks.campaignId, campaignId), eq(marks.itemId, itemId))) .get(); if (existing) { return NextResponse.json({ error: "Already marked", mark: existing }, { status: 409 }); } const id = uuidv4(); const now = new Date().toISOString(); db.insert(marks).values({ id, campaignId, itemId, userId: session.id, createdAt: now }).run(); return NextResponse.json({ id, markedBy: session.nickname }); } catch { return NextResponse.json({ error: "Failed to mark" }, { status: 500 }); } } export async function DELETE(req: NextRequest) { const session = await getServerSession(); if (!session) return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); try { const { campaignId, itemId } = await req.json(); if (!campaignId || !itemId) { return NextResponse.json({ error: "campaignId and itemId required" }, { status: 400 }); } db.delete(marks) .where(and(eq(marks.campaignId, campaignId), eq(marks.itemId, itemId))) .run(); return NextResponse.json({ ok: true }); } catch { return NextResponse.json({ error: "Failed to unmark" }, { status: 500 }); } }