public async Task IsUserBlacklisted() { var user = fillTestDbHelper.Users.FirstOrDefault(opt => opt.BlackList.Any()); Assert.True(await loadUsersService.IsUserBlacklisted(user.Id, user.BlackList.Select(opt => opt.BadUid))); Assert.False(await loadUsersService.IsUserBlacklisted(user.Id, new List <long> { 10 })); }
public async Task <ChannelVm> CreateChannelAsync(ChannelVm channel, long creatorId, IEnumerable <ChannelUserVm> subscribers) { ChannelUser channelUser = new ChannelUser { ChannelUserRole = ChannelUserRole.Creator, SubscribedTime = DateTime.UtcNow.ToUnixTime(), UserId = creatorId, Deleted = false }; if (subscribers != null && await loadUsersService.IsUserBlacklisted(creatorId, subscribers.Select(opt => opt.UserId)).ConfigureAwait(false)) { throw new UserBlockedException(); } List <ChannelUser> channelUsers = new List <ChannelUser>() { channelUser }; if (subscribers != null) { channelUsers.AddRange(ChannelConverter.GetChannelUsers(subscribers.Where(opt => opt.UserId != creatorId))); } List <UserVm> users = await loadUsersService.GetUsersByIdAsync(channelUsers.Select(opt => opt.UserId)).ConfigureAwait(false); if (users.Count() < channelUsers.Count()) { throw new UserNotFoundException(); } Channel newChannel = new Channel { ChannelId = channel.ChannelId.GetValueOrDefault(await poolsService.GetChannelIdAsync().ConfigureAwait(false)), About = channel.About, Deleted = false, ChannelName = channel.ChannelName, CreationTime = DateTime.UtcNow.ToUnixTime(), Photo = channel.Photo, Tag = string.IsNullOrWhiteSpace(channel.Tag) ? RandomExtensions.NextString(10, "QWERTYUIOPASDFGHJKLZXCVBNM1234567890") : channel.Tag, NodesId = users.Select(opt => opt.NodeId.GetValueOrDefault()).Distinct().ToArray() }; using (MessengerDbContext context = contextFactory.Create()) { newChannel.ChannelUsers = channelUsers; var entityEntry = await context.Channels.AddAsync(newChannel).ConfigureAwait(false); await context.SaveChangesAsync().ConfigureAwait(false); var createdChannel = ChannelConverter.GetChannel(entityEntry.Entity); createdChannel.SubscribersCount = newChannel.ChannelUsers.Count(); return(createdChannel); } }
public async Task <ChatVm> CreateChatAsync(ChatVm chatVm, long userId) { using (MessengerDbContext context = contextFactory.Create()) { List <ChatUser> chatUsers = new List <ChatUser>(); using (var transaction = await context.Database.BeginTransactionAsync().ConfigureAwait(false)) { if (chatVm.Users != null && await loadUsersService.IsUserBlacklisted(userId, chatVm.Users.Select(opt => opt.UserId)).ConfigureAwait(false)) { throw new UserBlockedException(); } Chat newChat = ChatConverter.GetChat(chatVm); newChat.Tag = RandomExtensions.NextString(10, "QWERTYUIOPASDFGHJKLZXCVBNM1234567890"); newChat.Id = await poolsService.GetChatIdAsync().ConfigureAwait(false); if (chatVm.Users != null) { chatUsers.AddRange(chatVm.Users.Where(opt => opt.UserId != userId).Select(chatUser => new ChatUser { Banned = chatUser.Banned.GetValueOrDefault(false), Deleted = chatUser.Deleted.GetValueOrDefault(false), Joined = DateTime.UtcNow.ToUnixTime(), UserId = chatUser.UserId, UserRole = chatUser.UserRole.GetValueOrDefault(UserRole.User), InviterId = userId })); } if (!chatUsers.Any(opt => opt.UserId == userId)) { chatUsers.Add(new ChatUser { Banned = false, Deleted = false, Joined = DateTime.UtcNow.ToUnixTime(), UserId = userId, UserRole = UserRole.Creator }); } newChat.ChatUsers = chatUsers; IEnumerable <UserVm> users = await loadUsersService.GetUsersByIdAsync(chatUsers.Select(chatUser => chatUser.UserId)).ConfigureAwait(false); IEnumerable <long> nodesId = users.Select(user => user.NodeId ?? 0).Distinct(); newChat.NodesId = nodesId.ToArray(); await context.Chats.AddAsync(newChat).ConfigureAwait(false); await context.SaveChangesAsync().ConfigureAwait(false); transaction.Commit(); newChat.ChatUsers = chatUsers; return(ChatConverter.GetChatVm(newChat)); } } }
public async Task <ChatVm> AddUsersToChatAsync(IEnumerable <long> usersId, long chatId, long userId) { using (MessengerDbContext context = contextFactory.Create()) { using (var transaction = await context.Database.BeginTransactionAsync().ConfigureAwait(false)) { Chat chat = await context.Chats.FirstOrDefaultAsync(opt => opt.Id == chatId).ConfigureAwait(false); if (chat == null) { throw new ConversationNotFoundException(chatId); } User requestingUser = await context.Users.FindAsync(userId).ConfigureAwait(false); if (requestingUser == null || requestingUser.Deleted) { throw new AddUserChatException(); } ChatUser chatUser = await context.ChatUsers .FirstOrDefaultAsync(opt => opt.ChatId == chatId && opt.UserId == userId).ConfigureAwait(false); List <ChatUserVm> addedUsers = new List <ChatUserVm>(); if (chat.Deleted) { throw new ConversationIsNotValidException(); } if (chatUser != null && chatUser.Banned) { throw new ChatUserBlockedException(); } if (usersId.Count() == 1 && usersId.FirstOrDefault() == userId) { if (chat.Type == (int)ChatType.Private) { throw new AddUserChatException(); } if (chatUser == null) { chatUser = ChatUserConverter.GetNewChatUser(chatId, userId, null); await context.AddAsync(chatUser).ConfigureAwait(false); } else if (chatUser.Deleted) { chatUser.Deleted = false; chatUser.User = requestingUser; context.Update(chatUser); } if (!chat.NodesId.Contains(NodeSettings.Configs.Node.Id)) { createMessagesService.DownloadMessageHistoryAsync(chat.NodesId.FirstOrDefault(), chat.Id, ConversationType.Chat, null, false); } chat.NodesId = chat.NodesId.Append(requestingUser.NodeId.Value).Distinct().ToArray(); addedUsers.Add(ChatUserConverter.GetChatUserVm(chatUser)); } else { if ((chatUser?.Deleted).GetValueOrDefault(true)) { throw new AddUserChatException(); } if (await loadUsersService.IsUserBlacklisted(userId, usersId).ConfigureAwait(false)) { throw new UserBlockedException(); } ExpressionStarter <User> usersCondition = PredicateBuilder.New <User>(); usersCondition = usersId.Aggregate(usersCondition, (current, value) => current.Or(opt => opt.Id == value).Expand()); List <User> existingUsers = await context.Users .AsNoTracking() .Where(usersCondition) .ToListAsync() .ConfigureAwait(false); ExpressionStarter <ChatUser> chatUsersCondition = PredicateBuilder.New <ChatUser>(); chatUsersCondition = existingUsers.Select(opt => opt.Id).Aggregate(chatUsersCondition, (current, value) => current.Or(opt => opt.UserId == value && opt.ChatId == chatId).Expand()); List <ChatUser> validChatUsers = await context.ChatUsers .Where(chatUsersCondition) .Include(opt => opt.User) .ToListAsync() .ConfigureAwait(false); foreach (ChatUser user in validChatUsers) { if (!user.Banned && user.Deleted) { user.Deleted = false; addedUsers.Add(ChatUserConverter.GetChatUserVm(user)); } } context.UpdateRange(validChatUsers); List <long> newChatUsersId = existingUsers.Select(opt => opt.Id).Except(validChatUsers.Select(opt => opt.UserId)).ToList(); List <ChatUser> newChatUsers = newChatUsersId.Select(id => ChatUserConverter.GetNewChatUser(chatId, id, userId)).ToList(); chat.NodesId = chat.NodesId?.Concat(existingUsers.Select(opt => opt.NodeId.GetValueOrDefault())).Distinct().ToArray() ?? existingUsers.Select(opt => opt.NodeId.GetValueOrDefault()).Distinct().ToArray(); await context.ChatUsers .AddRangeAsync(newChatUsers) .ConfigureAwait(false); /* foreach (ChatUser user in newChatUsers) * { * user.User = existingUsers.FirstOrDefault(opt => opt.Id == user.UserId); * }*/ addedUsers.AddRange(ChatUserConverter.GetChatUsersVm(newChatUsers)); } context.Update(chat); transaction.Commit(); await context.SaveChangesAsync() .ConfigureAwait(false); ChatVm resultChat = ChatConverter.GetChatVm(chat); resultChat.Users = addedUsers; return(resultChat); } } }