static void Main(string[] args) { // Load configuration IConfiguration configuration = new ConfigurationBuilder() .AddEnvironmentVariables() .Build(); string keyvault_endpoint = configuration["KEYVAULT_ENDPOINT"]; if (!string.IsNullOrEmpty(keyvault_endpoint)) { ConsoleWrite("Loading configuration from Azure Key Vault: " + keyvault_endpoint); var azureServiceTokenProvider = new AzureServiceTokenProvider(); var keyVaultClient = new KeyVaultClient( new KeyVaultClient.AuthenticationCallback( azureServiceTokenProvider.KeyVaultTokenCallback)); configuration = new ConfigurationBuilder() .AddConfiguration(configuration) .AddAzureKeyVault(keyvault_endpoint, keyVaultClient, new DefaultKeyVaultSecretManager()) .Build(); } IConfigurationSection generalConfig = configuration.GetSection("Settings"); TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById(generalConfig["TimeZone"]); string dbConnectionString = configuration.GetConnectionString("InternalDatabase") ?? string.Empty; MongoDbConnection mongoDatabase = new MongoDbConnection(dbConnectionString); ConsoleWrite($"Time zone for forms: {timeZone}"); IConfigurationSection smtpConfig = configuration.GetSection("SMTP"); SMTPConnectionDetails smtpInfo = new SMTPConnectionDetails() { Host = smtpConfig["hostname"], Port = int.Parse(smtpConfig["port"]), Username = smtpConfig["username"], Password = smtpConfig["password"], ReplyToAddress = smtpConfig["replytoaddress"], FromAddress = smtpConfig["fromaddress"] }; // Start main loop while (true) { ConsoleWrite($"Checking for notifications to send..."); ConsoleWrite($"> Loading schools..."); MongoRepository <School> schoolRepo = new MongoRepository <School>(mongoDatabase); ConsoleWrite($"> Setting up notification handlers..."); NotificationHandler notifications = new NotificationHandler(); // Register notification handlers notifications.RegisterHandler(new EmailNotificationHandler(smtpInfo, timeZone, schoolRepo.GetAll())); ConsoleWrite($"> Checking for notifications..."); // Connect to the DB and check for new submitted forms handleBatch <SubmittedPreKApplicationForm>(mongoDatabase, notifications); handleBatch <SubmittedGeneralRegistrationForm>(mongoDatabase, notifications); // Sleep ConsoleWrite($"Sleeping for {_sleepMinutes} minutes..."); Task.Delay(_sleepMinutes * 60 * 1000).Wait(); } }