using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Hosting.StaticWebAssets; using RackPeek.Domain; using RackPeek.Domain.Persistence; using RackPeek.Domain.Persistence.Yaml; using RackPeek.Domain.Resources; using RackPeek.Domain.Resources.Hardware; using RackPeek.Domain.Resources.Services; using RackPeek.Domain.Resources.SystemResources; using RackPeek.Web.Components; using RackPeek.Yaml; using Shared.Rcl; namespace RackPeek.Web; public class Program { public static async Task Main(string[] args) { var builder = WebApplication.CreateBuilder(args); StaticWebAssetsLoader.UseStaticWebAssets( builder.Environment, builder.Configuration ); var yamlDir = builder.Configuration.GetValue("RPK_YAML_DIR") ?? "./config"; var yamlFileName = "config.yaml"; var basePath = Directory.GetCurrentDirectory(); var yamlPath = Path.IsPathRooted(yamlDir) ? yamlDir : Path.Combine(basePath, yamlDir); Directory.CreateDirectory(yamlPath); var yamlFilePath = Path.Combine(yamlPath, yamlFileName); if (!File.Exists(yamlFilePath)) { // Create empty file safely await using var fs = new FileStream( yamlFilePath, FileMode.CreateNew, FileAccess.Write, FileShare.None); // optionally write default YAML content await using var writer = new StreamWriter(fs); await writer.WriteLineAsync("# default config"); } builder.Services.AddScoped(); builder.Services.AddScoped(sp => { var nav = sp.GetRequiredService(); return new HttpClient { BaseAddress = new Uri(nav.BaseUri) }; }); var resources = new ResourceCollection(); builder.Services.AddSingleton(resources); builder.Services.AddScoped(sp => new YamlResourceCollection( yamlFilePath, sp.GetRequiredService(), sp.GetRequiredService())); // Infrastructure builder.Services.AddYamlRepos(); builder.Services.AddUseCases(); builder.Services.AddCommands(); builder.Services.AddScoped(); // Add services to the container. builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseAntiforgery(); app.MapStaticAssets(); app.MapRazorComponents() .AddInteractiveServerRenderMode(); await app.RunAsync(); } }