Exemplo n.º 1
0
        public async Task <IActionResult> EditRating([FromBody] SetRatingModel setRatingModel)
        {
            var currentUser = await _userManager.GetUserAsync(User);

            var rubric = await _applicationDbContext.Rubrics.Include(x => x.Ratings)
                         .SingleOrDefaultAsync(x => x.Id == setRatingModel.RubricId);

            if (rubric == null)
            {
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return(Json("Rubric not found."));
            }

            if (rubric.Ratings.Where(x => x.ApplicationUserId == currentUser.Id).Any())
            {
                var rating = rubric.Ratings.First(x => x.ApplicationUserId == currentUser.Id);
                if (rating.Value == setRatingModel.Value)
                {
                    //user undoes vote
                    rubric.Ratings.Remove(rating);
                    rubric.TotalRating = setRatingModel.Value ? rubric.TotalRating - 1 : rubric.TotalRating + 1;
                }
                else
                {
                    //user switches directly from one vote to another
                    rating.Value       = setRatingModel.Value;
                    rubric.TotalRating = setRatingModel.Value ? rubric.TotalRating + 2 : rubric.TotalRating - 2;
                }
            }
            else
            {
                await _applicationDbContext.Ratings.AddAsync(new Rating
                {
                    ApplicationUserId = currentUser.Id,
                    RubricId          = setRatingModel.RubricId,
                    Value             = setRatingModel.Value
                });

                rubric.TotalRating = setRatingModel.Value ? rubric.TotalRating + 1 : rubric.TotalRating - 1;
            }

            await _applicationDbContext.SaveChangesAsync();

            var ratingValue = -1;

            if (rubric.Ratings.Any(x => x.ApplicationUserId == currentUser.Id))
            {
                var rating = rubric.Ratings.First(x => x.ApplicationUserId == currentUser.Id);
                ratingValue = rating.Value ? 1 : 0;
            }
            return(Json(new RatingViewModel
            {
                Vote = ratingValue,
                TotalRating = rubric.TotalRating.HasValue ? rubric.TotalRating.Value : 0
            }));
        }
        public async Task <IActionResult> Set([FromBody] SetRatingModel setRatingModel)
        {
            try
            {
                await _ratingService.Set(_setRatingMapper.ToBlModel(setRatingModel), User.GetEmail());

                return(Ok());
            }
            catch
            {
                return(StatusCode(500));
            }
        }