protected virtual TimeInfo GetTimeInfo(string time, string offset, DateTime?minimumUtcStartDate = null)
        {
            string field = DefaultDateField;

            if (!String.IsNullOrEmpty(time) && time.Contains("|"))
            {
                string[] parts = time.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
                field = parts.Length > 0 && AllowedDateFields.Contains(parts[0]) ? parts[0] : DefaultDateField;
                time  = parts.Length > 1 ? parts[1] : null;
            }

            var utcOffset = GetOffset(offset);

            // range parsing needs to be based on the user's local time.
            var range    = DateTimeRange.Parse(time, Foundatio.Utility.SystemClock.OffsetUtcNow.ToOffset(utcOffset));
            var timeInfo = new TimeInfo {
                Field = field, Offset = utcOffset, Range = range
            };

            if (minimumUtcStartDate.HasValue)
            {
                timeInfo.ApplyMinimumUtcStartDate(minimumUtcStartDate.Value);
            }

            timeInfo.AdjustEndTimeIfMaxValue();
            return(timeInfo);
        }
    public StackController(
        IStackRepository stackRepository,
        IOrganizationRepository organizationRepository,
        IProjectRepository projectRepository,
        IEventRepository eventRepository,
        IWebHookRepository webHookRepository,
        WebHookDataPluginManager webHookDataPluginManager,
        IQueue <WebHookNotification> webHookNotificationQueue,
        ICacheClient cacheClient,
        BillingManager billingManager,
        FormattingPluginManager formattingPluginManager,
        SemanticVersionParser semanticVersionParser,
        IMapper mapper,
        StackQueryValidator validator,
        AppOptions options,
        ILoggerFactory loggerFactory
        ) : base(stackRepository, mapper, validator, loggerFactory)
    {
        _stackRepository          = stackRepository;
        _organizationRepository   = organizationRepository;
        _projectRepository        = projectRepository;
        _eventRepository          = eventRepository;
        _webHookRepository        = webHookRepository;
        _webHookDataPluginManager = webHookDataPluginManager;
        _webHookNotificationQueue = webHookNotificationQueue;
        _cache                   = cacheClient;
        _billingManager          = billingManager;
        _formattingPluginManager = formattingPluginManager;
        _semanticVersionParser   = semanticVersionParser;
        _options                 = options;

        AllowedDateFields.AddRange(new[] { StackIndex.Alias.FirstOccurrence, StackIndex.Alias.LastOccurrence });
        DefaultDateField = StackIndex.Alias.LastOccurrence;
    }