예제 #1
0
        /// <summary>
        ///     This version of the call requests hourly chunks
        /// </summary>
        /// <param name="alertFilter"></param>
        /// <param name="chunkSize"></param>
        public async Task <List <Alert> > GetRestAlertsWithV84Bug(AlertFilter alertFilter, TimeSpan chunkSize)
        {
            var originalStartEpochIsAfter  = alertFilter.StartEpochIsAfter;
            var originalStartEpochIsBefore = alertFilter.StartEpochIsBefore;
            var utcNow = DateTime.UtcNow;

            if (alertFilter.StartEpochIsAfter == null)
            {
                alertFilter.StartEpochIsAfter = utcNow.AddYears(-1).SecondsSinceTheEpoch();
            }
            if (alertFilter.StartEpochIsBefore == null)
            {
                alertFilter.StartEpochIsBefore = utcNow.SecondsSinceTheEpoch();
            }
            var allAlerts = new ConcurrentBag <Alert>();

            var alertFilterList = ((long)alertFilter.StartEpochIsAfter).ToDateTimeUtc()
                                  .GetChunkedTimeRangeList(((long)alertFilter.StartEpochIsBefore).ToDateTimeUtc(), chunkSize)
                                  .Select(t =>
            {
                var newAlertFilter = alertFilter.Clone();
                newAlertFilter.ResetSearch();
                newAlertFilter.StartEpochIsAfter  = t.Item1.SecondsSinceTheEpoch() - 1;                        // Take one off to include anything raised on that exact second
                newAlertFilter.StartEpochIsBefore = t.Item2.SecondsSinceTheEpoch();
                return(newAlertFilter);
            });
            await Task.WhenAll(alertFilterList.Select(async individualAlertFilter =>
            {
                foreach (var alert in await GetRestAlertsWithoutV84BugAsync(individualAlertFilter).ConfigureAwait(false))
                {
                    allAlerts.Add(alert);
                }
            })).ConfigureAwait(false);

            alertFilter.StartEpochIsAfter  = originalStartEpochIsAfter;
            alertFilter.StartEpochIsBefore = originalStartEpochIsBefore;

            return(allAlerts.DistinctBy(a => a.Id).Take(alertFilter.Take ?? int.MaxValue).ToList());
        }
예제 #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)));
        }