The review and rating system enables drivers and passengers to rate each other after completing trips. This creates accountability, builds trust, and helps users make informed decisions. Companies can also be reviewed by passengers.
{ "driverId": "d_789012", "passengerId": "p_123456", "rating": 5, "comment": "Excellent driver! Very professional and arrived on time. The car was clean and comfortable."}
public async Task<CreateDriverReviewResponse> Handle( CreateDriverReviewCommand request, CancellationToken ct){ ThrowWhen(string.IsNullOrWhiteSpace(request.DriverId), "يجب تحديد معرف السائق"); ThrowWhen(request.Rating < 1 || request.Rating > 5, "التقييم يجب أن يكون بين 1 و 5"); var (driverId, isCompleted) = await ResolveTripDriverAsync(request.TripId, request.DriverId, ct); ThrowWhen(!string.Equals(driverId, request.DriverId, StringComparison.OrdinalIgnoreCase), "معرف السائق لا يطابق سائق هذه الرحلة"); ThrowWhen(!isCompleted, "يمكن تقييم السائق فقط بعد إكمال الرحلة"); var hasValidBooking = await HasValidBookingAsync(request.TripId, request.PassengerId, ct); ThrowWhen(!hasValidBooking, "يمكن تقييم السائق فقط من قبل الركاب الذين لديهم حجز مؤكد أو مكتمل في رحلة مكتملة"); var existingReview = await driverReviewRepository.GetDriverReviewByTripAndPassengerAsync( request.TripId, request.PassengerId, ct); ThrowWhen(existingReview is not null, "لقد قمت بتقييم هذه الرحلة مسبقاً"); var review = DriverReview.Create( request.DriverId, request.PassengerId, request.TripId, request.Rating, request.Comment); await driverReviewRepository.AddDriverReviewAsync(review, ct); await UpdateDriverOverallRatingAsync(request.DriverId, ct);}
public async Task<CreatePassengerReviewResponse> Handle( CreatePassengerReviewCommand request, CancellationToken ct){ ThrowWhen(string.IsNullOrWhiteSpace(request.PassengerId), "يجب تحديد معرف الراكب"); ThrowWhen(request.Rating < 1 || request.Rating > 5, "التقييم يجب أن يكون بين 1 و 5"); var (driverId, isCompleted) = await ResolveTripDriverAsync( request.TripId, request.DriverId, ct); ThrowWhen(!string.Equals(driverId, request.DriverId, StringComparison.OrdinalIgnoreCase), "يمكنك تقييم الركاب فقط في رحلاتك الخاصة"); ThrowWhen(!isCompleted, "يمكن تقييم الراكب فقط بعد إكمال الرحلة"); var hasValidBooking = await HasValidBookingAsync(request.TripId, request.PassengerId, ct); ThrowWhen(!hasValidBooking, "الراكب المحدد ليس لديه حجز مؤكد أو مكتمل في هذه الرحلة"); var existingReview = await passengerReviewRepository .GetPassengerReviewByTripDriverAndPassengerAsync( request.TripId, request.DriverId, request.PassengerId, ct); ThrowWhen(existingReview is not null, "لقد قمت بتقييم هذا الراكب في هذه الرحلة مسبقاً"); var review = PassengerReview.Create( request.PassengerId, request.DriverId, request.TripId, request.Rating, request.Comment); await passengerReviewRepository.AddPassengerReviewAsync(review, ct); await UpdatePassengerOverallRatingAsync(request.PassengerId, ct);}