Files
Shifted/app/api/cart/update/route.ts
2026-02-10 01:14:19 +00:00

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