コード例 #1
0
        protected override async Task <JobResult> RunInternalAsync(CancellationToken token)
        {
            var ip = Util.GetExternalIP();

            if (ip != null)
            {
                Log.Info().Message("Public IP:" + ip).Write();
            }

            CopyCollections("error", "errorstack", "errorstack.stats.day", "errorstack.stats.month", "jobhistory", "joblock", "log", "project.stats.day", "project.stats.month");

            Log.Info().Message("Running migrations...").Write();
            MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, new MongoUrl(Settings.Current.MongoConnectionString).DatabaseName);
            Log.Info().Message("Finished running migrations").Write();

            Log.Info().Message("Creating indexes...").Write();
            new ApplicationRepository(_mongoDatabase);
            new OrganizationRepository(_mongoDatabase);
            new ProjectRepository(_mongoDatabase);
            new TokenRepository(_mongoDatabase);
            new WebHookRepository(_mongoDatabase);
            new UserRepository(_mongoDatabase);
            Log.Info().Message("Finished creating indexes...").Write();

            Log.Info().Message("Flushing redis cache").Write();
            _cacheClient.FlushAll();

            return(JobResult.Success);
        }
コード例 #2
0
 public SystemHealthCheckerTests()
 {
     if (Settings.Current.ShouldAutoUpgradeDatabase)
     {
         MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, Settings.Current.MongoDatabaseName);
     }
 }
コード例 #3
0
        public static bool IsDbUpToDate()
        {
            lock (_dbIsUpToDateLock) {
                if (_dbIsUpToDate.HasValue && (_dbIsUpToDate.Value || DateTime.Now.Subtract(_lastDbUpToDateCheck).TotalSeconds < 10))
                {
                    return(_dbIsUpToDate.Value);
                }

                _lastDbUpToDateCheck = DateTime.Now;
                _dbIsUpToDate        = MongoMigrationChecker.IsUpToDate(Settings.Current.MongoConnectionString, Settings.Current.MongoDatabaseName);

                return(_dbIsUpToDate.Value);
            }
        }
コード例 #4
0
        public static bool IsDbUpToDate()
        {
            lock (_dbIsUpToDateLock) {
                if (_dbIsUpToDate.HasValue && (_dbIsUpToDate.Value || DateTime.Now.Subtract(_lastDbUpToDateCheck).TotalSeconds > 10))
                {
                    return(_dbIsUpToDate.Value);
                }

                _lastDbUpToDateCheck = DateTime.Now;

                string connectionString = ConfigurationManager.ConnectionStrings["MongoConnectionString"].ConnectionString;
                if (String.IsNullOrEmpty(connectionString))
                {
                    throw new ConfigurationErrorsException("MongoConnectionString was not found in the Web.config.");
                }

                var    url          = new MongoUrl(connectionString);
                string databaseName = url.DatabaseName;
                if (Settings.Current.AppendMachineNameToDatabase)
                {
                    databaseName += String.Concat("-", Environment.MachineName.ToLower());
                }

                try {
                    _dbIsUpToDate = MongoMigrationChecker.IsUpToDate(connectionString, databaseName);
                } catch (Exception e) {
                    Log.Error().Exception(e).Message("Error checking db version: {0}", e.Message).Report().Write();
                }

                if (!_dbIsUpToDate.HasValue || !_dbIsUpToDate.Value)
                {
                    // if enabled, auto upgrade the database
                    if (Settings.Current.ShouldAutoUpgradeDatabase)
                    {
                        try {
                            MongoMigrationChecker.EnsureLatest(connectionString, databaseName);
                        } catch (Exception e) {
                            Log.Error().Exception(e).Message("Error ensuring latest db version: {0}", e.Message).Report().Write();
                        }
                        _dbIsUpToDate = true;
                        return(true);
                    }

                    return(false);
                }

                return(true);
            }
        }
コード例 #5
0
ファイル: IoC.cs プロジェクト: lbarahona30/Exceptionless
        private static Container CreateContainer()
        {
            var container = AppBuilder.CreateContainer(false);

            RegisterServices(container);

            var searchclient = container.GetInstance <IElasticClient>();

            searchclient.DeleteIndex(i => i.AllIndices());

            if (Settings.Current.ShouldAutoUpgradeDatabase)
            {
                MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, Settings.Current.MongoDatabaseName);
            }

            return(container);
        }
