Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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)));
        }