Primer corte de checkout real, a proposito acotado: el carrito pasa de estado 100% local (localStorage con productos completos) a sincronizar con un cart_id real de Medusa via /api/cart/* (rutas puente same-origin, mismo patron que /api/search -- MEDUSA_BACKEND_URL es DNS interno del cluster, no resuelve desde el navegador). Formas de respuesta de la API verificadas en vivo con un carrito de prueba real antes de escribir el mapeo (no asumidas contra documentacion): agregar el mismo variant_id dos veces hace merge de cantidad automatico (no crea linea duplicada); eliminar una linea devuelve el carrito actualizado en 'parent', no en 'cart' como los demas endpoints. La firma publica de useCartStore (addItem/removeItem/updateQuantity/ items) no cambia, asi que ningun componente consumidor (cart-drawer, navbar, product-card, product-purchase, mobile-add-to-cart) necesito tocarse. Sigue cerrando por WhatsApp -- direccion/envio/pago quedan para los siguientes cortes del ADR 0009.
32 lines
1.2 KiB
TypeScript
32 lines
1.2 KiB
TypeScript
import { removeLineItem, updateLineItemQuantity } from "@/lib/headless/providers/medusa-cart";
|
|
|
|
interface RouteParams { params: Promise<{ lineItemId: string }> }
|
|
|
|
export async function POST(request: Request, { params }: RouteParams) {
|
|
const { lineItemId } = await params;
|
|
const { cartId, quantity } = await request.json();
|
|
if (!cartId || typeof quantity !== "number") {
|
|
return Response.json({ error: "cartId y quantity son obligatorios" }, { status: 400 });
|
|
}
|
|
try {
|
|
const cart = await updateLineItemQuantity(cartId, lineItemId, quantity);
|
|
return Response.json(cart);
|
|
} catch (error) {
|
|
return Response.json({ error: (error as Error).message }, { status: 502 });
|
|
}
|
|
}
|
|
|
|
export async function DELETE(request: Request, { params }: RouteParams) {
|
|
const { lineItemId } = await params;
|
|
const cartId = new URL(request.url).searchParams.get("cartId");
|
|
if (!cartId) {
|
|
return Response.json({ error: "cartId es obligatorio" }, { status: 400 });
|
|
}
|
|
try {
|
|
const cart = await removeLineItem(cartId, lineItemId);
|
|
return Response.json(cart);
|
|
} catch (error) {
|
|
return Response.json({ error: (error as Error).message }, { status: 502 });
|
|
}
|
|
}
|