refactor(cart): update CartItemResource to serialize only selected variant and remove unused variant data
This commit is contained in:
@@ -4,7 +4,6 @@ namespace App\Domains\Cart\Resources;
|
|||||||
|
|
||||||
use App\Domains\Cart\Models\CartItem;
|
use App\Domains\Cart\Models\CartItem;
|
||||||
use App\Domains\Catalog\Enums\InventoryPolicy;
|
use App\Domains\Catalog\Enums\InventoryPolicy;
|
||||||
use App\Domains\Catalog\Models\Variant;
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Http\Resources\Json\JsonResource;
|
use Illuminate\Http\Resources\Json\JsonResource;
|
||||||
|
|
||||||
@@ -38,16 +37,14 @@ class CartItemResource extends JsonResource
|
|||||||
'product' => $selectedItem === null ? null : [
|
'product' => $selectedItem === null ? null : [
|
||||||
'nombre' => $selectedItem->getName(),
|
'nombre' => $selectedItem->getName(),
|
||||||
'imagen' => $imageUrl,
|
'imagen' => $imageUrl,
|
||||||
'variants' => $this->catalogItem->visibleVariants($this->variant_id)
|
'variant' => $this->variant === null ? null : [
|
||||||
->map(fn (Variant $variant): array => [
|
'id' => $this->variant->id,
|
||||||
'id' => $variant->id,
|
'precio' => $this->formatMoney($this->variant->getPrice()),
|
||||||
'precio' => $this->formatMoney($variant->getPrice()),
|
'stock_tecnico' => $this->catalogItem->inventory_policy === InventoryPolicy::Unlimited
|
||||||
'stock_tecnico' => $this->catalogItem->inventory_policy === InventoryPolicy::Unlimited
|
? null
|
||||||
? null
|
: $this->variant->inventory->availableStock(),
|
||||||
: $variant->inventory->availableStock(),
|
'values' => $this->variant->selectorOptions($this->catalogItem->itemAttributes),
|
||||||
'values' => $variant->selectorOptions($this->catalogItem->itemAttributes),
|
],
|
||||||
])
|
|
||||||
->values(),
|
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,10 +108,6 @@ class CartService
|
|||||||
'items.catalogItem.attachments',
|
'items.catalogItem.attachments',
|
||||||
'items.catalogItem.inventory',
|
'items.catalogItem.inventory',
|
||||||
'items.catalogItem.itemAttributes.attribute',
|
'items.catalogItem.itemAttributes.attribute',
|
||||||
'items.catalogItem.variants.inventory',
|
|
||||||
'items.catalogItem.variants.definitions.itemAttribute.attribute.options',
|
|
||||||
'items.catalogItem.variants.eventDates',
|
|
||||||
'items.catalogItem.variants.eventDate',
|
|
||||||
'items.variant.attachments',
|
'items.variant.attachments',
|
||||||
'items.variant.inventory',
|
'items.variant.inventory',
|
||||||
'items.variant.definitions.itemAttribute.attribute.options',
|
'items.variant.definitions.itemAttribute.attribute.options',
|
||||||
|
|||||||
@@ -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.
|
`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.
|
||||||
|
|
||||||
## Dependencias y reglas
|
## Dependencias y reglas
|
||||||
|
|
||||||
|
|||||||
@@ -276,11 +276,6 @@ class CartControllerTest extends TestCase
|
|||||||
'inventory_id' => $secondInventory->id,
|
'inventory_id' => $secondInventory->id,
|
||||||
'precio' => '20.00',
|
'precio' => '20.00',
|
||||||
]);
|
]);
|
||||||
$unavailableInventory = Inventory::query()->create(['real_stock' => 0]);
|
|
||||||
$unavailableVariant = $item->variants()->create([
|
|
||||||
'inventory_id' => $unavailableInventory->id,
|
|
||||||
'precio' => '25.00',
|
|
||||||
]);
|
|
||||||
$createResponse = $this->postJson('/api/tenants/acme/cart/items', [
|
$createResponse = $this->postJson('/api/tenants/acme/cart/items', [
|
||||||
'catalog_item_id' => $item->id,
|
'catalog_item_id' => $item->id,
|
||||||
'variant_id' => $firstVariant->id,
|
'variant_id' => $firstVariant->id,
|
||||||
@@ -301,11 +296,9 @@ 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')
|
||||||
->assertJsonCount(2, 'data.items.0.product.variants')
|
->assertJsonPath('data.items.0.product.variant.id', $secondVariant->id)
|
||||||
->assertJsonPath('data.items.0.product.variants.0.id', $firstVariant->id)
|
->assertJsonPath('data.items.0.product.variant.stock_tecnico', 0)
|
||||||
->assertJsonPath('data.items.0.product.variants.1.id', $secondVariant->id)
|
->assertJsonMissingPath('data.items.0.product.variants');
|
||||||
->assertJsonPath('data.items.0.product.variants.1.stock_tecnico', 0)
|
|
||||||
->assertJsonMissing(['id' => $unavailableVariant->id, 'stock_tecnico' => 0]);
|
|
||||||
|
|
||||||
$this->assertDatabaseHas('inventories', [
|
$this->assertDatabaseHas('inventories', [
|
||||||
'id' => $firstVariant->inventory_id,
|
'id' => $firstVariant->inventory_id,
|
||||||
|
|||||||
Reference in New Issue
Block a user