import type { NextRequest } from "next/server"; import { cartMutationSchema } from "@salixcommerce/core"; import { commerceRepository } from "@/server/commerce/commerce"; import { CART_CAPABILITY_COOKIE, CART_CAPABILITY_MAX_AGE_SECONDS, createCartCapability, 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 = cartMutationSchema.safeParse(await readJson(request)); if (!parsed.success) return errorResponse("INVALID_REQUEST", "Invalid cart request.", 400); const existingCapability = parseCartCapability( request.cookies.get(CART_CAPABILITY_COOKIE)?.value, ); const capability = existingCapability ?? createCartCapability(); const result = await commerceRepository.mutateCart({ capabilityHash: hashCartCapability(capability), command: parsed.data, requestHash: hashCommerceRequest(parsed.data), }); if (!result.ok) return failureResponse(result.error); const response = noStoreJson({ data: result.data, ok: true }, 200); if (existingCapability === null) { response.cookies.set(CART_CAPABILITY_COOKIE, capability, { httpOnly: true, maxAge: CART_CAPABILITY_MAX_AGE_SECONDS, path: "/", sameSite: "strict", secure: process.env.NODE_ENV === "production", }); } return response; } async function readJson(request: NextRequest): Promise { try { return await request.json(); } catch { return undefined; } }