Compare commits

..
Author SHA1 Message Date
devops f124ae0bbd Merge fix/carrito-thumbnail-real into main
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (push) Successful in 21s
Build and Push Frontend / Construir y Subir Imagen (push) Successful in 11m47s
2026-08-29 03:24:11 +00:00
devops b8ce9ded87 fix(ecommerce): carrito muestra la foto real del producto
Reportado en produccion: el carrito mostraba el logo generico de ARI
en vez de la foto del producto. Verificado en vivo: item.thumbnail
viene null en la respuesta de Medusa para todo el catalogo real
(confirmado tambien contra /store/products directamente -- el campo
thumbnail del producto es null en la fuente, no solo omitido en la
respuesta del carrito). El catalogo ya resuelve esto cayendo a
images[0] (mapProduct() en medusa.ts); la linea del carrito necesita
pedir esa relacion explicita via fields=*items.product.images (no
viene por defecto) y aplicar el mismo fallback.
2026-08-29 03:24:09 +00:00
devops b12dd848af chore: release v1.0.208 [skip ci] 2026-08-29 02:52:32 +00:00
devops d28ee4a49d Merge fix/checkout-carrito-real-medusa into main
Build and Push Frontend / Escaneo de Secretos (Gitleaks) (push) Successful in 19s
Build and Push Frontend / Construir y Subir Imagen (push) Successful in 9m42s
2026-08-29 02:42:32 +00:00
2 changed files with 18 additions and 9 deletions

No files matched your search

@@ -25,7 +25,7 @@ spec:
runAsUser: 1001 runAsUser: 1001
containers: containers:
- name: app - name: app
image: gitea.cruzcloud.net/devops/ecommerce-frontend:v1.0.204 image: gitea.cruzcloud.net/devops/ecommerce-frontend:v1.0.208
env: env:
- name: HEADLESS_PROVIDER - name: HEADLESS_PROVIDER
value: medusa value: medusa
@@ -61,6 +61,7 @@ type MedusaLineItem = {
thumbnail?: string | null; thumbnail?: string | null;
quantity: number; quantity: number;
unit_price?: number | null; unit_price?: number | null;
product?: { images?: Array<{ url?: string | null }> | null } | null;
}; };
type MedusaCart = { type MedusaCart = {
@@ -82,10 +83,13 @@ function mapCart(cart: MedusaCart): CartSummary {
product: { product: {
id: item.product_id, id: item.product_id,
name: item.product_title || item.title || "Producto", name: item.product_title || item.title || "Producto",
// La linea del carrito no trae el arreglo de imagenes del producto, // item.thumbnail viene null en la practica para todo el catalogo
// solo este campo (a veces null) -- mismo fallback final que ya usa // real (confirmado contra /store/products: product.thumbnail
// mapProduct() en medusa.ts. // tambien es null ahi, incluso con fotos reales cargadas) -- el
thumbnail: item.thumbnail || "/images/brand/logo-ari.png", // catalogo ya resuelve esto cayendo a images[0] (mapProduct() en
// medusa.ts), asi que la linea del carrito pide esa misma relacion
// explicita (no viene por defecto) y aplica el mismo fallback.
thumbnail: item.thumbnail || item.product?.images?.[0]?.url || "/images/brand/logo-ari.png",
price: typeof item.unit_price === "number" ? item.unit_price : null, price: typeof item.unit_price === "number" ? item.unit_price : null,
currency: cart.currency_code, currency: cart.currency_code,
}, },
@@ -117,6 +121,11 @@ async function medusaCartFetch(
return response.json(); return response.json();
} }
// *items.product.images no viene por defecto (verificado en vivo) y es
// lo unico que necesitamos ademas del set por defecto -- *items ya trae
// unit_price/product_title/variant_id/quantity sin pedirlos aparte.
const ITEMS_FIELDS = "fields=*items,*items.product.images";
export async function createCart(): Promise<CartSummary> { export async function createCart(): Promise<CartSummary> {
const data = await medusaCartFetch("/store/carts", { const data = await medusaCartFetch("/store/carts", {
method: "POST", method: "POST",
@@ -126,7 +135,7 @@ export async function createCart(): Promise<CartSummary> {
} }
export async function getCart(cartId: string): Promise<CartSummary> { export async function getCart(cartId: string): Promise<CartSummary> {
const data = await medusaCartFetch(`/store/carts/${cartId}`); const data = await medusaCartFetch(`/store/carts/${cartId}?${ITEMS_FIELDS}`);
return mapCart(data.cart as MedusaCart); return mapCart(data.cart as MedusaCart);
} }
@@ -135,7 +144,7 @@ export async function addLineItem(
variantId: string, variantId: string,
quantity: number, quantity: number,
): Promise<CartSummary> { ): Promise<CartSummary> {
const data = await medusaCartFetch(`/store/carts/${cartId}/line-items`, { const data = await medusaCartFetch(`/store/carts/${cartId}/line-items?${ITEMS_FIELDS}`, {
method: "POST", method: "POST",
body: { variant_id: variantId, quantity }, body: { variant_id: variantId, quantity },
}); });
@@ -147,7 +156,7 @@ export async function updateLineItemQuantity(
lineItemId: string, lineItemId: string,
quantity: number, quantity: number,
): Promise<CartSummary> { ): Promise<CartSummary> {
const data = await medusaCartFetch(`/store/carts/${cartId}/line-items/${lineItemId}`, { const data = await medusaCartFetch(`/store/carts/${cartId}/line-items/${lineItemId}?${ITEMS_FIELDS}`, {
method: "POST", method: "POST",
body: { quantity }, body: { quantity },
}); });
@@ -155,7 +164,7 @@ export async function updateLineItemQuantity(
} }
export async function removeLineItem(cartId: string, lineItemId: string): Promise<CartSummary> { export async function removeLineItem(cartId: string, lineItemId: string): Promise<CartSummary> {
const data = await medusaCartFetch(`/store/carts/${cartId}/line-items/${lineItemId}`, { const data = await medusaCartFetch(`/store/carts/${cartId}/line-items/${lineItemId}?${ITEMS_FIELDS}`, {
method: "DELETE", method: "DELETE",
}); });
// Forma distinta a las demas: el carrito actualizado viene en // Forma distinta a las demas: el carrito actualizado viene en