import { NextResponse } from "next/server"; import { prisma } from "../../../../lib/prisma"; import { cookies } from "next/headers"; import { getServerSession } from "next-auth"; import { authOptions } from "../../../../lib/auth"; export async function POST(req: Request) { try { const body = await req.json(); const itemId = body.itemId as string; const quantity = Number(body.quantity); if (!itemId || !Number.isFinite(quantity)) { return NextResponse.json( { error: "itemId and quantity are required." }, { status: 400 } ); } const session = await getServerSession(authOptions); const cookieStore = cookies(); let sessionId = cookieStore.get("sf_session")?.value; const createdNew = !sessionId; if (!sessionId && !session?.user?.email) { return NextResponse.json({ error: "Missing cart session." }, { status: 400 }); } const item = await prisma.cartItem.findUnique({ where: { id: itemId }, include: { cart: true }, }); if (!item) { return NextResponse.json({ error: "Item not found." }, { status: 404 }); } if (session?.user?.email) { const user = await prisma.user.findUnique({ where: { email: session.user.email }, }); if (!user) { return NextResponse.json({ error: "User not found." }, { status: 404 }); } if (item.cart.userId !== user.id && item.cart.sessionId !== sessionId) { return NextResponse.json({ error: "Item not found." }, { status: 404 }); } if (!sessionId) { sessionId = crypto.randomUUID(); await prisma.cart.update({ where: { id: item.cartId }, data: { sessionId }, }); } } else if (item.cart.sessionId !== sessionId) { return NextResponse.json({ error: "Item not found." }, { status: 404 }); } if (quantity <= 0) { await prisma.cartItem.delete({ where: { id: itemId } }); const res = NextResponse.json({ deleted: true }); if (createdNew && sessionId) { res.cookies.set("sf_session", sessionId, { httpOnly: true, sameSite: "lax", path: "/", }); } return res; } const updated = await prisma.cartItem.update({ where: { id: itemId }, data: { quantity }, }); const res = NextResponse.json({ item: updated }); if (createdNew && sessionId) { res.cookies.set("sf_session", sessionId, { httpOnly: true, sameSite: "lax", path: "/", }); } return res; } catch (err: any) { return NextResponse.json( { error: err?.message || "Failed to update cart item." }, { status: 500 } ); } }