コード例 #6
0
        public static bool IsDbUpToDate()
        {
            lock (_dbIsUpToDateLock) {
                if (_dbIsUpToDate.HasValue && (_dbIsUpToDate.Value || DateTime.Now.Subtract(_lastDbUpToDateCheck).TotalSeconds < 10))
                {
                    return(_dbIsUpToDate.Value);
                }

                _lastDbUpToDateCheck = DateTime.Now;

                string connectionString = ConfigurationManager.ConnectionStrings["MongoConnectionString"].ConnectionString;
                if (String.IsNullOrEmpty(connectionString))
                {
                    throw new ConfigurationErrorsException("MongoConnectionString was not found in the Web.config.");
                }

                var    url          = new MongoUrl(connectionString);
                string databaseName = url.DatabaseName;
                if (Settings.Current.AppendMachineNameToDatabase)
                {
                    databaseName += String.Concat("-", Environment.MachineName.ToLower());
                }

                _dbIsUpToDate = MongoMigrationChecker.IsUpToDate(connectionString, databaseName);
                if (_dbIsUpToDate.Value)
                {
                    return(true);
                }

                // if enabled, auto upgrade the database
                if (Settings.Current.ShouldAutoUpgradeDatabase)
                {
                    Task.Factory.StartNew(() => MongoMigrationChecker.EnsureLatest(connectionString, databaseName))
                    .ContinueWith(_ => { _dbIsUpToDate = false; });
                }

                return(false);
            }
        }
コード例 #7
0
        public static bool IsDbUpToDate()
        {
            lock (_dbIsUpToDateLock) {
                if (_dbIsUpToDate.HasValue && (_dbIsUpToDate.Value || DateTime.Now.Subtract(_lastDbUpToDateCheck).TotalSeconds < 10))
                {
                    return(_dbIsUpToDate.Value);
                }

                _lastDbUpToDateCheck = DateTime.Now;

                var    url          = new MongoUrl(Settings.Current.MongoConnectionString);
                string databaseName = url.DatabaseName;
                if (Settings.Current.AppendMachineNameToDatabase)
                {
                    databaseName += String.Concat("-", Environment.MachineName.ToLower());
                }

                _dbIsUpToDate = MongoMigrationChecker.IsUpToDate(Settings.Current.MongoConnectionString, databaseName);

                return(_dbIsUpToDate.Value);
            }
        }
