public async Task HandleAsync() { try { var chatUsers = await updateChatsService.EditChatUsersAsync(notice.ChatUsers, notice.ChatId, notice.RequestedUserId).ConfigureAwait(false); var bannedUsers = chatUsers.Where(opt => opt.Banned == true); if (!bannedUsers.IsNullOrEmpty()) { foreach (var user in bannedUsers) { var systemMessageInfo = SystemMessageInfoFactory.CreateUserBannedMessageInfo(user.UserId); var message = await systemMessagesService.CreateMessageAsync(ConversationType.Chat, user.ChatId.Value, systemMessageInfo); conversationsNoticeService.SendSystemMessageNoticeAsync(message); } } var deletedUsers = chatUsers.Where(opt => opt.Deleted == true); if (!deletedUsers.IsNullOrEmpty()) { foreach (var user in deletedUsers) { var systemMessageInfo = SystemMessageInfoFactory.CreateUserRemovedMessageInfo(user.UserId); var message = await systemMessagesService.CreateMessageAsync(ConversationType.Chat, user.ChatId.Value, systemMessageInfo); conversationsNoticeService.SendSystemMessageNoticeAsync(message); } } } catch (UserIsNotInConversationException) { ChatVm newChat = await nodeRequestSender.GetFullChatInformationAsync(notice.ChatId, node).ConfigureAwait(false); await crossNodeService.NewOrEditChatAsync(newChat).ConfigureAwait(false); } catch (ConversationNotFoundException ex) { ChatVm newChat = await nodeRequestSender.GetFullChatInformationAsync(ex.ConversationId, node).ConfigureAwait(false); await crossNodeService.NewOrEditChatAsync(newChat).ConfigureAwait(false); } conversationsNoticeService.SendChangeChatUsersNoticeAsync(notice.ChatUsers, notice.ChatId); ChatVm chat = await loadChatsService.GetChatByIdAsync(notice.ChatId).ConfigureAwait(false); BlockSegmentVm segment = await BlockSegmentsService.Instance.CreateChangeUsersChatSegmetAsync( notice.ChatUsers, notice.ChatId, notice.RequestedUserId, node.Node.Id, chat.Type, NodeData.Instance.NodeKeys.SignPrivateKey, NodeData.Instance.NodeKeys.SymmetricKey, NodeData.Instance.NodeKeys.Password, NodeData.Instance.NodeKeys.KeyId).ConfigureAwait(false); BlockGenerationHelper.Instance.AddSegment(segment); }
public async Task EditChatUsers() { var chat = fillTestDbHelper.Chats.LastOrDefault(); var chatUsers = chat.ChatUsers.ToList(); var exptectedUsers = chatUsers.Select(opt => { if (opt.UserRole <= UserRole.Moderator) { return(new ChatUserVm { Banned = true, Deleted = true, UserRole = UserRole.Moderator, UserId = opt.UserId, ChatId = opt.ChatId, IsMuted = opt.IsMuted, InviterId = opt.InviterId, Joined = opt.Joined }); } else { return(new ChatUserVm { Banned = opt.Banned, Deleted = opt.Deleted, ChatId = opt.ChatId, UserId = opt.UserId, UserRole = opt.UserRole, IsMuted = opt.IsMuted, InviterId = opt.InviterId, Joined = opt.Joined }); } }); var actualUsers = await updateChatsService.EditChatUsersAsync(exptectedUsers, chat.Id, chat.ChatUsers.FirstOrDefault(opt => opt.UserRole >= UserRole.Admin).UserId); Assert.Equal( ObjectSerializer.ObjectToJson(exptectedUsers.OrderBy(opt => opt.UserId)), ObjectSerializer.ObjectToJson(actualUsers.OrderBy(opt => opt.UserId))); }
public async Task <Response> CreateResponseAsync() { try { List <ChatUserVm> chatUsers = await updateChatsService.EditChatUsersAsync( request.ChatUsers, request.ChatId, clientConnection.UserId.GetValueOrDefault()).ConfigureAwait(false); var bannedUsers = chatUsers.Where(opt => opt.Banned == true); if (!bannedUsers.IsNullOrEmpty()) { foreach (var user in bannedUsers) { var systemMessageInfo = SystemMessageInfoFactory.CreateUserBannedMessageInfo(user.UserId); var message = await systemMessagesService.CreateMessageAsync(ConversationType.Chat, user.ChatId.Value, systemMessageInfo); conversationsNoticeService.SendSystemMessageNoticeAsync(message); } } var deletedUsers = chatUsers.Where(opt => opt.Deleted == true); if (!deletedUsers.IsNullOrEmpty()) { foreach (var user in deletedUsers) { var systemMessageInfo = SystemMessageInfoFactory.CreateUserRemovedMessageInfo(user.UserId); var message = await systemMessagesService.CreateMessageAsync(ConversationType.Chat, user.ChatId.Value, systemMessageInfo); conversationsNoticeService.SendSystemMessageNoticeAsync(message); } } ChatVm chat = await loadChatsService.GetChatByIdAsync(request.ChatId).ConfigureAwait(false); BlockSegmentVm segment = await BlockSegmentsService.Instance.CreateChangeUsersChatSegmetAsync( chatUsers, request.ChatId, clientConnection.UserId.GetValueOrDefault(), NodeSettings.Configs.Node.Id, chat.Type, NodeData.Instance.NodeKeys.SignPrivateKey, NodeData.Instance.NodeKeys.SymmetricKey, NodeData.Instance.NodeKeys.Password, NodeData.Instance.NodeKeys.KeyId) .ConfigureAwait(false); BlockGenerationHelper.Instance.AddSegment(segment); nodeNoticeService.SendBlockSegmentsNodeNoticeAsync(new List <BlockSegmentVm> { segment }); conversationsNoticeService.SendChangeChatUsersNoticeAsync(chatUsers, request.ChatId, clientConnection); nodeNoticeService.SendChangeChatUsersNodeNoticeAsync(chatUsers.ToList(), request.ChatId, clientConnection.UserId.GetValueOrDefault(), chat); UsersConversationsCacheService.Instance.UpdateUsersChatsAsync(chatUsers.Select(opt => opt.UserId)); return(new ChatUsersResponse(request.RequestId, chatUsers)); } catch (ChatUserBlockedException ex) { Logger.WriteLog(ex, request); return(new ResultResponse(request.RequestId, "User blocked in chat.", ErrorCode.UserBlocked)); } catch (UserIsNotInConversationException ex) { Logger.WriteLog(ex, request); return(new ResultResponse(request.RequestId, "User is not in chat.", ErrorCode.UserIsNotInChat)); } catch (EditConversationUsersException ex) { Logger.WriteLog(ex, request); return(new ResultResponse(request.RequestId, "User does not access to the chat.", ErrorCode.PermissionDenied)); } catch (ConversationNotFoundException ex) { Logger.WriteLog(ex); return(new ResultResponse(request.RequestId, "Chat not found.", ErrorCode.ObjectDoesNotExists)); } }