Exemple #1
0
        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());
            }
        }
Exemple #2
0
        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());
        }