public IHttpActionResult AddScore(ItemScore score) { Question question = db.Questions.Find(score.id); string userId = User.Identity.GetUserId(); var scoreitems = question.ScoreItems.Where(x => x.UserID == userId).ToList(); if (scoreitems.Count == 0) { int addedScore = Math.Sign(score.score); question.ScoreItems.Add(new ScoreItem() { Added = DateTime.Now, Score = addedScore, UserID = userId, ItemID = question.ID, }); question.Score += addedScore; } else { int addedScore = Math.Sign(score.score); var scoreItem = scoreitems.First(); if (scoreItem.Score != addedScore) { question.Score -= scoreItem.Score; scoreItem.Score = addedScore; question.Score += addedScore; db.Entry(scoreItem).State = EntityState.Modified; } else { question.Score -= scoreItem.Score; db.Entry(scoreItem).State = EntityState.Deleted; } } db.Entry(question).State = EntityState.Modified; db.SaveChanges(); int currentScore = question.Score; int currentBadgeRarity = PointsUtils.getCurrentScoreBadgeRarity(currentScore); UserLevel userLevel = question.AspNetUser.UserLevels.Single(x => x.CategoryID == question.CategoryID); UserBadge userBadge = userLevel.UserBadges.SingleOrDefault(x => x.ItemID == question.ID); if (userBadge == null) { PointsUtils.giveBadge(question.AspNetUser.Id, question.CategoryID, "score", currentBadgeRarity, question.ID); } else if (userBadge.Badge.Rarity < currentBadgeRarity) { db.UserBadges.Remove(userBadge); PointsUtils.giveBadge(question.AspNetUser.Id, question.CategoryID, "score", currentBadgeRarity, question.ID); } db.SaveChanges(); return(Ok(new QuestionDTO(question))); }
public IHttpActionResult AddScore(ItemScore score) { Answer answer = db.Answers.Find(score.id); string userId = User.Identity.GetUserId(); var scoreitems = answer.ScoreItems.Where(x => x.UserID == userId).ToList(); if (scoreitems.Count == 0) { int addedScore = Math.Sign(score.score); answer.ScoreItems.Add(new ScoreItem() { Added = DateTime.Now, Score = addedScore, UserID = userId, ItemID = answer.ID, }); answer.Score += addedScore; } else { int addedScore = Math.Sign(score.score); var scoreItem = scoreitems.First(); if (scoreItem.Score != addedScore) { answer.Score -= decimal.ToInt32(scoreItem.Score); scoreItem.Score = addedScore; answer.Score += addedScore; db.Entry(scoreItem).State = EntityState.Modified; } else { answer.Score -= addedScore; db.Entry(scoreItem).State = EntityState.Deleted; } } db.Entry(answer).State = EntityState.Modified; db.SaveChanges(); if (answer.Score == 10) { UserLevel userLevel = answer.AspNetUser.UserLevels.Single(x => x.CategoryID == answer.Question.CategoryID); UserBadge userBadge = userLevel.UserBadges.SingleOrDefault(x => x.ItemID == answer.ID); if (userBadge == null) { PointsUtils.giveBadge(answer.AspNetUser.Id, answer.Question.CategoryID, "score", 0, answer.ID); } } else if (answer.Score == 50) { UserLevel userLevel = answer.AspNetUser.UserLevels.Single(x => x.CategoryID == answer.Question.CategoryID); UserBadge userBadge = userLevel.UserBadges.SingleOrDefault(x => x.ItemID == answer.ID); if (userBadge.Badge.Rarity == 0) { PointsUtils.giveBadge(answer.AspNetUser.Id, answer.Question.CategoryID, "score", 1, answer.ID); db.UserBadges.Remove(userBadge); } } else if (answer.Score == 100) { UserLevel userLevel = answer.AspNetUser.UserLevels.Single(x => x.CategoryID == answer.Question.CategoryID); UserBadge userBadge = userLevel.UserBadges.SingleOrDefault(x => x.ItemID == answer.ID); if (userBadge.Badge.Rarity == 1) { PointsUtils.giveBadge(answer.AspNetUser.Id, answer.Question.CategoryID, "score", 2, answer.ID); db.UserBadges.Remove(userBadge); } } else if (answer.Score == 500) { UserLevel userLevel = answer.AspNetUser.UserLevels.Single(x => x.CategoryID == answer.Question.CategoryID); UserBadge userBadge = userLevel.UserBadges.SingleOrDefault(x => x.ItemID == answer.ID); if (userBadge.Badge.Rarity == 2) { PointsUtils.giveBadge(answer.AspNetUser.Id, answer.Question.CategoryID, "score", 3, answer.ID); db.UserBadges.Remove(userBadge); } } db.SaveChanges(); return(Ok(new AnswerDTO(answer))); }