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)));
        }
Esempio n. 2
0
        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)));
        }