Пример #1
0
 public void DisplayConversationInfo(ConversationType type, string id)
 {
     this.lab_conversationId.Text   = id;
     this.lab_convarsationType.Text = type.ToString();
 }
Пример #2
0
 private void ChatBox_OnChatCreatedEvent(ConversationType type, string id)
 {
     this.lab_convarsationType.Text = type.ToString();
     this.lab_conversationId.Text   = id;
 }
Пример #3
0
        public async Task <PollDto> VotePollAsync(Guid pollId, long conversationId, ConversationType conversationType, List <PollVoteVm> options, long votingUserId)
        {
            if (!await conversationsService.IsUserInConversationAsync(conversationType, conversationId, votingUserId).ConfigureAwait(false))
            {
                throw new PermissionDeniedException("User is not in conversation.");
            }
            using (MessengerDbContext context = contextFactory.Create())
            {
                var poll = await context.Polls
                           .Include(opt => opt.Options)
                           .ThenInclude(opt => opt.PollOptionVotes)
                           .FirstOrDefaultAsync(opt =>
                                                opt.PollId == pollId &&
                                                opt.ConvertsationId == conversationId &&
                                                opt.ConversationType == conversationType)
                           .ConfigureAwait(false);

                if (poll == null)
                {
                    throw new ObjectDoesNotExistsException($"Poll not found (Poll Id: {pollId}, {conversationType.ToString()}Id: {conversationId}).");
                }
                if (options == null || !options.Any())
                {
                    foreach (var option in poll.Options)
                    {
                        option.PollOptionVotes = option.PollOptionVotes.Where(vote => vote.UserId != votingUserId).ToList();
                    }
                }
                List <PollOptionVote> newVotes     = new List <PollOptionVote>();
                List <PollOptionVote> removedVotes = new List <PollOptionVote>();
                foreach (var voteOption in options)
                {
                    var option = poll.Options.FirstOrDefault(opt => opt.OptionId == voteOption.OptionId);
                    if (option != null && voteOption.Sign != null && voteOption.Sign.Data != null)
                    {
                        if (!option.PollOptionVotes.Any(vote => vote.UserId == votingUserId))
                        {
                            if (poll.SignRequired)
                            {
                                if (voteOption.Sign == null || voteOption.Sign.Data == null || !voteOption.Sign.Data.Any())
                                {
                                    throw new InvalidSignException($"Vote №{voteOption.OptionId} is not signed.");
                                }
                                var signKey = await context.Keys
                                              .FirstOrDefaultAsync(key => key.KeyId == voteOption.Sign.KeyId && key.Type == KeyType.SignAsymKey)
                                              .ConfigureAwait(false);

                                if (signKey == null)
                                {
                                    throw new ObjectDoesNotExistsException($"Key not found (Key Id: {voteOption.Sign.KeyId}.");
                                }
                            }
                            newVotes.Add(new PollOptionVote
                            {
                                ConversationId   = conversationId,
                                ConversationType = conversationType,
                                OptionId         = voteOption.OptionId,
                                UserId           = votingUserId,
                                PollId           = pollId,
                                Sign             = voteOption.Sign?.Data,
                                SignKeyId        = voteOption.Sign?.KeyId
                            });
                        }
                        else
                        {
                            removedVotes.Add(option.PollOptionVotes
                                             .FirstOrDefault(opt => opt.UserId == votingUserId && opt.OptionId == voteOption.OptionId));
                        }
                    }
                    else
                    {
                        if (!option.PollOptionVotes.Any(vote => vote.UserId == votingUserId))
                        {
                            newVotes.Add(new PollOptionVote
                            {
                                ConversationId   = conversationId,
                                ConversationType = conversationType,
                                OptionId         = voteOption.OptionId,
                                UserId           = votingUserId,
                                PollId           = pollId
                            });
                        }
                        else
                        {
                            removedVotes.Add(option.PollOptionVotes
                                             .FirstOrDefault(opt => opt.UserId == votingUserId && opt.OptionId == voteOption.OptionId));
                        }
                    }
                    foreach (var vote in newVotes)
                    {
                        option.PollOptionVotes.Add(vote);
                    }
                    foreach (var vote in removedVotes)
                    {
                        option.PollOptionVotes.Remove(vote);
                    }
                }
                if (!poll.MultipleSelection && poll.Options.Count(opt => opt.PollOptionVotes.Any(vote => vote.UserId == votingUserId)) > 1)
                {
                    throw new InvalidOperationException("Multiple voting is not allowed in current poll.");
                }
                context.Polls.Update(poll);
                await context.SaveChangesAsync().ConfigureAwait(false);

                return(PollConverter.GetPollDto(poll));
            }
        }