Esempio n. 1
0
 public ChatUser(ChatUserVm chatUser)
 {
     UserId   = chatUser.UserId;
     ChatId   = chatUser.ChatId ?? 0;
     UserRole = chatUser.UserRole ?? UserRole;
     Deleted  = chatUser.Deleted ?? Deleted;
     Banned   = chatUser.Banned ?? Banned;
 }
Esempio n. 2
0
 private static ChatUser GetChatUser(ChatUserVm chatUser)
 {
     return(chatUser == null
         ? null
         : new ChatUser
     {
         Banned = chatUser.Banned ?? false,
         Deleted = chatUser.Deleted ?? false,
         ChatId = chatUser.ChatId ?? 0,
         UserId = chatUser.UserId,
         UserRole = chatUser.UserRole ?? UserRole.User,
         InviterId = chatUser.InviterId,
         Joined = chatUser.Joined,
         IsMuted = chatUser.IsMuted.GetValueOrDefault()
     });
 }
Esempio n. 3
0
        public async Task <List <ChatUserVm> > EditChatUsersAsync(IEnumerable <ChatUserVm> users, long chatId, long userId)
        {
            using (MessengerDbContext context = contextFactory.Create())
            {
                ExpressionStarter <ChatUser> usersCondition = PredicateBuilder.New <ChatUser>();
                usersCondition = users.Select(chatUser => chatUser.UserId).Aggregate(usersCondition,
                                                                                     (current, value) => current.Or(chatUser => chatUser.UserId == value).Expand());
                Chat currentChat = await context.Chats.FindAsync(chatId).ConfigureAwait(false);

                if (currentChat == null || currentChat.Deleted)
                {
                    throw new ConversationNotFoundException();
                }
                List <ChatUser> chatUsers = await context.ChatUsers
                                            .Where(usersCondition)
                                            .Where(chatUser => chatUser.ChatId == chatId)
                                            .ToListAsync()
                                            .ConfigureAwait(false);

                List <ChatUserVm> editedChatUsers = new List <ChatUserVm>();
                ChatUser          requestUser     = await context.ChatUsers
                                                    .FirstOrDefaultAsync(opt => opt.UserId == userId && opt.ChatId == chatId).ConfigureAwait(false);

                if (requestUser != null && requestUser.Banned)
                {
                    throw new ChatUserBlockedException();
                }
                if (requestUser == null || !chatUsers.Any())
                {
                    throw new UserIsNotInConversationException();
                }
                foreach (ChatUser user in chatUsers)
                {
                    ChatUserVm changedChatUser = users.FirstOrDefault(chatUser => user.UserId == chatUser.UserId);
                    if (changedChatUser != null)
                    {
                        if (requestUser.UserRole > changedChatUser.UserRole &&
                            requestUser.UserRole > user.UserRole &&
                            changedChatUser.UserRole < UserRole.Creator)
                        {
                            user.UserRole = changedChatUser.UserRole ?? user.UserRole;
                            user.Deleted  = changedChatUser.Deleted ?? user.Deleted;
                            user.Banned   = changedChatUser.Banned ?? user.Banned;
                            editedChatUsers.Add(ChatUserConverter.GetChatUserVm(user));
                        }
                        else if (requestUser.UserId == changedChatUser.UserId)
                        {
                            user.Deleted = changedChatUser.Deleted ?? user.Deleted;
                            editedChatUsers.Add(ChatUserConverter.GetChatUserVm(user));
                        }
                        else
                        {
                            throw new EditConversationUsersException();
                        }
                    }
                }
                if (users.Any(opt => opt.Deleted.GetValueOrDefault() || opt.Banned.GetValueOrDefault()))
                {
                    var query = from chat in context.Chats
                                join chatUser in context.ChatUsers on chat.Id equals chatUser.ChatId
                                join user in context.Users on chatUser.UserId equals user.Id
                                where chat.Id == chatId && !chatUser.Banned && !chatUser.Deleted
                                select user.NodeId;
                    var chatNodesId = (await query.ToListAsync().ConfigureAwait(false)).Distinct();
                    currentChat.NodesId = chatNodesId.Select(id => id.GetValueOrDefault()).ToArray();
                }
                await context.SaveChangesAsync().ConfigureAwait(false);

                return(editedChatUsers);
            }
        }