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(Request $request, string $id = null): JsonResponse { $id = $id ?? $request->input('passenger_id'); if (!$id) { return response()->json(['status' => 'failure', 'message' => 'Passenger ID required'], 400); } $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', 'message' => [ 'average' => round($avg ?? 5.0, 2), 'count' => $ratings->count(), 'ratings' => $ratings, ], ]); } /** GET /v2/ratings/app — Legacy GET support */ public function getAppFeedback(Request $request): JsonResponse { $passengerId = $request->input('passengerId'); if (!$passengerId) { return response()->json(['status' => 'failure', 'message' => 'passengerId is required']); } $data = DB::connection('primary')->table('feedBack') ->where('passengerId', $passengerId) ->orderBy('datecreated', 'desc') ->get(); if ($data->isEmpty()) { return response()->json(['status' => 'failure', 'message' => 'No feedback found']); } return response()->json([ 'status' => 'success', 'message' => $data ]); } /** POST /v2/ratings/app — Legacy POST support */ public function storeAppFeedback(Request $request): JsonResponse { $passengerId = $request->input('passengerId'); $feedBack = $request->input('feedBack'); if (!$passengerId || !$feedBack) { return response()->json(['status' => 'failure', 'message' => 'Missing parameters']); } // V1 Encrypts this data $enc = new \App\Helpers\LegacyEncryption(); $feedBackEnc = $enc->encrypt($feedBack); try { DB::connection('primary')->table('feedBack')->insert([ 'passengerId' => $passengerId, 'feedBack' => $feedBackEnc, 'datecreated' => now() ]); return response()->json(['status' => 'success', 'message' => 'Feedback saved successfully']); } catch (\Exception $e) { return response()->json(['status' => 'failure', 'message' => 'Database error: ' . $e->getMessage()]); } } }