Explorar el Código

feat: add mais endpoints para cart

Gustavo Mantovani hace 3 días
padre
commit
644ae44385

+ 19 - 0
app/Http/Controllers/CartController.php

@@ -6,6 +6,7 @@ use App\Http\Requests\CartRequest;
 use App\Http\Resources\CartResource;
 use App\Services\CartService;
 use Illuminate\Http\JsonResponse;
+use Illuminate\Support\Facades\Auth;
 
 class CartController extends Controller
 {
@@ -54,6 +55,24 @@ class CartController extends Controller
 
     //
 
+    public function myCarts(): JsonResponse
+    {
+        $items = $this->service->getByUserId(Auth::id());
+
+        return $this->successResponse(payload: CartResource::collection($items));
+    }
+
+    public function storeMine(CartRequest $request): JsonResponse
+    {
+        $request->merge(['client_id' => Auth::user()?->client?->id]);
+
+        $item = $this->service->createForUser($request->validated(), Auth::id());
+
+        return $this->successResponse(payload: new CartResource($item), message: __('messages.created'), code: 201);
+    }
+
+    //
+
     private function hasSchedulePayload(array $data): bool
     {
         return ! empty($data['schedules'])

+ 56 - 24
app/Services/CartService.php

@@ -3,6 +3,7 @@
 namespace App\Services;
 
 use App\Models\Cart;
+use App\Models\Client;
 use Illuminate\Support\Arr;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Support\Facades\DB;
@@ -29,30 +30,6 @@ class CartService
         return Cart::create($data);
     }
 
-    public function createWithSchedules(array $data): Cart
-    {
-        return DB::transaction(function () use ($data) {
-            $items = $this->scheduleItems($data);
-
-            $schedules = app(ScheduleService::class)->createSingleOrMultiple(
-                baseData:  $this->baseScheduleData($data),
-                schedules: $items,
-            );
-
-            $cart = Cart::create([
-                'client_id' => $data['client_id'],
-            ]);
-
-            foreach ($schedules as $schedule) {
-                $cart->items()->create([
-                    'schedule_id' => $schedule->id,
-                ]);
-            }
-
-            return $cart->fresh(['items.schedule.client.user', 'items.schedule.provider.user', 'items.schedule.address']);
-        });
-    }
-
     public function update(int $id, array $data): ?Cart
     {
         $model = $this->findById($id);
@@ -79,6 +56,54 @@ class CartService
 
     //
 
+    public function getByUserId(int $userId): Collection
+    {
+        return Cart::query()
+            ->with(['items.schedule.client.user', 'items.schedule.provider.user', 'items.schedule.address'])
+            ->whereHas('client', fn ($query) => $query->where('user_id', $userId))
+            ->orderBy('created_at', 'desc')
+            ->get();
+    }
+
+    public function createForUser(array $data, int $userId): Cart
+    {
+        $client = Client::query()
+            ->where('user_id', $userId)
+            ->firstOrFail();
+
+        $data['client_id'] = $client->id;
+
+        return $this->hasSchedulePayload($data)
+            ? $this->createWithSchedules($data)
+            : $this->create($data);
+    }
+
+    public function createWithSchedules(array $data): Cart
+    {
+        return DB::transaction(function () use ($data) {
+            $items = $this->scheduleItems($data);
+
+            $schedules = app(ScheduleService::class)->createSingleOrMultiple(
+                baseData:  $this->baseScheduleData($data),
+                schedules: $items,
+            );
+
+            $cart = Cart::create([
+                'client_id' => $data['client_id'],
+            ]);
+
+            foreach ($schedules as $schedule) {
+                $cart->items()->create([
+                    'schedule_id' => $schedule->id,
+                ]);
+            }
+
+            return $cart->fresh(['items.schedule.client.user', 'items.schedule.provider.user', 'items.schedule.address']);
+        });
+    }
+
+    //
+
     private function baseScheduleData(array $data): array
     {
         return Arr::except($data, [
@@ -93,6 +118,13 @@ class CartService
         ]);
     }
 
+    private function hasSchedulePayload(array $data): bool
+    {
+        return ! empty($data['schedules'])
+            || ! empty($data['dates'])
+            || ! empty($data['date']);
+    }
+
     private function scheduleItems(array $data): array
     {
         if (! empty($data['schedules'])) {

+ 8 - 14
routes/authRoutes/cart.php

@@ -3,17 +3,11 @@
 use App\Http\Controllers\CartController;
 use Illuminate\Support\Facades\Route;
 
-Route::get('/cart',         [CartController::class, 'index'])
-    ->middleware('permission:cart,view');
-
-Route::post('/cart',        [CartController::class, 'store'])
-    ->middleware('permission:cart,add');
-
-Route::get('/cart/{id}',    [CartController::class, 'show'])
-    ->middleware('permission:cart,view');
-
-Route::put('/cart/{id}',    [CartController::class, 'update'])
-    ->middleware('permission:cart,edit');
-
-Route::delete('/cart/{id}', [CartController::class, 'destroy'])
-    ->middleware('permission:cart,delete');
+Route::get('/cart',         [CartController::class, 'index'])->middleware('permission:cart,view');
+Route::post('/cart',        [CartController::class, 'store'])->middleware('permission:cart,add');
+
+Route::get('/cart/me',      [CartController::class, 'myCarts']);
+Route::post('/cart/me',     [CartController::class, 'storeMine']);
+Route::get('/cart/{id}',    [CartController::class, 'show'])->middleware('permission:cart,view');
+Route::put('/cart/{id}',    [CartController::class, 'update'])->middleware('permission:cart,edit');
+Route::delete('/cart/{id}', [CartController::class, 'destroy'])->middleware('permission:cart,delete');

+ 5 - 14
routes/authRoutes/cart_item.php

@@ -3,17 +3,8 @@
 use App\Http\Controllers\CartItemController;
 use Illuminate\Support\Facades\Route;
 
-Route::get('/cart-item',         [CartItemController::class, 'index'])
-    ->middleware('permission:cart-item,view');
-
-Route::post('/cart-item',        [CartItemController::class, 'store'])
-    ->middleware('permission:cart-item,add');
-
-Route::get('/cart-item/{id}',    [CartItemController::class, 'show'])
-    ->middleware('permission:cart-item,view');
-
-Route::put('/cart-item/{id}',    [CartItemController::class, 'update'])
-    ->middleware('permission:cart-item,edit');
-
-Route::delete('/cart-item/{id}', [CartItemController::class, 'destroy'])
-    ->middleware('permission:cart-item,delete');
+Route::get('/cart-item',         [CartItemController::class, 'index'])->middleware('permission:cart-item,view');
+Route::post('/cart-item',        [CartItemController::class, 'store'])->middleware('permission:cart-item,add');
+Route::get('/cart-item/{id}',    [CartItemController::class, 'show'])->middleware('permission:cart-item,view');
+Route::put('/cart-item/{id}',    [CartItemController::class, 'update'])->middleware('permission:cart-item,edit');
+Route::delete('/cart-item/{id}', [CartItemController::class, 'destroy'])->middleware('permission:cart-item,delete');