Răsfoiți Sursa

adiciona abas de avaliacoes no cliente e prestador

Gustavo Zanatta 1 lună în urmă
părinte
comite
65fa4dbe54

+ 37 - 0
app/Http/Controllers/ReviewController.php

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers;
 
 use App\Http\Requests\ReviewRequest;
+use App\Http\Resources\ReviewDetailResource;
 use App\Http\Resources\ReviewResource;
 use App\Services\ReviewService;
 use Illuminate\Http\JsonResponse;
@@ -40,6 +41,42 @@ class ReviewController extends Controller
         );
     }
 
+    public function clientSent(int $clientId): JsonResponse
+    {
+        $reviews = $this->service->getByClientSent($clientId);
+
+        return $this->successResponse(
+            payload: ReviewDetailResource::collection($reviews),
+        );
+    }
+
+    public function clientReceived(int $clientId): JsonResponse
+    {
+        $reviews = $this->service->getByClientReceived($clientId);
+
+        return $this->successResponse(
+            payload: ReviewDetailResource::collection($reviews),
+        );
+    }
+
+    public function providerSent(int $providerId): JsonResponse
+    {
+        $reviews = $this->service->getByProviderSent($providerId);
+
+        return $this->successResponse(
+            payload: ReviewDetailResource::collection($reviews),
+        );
+    }
+
+    public function providerReceived(int $providerId): JsonResponse
+    {
+        $reviews = $this->service->getByProviderReceived($providerId);
+
+        return $this->successResponse(
+            payload: ReviewDetailResource::collection($reviews),
+        );
+    }
+
     public function store(ReviewRequest $request): JsonResponse
     {
         $review = $this->service->create($request->validated());

+ 76 - 0
app/Http/Resources/ReviewDetailResource.php

@@ -0,0 +1,76 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class ReviewDetailResource extends JsonResource
+{
+    public function toArray(Request $request): array
+    {
+        $schedule = $this->schedule;
+        $customSchedule = $schedule?->customSchedule;
+        $address = $schedule?->address;
+
+        return [
+            'id'         => $this->id,
+            'origin'     => $this->origin,
+            'origin_id'  => $this->origin_id,
+            'stars'      => $this->stars,
+            'comment'    => $this->comment,
+            'created_at' => $this->created_at?->format('Y-m-d H:i'),
+            'improvements' => $this->whenLoaded('improvements', function () {
+                return $this->improvements->map(fn($imp) => [
+                    'id'          => $imp->id,
+                    'description' => $imp->description,
+                ]);
+            }),
+            'schedule' => $schedule ? [
+                'id'            => $schedule->id,
+                'schedule_type' => $schedule->schedule_type,
+                'status'        => $schedule->status,
+                'date'          => $schedule->date?->format('d/m/Y'),
+                'start_time'    => $schedule->start_time,
+                'end_time'      => $schedule->end_time,
+                'period_type'   => $schedule->period_type,
+                'total_amount'  => $schedule->total_amount,
+                'code'          => $schedule->code,
+                'client'        => $schedule->client ? [
+                    'id'    => $schedule->client->id,
+                    'name'  => $schedule->client->user?->name,
+                    'email' => $schedule->client->user?->email,
+                    'phone' => $schedule->client->user?->phone,
+                ] : null,
+                'provider'      => $schedule->provider ? [
+                    'id'    => $schedule->provider->id,
+                    'name'  => $schedule->provider->user?->name,
+                    'email' => $schedule->provider->user?->email,
+                    'phone' => $schedule->provider->user?->phone,
+                ] : null,
+                'address'       => $address ? [
+                    'street'       => $address->street,
+                    'number'       => $address->number,
+                    'complement'   => $address->complement,
+                    'neighborhood' => $address->neighborhood,
+                    'city'         => $address->city?->name,
+                    'state'        => $address->state?->name,
+                ] : null,
+                'custom_schedule' => $customSchedule ? [
+                    'address_type' => $customSchedule->address_type,
+                    'service_type' => $customSchedule->serviceType?->description,
+                    'specialities' => $customSchedule->specialities
+                        ? $customSchedule->specialities->map(fn($s) => [
+                            'id'          => $s->id,
+                            'description' => $s->description,
+                        ])
+                        : [],
+                    'min_price'   => $customSchedule->min_price,
+                    'max_price'   => $customSchedule->max_price,
+                    'offers_meal' => $customSchedule->offers_meal,
+                    'description' => $customSchedule->description,
+                ] : null,
+            ] : null,
+        ];
+    }
+}

+ 49 - 0
app/Services/ReviewService.php

@@ -75,6 +75,55 @@ class ReviewService
     }
   }
 
+  private function detailEagerLoads(): array
+  {
+    return [
+      'schedule.client.user',
+      'schedule.provider.user',
+      'schedule.address.city',
+      'schedule.address.state',
+      'schedule.customSchedule.serviceType',
+      'schedule.customSchedule.specialities',
+      'improvements',
+    ];
+  }
+
+  public function getByClientSent(int $clientId)
+  {
+    return Review::with($this->detailEagerLoads())
+      ->whereIn('origin', ['client', 'clients'])
+      ->where('origin_id', $clientId)
+      ->orderBy('created_at', 'desc')
+      ->get();
+  }
+
+  public function getByClientReceived(int $clientId)
+  {
+    return Review::with($this->detailEagerLoads())
+      ->whereIn('origin', ['provider', 'providers'])
+      ->whereHas('schedule', fn($q) => $q->where('client_id', $clientId))
+      ->orderBy('created_at', 'desc')
+      ->get();
+  }
+
+  public function getByProviderSent(int $providerId)
+  {
+    return Review::with($this->detailEagerLoads())
+      ->whereIn('origin', ['provider', 'providers'])
+      ->where('origin_id', $providerId)
+      ->orderBy('created_at', 'desc')
+      ->get();
+  }
+
+  public function getByProviderReceived(int $providerId)
+  {
+    return Review::with($this->detailEagerLoads())
+      ->whereIn('origin', ['client', 'clients'])
+      ->whereHas('schedule', fn($q) => $q->where('provider_id', $providerId))
+      ->orderBy('created_at', 'desc')
+      ->get();
+  }
+
   public function update(int $id, array $data): Review
   {
     $review = Review::findOrFail($id);

+ 4 - 0
routes/authRoutes/review.php

@@ -5,6 +5,10 @@ use Illuminate\Support\Facades\Route;
 
 Route::get('/reviews', [ReviewController::class, 'index'])->middleware('permission:config.review,view');
 Route::get('/reviews/schedule/{scheduleId}', [ReviewController::class, 'indexBySchedule'])->middleware('permission:config.review,view');
+Route::get('/reviews/client/{clientId}/sent', [ReviewController::class, 'clientSent'])->middleware('permission:config.review,view');
+Route::get('/reviews/client/{clientId}/received', [ReviewController::class, 'clientReceived'])->middleware('permission:config.review,view');
+Route::get('/reviews/provider/{providerId}/sent', [ReviewController::class, 'providerSent'])->middleware('permission:config.review,view');
+Route::get('/reviews/provider/{providerId}/received', [ReviewController::class, 'providerReceived'])->middleware('permission:config.review,view');
 Route::get('/reviews/{origin}/{originId}', [ReviewController::class, 'indexByOrigin'])->middleware('permission:config.review,view');
 Route::post('/reviews', [ReviewController::class, 'store'])->middleware('permission:config.review,add');
 Route::put('/reviews/{id}', [ReviewController::class, 'update'])->middleware('permission:config.review,edit');