protected async Task <ActionResult <CountResult> > GetCountImplAsync(AppFilter sf, TimeInfo ti, string filter = null, string aggregations = null)
        {
            var pr = await _validator.ValidateQueryAsync(filter);

            if (!pr.IsValid)
            {
                return(BadRequest(pr.Message));
            }

            var far = await _validator.ValidateAggregationsAsync(aggregations);

            if (!far.IsValid)
            {
                return(BadRequest(far.Message));
            }

            sf.UsesPremiumFeatures = pr.UsesPremiumFeatures || far.UsesPremiumFeatures;
            var query = new RepositoryQuery <TModel>()
                        .AppFilter(ShouldApplySystemFilter(sf, filter) ? sf : null)
                        .DateRange(ti.Range.UtcStart, ti.Range.UtcEnd, ti.Field)
                        .Index(ti.Range.UtcStart, ti.Range.UtcEnd);

            CountResult result;

            try {
                result = await _repository.CountAsync(q => q.SystemFilter(query).FilterExpression(filter).AggregationsExpression(aggregations));
            } catch (Exception ex) {
                using (_logger.BeginScope(new ExceptionlessState().Property("Search Filter", new { SystemFilter = sf, UserFilter = filter, Time = ti, Aggregations = aggregations }).Tag("Search").Identity(CurrentUser.EmailAddress).Property("User", CurrentUser).SetHttpContext(HttpContext)))
                    _logger.LogError(ex, "An error has occurred. Please check your filter or aggregations.");

                return(BadRequest("An error has occurred. Please check your search filter."));
            }

            return(Ok(result));
        }
    public async Task <ActionResult <IReadOnlyCollection <Stack> > > GetByProjectAsync(string projectId = null, string filter = null, string sort = null, string time = null, string offset = null, string mode = null, int page = 1, int limit = 10)
    {
        var project = await GetProjectAsync(projectId);

        if (project == null)
        {
            return(NotFound());
        }

        var organization = await GetOrganizationAsync(project.OrganizationId);

        if (organization == null)
        {
            return(NotFound());
        }

        if (organization.IsSuspended)
        {
            return(PlanLimitReached("Unable to view stack occurrences for the suspended organization."));
        }

        var ti = GetTimeInfo(time, offset, organization.GetRetentionUtcCutoff(project, _options.MaximumRetentionDays));
        var sf = new AppFilter(project, organization);

        return(await GetInternalAsync(sf, ti, filter, sort, mode, page, limit));
    }
        public VictimView GetListOfVictimsProfile(AppFilter filterApp)
        {
            var victimList = _unitOfWork.victimProfileRepository.Find(c => c.VictimStatus == true)
                             .Where(c => filterApp.filters.rules[0].Data == "" ||
                                    c.LastName.Trim().Contains(filterApp.filters.rules[0].Data.Trim()) ||
                                    c.LastName.Trim().Contains(filterApp.filters.rules[0].Data.Trim()));

            if (victimList.Count() > 0)
            {
                var victims = victimList
                              .OrderBy(c => filterApp.sidx)
                              .Skip((filterApp.page - 1) * filterApp.rows)
                              .Take(filterApp.rows)
                              .ToList();


                var victimsView = new VictimView()
                {
                    Data    = Mapper.Map <List <VictimProfile>, List <VictimViewModel> >(victims),
                    Records = victimList.Count(),
                };
                return(victimsView);
            }

            return(new VictimView());
        }
        public async Task <ActionResult <IReadOnlyCollection <ViewProject> > > GetAsync(string filter = null, string sort = null, int page = 1, int limit = 10, string mode = null)
        {
            var organizations = await GetSelectedOrganizationsAsync(_organizationRepository, _projectRepository, _stackRepository, filter);

            if (organizations.Count == 0)
            {
                return(Ok(EmptyModels));
            }

            page  = GetPage(page);
            limit = GetLimit(limit, 1000);

            var sf = new AppFilter(organizations)
            {
                IsUserOrganizationsFilter = true
            };
            var projects = await _repository.GetByFilterAsync(sf, filter, sort, o => o.PageNumber(page).PageLimit(limit));

            var viewProjects = await MapCollectionAsync <ViewProject>(projects.Documents, true);

            if (!String.IsNullOrEmpty(mode) && String.Equals(mode, "stats", StringComparison.OrdinalIgnoreCase))
            {
                return(OkWithResourceLinks(await PopulateProjectStatsAsync(viewProjects.ToList()), projects.HasMore && !NextPageExceedsSkipLimit(page, limit), page, projects.Total));
            }

            return(OkWithResourceLinks(viewProjects, projects.HasMore && !NextPageExceedsSkipLimit(page, limit), page, projects.Total));
        }
        private async Task <string> GetNextEventIdAsync(PersistentEvent ev, AppFilter systemFilter = null, string userFilter = null, DateTime?utcStart = null, DateTime?utcEnd = null)
        {
            if (ev == null)
            {
                return(null);
            }

            if (!utcStart.HasValue || utcStart.Value.IsBefore(ev.Date.UtcDateTime))
            {
                utcStart = ev.Date.UtcDateTime;
            }

            if (!utcEnd.HasValue || utcEnd.Value.IsAfter(SystemClock.UtcNow))
            {
                utcEnd = SystemClock.UtcNow;
            }

            var utcEventDate = ev.Date.UtcDateTime;

            // utcEnd is before the current event date.
            if (utcStart > utcEventDate || utcEnd < utcEventDate)
            {
                return(null);
            }

            if (String.IsNullOrEmpty(userFilter))
            {
                userFilter = String.Concat(EventIndex.Alias.StackId, ":", ev.StackId);
            }

            var results = await FindAsync(q => q
                                          .DateRange(utcEventDate, utcEnd, (PersistentEvent e) => e.Date)
                                          .Index(utcEventDate, utcEnd)
                                          .SortAscending(e => e.Date)
                                          .Include(e => e.Id, e => e.Date)
                                          .AppFilter(systemFilter)
                                          .ElasticFilter(!Query <PersistentEvent> .Ids(ids => ids.Values(ev.Id)))
                                          .FilterExpression(userFilter), o => o.PageLimit(10)).AnyContext();

            if (results.Total == 0)
            {
                return(null);
            }

            // make sure we don't have records with the exact same occurrence date
            if (results.Documents.All(t => t.Date != ev.Date))
            {
                return(results.Documents.OrderBy(t => t.Date).ThenBy(t => t.Id).First().Id);
            }

            // we have records with the exact same occurrence date, we need to figure out the order of those
            // put our target error into the mix, sort it and return the result after the target
            var unionResults = results.Documents.Union(new[] { ev })
                               .OrderBy(t => t.Date.Ticks).ThenBy(t => t.Id)
                               .ToList();

            int index = unionResults.FindIndex(t => t.Id == ev.Id);

            return(index == unionResults.Count - 1 ? null : unionResults[index + 1].Id);
        }
