79 lines
2.0 KiB
PHP
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();
|
|
}
|
|
}
|