92 lines
2.7 KiB
TypeScript
92 lines
2.7 KiB
TypeScript
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 }
|
|
);
|
|
}
|
|
}
|