public async Task <IActionResult> PutQuestionVote(QuestionVoteViewModel model) { if (model.Vote != 1 && model.Vote != -1) { return(BadRequest()); } var user = await userManager.FindByNameAsync(User.Identity.Name); if (user == null) { return(Unauthorized()); } var question = await _context.Questions.Where(x => x.ID == model.QuestionId).FirstOrDefaultAsync(); if (question == null) { return(NotFound()); } var vote = await _context.QuestionVotes.Where(x => x.UserId == user.Id && x.QuestionId == model.QuestionId).FirstOrDefaultAsync(); if (vote == null) { return(NotFound("Question has not been voted on yet.")); } if (vote.UserId != user.Id) { return(Unauthorized()); } if (vote.Vote == model.Vote) { return(BadRequest($"The vote already is {vote.Vote}")); } var previousVote = vote.Vote; vote.Vote = model.Vote; if (previousVote == 1) { question.Upvotes -= 1; question.Downvotes += 1; } else { question.Upvotes += 1; question.Downvotes -= 1; } await _context.SaveChangesAsync(); return(NoContent()); }
public async Task <IActionResult> PostQuestionVote(QuestionVoteViewModel model) { var user = await userManager.FindByNameAsync(User.Identity.Name); if (user == null) { return(Unauthorized()); } var question = await _context.Questions.Where(x => x.ID == model.QuestionId).FirstOrDefaultAsync(); if (question == null) { return(NotFound()); } var vote = await _context.QuestionVotes.Where(x => x.UserId == user.Id && x.QuestionId == model.QuestionId).FirstOrDefaultAsync(); if (vote != null) { return(BadRequest("Question has already been voted on.")); } var questionVote = new QuestionVote { QuestionId = model.QuestionId, UserId = user.Id, Vote = model.Vote }; _context.QuestionVotes.Add(questionVote); if (model.Vote == 1) { question.Upvotes += 1; } else { question.Downvotes += 1; } await _context.SaveChangesAsync(); return(NoContent()); }