コード例 #8
0
ファイル: AppBuilder.cs プロジェクト: fhchina/Exceptionless
        public static void BuildWithContainer(IAppBuilder app, Container container)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }

            Config = new HttpConfiguration();
            ExceptionlessClient.Default.RegisterWebApi(Config);

            Log.Info().Message("Starting api...").Write();
            // if enabled, auto upgrade the database
            if (Settings.Current.ShouldAutoUpgradeDatabase)
            {
                var    url          = new MongoUrl(Settings.Current.MongoConnectionString);
                string databaseName = url.DatabaseName;
                if (Settings.Current.AppendMachineNameToDatabase)
                {
                    databaseName += String.Concat("-", Environment.MachineName.ToLower());
                }

                MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, databaseName);
            }

            Config.Services.Add(typeof(IExceptionLogger), new NLogExceptionLogger());
            Config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
            Config.Formatters.Remove(Config.Formatters.XmlFormatter);
            Config.Formatters.JsonFormatter.SerializerSettings.Formatting       = Formatting.Indented;
            Config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new LowerCaseUnderscorePropertyNamesContractResolver();

            var constraintResolver = new DefaultInlineConstraintResolver();

            constraintResolver.ConstraintMap.Add("objectid", typeof(ObjectIdRouteConstraint));
            constraintResolver.ConstraintMap.Add("objectids", typeof(ObjectIdsRouteConstraint));
            constraintResolver.ConstraintMap.Add("token", typeof(TokenRouteConstraint));
            constraintResolver.ConstraintMap.Add("tokens", typeof(TokensRouteConstraint));
            Config.MapHttpAttributeRoutes(constraintResolver);
            //Config.EnableSystemDiagnosticsTracing();

            container.RegisterSingle <JsonSerializer>(JsonSerializer.Create(new JsonSerializerSettings {
                ContractResolver = new SignalRContractResolver()
            }));
            container.RegisterWebApiFilterProvider(Config);

            try {
                container.Verify();
            } catch (Exception ex) {
                var tempEx = ex;
                while (!(tempEx is ReflectionTypeLoadException))
                {
                    if (tempEx.InnerException == null)
                    {
                        break;
                    }
                    tempEx = tempEx.InnerException;
                }

                var typeLoadException = tempEx as ReflectionTypeLoadException;
                if (typeLoadException != null)
                {
                    foreach (var loaderEx in typeLoadException.LoaderExceptions)
                    {
                        Debug.WriteLine(loaderEx.Message);
                    }
                }

                Debug.WriteLine(ex.Message);
                throw;
            }

            Config.MessageHandlers.Add(container.GetInstance <XHttpMethodOverrideDelegatingHandler>());
            Config.MessageHandlers.Add(container.GetInstance <EncodingDelegatingHandler>());
            Config.MessageHandlers.Add(container.GetInstance <AuthMessageHandler>());

            // Throttle api calls to X every 15 minutes by IP address.
            Config.MessageHandlers.Add(container.GetInstance <ThrottlingHandler>());

            // Reject event posts in orgs over their max event limits.
            Config.MessageHandlers.Add(container.GetInstance <OverageHandler>());

            app.UseCors(new CorsOptions {
                PolicyProvider = new CorsPolicyProvider
                {
                    PolicyResolver = ctx => Task.FromResult(new CorsPolicy
                    {
                        AllowAnyHeader      = true,
                        AllowAnyMethod      = true,
                        AllowAnyOrigin      = true,
                        SupportsCredentials = true,
                        PreflightMaxAge     = 60 * 5
                    })
                }
            });

            app.CreatePerContext <Lazy <User> >("User", ctx => new Lazy <User>(() => {
                if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated)
                {
                    return(null);
                }

                string userId = ctx.Request.User.GetUserId();
                if (String.IsNullOrEmpty(userId))
                {
                    return(null);
                }

                var userRepository = container.GetInstance <IUserRepository>();
                return(userRepository.GetById(userId, true));
            }));

            app.CreatePerContext <Lazy <Project> >("DefaultProject", ctx => new Lazy <Project>(() => {
                if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated)
                {
                    return(null);
                }

                // TODO: Use project id from url. E.G., /projects/{projectId:objectid}/events
                string projectId      = ctx.Request.User.GetDefaultProjectId();
                var projectRepository = container.GetInstance <IProjectRepository>();

                if (String.IsNullOrEmpty(projectId))
                {
                    var firstOrgId = ctx.Request.User.GetOrganizationIds().FirstOrDefault();
                    if (!String.IsNullOrEmpty(firstOrgId))
                    {
                        var project = projectRepository.GetByOrganizationId(firstOrgId, useCache: true).FirstOrDefault();
                        if (project != null)
                        {
                            return(project);
                        }
                    }

                    if (Settings.Current.WebsiteMode == WebsiteMode.Dev)
                    {
                        var dataHelper = container.GetInstance <DataHelper>();
                        // create a default org and project
                        projectId = dataHelper.CreateDefaultOrganizationAndProject(ctx.Request.GetUser());
                    }
                }

                if (String.IsNullOrEmpty(projectId))
                {
                    return(null);
                }

                return(projectRepository.GetById(projectId, true));
            }));

            app.UseWebApi(Config);
            var resolver = new SimpleInjectorSignalRDependencyResolver(container);

            if (Settings.Current.EnableRedis)
            {
                resolver.UseRedis(new RedisScaleoutConfiguration(Settings.Current.RedisConnectionString, "exceptionless.signalr"));
            }
            app.MapSignalR("/api/v2/push", new HubConfiguration {
                Resolver = resolver
            });

            Mapper.Configuration.ConstructServicesUsing(container.GetInstance);

            var context = new OwinContext(app.Properties);
            var token   = context.Get <CancellationToken>("host.OnAppDisposing");

            CreateSampleData(container);

            if (Settings.Current.RunJobsInProcess)
            {
                Task.Factory.StartNew(() => container.GetInstance <EventPostsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <EventUserDescriptionsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <MailMessageJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <EventNotificationsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <WebHooksJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                //Task.Factory.StartNew(() => container.GetInstance<DailySummaryJob>().RunContinuousAsync(delay: TimeSpan.FromMinutes(15), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                //Task.Factory.StartNew(() => container.GetInstance<RetentionLimitsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                //Task.Factory.StartNew(() => container.GetInstance<StaleAccountsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
            }
        }
