public static HaikuRating MapHaikuRateDtoToHaikuRating(HaikuRatingDto dto) { return(new HaikuRating() { Value = dto.Rating, DateCreated = DateTime.Now }); }
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)); }
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); } }
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); }