public async Task <PostComboVoteResponse> Handle(PostComboVoteRequest request, CancellationToken cancellationToken) { var combo = await _dbContext.Combos.FindAsync(request.ComboId); if (combo == null) { throw new KeyNotFoundException($"Combo with id {request.ComboId} does not exist"); } var existingComboVote = await _dbContext.ComboVotes .Include(vote => vote.Combo) .Include(vote => vote.User) .Where(comboVote => comboVote.Combo.Id == request.ComboId && comboVote.User.Id == request.CurrentUserId) .FirstOrDefaultAsync(); if (existingComboVote != null) { if (existingComboVote.IsUpvote == request.IsUpVote) { _dbContext.ComboVotes.Remove(existingComboVote); if (existingComboVote.IsUpvote) { combo.VoteDown(); } else { combo.VoteUp(); } await _dbContext.SaveChangesAsync(CancellationToken.None); return(new PostComboVoteResponse()); } if (existingComboVote.IsUpvote) { combo.VoteDown(); combo.VoteDown(); } else { combo.VoteUp(); combo.VoteUp(); } existingComboVote.IsUpvote = request.IsUpVote; _dbContext.Entry(existingComboVote).State = EntityState.Modified; await _dbContext.SaveChangesAsync(CancellationToken.None); return(new PostComboVoteResponse()); } else { var user = await _dbContext.Users.Where(user => user.Id == request.CurrentUserId).FirstOrDefaultAsync(); if (user == null) { throw new KeyNotFoundException($"User with id {request.CurrentUserId} does not exist"); } var comboVote = new ComboVote { Combo = combo, User = user, IsUpvote = request.IsUpVote }; if (comboVote.IsUpvote) { combo.VoteUp(); } else { combo.VoteDown(); } await _dbContext.ComboVotes.AddAsync(comboVote); await _dbContext.SaveChangesAsync(CancellationToken.None); return(new PostComboVoteResponse()); } }
public async Task <IActionResult> PostComboVote(int id, string upOrDown) { var combo = await _context.Combos.FindAsync(id); if (combo == null) { return(NotFound()); } var existingComboVote = await _context.ComboVotes.Where(comboVote => comboVote.UserId == GetCurrentUserId() && comboVote.ComboId == id).FirstOrDefaultAsync(); if (existingComboVote != null) { if (existingComboVote.upOrDown == upOrDown) { return(NoContent()); } switch (existingComboVote.upOrDown) { case "downvote": combo.VoteUp(); break; case "upvote": combo.VoteDown(); break; default: return(BadRequest()); } existingComboVote.upOrDown = upOrDown; _context.Entry(existingComboVote).State = EntityState.Modified; await _context.SaveChangesAsync(); } else { var comboVote = new ComboVote { ComboId = id, UserId = GetCurrentUserId(), upOrDown = upOrDown }; await _context.ComboVotes.AddAsync(comboVote); } switch (upOrDown) { case "upvote": combo.VoteUp(); break; case "downvote": combo.VoteDown(); break; default: return(BadRequest()); } _context.Entry(combo).State = EntityState.Modified; await _context.SaveChangesAsync(); return(NoContent()); }