import type { NextRequest } from "next/server"; import { orderCreateCommandSchema } from "@salixcommerce/core"; import { commerceRepository } from "@/server/commerce/commerce"; import { CART_CAPABILITY_COOKIE, hashCartCapability, hashCommerceRequest, parseCartCapability, } from "@/server/commerce/capability"; import { errorResponse, failureResponse, noStoreJson, validateJsonMutationRequest, } from "@/server/commerce/http"; export const runtime = "nodejs"; export async function POST(request: NextRequest) { const requestGate = validateJsonMutationRequest(request); if (!requestGate.ok) return requestGate.response; const parsed = orderCreateCommandSchema.safeParse(await readJson(request)); if (!parsed.success) return errorResponse("INVALID_REQUEST", "Invalid order request.", 400); const capability = parseCartCapability(request.cookies.get(CART_CAPABILITY_COOKIE)?.value); if (capability === null) return errorResponse("CART_NOT_FOUND", "Cart not found.", 404); const result = await commerceRepository.createOrder({ capabilityHash: hashCartCapability(capability), contactEmail: parsed.data.contactEmail, idempotencyKey: parsed.data.idempotencyKey, requestHash: hashCommerceRequest(parsed.data), }); if (!result.ok) return failureResponse(result.error); return noStoreJson({ data: result.data, ok: true }, 200); } async function readJson(request: NextRequest): Promise { try { return await request.json(); } catch { return undefined; } }