コード例 #9
0
ファイル: AppBuilder.cs プロジェクト: WSmartJ18/Exceptionless
        public static void BuildWithContainer(IAppBuilder app, Container container, bool registerExceptionlessClient = true)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }

            // if enabled, auto upgrade the database
            if (Settings.Current.ShouldAutoUpgradeDatabase)
            {
                var    url          = new MongoUrl(Settings.Current.MongoConnectionString);
                string databaseName = url.DatabaseName;
                if (Settings.Current.AppendMachineNameToDatabase)
                {
                    databaseName += String.Concat("-", Environment.MachineName.ToLower());
                }

                MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, databaseName);
            }

            Config = new HttpConfiguration();
            Config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
            Config.Formatters.Remove(Config.Formatters.XmlFormatter);
            Config.Formatters.JsonFormatter.SerializerSettings.Formatting       = Formatting.Indented;
            Config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new LowerCaseUnderscorePropertyNamesContractResolver();

            var constraintResolver = new DefaultInlineConstraintResolver();

            constraintResolver.ConstraintMap.Add("objectid", typeof(ObjectIdRouteConstraint));
            constraintResolver.ConstraintMap.Add("objectids", typeof(ObjectIdsRouteConstraint));
            Config.MapHttpAttributeRoutes(constraintResolver);
            //config.EnableSystemDiagnosticsTracing();

            container.RegisterSingle <JsonSerializer>(JsonSerializer.Create(new JsonSerializerSettings {
                ContractResolver = new SignalRContractResolver()
            }));
            container.RegisterWebApiFilterProvider(Config);

            try {
                container.Verify();
            } catch (Exception ex) {
                var tempEx = ex;
                while (!(tempEx is ReflectionTypeLoadException))
                {
                    if (tempEx.InnerException == null)
                    {
                        break;
                    }
                    tempEx = tempEx.InnerException;
                }

                var typeLoadException = tempEx as ReflectionTypeLoadException;
                if (typeLoadException != null)
                {
                    foreach (var loaderEx in typeLoadException.LoaderExceptions)
                    {
                        Debug.WriteLine(loaderEx.Message);
                    }
                }

                Debug.WriteLine(ex.Message);
                throw;
            }

            Config.MessageHandlers.Add(container.GetInstance <XHttpMethodOverrideDelegatingHandler>());
            Config.MessageHandlers.Add(container.GetInstance <EncodingDelegatingHandler>());
            Config.MessageHandlers.Add(container.GetInstance <AuthTokenMessageHandler>());

            // Throttle api calls to X every 15 minutes by IP address.
            Config.MessageHandlers.Add(container.GetInstance <ThrottlingHandler>());

            // Reject event posts in orgs over their max event limits.
            Config.MessageHandlers.Add(container.GetInstance <OverageHandler>());

            app.UseCors(CorsOptions.AllowAll);

            app.CreatePerContext <Lazy <User> >("User", ctx => new Lazy <User>(() => {
                if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated)
                {
                    return(null);
                }

                string userId = ctx.Request.User.GetUserId();
                if (String.IsNullOrEmpty(userId))
                {
                    return(null);
                }

                var userRepository = container.GetInstance <IUserRepository>();
                return(userRepository.GetById(userId, true));
            }));

            app.CreatePerContext <Lazy <Project> >("DefaultProject", ctx => new Lazy <Project>(() => {
                if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated)
                {
                    return(null);
                }

                string projectId      = ctx.Request.User.GetDefaultProjectId();
                var projectRepository = container.GetInstance <IProjectRepository>();

                if (String.IsNullOrEmpty(projectId))
                {
                    return(projectRepository.GetByOrganizationIds(ctx.Request.User.GetOrganizationIds(), useCache: true).FirstOrDefault());
                }

                return(projectRepository.GetById(projectId, true));
            }));

            if (registerExceptionlessClient)
            {
                ExceptionlessClient.Default.RegisterWebApi(Config);
                Config.Services.Add(typeof(IExceptionLogger), new ExceptionlessExceptionLogger());
            }

            app.UseWebApi(Config);
            app.MapSignalR("/api/v2/push", new HubConfiguration {
                Resolver = new SimpleInjectorSignalRDependencyResolver(container)
            });

            PhysicalFileSystem fileSystem = null;
            var root = AppDomain.CurrentDomain.BaseDirectory;

            if (Directory.Exists(Path.Combine(root, "./Content")))
            {
                fileSystem = new PhysicalFileSystem(Path.Combine(root, "./Content"));
            }
            if (Directory.Exists(Path.Combine(root, "./bin/Content")))
            {
                fileSystem = new PhysicalFileSystem(Path.Combine(root, "./bin/Content"));
            }

            if (fileSystem != null)
            {
                app.UseFileServer(new FileServerOptions {
                    FileSystem = fileSystem
                });
            }

            Mapper.Configuration.ConstructServicesUsing(container.GetInstance);

            // TODO: Figure out what data we want to create when the db is empty in production mode.
            if (Settings.Current.WebsiteMode == WebsiteMode.Dev)
            {
                EnsureSampleData(container);
            }

            var context = new OwinContext(app.Properties);
            var token   = context.Get <CancellationToken>("host.OnAppDisposing");

            if (Settings.Current.EnableJobsModule)
            {
                Run.InBackground(t => container.GetInstance <ProcessEventPostsJob>().Run(token), token);
                Run.InBackground(t => container.GetInstance <ProcessEventUserDescriptionsJob>().Run(token), token);
                Run.InBackground(t => container.GetInstance <ProcessMailMessageJob>().Run(token), token);
                Run.InBackground(t => container.GetInstance <DailyNotificationJob>().Run(token), token);
                Run.InBackground(t => container.GetInstance <EnforceRetentionLimitsJob>().Run(token), token);
                Run.InBackground(t => container.GetInstance <RemoveStaleAccountsJob>().Run(token), token);
            }
        }
