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

70 lines
2 KiB
TypeScript

import { NextResponse } from "next/server";
import { applyPromoCode, removePromoCode } from "@/lib/medusa";
import { parseBody, isNonEmptyString, isValidMedusaId, badRequest, checkCsrf } from "@/lib/apiUtils";
// POST /api/cart/[cartId]/promotions — apply a promo code
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<{ code?: unknown }>(request);
if (!body) return badRequest("Invalid request body");
const { code } = body;
if (!isNonEmptyString(code)) {
return badRequest("Missing or invalid promo code");
}
try {
const cart = await applyPromoCode(cartId, code.trim());
return NextResponse.json(cart);
} catch (e) {
const msg = (e as Error).message ?? "";
console.error("[cart:promo:apply]", msg);
return NextResponse.json(
{ error: "Invalid or expired promo code" },
{ status: 400 },
);
}
}
// DELETE /api/cart/[cartId]/promotions — remove a promo code
export async function DELETE(
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<{ code?: unknown }>(request);
if (!body) return badRequest("Invalid request body");
const { code } = body;
if (!isNonEmptyString(code)) {
return badRequest("Missing or invalid promo code");
}
try {
const cart = await removePromoCode(cartId, code.trim());
return NextResponse.json(cart);
} catch (e) {
console.error("[cart:promo:remove]", (e as Error).message);
return NextResponse.json(
{ error: "Failed to remove promo code" },
{ status: 500 },
);
}
}