Beispiel #6
0
        private async Task <List <ViewOrganization> > PopulateOrganizationStatsAsync(List <ViewOrganization> viewOrganizations)
        {
            if (viewOrganizations.Count <= 0)
            {
                return(viewOrganizations);
            }

            int maximumRetentionDays = _options.MaximumRetentionDays;
            var organizations        = viewOrganizations.Select(o => new Organization {
                Id = o.Id, CreatedUtc = o.CreatedUtc, RetentionDays = o.RetentionDays
            }).ToList();
            var sf           = new AppFilter(organizations);
            var systemFilter = new RepositoryQuery <PersistentEvent>().AppFilter(sf).DateRange(organizations.GetRetentionUtcCutoff(maximumRetentionDays), SystemClock.UtcNow, (PersistentEvent e) => e.Date).Index(organizations.GetRetentionUtcCutoff(maximumRetentionDays), SystemClock.UtcNow);
            var result       = await _eventRepository.CountAsync(q => q.SystemFilter(systemFilter).AggregationsExpression($"terms:(organization_id~{viewOrganizations.Count} cardinality:stack_id)"));

            foreach (var organization in viewOrganizations)
            {
                var organizationStats = result.Aggregations.Terms <string>("terms_organization_id")?.Buckets.FirstOrDefault(t => t.Key == organization.Id);
                organization.EventCount   = organizationStats?.Total ?? 0;
                organization.StackCount   = (long?)organizationStats?.Aggregations.Cardinality("cardinality_stack_id")?.Value ?? 0;
                organization.ProjectCount = await _projectRepository.GetCountByOrganizationIdAsync(organization.Id);
            }

            return(viewOrganizations);
        }
        private async Task <List <ViewProject> > PopulateProjectStatsAsync(List <ViewProject> viewProjects)
        {
            if (viewProjects.Count <= 0)
            {
                return(viewProjects);
            }

            int maximumRetentionDays = _options.MaximumRetentionDays;
            var organizations        = await _organizationRepository.GetByIdsAsync(viewProjects.Select(p => p.OrganizationId).ToArray(), o => o.Cache());

            var projects = viewProjects.Select(p => new Project {
                Id = p.Id, CreatedUtc = p.CreatedUtc, OrganizationId = p.OrganizationId
            }).ToList();
            var sf           = new AppFilter(projects, organizations);
            var systemFilter = new RepositoryQuery <PersistentEvent>().AppFilter(sf).DateRange(organizations.GetRetentionUtcCutoff(maximumRetentionDays), SystemClock.UtcNow, (PersistentEvent e) => e.Date).Index(organizations.GetRetentionUtcCutoff(maximumRetentionDays), SystemClock.UtcNow);
            var result       = await _eventRepository.CountAsync(q => q
                                                                 .SystemFilter(systemFilter)
                                                                 .AggregationsExpression($"terms:(project_id~{viewProjects.Count} cardinality:stack_id)")
                                                                 .EnforceEventStackFilter(false));

            foreach (var project in viewProjects)
            {
                var term = result.Aggregations.Terms <string>("terms_project_id")?.Buckets.FirstOrDefault(t => t.Key == project.Id);
                project.EventCount = term?.Total ?? 0;
                project.StackCount = (long)(term?.Aggregations.Cardinality("cardinality_stack_id")?.Value ?? 0);
            }

            return(viewProjects);
        }
        private async Task <string> GetPreviousEventIdAsync(PersistentEvent ev, AppFilter systemFilter = null, DateTime?utcStart = null, DateTime?utcEnd = null)
        {
            if (ev == null)
            {
                return(null);
            }

            var retentionDate = _options.MaximumRetentionDays > 0 ? SystemClock.UtcNow.Date.SubtractDays(_options.MaximumRetentionDays) : DateTime.MinValue;

            if (!utcStart.HasValue || utcStart.Value.IsBefore(retentionDate))
            {
                utcStart = retentionDate;
            }

            if (!utcEnd.HasValue || utcEnd.Value.IsAfter(ev.Date.UtcDateTime))
            {
                utcEnd = ev.Date.UtcDateTime;
            }

            var utcEventDate = ev.Date.UtcDateTime;

            // utcEnd is before the current event date.
            if (utcStart > utcEventDate || utcEnd < utcEventDate)
            {
                return(null);
            }

            var results = await FindAsync(q => q
                                          .DateRange(utcStart, utcEventDate, (PersistentEvent e) => e.Date)
                                          .Index(utcStart, utcEventDate)
                                          .SortDescending(e => e.Date)
                                          .Include(e => e.Id, e => e.Date)
                                          .AppFilter(systemFilter)
                                          .ElasticFilter(!Query <PersistentEvent> .Ids(ids => ids.Values(ev.Id)))
                                          .FilterExpression(String.Concat(EventIndex.Alias.StackId, ":", ev.StackId))
                                          .EnforceEventStackFilter(false), o => o.PageLimit(10)).AnyContext();

            if (results.Total == 0)
            {
                return(null);
            }

            // make sure we don't have records with the exact same occurrence date
            if (results.Documents.All(t => t.Date != ev.Date))
            {
                return(results.Documents.OrderByDescending(t => t.Date).ThenByDescending(t => t.Id).First().Id);
            }

            // we have records with the exact same occurrence date, we need to figure out the order of those
            // put our target error into the mix, sort it and return the result before the target
            var unionResults = results.Documents.Union(new[] { ev })
                               .OrderBy(t => t.Date.UtcTicks).ThenBy(t => t.Id)
                               .ToList();

            int index = unionResults.FindIndex(t => t.Id == ev.Id);

            return(index == 0 ? null : unionResults[index - 1].Id);
        }
