Program.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using System.Text.Json.Serialization;
  2. using Microsoft.AspNetCore.Components;
  3. using Microsoft.AspNetCore.Hosting.StaticWebAssets;
  4. using RackPeek.Domain;
  5. using RackPeek.Domain.Persistence;
  6. using RackPeek.Domain.Persistence.Yaml;
  7. using RackPeek.Web.Api;
  8. using RackPeek.Web.Components;
  9. using Shared.Rcl;
  10. namespace RackPeek.Web;
  11. public class Program
  12. {
  13. public static async Task<WebApplication> BuildApp(WebApplicationBuilder builder)
  14. {
  15. StaticWebAssetsLoader.UseStaticWebAssets(
  16. builder.Environment,
  17. builder.Configuration
  18. );
  19. builder.Configuration.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false);
  20. var yamlDir = builder.Configuration.GetValue<string>("RPK_YAML_DIR") ?? "./config";
  21. var yamlFileName = "config.yaml";
  22. var basePath = Directory.GetCurrentDirectory();
  23. var yamlPath = Path.IsPathRooted(yamlDir)
  24. ? yamlDir
  25. : Path.Combine(basePath, yamlDir);
  26. Directory.CreateDirectory(yamlPath);
  27. var yamlFilePath = Path.Combine(yamlPath, yamlFileName);
  28. if (!File.Exists(yamlFilePath))
  29. {
  30. await using var fs = new FileStream(
  31. yamlFilePath,
  32. FileMode.CreateNew,
  33. FileAccess.Write,
  34. FileShare.None);
  35. await using var writer = new StreamWriter(fs);
  36. await writer.WriteLineAsync("# default config");
  37. }
  38. builder.Services.ConfigureHttpJsonOptions(options =>
  39. {
  40. options.SerializerOptions.Converters.Add(
  41. new JsonStringEnumConverter());
  42. });
  43. builder.Services.AddScoped<ITextFileStore, PhysicalTextFileStore>();
  44. builder.Services.AddScoped(sp =>
  45. {
  46. var nav = sp.GetRequiredService<NavigationManager>();
  47. return new HttpClient
  48. {
  49. BaseAddress = new Uri(nav.BaseUri)
  50. };
  51. });
  52. var resources = new ResourceCollection();
  53. builder.Services.AddSingleton(resources);
  54. builder.Services.AddScoped<RackPeekConfigMigrationDeserializer>();
  55. builder.Services.AddScoped<IResourceYamlMigrationService, ResourceYamlMigrationService>();
  56. builder.Services.AddScoped<IResourceCollection>(sp =>
  57. new YamlResourceCollection(
  58. yamlFilePath,
  59. sp.GetRequiredService<ITextFileStore>(),
  60. sp.GetRequiredService<ResourceCollection>(),
  61. sp.GetRequiredService<IResourceYamlMigrationService>()));
  62. // Infrastructure
  63. builder.Services.AddYamlRepos();
  64. builder.Services.AddUseCases();
  65. builder.Services.AddCommands();
  66. builder.Services.AddScoped<IConsoleEmulator, ConsoleEmulator>();
  67. // Razor Components
  68. builder.Services.AddRazorComponents()
  69. .AddInteractiveServerComponents();
  70. var app = builder.Build();
  71. if (!app.Environment.IsDevelopment())
  72. {
  73. app.UseExceptionHandler("/Error");
  74. app.UseHsts();
  75. }
  76. app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
  77. app.UseHttpsRedirection();
  78. app.UseStaticFiles();
  79. app.UseAntiforgery();
  80. app.MapInventoryApi();
  81. app.MapStaticAssets();
  82. app.MapRazorComponents<App>()
  83. .AddInteractiveServerRenderMode();
  84. return app;
  85. }
  86. public static async Task Main(string[] args)
  87. {
  88. var builder = WebApplication.CreateBuilder(args);
  89. var app = await BuildApp(builder);
  90. await app.RunAsync();
  91. }
  92. }