refactor(cart): simplify CartItemResource response structure to prioritize selected variant details

This commit is contained in:
2026-08-18 09:05:50 -03:00
parent 4817cb28fe
commit 7c2880646f
3 changed files with 18 additions and 16 deletions

View File

@@ -34,17 +34,15 @@ class CartItemResource extends JsonResource
'precio_unitario' => $this->formatMoney($selectedItem?->getPrice()), 'precio_unitario' => $this->formatMoney($selectedItem?->getPrice()),
'catalog_item_id' => $this->catalog_item_id, 'catalog_item_id' => $this->catalog_item_id,
'variant_id' => $this->variant_id, 'variant_id' => $this->variant_id,
'product' => $selectedItem === null ? null : [ 'nombre' => $selectedItem?->getName(),
'nombre' => $selectedItem->getName(), 'imagen' => $imageUrl,
'imagen' => $imageUrl, 'variant' => $this->variant === null ? null : [
'variant' => $this->variant === null ? null : [ 'id' => $this->variant->id,
'id' => $this->variant->id, 'precio' => $this->formatMoney($this->variant->getPrice()),
'precio' => $this->formatMoney($this->variant->getPrice()), 'stock_tecnico' => $this->catalogItem->inventory_policy === InventoryPolicy::Unlimited
'stock_tecnico' => $this->catalogItem->inventory_policy === InventoryPolicy::Unlimited ? null
? null : $this->variant->inventory->availableStock(),
: $this->variant->inventory->availableStock(), 'values' => $this->variant->selectorOptions($this->catalogItem->itemAttributes),
'values' => $this->variant->selectorOptions($this->catalogItem->itemAttributes),
],
], ],
]; ];
} }

View File

@@ -25,7 +25,7 @@ Bajo `/tenants/{tenant:codigo}`:
## Contratos ## Contratos
`AddCartItemRequest` y `UpdateCartItemQuantityRequest` validan selección y cantidad. `CartResource` y `CartItemResource` estabilizan la respuesta pública. Cada ítem serializa únicamente su variante seleccionada en `product.variant`; las variantes alternativas no forman parte de la respuesta del carrito. `AddCartItemRequest` y `UpdateCartItemQuantityRequest` validan selección y cantidad. `CartResource` y `CartItemResource` estabilizan la respuesta pública. Cada ítem expone `nombre`, `imagen` y `precio_unitario` en la raíz, priorizando la variante seleccionada y usando el catálogo base como respaldo. La variante seleccionada se serializa en `variant`; las variantes alternativas no forman parte de la respuesta del carrito.
## Dependencias y reglas ## Dependencias y reglas

View File

@@ -49,9 +49,12 @@ class CartControllerTest extends TestCase
->assertCookie('guest_token') ->assertCookie('guest_token')
->assertJsonPath('data.items.0.catalog_item_id', $item->id) ->assertJsonPath('data.items.0.catalog_item_id', $item->id)
->assertJsonPath('data.items.0.variant_id', null) ->assertJsonPath('data.items.0.variant_id', null)
->assertJsonPath('data.items.0.variant', null)
->assertJsonPath('data.items.0.cantidad', 2) ->assertJsonPath('data.items.0.cantidad', 2)
->assertJsonPath('data.items.0.precio_unitario', '49.90') ->assertJsonPath('data.items.0.precio_unitario', '49.90')
->assertJsonPath('data.items.0.product.nombre', 'Item acme') ->assertJsonPath('data.items.0.nombre', 'Item acme')
->assertJsonPath('data.items.0.imagen', null)
->assertJsonMissingPath('data.items.0.product')
->assertJsonPath('data.subtotal', '99.80'); ->assertJsonPath('data.subtotal', '99.80');
$guestTokenCookie = $response->getCookie('guest_token', false); $guestTokenCookie = $response->getCookie('guest_token', false);
@@ -296,9 +299,10 @@ class CartControllerTest extends TestCase
->assertOk() ->assertOk()
->assertJsonPath('data.items.0.variant_id', $secondVariant->id) ->assertJsonPath('data.items.0.variant_id', $secondVariant->id)
->assertJsonPath('data.items.0.precio_unitario', '20.00') ->assertJsonPath('data.items.0.precio_unitario', '20.00')
->assertJsonPath('data.items.0.product.variant.id', $secondVariant->id) ->assertJsonPath('data.items.0.variant.id', $secondVariant->id)
->assertJsonPath('data.items.0.product.variant.stock_tecnico', 0) ->assertJsonPath('data.items.0.variant.precio', '20.00')
->assertJsonMissingPath('data.items.0.product.variants'); ->assertJsonPath('data.items.0.variant.stock_tecnico', 0)
->assertJsonMissingPath('data.items.0.product');
$this->assertDatabaseHas('inventories', [ $this->assertDatabaseHas('inventories', [
'id' => $firstVariant->inventory_id, 'id' => $firstVariant->inventory_id,