adding a cart
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
<?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();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Contracts\Validation\ValidationRule;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class StoreCartRequest extends FormRequest
|
||||
{
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'product_id' => ['required', 'integer', 'exists:products,id'],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Contracts\Validation\ValidationRule;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class UpdateCartRequest extends FormRequest
|
||||
{
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'quantity' => ['required', 'integer', 'min:1'],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user