public IHttpActionResult Accept(Guid id) { Answer answer = db.Answers.Find(id); Question question = answer.Question; if (answer.Accepted == false) { var questionHasAnwser = question.Answers.Any(x => x.Accepted); if (!questionHasAnwser) { string userId = User.Identity.GetUserId(); if (question.UserID != userId) { return(Unauthorized()); } answer.AspNetUser.Credits += question.Bounty; answer.Accepted = true; db.Entry(answer.AspNetUser).State = EntityState.Modified; db.Entry(answer).State = EntityState.Modified; PointsUtils.AddCreditsAndXP(answer.AspNetUser.Id, answer.Question.CategoryID, 25, 40); db.SaveChanges(); } } return(Ok(new AnswerDTO(answer))); }
public async Task <IActionResult> Details(int?id) { IActionResult actionResult = null; var viewModel = new UserDetailsViewModel(); var attendee = id.HasValue ? await this.DatabaseContext.Attendee .FirstOrDefaultAsync(m => m.UserID == id) : null; if (attendee == null) { actionResult = this.NotFound(); } else { viewModel.User = attendee; viewModel.PointsBalance = PointsUtils.GetPointsForUser( attendee.UserID, this.DatabaseContext); actionResult = this.View(viewModel); } return(actionResult); }
public async Task <IActionResult> CheckBalance(string UserNumber) { var viewModel = new CheckBalanceJsonViewModel(); try { //validate var user = await _context.User.FirstOrDefaultAsync(i => i.UserNumber == UserNumber); if (user == null) { throw new ApplicationException("User not found."); } viewModel.ResponseData.PointsBalance = PointsUtils.GetPointsForUser(user.UserID, _context); viewModel.ResponseData.UserNumber = user.UserNumber; viewModel.ResponseData.ExternalID = user.ExternalID; } catch (Exception ex) { viewModel.ErrorMessage = ex.Message; viewModel.ResponseData = null; } return(new JsonResult(viewModel)); }
public IHttpActionResult DeleteComment(Guid id) { Comment comment = db.Comments.Find(id); if (comment == null) { return(NotFound()); } Guid categoryId = Guid.Empty; if (comment.Answer != null) { categoryId = comment.Answer.Question.CategoryID; } else if (comment.Question != null) { categoryId = comment.Question.CategoryID; } PointsUtils.AddCreditsAndXP(comment.UserID, categoryId, -30, 0); db.Comments.Remove(comment); db.SaveChanges(); return(Ok(comment)); }
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 async Task <IActionResult> LogAction(string AwardNumber, string UserNumber) { var viewModel = new LogActionJsonViewModel(); try { //validate var award = await _context.Award.FirstOrDefaultAsync(i => i.AwardNumber == AwardNumber); if (award == null) { throw new ApplicationException("Award not found."); } var user = await _context.User.FirstOrDefaultAsync(i => i.UserNumber == UserNumber); if (user == null) { throw new ApplicationException("User not found."); } var existingAwardLogByThisUser = await _context.AwardLog.FirstOrDefaultAsync(i => i.UserID == user.UserID && i.AwardID == award.AwardID); if (existingAwardLogByThisUser != null) { throw new ApplicationException($"User has already been Awarded points for this action. User has {PointsUtils.GetPointsForUser(user.UserID, _context)} points."); } //good to go! var awardLog = new AwardLog(); awardLog.AwardID = award.AwardID; awardLog.CreatedDate = DateTime.UtcNow; awardLog.ModifiedDate = awardLog.CreatedDate; awardLog.Points = award.Points; awardLog.UserID = user.UserID; _context.Add(awardLog); await _context.SaveChangesAsync(); viewModel.ResponseData.PointsAwarded = awardLog.Points; viewModel.ResponseData.PointsBalance = PointsUtils.GetPointsForUser(user.UserID, _context); viewModel.ResponseData.UserNumber = user.UserNumber; viewModel.ResponseData.ExternalID = user.ExternalID; } catch (Exception ex) { viewModel.ErrorMessage = ex.Message; viewModel.ResponseData = null; } return(new JsonResult(viewModel)); }
public IHttpActionResult DeleteQuestion(Guid id) { Question question = db.Questions.Find(id); if (question == null) { return(NotFound()); } PointsUtils.AddCreditsAndXP(question.UserID, question.CategoryID, -100, 0); db.Questions.Remove(question); db.SaveChanges(); return(Ok(question)); }
public IHttpActionResult DeleteAnswer(Guid id) { Answer answer = db.Answers.Find(id); if (answer == null) { return(NotFound()); } Category category = db.Categories.Single(x => x.ID == answer.Question.CategoryID); PointsUtils.AddCreditsAndXP(answer.UserID, category.ID, -50, 0); db.Answers.Remove(answer); db.SaveChanges(); return(Ok(answer)); }
public IHttpActionResult PostComment(Comment comment) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } comment.ID = Guid.NewGuid(); comment.Added = DateTime.Now; comment.UserID = User.Identity.GetUserId(); db.Comments.Add(comment); try { db.SaveChanges(); } catch (DbUpdateException) { if (CommentExists(comment.ID)) { return(Conflict()); } else { throw; } } db = new OutOfRangeEntities(); comment = db.Comments.Find(comment.ID); Guid categoryId = Guid.Empty; if (comment.Answer != null) { categoryId = comment.Answer.Question.CategoryID; } else if (comment.Question != null) { categoryId = comment.Question.CategoryID; } PointsUtils.AddCreditsAndXP(comment.UserID, categoryId, 4, 7); return(CreatedAtRoute("DefaultApi", new { id = comment.ID }, CommentDTO.FromEntity(comment))); }
// GET: User/Details/5 public async Task <IActionResult> Details(int?id) { var viewModel = new UserDetailsViewModel(); if (id == null) { return(NotFound()); } var atendee = await _context.User .SingleOrDefaultAsync(m => m.UserID == id); if (atendee == null) { return(NotFound()); } viewModel.User = atendee; viewModel.PointsBalance = PointsUtils.GetPointsForUser(atendee.UserID, _context); return(View(viewModel)); }
public IHttpActionResult PostAnswer(Answer answer) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } answer.ID = Guid.NewGuid(); answer.Added = DateTime.Now; answer.UserID = User.Identity.GetUserId(); db.Answers.Add(answer); try { db.SaveChanges(); } catch (DbUpdateException) { if (AnswerExists(answer.ID)) { return(Conflict()); } else { throw; } } db = new OutOfRangeEntities(); answer = db.Answers.Find(answer.ID); Category category = db.Categories.Single(x => x.ID == answer.Question.CategoryID); PointsUtils.AddCreditsAndXP(answer.UserID, category.ID, 10, 15); return(CreatedAtRoute("DefaultApi", new { id = answer.ID }, AnswerDTO.FromEntity(answer))); }
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 async Task <IActionResult> LogAction(string RedemptionNumber, string UserNumber) { var viewModel = new LogRedemptionJsonViewModel(); try { //validate var redemption = await _context.Redemption.FirstOrDefaultAsync(i => i.RedemptionNumber == RedemptionNumber); if (redemption == null) { throw new ApplicationException("Redemption not found."); } var user = await _context.User.FirstOrDefaultAsync(i => i.UserNumber == UserNumber); if (user == null) { throw new ApplicationException("User not found."); } var existingRedemptionByUser = await _context.RedemptionLog.FirstOrDefaultAsync(i => i.UserID == user.UserID && i.RedemptionID == redemption.RedemptionID); if (existingRedemptionByUser != null) { throw new ApplicationException($"User has already Redeemed this. User has {PointsUtils.GetPointsForUser(user.UserID, _context)} points."); } //check if we have enough points int pointsShort = 0; int userPoints = PointsUtils.GetPointsForUser(user.UserID, _context); int pointsRequired = redemption.PointsRequired; bool hasEnoughPoints = false; pointsShort = pointsRequired - userPoints; if (pointsShort <= 0) { hasEnoughPoints = true; pointsShort = 0; } if (hasEnoughPoints) { //good to go! var redemptionLog = new RedemptionLog(); redemptionLog.RedemptionID = redemption.RedemptionID; redemptionLog.CreatedDate = DateTime.UtcNow; redemptionLog.ModifiedDate = redemptionLog.CreatedDate; redemptionLog.UserID = user.UserID; _context.Add(redemptionLog); await _context.SaveChangesAsync(); } viewModel.ResponseData.PointsShort = pointsShort; viewModel.ResponseData.Success = hasEnoughPoints; viewModel.ResponseData.PointsBalance = PointsUtils.GetPointsForUser(user.UserID, _context); viewModel.ResponseData.UserNumber = user.UserNumber; viewModel.ResponseData.ExternalID = user.ExternalID; } catch (Exception ex) { viewModel.ErrorMessage = ex.Message; viewModel.ResponseData = null; } return(new JsonResult(viewModel)); }
public void getCurrentBadgeRarityTest4() { actualRarity = PointsUtils.getCurrentScoreBadgeRarity(1024); expectedRarity = 3; Assert.AreEqual(expectedRarity, actualRarity); }
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))); }
public decimal GetPoints(ClassificationInfo classificationInfo, Result result, int tableIndex) { return(PointsUtils.GetPlacePoints(classificationInfo, result.Rank, tableIndex)); }
public void getQuestionBadgeRarityTest5() { actualRarity = PointsUtils.getQuestionBadgeRarity(500); expectedRarity = 3; Assert.AreEqual(expectedRarity, actualRarity); }