Beispiel #9
0
        public Task <FindResults <Project> > GetByFilterAsync(AppFilter systemFilter, string userFilter, string sort, CommandOptionsDescriptor <Project> options = null)
        {
            IRepositoryQuery <Project> query = new RepositoryQuery <Project>()
                                               .AppFilter(systemFilter)
                                               .FilterExpression(userFilter);

            query = !String.IsNullOrEmpty(sort) ? query.SortExpression(sort) : query.SortAscending(p => p.Name.Suffix("keyword"));
            return(FindAsync(q => query, options));
        }
Beispiel #10
0
 public void AppFilterTest()
 {
     // get test
     Assert.That(AppFilter.Installed.ToString(), Is.EqualTo("installed"));
     Assert.That(AppFilter.Featured.ToString(), Is.EqualTo("featured"));
     // parse test
     Assert.That(AppFilter.FromJsonString("installed"), Is.EqualTo(AppFilter.Installed));
     Assert.That(AppFilter.FromJsonString("featured"), Is.EqualTo(AppFilter.Featured));
 }
        public static T AppFilter <T>(this T query, AppFilter filter) where T : IRepositoryQuery
        {
            if (filter != null)
            {
                return(query.BuildOption(SystemFilterKey, filter));
            }

            return(query);
        }
Beispiel #12
0
        public HttpResponseMessage GetDonors(AppFilter filter)
        {
            var donors = _admin.GetListOfDonors(filter);

            if (donors != null)
            {
                return(Request.CreateResponse(HttpStatusCode.OK, donors));
            }
            return(Request.CreateResponse(HttpStatusCode.NotFound, "Donors not found."));
        }
