public async Task CreateOrUpdatePlayersRating(PlayersRatingViewModel model, PlayersRating entity) { using (var db = new ApplicationDbContext()) using (var transaction = db.Database.BeginTransaction()) { await Task.Run(() => { var playersRating = db.PlayersRatings.SingleOrDefault(x => x.ReviewerId == model.ReviewerId && x.RatedId == model.RatedId); // Add or update rating if (playersRating == null) { db.PlayersRatings.Add(entity); } else { playersRating.Rating = model.Rating; } db.SaveChanges(); // Update players overall rating var ratedPlayer = db.Users.SingleOrDefault(x => x.Id == model.RatedId); var ratedPlayerRatings = db.PlayersRatings.Where(x => x.RatedId == model.RatedId).ToList(); int counter = 0, ratingSum = 0; foreach (var item in ratedPlayerRatings) { var ratingInt = (int)item.Rating; if (ratingInt == 0) { continue; } counter++; ratingSum += ratingInt; } ratedPlayer.OverallRating = ratingSum / (double)counter; db.SaveChanges(); transaction.Commit(); }); } }
public async Task <IHttpActionResult> CreateOrUpdatePlayersRating(PlayersRatingViewModel model, string userID = null) { string appUserID = (userID == null) ? User.Identity.GetUserId() : userID; model.ReviewerId = appUserID; try { var playersRating = _mapperToEntity.Map <PlayersRating>(model); await _playerRatingsService.CreateOrUpdatePlayersRating(model, playersRating); return(Ok()); } catch (Exception ex) { return(BadRequest(ex.Message)); } }