public async Task <ActionResult> Put(int movieId, [FromBody] AddUpdateUserRatingRequest request) { var status = await movieService.AddOrUpdateUserRatingForMovieAsync(movieId, request); if (status == ResponseStatus.NotFound) { return(NotFound("Movie or User not found")); } if (status == ResponseStatus.Invalid) { return(BadRequest("Invalid rating. Must be b/w 1 and 5")); } if (status == ResponseStatus.Fail) { return(new StatusCodeResult(500)); } return(Ok()); }
/// <summary> /// Add a rating to a movie for a certain user. /// The rating must be an integer between 1 and 5. /// If the user already had a rating for that movie, the old rating should be updated to the new value. /// </summary> public async Task <ResponseStatus> AddOrUpdateUserRatingForMovieAsync(int movieId, AddUpdateUserRatingRequest addUpdateUserRatingRequest) { try { var(isValid, addUpdateStatus) = await ValidateAddUpdateMovieRatingRequest(movieId, addUpdateUserRatingRequest); if (!isValid) { return(addUpdateStatus); } var movieRating = await this.moviesRepository.MovieRatings.Where(mr => mr.MovieId == movieId && mr.UserId == addUpdateUserRatingRequest.UserId).FirstOrDefaultAsync(); if (movieRating == null) { await this.moviesRepository.MovieRatings.AddAsync(new MovieRating { MovieId = movieId, UserId = addUpdateUserRatingRequest.UserId, Rating = addUpdateUserRatingRequest.Rating }); } else { movieRating.Rating = addUpdateUserRatingRequest.Rating; this.moviesRepository.MovieRatings.Update(movieRating); } return(await this.moviesRepository.SaveChangesAsync() > 0 ? ResponseStatus.Success : ResponseStatus.Fail); } catch (DbException dbException) { logger.LogError(dbException, $"Error while adding/updating rating for the movie"); return(ResponseStatus.Fail); } }
private async Task <(bool isValid, ResponseStatus addUpdateStatus)> ValidateAddUpdateMovieRatingRequest (int movieId, AddUpdateUserRatingRequest request) { var movieExists = await moviesRepository.Movies.AnyAsync(mr => mr.Id.Equals(movieId)); if (!movieExists) { return(false, ResponseStatus.NotFound); } var userExists = await moviesRepository.Users.AnyAsync(u => u.Id.Equals(request.UserId)); if (!userExists) { return(false, ResponseStatus.NotFound); } if (!(request.Rating >= 1 && request.Rating <= 5)) { return(false, ResponseStatus.Invalid); } return(true, default(ResponseStatus)); }