Beispiel #13
0
        public void AppFilterTest()
        {
            // get test
            Assert.That(actual: AppFilter.Installed.ToString(), expression: Is.EqualTo(expected: "installed"));
            Assert.That(actual: AppFilter.Featured.ToString(), expression: Is.EqualTo(expected: "featured"));

            // parse test
            Assert.That(actual: AppFilter.FromJsonString(response: "installed"), expression: Is.EqualTo(expected: AppFilter.Installed));
            Assert.That(actual: AppFilter.FromJsonString(response: "featured"), expression: Is.EqualTo(expected: AppFilter.Featured));
        }
Beispiel #14
0
        public HttpResponseMessage GetVictimProfiles(AppFilter filter)
        {
            var profiles = _admin.GetListOfVictimsProfile(filter);

            if (profiles != null)
            {
                return(Request.CreateResponse(HttpStatusCode.OK, profiles));
            }
            return(Request.CreateResponse(HttpStatusCode.NotFound, "Victim Profiles not found."));
        }
        public Task <FindResults <Stack> > GetByFilterAsync(AppFilter systemFilter, string userFilter, string sort, string field, DateTime utcStart, DateTime utcEnd, CommandOptionsDescriptor <Stack> options = null)
        {
            IRepositoryQuery <Stack> query = new RepositoryQuery <Stack>()
                                             .DateRange(utcStart, utcEnd, field ?? InferField(s => s.LastOccurrence))
                                             .AppFilter(systemFilter)
                                             .FilterExpression(userFilter);

            query = !String.IsNullOrEmpty(sort) ? query.SortExpression(sort) : query.SortDescending(s => s.LastOccurrence);
            return(FindAsync(q => query, options));
        }
Beispiel #16
0
        public Task <FindResults <PersistentEvent> > GetByFilterAsync(AppFilter systemFilter, string userFilter, string sort, string field, DateTime utcStart, DateTime utcEnd, CommandOptionsDescriptor <PersistentEvent> options = null)
        {
            IRepositoryQuery <PersistentEvent> query = new RepositoryQuery <PersistentEvent>()
                                                       .DateRange(utcStart, utcEnd, field ?? InferField(e => e.Date))
                                                       .Index(utcStart, utcEnd)
                                                       .AppFilter(systemFilter)
                                                       .FilterExpression(userFilter);

            query = !String.IsNullOrEmpty(sort) ? query.SortExpression(sort) : query.SortDescending(e => e.Date);
            return(FindAsync(q => query, options));
        }
        public DonorEntity GetListOfDonors(AppFilter filter)
        {
            var donors = _unitOfWork.DonorRepository.Find(c => c.DonorStatus == true).ToList();

            if (donors.Count() > 0)
            {
                var donorProfiles = new DonorEntity()
                {
                    Data    = Mapper.Map <List <Donor>, List <DonorEntityModel> >(donors),
                    Records = donors.Count,
                };
                return(donorProfiles);
            }
            return(null);
        }
    public async Task CanGetByStatus()
    {
        Log.MinimumLevel = Microsoft.Extensions.Logging.LogLevel.Trace;
        var organizationRepository = GetService <IOrganizationRepository>();
        var organization           = await organizationRepository.GetByIdAsync(TestConstants.OrganizationId);

        Assert.NotNull(organization);

        await StackData.CreateSearchDataAsync(_repository, GetService <JsonSerializer>(), true);

        var appFilter = new AppFilter(organization);
        var stackIds  = await _repository.GetIdsByQueryAsync(q => q.AppFilter(appFilter).FilterExpression("status:open OR status:regressed").DateRange(DateTime.UtcNow.AddDays(-5), DateTime.UtcNow), o => o.PageLimit(o.GetMaxLimit()));

        Assert.Equal(2, stackIds.Total);
    }
