trptk/app/api/cart/[cartId]/items/route.ts
2026-02-24 17:14:07 +01:00

42 lines
1.3 KiB
TypeScript

import { NextResponse } from "next/server";
import { addToCart } from "@/lib/medusa";
import { parseBody, isNonEmptyString, isPositiveInt, isValidMedusaId, badRequest, checkCsrf } from "@/lib/apiUtils";
// POST /api/cart/[cartId]/items — add a line item
export async function POST(
request: Request,
{ params }: { params: Promise<{ cartId: string }> },
) {
const csrfError = await checkCsrf();
if (csrfError) return csrfError;
const { cartId } = await params;
if (!isValidMedusaId(cartId)) {
return badRequest("Invalid cart ID format");
}
const body = await parseBody<{ variant_id?: unknown; quantity?: unknown }>(request);
if (!body) return badRequest("Invalid request body");
const { variant_id, quantity } = body;
if (!isNonEmptyString(variant_id)) {
return badRequest("Missing or invalid variant_id");
}
if (!isValidMedusaId(variant_id)) {
return badRequest("Invalid variant ID format");
}
const qty = quantity ?? 1;
if (!isPositiveInt(qty)) {
return badRequest("Quantity must be a positive integer");
}
try {
const cart = await addToCart(cartId, variant_id, qty);
return NextResponse.json(cart);
} catch (e) {
console.error("[cart:add]", (e as Error).message);
return NextResponse.json({ error: "Failed to add item to cart" }, { status: 500 });
}
}