70 lines
2 KiB
TypeScript
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 },
|
|
);
|
|
}
|
|
}
|