Beispiel #19
0
        public IQueryable <App> GetApps(AppFilter filter)
        {
            var query = GetAvailableAppsForEndUser();

            // Applying filters
            if (filter.FeaturedApp.HasValue)
            {
                if (filter.FeaturedApp.Value)
                {
                    query = query.Where(app => app.FeaturedApp != null);
                }
                else
                {
                    query = query.Where(app => app.FeaturedApp == null);
                }
            }

            if (filter.AppCategoryId.HasValue)
            {
                query = query.Where(app => app.AppCategoryId == filter.AppCategoryId);
            }

            if (filter.AppPricing.HasValue)
            {
                query =
                    filter.AppPricing.Value == AppPricing.FreeApp
                    ? query.Where(app => app.Price == 0)
                    : query.Where(app => app.Price > 0);
            }

            if (filter.AppType.HasValue)
            {
                query = query.Where(app => app.AppCategory.AppType == filter.AppType.Value);
            }

            if (filter.AppOrderMethod == AppOrderMethod.Top)
            {
                query = query.OrderBy(app => app.AppVersions.Sum(appVersion => appVersion.Downloads));
            }
            else
            {
                // Ordering apps are necessery for server side Paging
                query = query.OrderBy(app => app.Id);
            }


            return(query);
        }
    public async Task <ActionResult <IReadOnlyCollection <Stack> > > GetAsync(string filter = null, string sort = null, string time = null, string offset = null, string mode = null, int page = 1, int limit = 10)
    {
        var organizations = await GetSelectedOrganizationsAsync(_organizationRepository, _projectRepository, _stackRepository, filter);

        if (organizations.Count(o => !o.IsSuspended) == 0)
        {
            return(Ok(EmptyModels));
        }

        var ti = GetTimeInfo(time, offset, organizations.GetRetentionUtcCutoff(_options.MaximumRetentionDays));
        var sf = new AppFilter(organizations)
        {
            IsUserOrganizationsFilter = true
        };

        return(await GetInternalAsync(sf, ti, filter, sort, mode, page, limit));
    }
        public async Task <PreviousAndNextEventIdResult> GetPreviousAndNextEventIdsAsync(PersistentEvent ev, AppFilter systemFilter, string userFilter, DateTime?utcStart, DateTime?utcEnd)
        {
            var previous = GetPreviousEventIdAsync(ev, systemFilter, userFilter, utcStart, utcEnd);
            var next     = GetNextEventIdAsync(ev, systemFilter, userFilter, utcStart, utcEnd);
            await Task.WhenAll(previous, next).AnyContext();

            return(new PreviousAndNextEventIdResult {
                Previous = previous.Result,
                Next = next.Result
            });
        }
    private async Task <Dictionary <string, double> > GetUserCountByProjectIdsAsync(ICollection <Stack> stacks, AppFilter sf, DateTime utcStart, DateTime utcEnd)
    {
        var scopedCacheClient = new ScopedCacheClient(_cache, $"Project:user-count:{utcStart.Floor(TimeSpan.FromMinutes(15)).Ticks}-{utcEnd.Floor(TimeSpan.FromMinutes(15)).Ticks}");
        var projectIds        = stacks.Select(s => s.ProjectId).Distinct().ToList();
        var cachedTotals      = await scopedCacheClient.GetAllAsync <double>(projectIds);

        var totals = cachedTotals.Where(kvp => kvp.Value.HasValue).ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Value);

        if (totals.Count == projectIds.Count)
        {
            return(totals);
        }

        var systemFilter = new RepositoryQuery <PersistentEvent>().AppFilter(sf).DateRange(utcStart, utcEnd, (PersistentEvent e) => e.Date).Index(utcStart, utcEnd);
        var projects     = cachedTotals.Where(kvp => !kvp.Value.HasValue).Select(kvp => new Project {
            Id = kvp.Key, OrganizationId = stacks.FirstOrDefault(s => s.ProjectId == kvp.Key)?.OrganizationId
        }).ToList();
        var countResult = await _eventRepository.CountAsync(q => q.SystemFilter(systemFilter).FilterExpression(projects.BuildFilter()).AggregationsExpression("terms:(project_id cardinality:user)"));

        // Cache all projects that have more than 10 users for 5 minutes.
        var projectTerms = countResult.Aggregations.Terms <string>("terms_project_id").Buckets;
        var aggregations = projectTerms.ToDictionary(t => t.Key, t => t.Aggregations.Cardinality("cardinality_user").Value.GetValueOrDefault());
        await scopedCacheClient.SetAllAsync(aggregations.Where(t => t.Value >= 10).ToDictionary(k => k.Key, v => v.Value), TimeSpan.FromMinutes(5));

        totals.AddRange(aggregations);

        return(totals);
    }
    private async Task <ICollection <StackSummaryModel> > GetStackSummariesAsync(ICollection <Stack> stacks, IReadOnlyCollection <KeyedBucket <string> > stackTerms, AppFilter sf, TimeInfo ti)
    {
        if (stacks.Count == 0)
        {
            return(new List <StackSummaryModel>(0));
        }

        var totalUsers = await GetUserCountByProjectIdsAsync(stacks, sf, ti.Range.UtcStart, ti.Range.UtcEnd);

        return(stacks.Join(stackTerms, s => s.Id, tk => tk.Key, (stack, term) => {
            var data = _formattingPluginManager.GetStackSummaryData(stack);
            var summary = new StackSummaryModel {
                TemplateKey = data.TemplateKey,
                Data = data.Data,
                Id = stack.Id,
                Title = stack.Title,
                Status = stack.Status,
                FirstOccurrence = term.Aggregations.Min <DateTime>("min_date").Value,
                LastOccurrence = term.Aggregations.Max <DateTime>("max_date").Value,
                Total = (long)(term.Aggregations.Sum("sum_count").Value ?? term.Total.GetValueOrDefault()),

                Users = term.Aggregations.Cardinality("cardinality_user").Value.GetValueOrDefault(),
                TotalUsers = totalUsers.GetOrDefault(stack.ProjectId)
            };

            return summary;
        }).ToList());
    }
        private async Task <bool> SendSummaryNotificationAsync(Project project, SummaryNotification data)
        {
            // TODO: Add slack daily summaries
            var userIds = project.NotificationSettings.Where(n => n.Value.SendDailySummary && !String.Equals(n.Key, Project.NotificationIntegrations.Slack)).Select(n => n.Key).ToList();

            if (userIds.Count == 0)
            {
                _logger.LogInformation("Project {ProjectName} has no users to send summary to.", project.Name);
                return(false);
            }

            var results = await _userRepository.GetByIdsAsync(userIds, o => o.Cache()).AnyContext();

            var users = results.Where(u => u.IsEmailAddressVerified && u.EmailNotificationsEnabled && u.OrganizationIds.Contains(project.OrganizationId)).ToList();

            if (users.Count == 0)
            {
                _logger.LogInformation("Project {ProjectName} has no users to send summary to.", project.Name);
                return(false);
            }

            // TODO: What should we do about suspended organizations.
            var organization = await _organizationRepository.GetByIdAsync(project.OrganizationId, o => o.Cache()).AnyContext();

            if (organization == null)
            {
                _logger.LogInformation("The organization {organization} for project {ProjectName} may have been deleted. No summaries will be sent.", project.OrganizationId, project.Name);
                return(false);
            }

            _logger.LogInformation("Sending daily summary: users={UserCount} project={project}", users.Count, project.Id);
            var    sf           = new AppFilter(project, organization);
            var    systemFilter = new RepositoryQuery <PersistentEvent>().AppFilter(sf).DateRange(data.UtcStartTime, data.UtcEndTime, (PersistentEvent e) => e.Date).Index(data.UtcStartTime, data.UtcEndTime);
            string filter       = "type:error (status:open OR status:regressed)";
            var    result       = await _eventRepository.CountAsync(q => q.SystemFilter(systemFilter).FilterExpression(filter).EnforceEventStackFilter().AggregationsExpression("terms:(first @include:true) terms:(stack_id~3) cardinality:stack_id sum:count~1")).AnyContext();

            double total              = result.Aggregations.Sum("sum_count")?.Value ?? result.Total;
            double newTotal           = result.Aggregations.Terms <double>("terms_first")?.Buckets.FirstOrDefault()?.Total ?? 0;
            double uniqueTotal        = result.Aggregations.Cardinality("cardinality_stack_id")?.Value ?? 0;
            bool   hasSubmittedEvents = total > 0 || project.IsConfigured.GetValueOrDefault();
            bool   isFreePlan         = organization.PlanId == _plans.FreePlan.Id;

            string fixedFilter = "type:error status:fixed";
            var    fixedResult = await _eventRepository.CountAsync(q => q.SystemFilter(systemFilter).FilterExpression(fixedFilter).EnforceEventStackFilter().AggregationsExpression("sum:count~1")).AnyContext();

            double fixedTotal = fixedResult.Aggregations.Sum("sum_count")?.Value ?? fixedResult.Total;

            var range        = new DateTimeRange(data.UtcStartTime, data.UtcEndTime);
            var usages       = project.OverageHours.Where(u => range.Contains(u.Date)).ToList();
            int blockedTotal = usages.Sum(u => u.Blocked);
            int tooBigTotal  = usages.Sum(u => u.TooBig);

            IReadOnlyCollection <Stack> mostFrequent = null;
            var stackTerms = result.Aggregations.Terms <string>("terms_stack_id");

            if (stackTerms?.Buckets.Count > 0)
            {
                mostFrequent = await _stackRepository.GetByIdsAsync(stackTerms.Buckets.Select(b => b.Key).ToArray()).AnyContext();
            }

            IReadOnlyCollection <Stack> newest = null;

            if (newTotal > 0)
            {
                newest = (await _stackRepository.FindAsync(q => q.AppFilter(sf).FilterExpression(filter).SortExpression("-first").DateRange(data.UtcStartTime, data.UtcEndTime, "first"), o => o.PageLimit(3)).AnyContext()).Documents;
            }

            foreach (var user in users)
            {
                _logger.LogInformation("Queuing {ProjectName} daily summary email ({UtcStartTime}-{UtcEndTime}) for user {EmailAddress}.", project.Name, data.UtcStartTime, data.UtcEndTime, user.EmailAddress);
                await _mailer.SendProjectDailySummaryAsync(user, project, mostFrequent, newest, data.UtcStartTime, hasSubmittedEvents, total, uniqueTotal, newTotal, fixedTotal, blockedTotal, tooBigTotal, isFreePlan).AnyContext();
            }

            _logger.LogInformation("Done sending daily summary: users={UserCount} project={ProjectName} events={EventCount}", users.Count, project.Name, total);
            return(true);
        }
    private async Task <ActionResult <IReadOnlyCollection <Stack> > > GetInternalAsync(AppFilter sf, TimeInfo ti, string filter = null, string sort = null, string mode = null, int page = 1, int limit = 10)
    {
        page  = GetPage(page);
        limit = GetLimit(limit);
        int skip = GetSkip(page, limit);

        if (skip > MAXIMUM_SKIP)
        {
            return(Ok(EmptyModels));
        }

        var pr = await _validator.ValidateQueryAsync(filter);

        if (!pr.IsValid)
        {
            return(BadRequest(pr.Message));
        }

        sf.UsesPremiumFeatures = pr.UsesPremiumFeatures;

        try {
            var results = await _repository.FindAsync(q => q.AppFilter(ShouldApplySystemFilter(sf, filter) ? sf : null).FilterExpression(filter).SortExpression(sort).DateRange(ti.Range.UtcStart, ti.Range.UtcEnd, ti.Field), o => o.PageNumber(page).PageLimit(limit));

            var stacks = results.Documents.Select(s => s.ApplyOffset(ti.Offset)).ToList();
            if (!String.IsNullOrEmpty(mode) && String.Equals(mode, "summary", StringComparison.OrdinalIgnoreCase))
            {
                return(OkWithResourceLinks(await GetStackSummariesAsync(stacks, sf, ti), results.HasMore && !NextPageExceedsSkipLimit(page, limit), page));
            }

            return(OkWithResourceLinks(stacks, results.HasMore && !NextPageExceedsSkipLimit(page, limit), page));
        }
        catch (ApplicationException ex) {
            using (_logger.BeginScope(new ExceptionlessState().Property("Search Filter", new { SystemFilter = sf, UserFilter = filter, Time = ti, Page = page, Limit = limit }).Tag("Search").Identity(CurrentUser.EmailAddress).Property("User", CurrentUser).SetHttpContext(HttpContext)))
                _logger.LogError(ex, "An error has occurred. Please check your search filter.");

            return(BadRequest("An error has occurred. Please check your search filter."));
        }
    }
