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 AddChatUsersAsync(IEnumerable <ChatUserVm> chatUsers) { try { var newChatUsers = ChatUserConverter.GetChatUsers(chatUsers); using (MessengerDbContext context = contextFactory.Create()) { await context.ChatUsers.AddRangeAsync(newChatUsers).ConfigureAwait(false); await context.SaveChangesAsync().ConfigureAwait(false); } } catch (Exception ex) { Logger.WriteLog(ex); } }
private async Task HandleChangeUsersChatSegmentAsync(BlockSegmentVm segment) { using (MessengerDbContext _context = CreateContext()) { using (var transaction = await _context.Database.BeginTransactionAsync().ConfigureAwait(false)) { try { if (TryDecryptPrivateData <ChangeUsersChatBlockData>(segment, out var blockData)) { var usersCondition = PredicateBuilder.New <ChatUser>(); usersCondition = blockData.ChatUsers.Aggregate(usersCondition, (current, value) => current.Or(chatUser => chatUser.UserId == value.UserId && chatUser.ChatId == blockData.ChatId).Expand()); var existingChatUsers = await _context.ChatUsers.Where(usersCondition).ToListAsync().ConfigureAwait(false); var nonExistingChatUsers = blockData.ChatUsers .Where(chatUser => !existingChatUsers.Any(opt => chatUser.UserId == opt.UserId)).ToList(); if (nonExistingChatUsers.Any()) { await _context.ChatUsers.AddRangeAsync(ChatUserConverter.GetChatUsers(nonExistingChatUsers)).ConfigureAwait(false); } var updatedChatUsersVm = blockData.ChatUsers.Where(chatUser => existingChatUsers.Any(opt => opt.UserId == chatUser.UserId)); if (updatedChatUsersVm.Any()) { var updatedChatUsers = ChatUserConverter.GetChatUsers(updatedChatUsersVm); _context.ChatUsers.AttachRange(updatedChatUsers); _context.ChatUsers.UpdateRange(updatedChatUsers); } await _context.SaveChangesAsync().ConfigureAwait(false); transaction.Commit(); } } catch (Exception ex) { AddErrorMessage(nameof(HandleChangeUsersChatSegmentAsync), ex.ToString()); transaction.Rollback(); } } } }