46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { createPaymentCollection, initPaymentSession } from "@/lib/medusa";
|
|
import { parseBody, isNonEmptyString, isValidMedusaId, badRequest, checkCsrf } from "@/lib/apiUtils";
|
|
|
|
// POST /api/checkout/payment — create payment collection + Mollie session
|
|
export async function POST(request: Request) {
|
|
const csrfError = await checkCsrf();
|
|
if (csrfError) return csrfError;
|
|
|
|
const body = await parseBody<{ cartId?: unknown; providerId?: unknown }>(request);
|
|
if (!body) return badRequest("Invalid request body");
|
|
|
|
const { cartId, providerId } = body;
|
|
if (!isNonEmptyString(cartId)) {
|
|
return badRequest("Missing cartId");
|
|
}
|
|
if (!isValidMedusaId(cartId)) {
|
|
return badRequest("Invalid cart ID format");
|
|
}
|
|
|
|
// Step 1: Create a payment collection for the cart
|
|
let collection;
|
|
try {
|
|
collection = await createPaymentCollection(cartId);
|
|
} catch (e) {
|
|
console.error("[payment:collection]", (e as Error).message);
|
|
return NextResponse.json(
|
|
{ error: "Failed to create payment collection" },
|
|
{ status: 500 },
|
|
);
|
|
}
|
|
|
|
// Step 2: Initialize a payment session with the provider (Mollie)
|
|
try {
|
|
const provider =
|
|
isNonEmptyString(providerId) ? providerId : "pp_mollie-hosted-checkout_mollie";
|
|
const updated = await initPaymentSession(collection.id, provider);
|
|
return NextResponse.json(updated);
|
|
} catch (e) {
|
|
console.error("[payment:session]", (e as Error).message);
|
|
return NextResponse.json(
|
|
{ error: "Failed to initialize payment session" },
|
|
{ status: 500 },
|
|
);
|
|
}
|
|
}
|