Beispiel #26
0
        public static async Task <PreviousAndNextEventIdResult> GetPreviousAndNextEventIdsAsync(this IEventRepository repository, string id, AppFilter systemFilter = null, DateTime?utcStart = null, DateTime?utcEnd = null)
        {
            var ev = await repository.GetByIdAsync(id, o => o.Cache()).AnyContext();

            return(await repository.GetPreviousAndNextEventIdsAsync(ev, systemFilter, utcStart, utcEnd).AnyContext());
        }
    private async Task <ICollection <StackSummaryModel> > GetStackSummariesAsync(ICollection <Stack> stacks, AppFilter eventSystemFilter, TimeInfo ti)
    {
        if (stacks.Count == 0)
        {
            return(new List <StackSummaryModel>());
        }

        var systemFilter = new RepositoryQuery <PersistentEvent>().AppFilter(eventSystemFilter).DateRange(ti.Range.UtcStart, ti.Range.UtcEnd, (PersistentEvent e) => e.Date).Index(ti.Range.UtcStart, ti.Range.UtcEnd);
        var stackTerms   = await _eventRepository.CountAsync(q => q.SystemFilter(systemFilter).FilterExpression(String.Join(" OR ", stacks.Select(r => $"stack:{r.Id}"))).AggregationsExpression($"terms:(stack_id~{stacks.Count} cardinality:user sum:count~1 min:date max:date)"));

        return(await GetStackSummariesAsync(stacks, stackTerms.Aggregations.Terms <string>("terms_stack_id").Buckets, eventSystemFilter, ti));
    }
        private void LoadWebPartView(ExtentrixWIWebPart wp)
        {
            //if (Page.Session[PublishedApps] == null)
            PublishedApplication[] publishedApps = Page.Session[PublishedApps] as PublishedApplication[];
            if (!Page.IsPostBack && publishedApps == null)
            {
                var watch = Stopwatch.StartNew();
                Logger.Default.Info(LogLocation, string.Format("LoadWebPartView: Start getting applications {0}", DateTime.Now));
                DelegateGetApplications delGetApp = new DelegateGetApplications(wp.getApplication);

                IAsyncResult result = delGetApp.BeginInvoke(Credentials, null, null);

                publishedApps = delGetApp.EndInvoke(result);

                Logger.Default.Info(LogLocation, string.Format("LoadWebPartView: End getting applications {0}", watch.Elapsed));
                //check is app filter applied

                if ((publishedApps != null) && (publishedApps.Length > 0))
                {
                    Page.Session[PublishedApps] = publishedApps;
                    new Thread(() => wp.ProcessIcons(Credentials, wp.getService())).Start();
                }
            }

            if (publishedApps != null)
            {
                if (IsAppFilterApplied)
                {
                    var      appsFiltered = new List <PublishedApplication>();
                    string[] filter       = AppFilter.Split(',');
                    for (int i = 0; i < filter.Length; i++)
                    {
                        foreach (PublishedApplication app in publishedApps)
                        {
                            if (app.AppName.ToLower().Contains(filter[i].ToLower()))
                            {
                                appsFiltered.Add(app);
                            }
                        }
                    }
                    publishedApps = appsFiltered.ToArray();
                }

                Logger.Default.Info(LogLocation, "LoadWebPartView: Start creating app tree");
                tree = new ApplicationsTree(publishedApps);
                Logger.Default.Info(LogLocation, "LoadWebPartView: End creating app tree");
                if (SPContext.Current.Web.CurrentUser != null)
                {
                    favorites = new Favorites(tree);
                }
            }

            if (SPContext.Current.Web.CurrentUser == null)
            {
                DropDownViewSwitcher.Items.Remove(DropDownViewSwitcher.Items.FindByText("Favorites"));
            }
            if ((publishedApps != null) && (publishedApps.Length > 0))
            {
                FillView(GetCurrentView(DropDownViewSwitcher.SelectedValue));
            }
        }