예제 #1
0
 public static HaikuRating MapHaikuRateDtoToHaikuRating(HaikuRatingDto dto)
 {
     return(new HaikuRating()
     {
         Value = dto.Rating,
         DateCreated = DateTime.Now
     });
 }
예제 #2
0
        public async Task <ActionResult> Rate(int id, HaikuRatingDto dto)
        {
            return(await RunAndHandleExceptions(async (haikuId) =>
            {
                var author = await this.haikusService.GetHaikuAuthorAsync(haikuId).ConfigureAwait(false);
                if (author == LoggedUserNickname)
                {
                    throw new DTO.Exceptions.UnauthorizedAccessException("Forbidden!");
                }

                await this.haikusService.RateAsync(LoggedUserNickname, id, dto).ConfigureAwait(false);
                return RedirectToAction("Details", "Haikus");
            }, id).ConfigureAwait(false));
        }
예제 #3
0
        public async Task RateAsync(string nickname, int haikuId, HaikuRatingDto dto)
        {
            var userId = (await this.UnitOfWork.UsersRepository
                          .GetUniqueAsync(u => u.Nickname == nickname).ConfigureAwait(false)).Id;
            var existingRating = await this.UnitOfWork.RatingsRepository.GetByIdAsync(userId, haikuId).ConfigureAwait(false);

            if (existingRating != null)
            {
                await RateExistingAsync(existingRating, dto).ConfigureAwait(false);
            }
            else
            {
                var haiku = await this.UnitOfWork.HaikusRepository.GetByIdAsync(haikuId).ConfigureAwait(false);

                var rating = Mapper.MapHaikuRateDtoToHaikuRating(dto);
                haiku.Ratings.Add(rating);

                // updating haiku rating
                var oldHaikuRating = haiku.Rating;
                haiku.RatingsCount++;
                haiku.RatingsSum += rating.Value;
                haiku.Rating      = ((double)haiku.RatingsSum) / haiku.RatingsCount;

                // updating user rating
                var user = await this.UnitOfWork.UsersRepository.GetByIdAsync(haiku.UserId);

                if (oldHaikuRating == null)
                {
                    user.HaikusRatingSum += haiku.Rating.Value;
                    user.HaikusCount++;
                }
                else
                {
                    user.HaikusRatingSum = user.HaikusRatingSum - oldHaikuRating.Value + haiku.Rating.Value;
                }
                user.Rating = user.HaikusRatingSum / user.HaikusCount;

                rating.UserId = userId;

                await this.UnitOfWork.CommitAsync().ConfigureAwait(false);
            }
        }
예제 #4
0
        private async Task RateExistingAsync(HaikuRating existingRating, HaikuRatingDto dto)
        {
            var haiku = await this.UnitOfWork.HaikusRepository.GetByIdAsync(existingRating.HaikuId).ConfigureAwait(false);

            var oldRating = existingRating.Value;

            existingRating.Value = dto.Rating;

            var oldHaikuRating = haiku.Rating;

            haiku.RatingsSum = haiku.RatingsSum - oldRating + dto.Rating;
            haiku.Rating     = ((double)haiku.RatingsSum) / haiku.RatingsCount;

            var user = await this.UnitOfWork.UsersRepository.GetByIdAsync(haiku.UserId);

            user.HaikusRatingSum = user.HaikusRatingSum - oldHaikuRating.Value + haiku.Rating.Value;
            user.Rating          = user.HaikusRatingSum / user.HaikusCount;

            await this.UnitOfWork.CommitAsync().ConfigureAwait(false);
        }