Example #1
0
        public async Task <ActionResult <VotingView> > Vote(
            CancellationToken cancellationToken,
            [FromRoute] Guid votingId,
            [FromQuery] Guid variantId)
        {
            var voting = await _votingRepository.Get(votingId, cancellationToken);

            if (voting == null)
            {
                return(NotFound(votingId));
            }

            var variant = await _context.Variants
                          .Include(o => o.Votes)
                          .SingleOrDefaultAsync(o => o.Id == variantId);

            if (variant == null)
            {
                return(NotFound(variantId));
            }

            var person = await _personRepository.Get(User.GetId(), cancellationToken);

            if (await IsVoted(person.Id, voting.Id))
            {
                return(Conflict("Already voted!"));
            }

            try
            {
                voting.Vote(variant.Id, person);
            }
            catch (InvalidOperationException exception)
            {
                return(BadRequest(exception.Message));
            }

            await _votingRepository.Save(voting, cancellationToken);

            return(Ok(new VotingView
            {
                Id = voting.Id,
                Title = voting.Title,
                IsClosed = voting.IsClosed,
                Variants = voting.Variants.Select(o => new VariantView
                {
                    Id = o.Id,
                    Title = o.Title,
                    Count = variant.Votes.Count,
                    Votes = o.Votes.Select(v => new VoteView
                    {
                        Id = v.Id,
                        Person = new PersonView
                        {
                            Id = v.Person.Id,
                            Name = v.Person.Name,
                            Surname = v.Person.Surname
                        }
                    }).ToList()
                }).ToList()
            }));
        }