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());
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }
Ejemplo n.º 3
0
        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));
        }