コード例 #10
0
        public static void BuildWithContainer(IAppBuilder app, Container container)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }

            if (Settings.Current.ShouldAutoUpgradeDatabase)
            {
                MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, Settings.Current.MongoDatabaseName);
            }

            Config = new HttpConfiguration();
            Config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
            Config.Formatters.Remove(Config.Formatters.XmlFormatter);
            Config.Formatters.JsonFormatter.SerializerSettings.Formatting       = Formatting.Indented;
            Config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = container.GetInstance <IContractResolver>();

            var constraintResolver = new DefaultInlineConstraintResolver();

            constraintResolver.ConstraintMap.Add("objectid", typeof(ObjectIdRouteConstraint));
            constraintResolver.ConstraintMap.Add("objectids", typeof(ObjectIdsRouteConstraint));
            constraintResolver.ConstraintMap.Add("token", typeof(TokenRouteConstraint));
            constraintResolver.ConstraintMap.Add("tokens", typeof(TokensRouteConstraint));
            Config.MapHttpAttributeRoutes(constraintResolver);

            container.RegisterWebApiFilterProvider(Config);

            VerifyContainer(container);

            container.Bootstrap(Config);
            container.Bootstrap(app);
            Log.Info().Message("Starting api...").Write();

            Config.Services.Add(typeof(IExceptionLogger), new NLogExceptionLogger());
            Config.Services.Replace(typeof(IExceptionHandler), container.GetInstance <ExceptionlessReferenceIdExceptionHandler>());

            Config.MessageHandlers.Add(container.GetInstance <XHttpMethodOverrideDelegatingHandler>());
            Config.MessageHandlers.Add(container.GetInstance <EncodingDelegatingHandler>());
            Config.MessageHandlers.Add(container.GetInstance <AuthMessageHandler>());

            // Throttle api calls to X every 15 minutes by IP address.
            Config.MessageHandlers.Add(container.GetInstance <ThrottlingHandler>());

            // Reject event posts in orgs over their max event limits.
            Config.MessageHandlers.Add(container.GetInstance <OverageHandler>());

            app.UseCors(new CorsOptions {
                PolicyProvider = new CorsPolicyProvider
                {
                    PolicyResolver = ctx => Task.FromResult(new CorsPolicy
                    {
                        AllowAnyHeader      = true,
                        AllowAnyMethod      = true,
                        AllowAnyOrigin      = true,
                        SupportsCredentials = true,
                        PreflightMaxAge     = 60 * 5
                    })
                }
            });

            app.CreatePerContext <Lazy <User> >("User", ctx => new Lazy <User>(() => {
                if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated)
                {
                    return(null);
                }

                string userId = ctx.Request.User.GetUserId();
                if (String.IsNullOrEmpty(userId))
                {
                    return(null);
                }

                var userRepository = container.GetInstance <IUserRepository>();
                return(userRepository.GetById(userId, true));
            }));

            app.CreatePerContext <Lazy <Project> >("DefaultProject", ctx => new Lazy <Project>(() => {
                if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated)
                {
                    return(null);
                }

                // TODO: Use project id from url. E.G., /projects/{projectId:objectid}/events
                string projectId      = ctx.Request.User.GetDefaultProjectId();
                var projectRepository = container.GetInstance <IProjectRepository>();

                if (String.IsNullOrEmpty(projectId))
                {
                    var firstOrgId = ctx.Request.User.GetOrganizationIds().FirstOrDefault();
                    if (!String.IsNullOrEmpty(firstOrgId))
                    {
                        var project = projectRepository.GetByOrganizationId(firstOrgId, useCache: true).FirstOrDefault();
                        if (project != null)
                        {
                            return(project);
                        }
                    }

                    if (Settings.Current.WebsiteMode == WebsiteMode.Dev)
                    {
                        var dataHelper = container.GetInstance <DataHelper>();
                        // create a default org and project
                        projectId = dataHelper.CreateDefaultOrganizationAndProject(ctx.Request.GetUser());
                    }
                }

                if (String.IsNullOrEmpty(projectId))
                {
                    return(null);
                }

                return(projectRepository.GetById(projectId, true));
            }));

            app.UseWebApi(Config);
            var resolver = new SimpleInjectorSignalRDependencyResolver(container);

            if (Settings.Current.EnableRedis)
            {
                resolver.UseRedis(new RedisScaleoutConfiguration(Settings.Current.RedisConnectionString, "exceptionless.signalr"));
            }
            app.MapSignalR("/api/v2/push", new HubConfiguration {
                Resolver = resolver
            });

            Config.EnableSwagger("schema/{apiVersion}", c => {
                c.SingleApiVersion("v2", "Exceptionless");
                c.ApiKey("access_token").In("header").Name("access_token").Description("API Key Authentication");
                c.BasicAuth("basic").Description("Basic HTTP Authentication");
                c.IncludeXmlComments(String.Format(@"{0}\bin\Exceptionless.Api.xml", AppDomain.CurrentDomain.BaseDirectory));
                c.IgnoreObsoleteActions();
                c.DocumentFilter <FilterRoutesDocumentFilter>();
            }).EnableSwaggerUi("docs/{*assetPath}", c => {
                c.InjectStylesheet(typeof(AppBuilder).Assembly, "Exceptionless.Api.Content.docs.css");
                c.InjectJavaScript(typeof(AppBuilder).Assembly, "Exceptionless.Api.Content.docs.js");
            });

            Mapper.Configuration.ConstructServicesUsing(container.GetInstance);

            var context = new OwinContext(app.Properties);
            var token   = context.Get <CancellationToken>("host.OnAppDisposing");

            CreateSampleData(container);

            if (Settings.Current.RunJobsInProcess)
            {
                Task.Factory.StartNew(() => container.GetInstance <EventPostsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <EventUserDescriptionsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <MailMessageJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <EventNotificationsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                Task.Factory.StartNew(() => container.GetInstance <WebHooksJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                //Task.Factory.StartNew(() => container.GetInstance<DailySummaryJob>().RunContinuousAsync(delay: TimeSpan.FromMinutes(15), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                //Task.Factory.StartNew(() => container.GetInstance<RetentionLimitsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
                //Task.Factory.StartNew(() => container.GetInstance<StaleAccountsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions();
            }
        }