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))); }
public IHttpActionResult GetQuestion(Guid id) { Question question = db.Questions.Find(id); if (question == null) { return(NotFound()); } string userId = ""; if (User.Identity.IsAuthenticated) { userId = User.Identity.GetUserId(); var view = question.QuestionViews.Where(x => x.UserID == userId).ToList(); if (view.Count == 0) { question.QuestionViews.Add(new QuestionView() { UserID = userId, Added = DateTime.Now, LastVisit = DateTime.Now, }); db.Entry(question).State = EntityState.Modified; } else { view.First().LastVisit = DateTime.Now; db.Entry(view.First()).State = EntityState.Modified; } } db.SaveChanges(); db = new OutOfRangeEntities(); question = db.Questions.Find(id); QuestionDTO jsonQuestion = new QuestionDTO(question); if (User.Identity.IsAuthenticated) { var qScore = question.ScoreItems.Where(x => x.UserID == userId).ToList(); if (qScore.Count > 0) { var score = qScore.First().Score; jsonQuestion.ScoreGiven = decimal.ToInt32(score); } foreach (var comment in jsonQuestion.Comments) { var comm = db.Comments.Find(comment.ID); var qComScore = comm.ScoreItems.Where(x => x.UserID == userId).ToList(); if (qComScore.Count > 0) { var score = qComScore.First().Score; comment.ScoreGiven = decimal.ToInt32(score); } } foreach (var answer in jsonQuestion.Answers) { var answ = db.Answers.Find(answer.ID); var qAnswScore = answ.ScoreItems.Where(x => x.UserID == userId).ToList(); if (qAnswScore.Count > 0) { var score = qAnswScore.First().Score; answer.ScoreGiven = decimal.ToInt32(score); } foreach (var comment in answer.Comments) { var comm = db.Comments.Find(comment.ID); var qComScore = comm.ScoreItems.Where(x => x.UserID == userId).ToList(); if (qComScore.Count > 0) { var score = qComScore.First().Score; comment.ScoreGiven = decimal.ToInt32(score); } } } } int viewsNumber = question.QuestionViews.Count(); if (viewsNumber == 100) { PointsUtils.giveBadge(question.AspNetUser.Id, question.CategoryID, "views", 0, question.ID); } else if (viewsNumber == 300) { PointsUtils.giveBadge(question.AspNetUser.Id, question.CategoryID, "views", 1, question.ID); } else if (viewsNumber == 500) { PointsUtils.giveBadge(question.AspNetUser.Id, question.CategoryID, "views", 2, question.ID); } else if (viewsNumber == 1000) { PointsUtils.giveBadge(question.AspNetUser.Id, question.CategoryID, "views", 3, question.ID); } return(Ok(jsonQuestion)); }
public IHttpActionResult PostQuestion(Question question) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } string userId = User.Identity.GetUserId(); AspNetUser user = db.AspNetUsers.Single(x => x.Id == userId); if (question.Bounty > user.Credits && question.Bounty > 0) { return(BadRequest("Cannot add a bounty with more points than you have")); } user.Credits -= question.Bounty; db.Entry(user).State = EntityState.Modified; List <Tag> removingTags = new List <Tag>(); List <Tag> addingTags = new List <Tag>(); foreach (var tag in question.Tags) { var currentTag = db.Tags.SingleOrDefault(x => x.Name.ToLower() == tag.Name.ToLower()); if (currentTag == null) { tag.ID = Guid.NewGuid(); //Tag newTag = new Tag() //{ // Name = tag.Name.ToLower(), // Description = tag.Description, // ID = Guid.NewGuid() //}; //db.Tags.Add(newTag); } else { removingTags.Add(tag); addingTags.Add(currentTag); } } foreach (var removingTag in removingTags) { question.Tags.Remove(removingTag); } foreach (var addingTag in addingTags) { question.Tags.Add(addingTag); } question.ID = Guid.NewGuid(); //guid hardcodat al unui user if (User.Identity.IsAuthenticated) { question.UserID = userId; } else { question.UserID = "9e03ab56-d1c8-460a-ad48-fa7c6e69bf18"; } question.Added = DateTime.Now; question.Modified = DateTime.Now; //Category ca sa mearga (bine ca nu's puse FK inca) db.Questions.Add(question); try { db.SaveChanges(); } catch (DbUpdateException e) { if (QuestionExists(question.ID)) { return(Conflict()); } else { throw e; } } PointsUtils.AddCreditsAndXP(userId, question.CategoryID, 10, 15); int questionsNumber = user.Questions.Where(x => x.CategoryID == question.CategoryID).Count(); int badgeRarity = PointsUtils.getQuestionBadgeRarity(questionsNumber); if (badgeRarity != -1) { PointsUtils.giveBadge(userId, question.CategoryID, "question", badgeRarity, question.ID); } db = new OutOfRangeEntities(); question = db.Questions.Find(question.ID); return(CreatedAtRoute("DefaultApi", new { id = question.ID }, QuestionDTO.FromEntity(question))); }