validate([ 'driver_id' => 'required|string', 'ride_id' => 'required|integer', 'rating' => 'required|numeric|min:1|max:5', 'comment' => 'nullable|string|max:500', ]); $passengerId = $request->input('_jwt_user_id'); // Prevent duplicate ratings $exists = DB::connection('primary')->table('ratingDriver') ->where('ride_id', $request->input('ride_id'))->exists(); if ($exists) { return response()->json(['status' => 'failure', 'message' => 'Already rated'], 409); } DB::connection('primary')->table('ratingDriver')->insert([ 'passenger_id' => $passengerId, 'driver_id' => $request->input('driver_id'), 'ride_id' => $request->input('ride_id'), 'rating' => $request->input('rating'), 'comment' => $request->input('comment', ''), 'created_at' => now(), ]); return response()->json(['status' => 'success'], 201); } /** POST /v2/ratings/passenger — driver rates a passenger */ public function ratePassenger(Request $request): JsonResponse { $request->validate([ 'passenger_id' => 'required|string', 'ride_id' => 'required', 'rating' => 'required|numeric|min:1|max:5', 'comment' => 'nullable|string|max:500', ]); $driverId = $request->input('_jwt_user_id'); $exists = DB::connection('primary')->table('ratingPassenger') ->where('rideId', $request->input('ride_id'))->exists(); if ($exists) { return response()->json(['status' => 'failure', 'message' => 'Already rated'], 409); } DB::connection('primary')->table('ratingPassenger')->insert([ 'passenger_id' => $request->input('passenger_id'), 'driverID' => $driverId, 'rideId' => $request->input('ride_id'), 'rating' => $request->input('rating'), 'comment' => $request->input('comment', ''), 'created_at' => now(), ]); return response()->json(['status' => 'success'], 201); } /** POST /v2/ratings/app */ public function rateApp(Request $request): JsonResponse { $request->validate([ 'rating' => 'required|numeric|min:1|max:5', 'comment' => 'nullable|string|max:300', ]); $userId = $request->input('_jwt_user_id'); $userType = $request->input('_jwt_user_type'); DB::connection('primary')->table('ratingApp')->insert([ 'name' => $request->input('name', ''), 'email' => $request->input('email', ''), 'phone' => $request->input('phone', ''), 'userId' => $userId, 'userType' => $userType, 'rating' => $request->input('rating'), 'comment' => $request->input('comment', ''), 'created_at' => now(), ]); return response()->json(['status' => 'success'], 201); } /** GET /v2/ratings/driver/{id} */ public function driverRating(string $id): JsonResponse { $ratings = DB::connection('primary')->table('ratingDriver') ->where('driver_id', $id) ->orderBy('created_at', 'desc') ->limit(50) ->get(); $avg = DB::connection('primary')->table('ratingDriver') ->where('driver_id', $id)->avg('rating'); return response()->json([ 'status' => 'success', 'data' => [ 'average' => round($avg ?? 5.0, 2), 'count' => $ratings->count(), 'ratings' => $ratings, ], ]); } /** GET /v2/ratings/passenger/{id} */ public function passengerRating(string $id): JsonResponse { $ratings = DB::connection('primary')->table('ratingPassenger') ->where('passenger_id', $id) ->orderBy('created_at', 'desc') ->limit(50) ->get(); $avg = DB::connection('primary')->table('ratingPassenger') ->where('passenger_id', $id)->avg('rating'); return response()->json([ 'status' => 'success', 'data' => [ 'average' => round($avg ?? 5.0, 2), 'count' => $ratings->count(), 'ratings' => $ratings, ], ]); } }