using APCViewer.HostedService; using APCViewer.Models; using APCViewer.Models.Stateless.Methods; using IFX.Shared; using Serilog; using System.Reflection; namespace APCViewer; public class Program { public static int Main(string[] args) { LoggerConfiguration loggerConfiguration = new(); // ConsoleLoggerConfigurationExtensions.Console(loggerConfiguration.WriteTo); Assembly assembly = Assembly.GetExecutingAssembly(); string? assemblyName = assembly.GetName()?.Name; if (string.IsNullOrEmpty(assemblyName)) throw new Exception(); WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(args); AppSettings appSettings = Models.Stateless.AppSettings.Get(webApplicationBuilder.Configuration); if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName)) throw new Exception("Working directory name must have a value!"); string workingDirectory = IWorkingDirectory.GetWorkingDirectory(assemblyName, appSettings.WorkingDirectoryName); Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory); _ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, webApplicationBuilder.Configuration); _ = SerilogHostBuilderExtensions.UseSerilog(webApplicationBuilder.Host); Log.Logger = loggerConfiguration.CreateLogger(); Serilog.ILogger log = Log.ForContext(); try { IsEnvironment isEnvironment = new(webApplicationBuilder.Environment.IsDevelopment(), webApplicationBuilder.Environment.IsStaging(), webApplicationBuilder.Environment.IsProduction()); Singleton.Background background = new(isEnvironment, appSettings, workingDirectory); if (isEnvironment.Development && !string.IsNullOrEmpty("storage.UrlRoot")) throw new Exception(); _ = webApplicationBuilder.Services.AddControllersWithViews(); // _ = webApplicationBuilder.Services.AddRazorPages(configure => configure.Conventions.AuthorizeFolder("/Admin").AddPageRoute("/index", "{*url}")); _ = webApplicationBuilder.Services.AddRazorPages(); _ = webApplicationBuilder.Services.AddSingleton(_ => appSettings); _ = webApplicationBuilder.Services.AddSingleton(_ => isEnvironment); _ = webApplicationBuilder.Services.AddSingleton(_ => background); _ = webApplicationBuilder.Services.AddHostedService(t => new TimedHostedService(isEnvironment, background)); _ = webApplicationBuilder.Services.AddSwaggerGen(); WebApplication webApplication = webApplicationBuilder.Build(); if (isEnvironment.Development) { webApplication.UseWebAssemblyDebugging(); if (!string.IsNullOrEmpty("storage.UrlRoot")) { Environment.ExitCode = -1; webApplication.Lifetime.StopApplication(); } _ = webApplication.UseSwagger(); _ = webApplication.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "APC Viewer API V1")); } else { _ = webApplication.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. _ = webApplication.UseHsts(); } _ = webApplication.Lifetime.ApplicationStopped.Register(Log.CloseAndFlush); _ = ApplicationBuilderSerilogClientExtensions.UseSerilogIngestion(webApplication); _ = SerilogApplicationBuilderExtensions.UseSerilogRequestLogging(webApplication); _ = webApplication.UseDeveloperExceptionPage(); _ = webApplication.UseHttpsRedirection(); _ = webApplication.UseBlazorFrameworkFiles(); _ = webApplication.UseStaticFiles(); _ = webApplication.UseRouting(); _ = webApplication.MapRazorPages(); _ = webApplication.MapControllers(); _ = webApplication.MapFallbackToFile("index.html"); log.Information("Starting Web Application"); webApplication.Run(); return 0; } catch (Exception ex) { log.Fatal(ex, "Host terminated unexpectedly"); return 1; } finally { Log.CloseAndFlush(); } } }