Files
brian d9cb44e93c
linter / quality (push) Has been cancelled
tests / ci (8.3) (push) Has been cancelled
tests / ci (8.4) (push) Has been cancelled
tests / ci (8.5) (push) Has been cancelled
adding a cart
2026-04-10 08:54:20 -06:00

79 lines
2.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Requests\StoreCartRequest;
use App\Http\Requests\UpdateCartRequest;
use App\Models\Cart;
use App\Models\Product;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CartController extends Controller
{
public function store(StoreCartRequest $request): JsonResponse
{
$cart = $this->resolveCart();
$existing = $cart->products()->wherePivot('product_id', $request->product_id)->first();
if ($existing) {
$cart->products()->updateExistingPivot($request->product_id, [
'quantity' => $existing->pivot->quantity + 1,
]);
} else {
$cart->products()->attach($request->product_id, ['quantity' => 1]);
}
return response()->json($this->cartItems($cart));
}
public function update(UpdateCartRequest $request, Product $product): JsonResponse
{
$cart = $this->resolveCart();
$cart->products()->updateExistingPivot($product->id, [
'quantity' => $request->quantity,
]);
return response()->json($this->cartItems($cart));
}
public function destroy(Request $request, Product $product): JsonResponse
{
$cart = $this->resolveCart();
$cart->products()->detach($product->id);
return response()->json($this->cartItems($cart));
}
private function resolveCart(): Cart
{
$cartId = session('cart_id');
if ($cartId) {
$cart = Cart::find($cartId);
if ($cart) {
return $cart;
}
}
$cart = Cart::create(['user_id' => request()->user()?->id]);
session(['cart_id' => $cart->id]);
return $cart;
}
/**
* @return array<int, array{product_id: int, quantity: int}>
*/
private function cartItems(Cart $cart): array
{
return $cart->products()->get()->map(fn ($p) => [
'product_id' => $p->id,
'quantity' => $p->pivot->quantity,
])->all();
}
}