private async Task HandleEditChatBlockSegmentAsync(BlockSegmentVm segment) { using (MessengerDbContext _context = CreateContext()) { using (var transaction = await _context.Database.BeginTransactionAsync().ConfigureAwait(false)) { try { EditChatBlockData blockData = (EditChatBlockData)segment.PublicData; var editedChat = await _context.Chats.FirstOrDefaultAsync(chat => chat.Id == blockData.Chat.Id).ConfigureAwait(false); if (editedChat != null) { editedChat = ChatConverter.GetChat(editedChat, ChatConverter.GetChatDto(blockData.Chat)); _context.Chats.Update(editedChat); await _context.SaveChangesAsync().ConfigureAwait(false); transaction.Commit(); } } catch (Exception ex) { AddErrorMessage(nameof(HandleEditChatBlockSegmentAsync), ex.ToString()); transaction.Rollback(); } } } }
public async Task <ChatVm> EditChatAsync(EditChatVm editChat, long userId) { using (MessengerDbContext context = contextFactory.Create()) { IQueryable <Chat> query = from chat in context.Chats join chatUser in context.ChatUsers on chat.Id equals chatUser.ChatId join chatUsers in context.ChatUsers on chat.Id equals chatUsers.ChatId where chat.Id == editChat.Id && chatUser.UserId == userId && chatUser.UserRole >= UserRole.Admin && chat.Deleted == false && chatUser.Banned == false && chatUser.Deleted == false && chatUsers.Banned == false && chatUsers.Deleted == false select chat; Chat targetChat = await query .FirstOrDefaultAsync() .ConfigureAwait(false); if (targetChat != null) { targetChat = ChatConverter.GetChat(targetChat, editChat); await context.SaveChangesAsync().ConfigureAwait(false); return(ChatConverter.GetChatVm(targetChat)); } throw new PermissionDeniedException(); } }
private async Task HandleNewChatBlockSegmentAsync(BlockSegmentVm segment) { using (MessengerDbContext _context = CreateContext()) { using (var transaction = await _context.Database.BeginTransactionAsync().ConfigureAwait(false)) { try { NewChatBlockData newChatBlockData = (NewChatBlockData)segment.PublicData; if (!await _context.Chats.AnyAsync(chat => chat.Id == newChatBlockData.Chat.Id).ConfigureAwait(false)) { Chat newChat = ChatConverter.GetChat(newChatBlockData.Chat); await _context.Chats.AddAsync(newChat).ConfigureAwait(false); await _context.SaveChangesAsync().ConfigureAwait(false); transaction.Commit(); } } catch (Exception ex) { AddErrorMessage(nameof(HandleNewChatBlockSegmentAsync), ex.ToString()); transaction.Rollback(); } } } }
public async Task <ChatVm> NewOrEditChatAsync(ChatVm targetChat) { if (targetChat == null) { return(null); } try { using (MessengerDbContext context = contextFactory.Create()) { var query = from chat in context.Chats where chat.Id == targetChat.Id select chat; Chat editableChat = await query.Include(opt => opt.ChatUsers).FirstOrDefaultAsync().ConfigureAwait(false); if (editableChat == null) { editableChat = ChatConverter.GetChat(targetChat); if (targetChat.Users != null) { editableChat.ChatUsers = ChatUserConverter.GetChatUsers(targetChat.Users).ToList(); } await context.AddAsync(editableChat).ConfigureAwait(false); } else { editableChat = ChatConverter.GetChat(editableChat, new EditChatVm { About = targetChat.About, Name = targetChat.Name, Photo = targetChat.Photo, Public = targetChat.Public, Security = targetChat.Security, Visible = targetChat.Visible }); if (!targetChat.Users.IsNullOrEmpty()) { editableChat.ChatUsers = ChatUserConverter.GetChatUsers(targetChat.Users); } context.Update(editableChat); } await context.SaveChangesAsync().ConfigureAwait(false); return(ChatConverter.GetChatVm(editableChat)); } } catch (DbUpdateException ex) { Logger.WriteLog(ex); return(targetChat); } catch (Exception ex) { Logger.WriteLog(ex); return(null); } }
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)); } } }
private async Task HandlePrivateChatSegmentAsync(BlockSegmentVm segment) { using (MessengerDbContext _context = CreateContext()) { using (var transaction = await _context.Database.BeginTransactionAsync().ConfigureAwait(false)) { try { bool chatExists = !await _context.Chats.AnyAsync(chat => chat.Id == segment.SegmentHeader.ObjectId).ConfigureAwait(false); if (TryDecryptPrivateData <PrivateChatPrivateData>(segment, out var privateData)) { Chat newChat = ChatConverter.GetChat(privateData.Chat); if (!chatExists) { await _context.Chats.AddAsync(newChat).ConfigureAwait(false); } else { _context.Chats.Attach(newChat); _context.Chats.Update(newChat); } } else { if (!chatExists) { Chat emptyChat = new Chat { Id = segment.SegmentHeader.ObjectId, Type = (short)ChatType.Private, Name = "Restored-private-chat" }; await _context.Chats.AddAsync(emptyChat).ConfigureAwait(false); } } await _context.SaveChangesAsync().ConfigureAwait(false); transaction.Commit(); } catch (Exception ex) { AddErrorMessage(nameof(HandlePrivateChatSegmentAsync), ex.ToString()); transaction.Rollback(); } } } }
public async Task <List <ChatDto> > CreateOrUpdateUserChatsAsync(List <ChatDto> userChats) { using (MessengerDbContext context = contextFactory.Create()) { var chatsCondition = PredicateBuilder.New <Chat>(); chatsCondition = userChats.Aggregate(chatsCondition, (current, value) => current.Or(opt => opt.Id == value.Id).Expand()); List <ChatDto> resultChats = new List <ChatDto>(); List <Chat> existingChats = await context.Chats .Where(chatsCondition) .ToListAsync() .ConfigureAwait(false); if (existingChats.Any()) { for (int i = 0; i < existingChats.Count; i++) { var editedChat = userChats.FirstOrDefault(opt => opt.Id == existingChats[i].Id); editedChat.ChatUsers = null; existingChats[i] = ChatConverter.GetChat(existingChats[i], editedChat); } context.Chats.UpdateRange(existingChats); await context.SaveChangesAsync().ConfigureAwait(false); resultChats.AddRange(ChatConverter.GetChatsDto(existingChats)); } List <ChatDto> nonExistingChats = userChats.Where(chat => !existingChats.Any(opt => opt.Id == chat.Id))?.ToList(); if (nonExistingChats != null && nonExistingChats.Any()) { List <Chat> newChats = nonExistingChats.Select(chat => ChatConverter.GetChat(null, chat))?.ToList(); await context.Chats.AddRangeAsync(newChats).ConfigureAwait(false); await context.SaveChangesAsync().ConfigureAwait(false); resultChats.AddRange(ChatConverter.GetChatsDto(newChats)); } return(resultChats); } }