public async Task HandleAsync() { try { List <UserVm> users = null; List <ChatVm> chats = null; List <ChannelVm> channels = null; foreach (var searchType in request.SearchTypes) { switch (searchType) { case SearchType.Users: users = await loadUsersService.FindUsersByStringQueryAsync(request.SearchQuery, request.NavigationId, request.Direction).ConfigureAwait(false); break; case SearchType.Chats: chats = await loadChatsService.FindChatsByStringQueryAsync(request.SearchQuery, request.NavigationId, request.Direction, request.RequestorId).ConfigureAwait(false); break; case SearchType.Channels: channels = await loadChannelsService.FindChannelsByStringQueryAsync(request.SearchQuery, request.NavigationId, request.Direction).ConfigureAwait(false); break; default: continue; } } SearchNodeResponse response = new SearchNodeResponse( request.RequestId, privacyService.ApplyPrivacySettings(users, request.SearchQuery, request.RequestorId), channels, chats); NodeWebSocketCommunicationManager.SendResponse(response, current); } catch (Exception ex) { Logger.WriteLog(ex); NodeWebSocketCommunicationManager.SendResponse(new ResultNodeResponse(request.RequestId, ErrorCode.UnknownError, ex.ToString()), current); } }
public async Task <Response> CreateResponseAsync() { ConcurrentBag <UserVm> foundUsers = new ConcurrentBag <UserVm>(); ConcurrentBag <ChannelVm> foundChannels = new ConcurrentBag <ChannelVm>(); ConcurrentBag <ChatVm> foundChats = new ConcurrentBag <ChatVm>(); var nodesInfo = await nodesService.GetAllNodesInfoAsync().ConfigureAwait(false); List <Task> searchTasks = new List <Task>(); foreach (var node in nodesInfo) { Task task = Task.Run(async() => { var nodeConnection = connectionsService.GetNodeConnection(node.Id); if (nodeConnection != null) { SearchNodeResponse searchNodeResponse = await nodeRequestSender.GetSearchResponseAsync( request.SearchQuery, request.NavigationId, request.Direction, request.SearchTypes, clientConnection.UserId, nodeConnection).ConfigureAwait(false); if (searchNodeResponse?.Users != null) { foundUsers.AddRange(searchNodeResponse.Users); } if (searchNodeResponse?.Chats != null) { foundChats.AddRange(searchNodeResponse.Chats); } if (searchNodeResponse?.Channels != null) { foundChannels.AddRange(searchNodeResponse.Channels); } await MetricsHelper.Instance.SetCrossNodeApiInvolvedAsync(request.RequestId).ConfigureAwait(false); } else if (NodeSettings.Configs.Node.Id == node.Id) { foreach (var searchType in request.SearchTypes.Distinct()) { switch (searchType) { case SearchType.Users: { List <UserVm> users = await loadUsersService.FindUsersByStringQueryAsync( request.SearchQuery, request.NavigationId.GetValueOrDefault(), request.Direction.GetValueOrDefault(true)).ConfigureAwait(false); foundUsers.AddRange(privacyService.ApplyPrivacySettings(users, request.SearchQuery, clientConnection.UserId)); } break; case SearchType.Chats: { List <ChatVm> chats = await loadChatsService.FindChatsByStringQueryAsync( request.SearchQuery, request.NavigationId.GetValueOrDefault(), request.Direction.GetValueOrDefault(true), clientConnection.UserId).ConfigureAwait(false); foundChats.AddRange(chats); } break; case SearchType.Channels: { List <ChannelVm> channels = await loadChannelsService.FindChannelsByStringQueryAsync( request.SearchQuery, request.NavigationId.GetValueOrDefault(), request.Direction.GetValueOrDefault(true)).ConfigureAwait(false); foundChannels.AddRange(channels); } break; default: continue; } } } }); searchTasks.Add(task); } await Task.WhenAll(searchTasks).ConfigureAwait(false); foundChats = new ConcurrentBag <ChatVm>(foundChats.DistinctBy(opt => opt.Id)); foundChannels = new ConcurrentBag <ChannelVm>(foundChannels.DistinctBy(opt => opt.ChannelId)); return(new SearchResponse(request.RequestId, request.Direction.GetValueOrDefault(true) ? foundUsers.OrderBy(opt => opt.Id) : foundUsers.OrderByDescending(opt => opt.Id), request.Direction.GetValueOrDefault(true) ? foundChats.OrderBy(opt => opt.Id) : foundChats.OrderByDescending(opt => opt.Id), request.Direction.GetValueOrDefault(true) ? foundChannels.OrderBy(opt => opt.ChannelId) : foundChannels.OrderByDescending(opt => opt.ChannelId))); }