public ChatUser(ChatUserVm chatUser) { UserId = chatUser.UserId; ChatId = chatUser.ChatId ?? 0; UserRole = chatUser.UserRole ?? UserRole; Deleted = chatUser.Deleted ?? Deleted; Banned = chatUser.Banned ?? Banned; }
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() }); }
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); } }