55 lines
1.8 KiB
TypeScript
55 lines
1.8 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { updateCartItem, removeFromCart } from "@/lib/medusa";
|
|
import { parseBody, isPositiveInt, isValidMedusaId, badRequest, checkCsrf } from "@/lib/apiUtils";
|
|
|
|
// POST /api/cart/[cartId]/items/[itemId] — update quantity
|
|
export async function POST(
|
|
request: Request,
|
|
{ params }: { params: Promise<{ cartId: string; itemId: string }> },
|
|
) {
|
|
const csrfError = await checkCsrf();
|
|
if (csrfError) return csrfError;
|
|
|
|
const { cartId, itemId } = await params;
|
|
if (!isValidMedusaId(cartId) || !isValidMedusaId(itemId)) {
|
|
return badRequest("Invalid ID format");
|
|
}
|
|
|
|
const body = await parseBody<{ quantity?: unknown }>(request);
|
|
if (!body) return badRequest("Invalid request body");
|
|
|
|
const { quantity } = body;
|
|
if (!isPositiveInt(quantity)) {
|
|
return badRequest("Quantity must be a positive integer");
|
|
}
|
|
|
|
try {
|
|
const cart = await updateCartItem(cartId, itemId, quantity);
|
|
return NextResponse.json(cart);
|
|
} catch (e) {
|
|
console.error("[cart:update]", (e as Error).message);
|
|
return NextResponse.json({ error: "Failed to update item" }, { status: 500 });
|
|
}
|
|
}
|
|
|
|
// DELETE /api/cart/[cartId]/items/[itemId] — remove line item
|
|
export async function DELETE(
|
|
_request: Request,
|
|
{ params }: { params: Promise<{ cartId: string; itemId: string }> },
|
|
) {
|
|
const csrfError = await checkCsrf();
|
|
if (csrfError) return csrfError;
|
|
|
|
const { cartId, itemId } = await params;
|
|
if (!isValidMedusaId(cartId) || !isValidMedusaId(itemId)) {
|
|
return badRequest("Invalid ID format");
|
|
}
|
|
|
|
try {
|
|
const cart = await removeFromCart(cartId, itemId);
|
|
return NextResponse.json(cart);
|
|
} catch (e) {
|
|
console.error("[cart:remove]", (e as Error).message);
|
|
return NextResponse.json({ error: "Failed to remove item" }, { status: 500 });
|
|
}
|
|
}
|