public async Task CollectAsync(QuickFactContext context)
        {
            var versions = await _repository.FindForIncidentAsync(context.IncidentId);

            if (!versions.Any())
            {
                return;
            }

            context.CollectedFacts.Add(new QuickFact
            {
                Title       = "Versions",
                Description = "Application versions that this incident have been detected in.",
                Value       = string.Join(", ", versions.Select(x => "v" + x.Version))
            });
        }
        public async Task <GetIncidentResult> HandleAsync(IMessageContext context, GetIncident query)
        {
            _logger.Info("GetIncident step 1");
            var sql =
                "SELECT Incidents.*, Users.Username as AssignedTo " +
                " FROM Incidents WITH(READUNCOMMITTED)" +
                " LEFT JOIN Users WITH(READUNCOMMITTED) ON (AssignedToId = Users.AccountId) " +
                " WHERE Incidents.Id = @id";

            var result = await _unitOfWork.FirstAsync <GetIncidentResult>(sql, new { Id = query.IncidentId });

            _logger.Info("GetIncident step 2");

            result.Tags = GetTags(query.IncidentId);
            _logger.Info("GetIncident step 3");

            var facts = new List <QuickFact>
            {
                new QuickFact
                {
                    Title       = "Created",
                    Description = "When we received the first error report",
                    Value       = result.CreatedAtUtc.ToShortDateString()
                },
                new QuickFact
                {
                    Title       = "Last report",
                    Description = "When we received the most recent error report",
                    Value       = result.LastReportReceivedAtUtc.ToShortDateString()
                },
                new QuickFact
                {
                    Title       = "Report Count",
                    Description = "Number of reports since this incident was discovered",
                    Value       = result.ReportCount.ToString()
                }
            };

            var environments = GetEnvironments(query.IncidentId);

            if (environments.Any())
            {
                facts.Add(new QuickFact
                {
                    Title = "Environments",
                    Value = string.Join(", ", environments)
                });
            }

            _logger.Info("GetIncident step 4");
            await GetContextCollectionNames(result);

            _logger.Info("GetIncident step 5");
            await GetReportStatistics(result);

            _logger.Info("GetIncident step 6");
            await GetStatSummary(query, facts);

            _logger.Info("GetIncident step 7");

            var solutions = new List <SuggestedIncidentSolution>();
            var suggestedSolutionContext = new SolutionProviderContext(solutions)
            {
                ApplicationId = result.ApplicationId,
                Description   = result.Description,
                FullName      = result.FullName,
                IncidentId    = result.Id,
                StackTrace    = result.StackTrace,
                Tags          = result.Tags
            };

            var contextData        = new List <HighlightedContextData>();
            var highlightedContext = new HighlightedContextDataProviderContext(contextData)
            {
                ApplicationId = result.ApplicationId,
                Description   = result.Description,
                FullName      = result.FullName,
                IncidentId    = result.Id,
                StackTrace    = result.StackTrace,
                Tags          = result.Tags
            };
            var quickFactContext = new QuickFactContext(result.ApplicationId, query.IncidentId, facts);

            foreach (var provider in _quickfactProviders)
            {
                await provider.CollectAsync(quickFactContext);
            }
            foreach (var provider in _highlightedContextDataProviders)
            {
                await provider.CollectAsync(highlightedContext);
            }
            foreach (var provider in _solutionProviders)
            {
                await provider.SuggestSolutionAsync(suggestedSolutionContext);
            }
            _logger.Info("GetIncident step 8");

            result.Facts = facts.ToArray();
            result.SuggestedSolutions     = solutions.ToArray();
            result.HighlightedContextData = contextData.ToArray();
            return(result);
        }
        public async Task <GetIncidentResult> HandleAsync(IMessageContext context, GetIncident query)
        {
            _logger.Info("GetIncident step 1");
            var sql =
                "SELECT Incidents.*, Users.Username as AssignedTo " +
                " FROM Incidents WITH (ReadPast)" +
                " LEFT JOIN Users WITH (ReadPast) ON (AssignedToId = Users.AccountId) " +
                " WHERE Incidents.Id = @id";

            var result = await _unitOfWork.FirstAsync <GetIncidentResult>(sql, new { Id = query.IncidentId });

            _logger.Info("GetIncident step 2");

            var tags = GetTags(query.IncidentId);

            result.Tags = tags.ToArray();
            _logger.Info("GetIncident step 3");

            var facts = new List <QuickFact>
            {
                new QuickFact
                {
                    Title       = "Report Count",
                    Description = "Number of reports since this incident was discovered",
                    Value       = result.ReportCount.ToString()
                }
            };


            _logger.Info("GetIncident step 4");
            await GetContextCollectionNames(result);

            _logger.Info("GetIncident step 5");
            await GetReportStatistics(result);

            _logger.Info("GetIncident step 6");
            await GetStatSummary(query, facts);

            _logger.Info("GetIncident step 7");

            var contextData      = new List <HighlightedContextData>();
            var solutions        = new List <SuggestedIncidentSolution>();
            var quickFactContext = new QuickFactContext(result.ApplicationId, query.IncidentId, facts);

            foreach (var provider in _quickfactProviders)
            {
                await provider.CollectAsync(quickFactContext);
            }
            foreach (var provider in _highlightedContextDataProviders)
            {
                await provider.CollectAsync(query.IncidentId, contextData);
            }
            foreach (var provider in _solutionProviders)
            {
                await provider.SuggestSolutionAsync(query.IncidentId, solutions);
            }
            _logger.Info("GetIncident step 8");

            result.Facts = facts.ToArray();
            result.SuggestedSolutions     = solutions.ToArray();
            result.HighlightedContextData = contextData.ToArray();
            return(result);
        }