Program.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using Microsoft.AspNetCore.Components;
  2. using Microsoft.AspNetCore.Hosting.StaticWebAssets;
  3. using RackPeek.Domain;
  4. using RackPeek.Domain.Persistence;
  5. using RackPeek.Domain.Persistence.Yaml;
  6. using RackPeek.Web.Components;
  7. using DocMigrator.Yaml;
  8. using YamlDotNet.Serialization;
  9. using YamlDotNet.Serialization.NamingConventions;
  10. using Shared.Rcl;
  11. namespace RackPeek.Web;
  12. public class Program
  13. {
  14. public static async Task<WebApplication> BuildApp(WebApplicationBuilder builder)
  15. {
  16. StaticWebAssetsLoader.UseStaticWebAssets(
  17. builder.Environment,
  18. builder.Configuration
  19. );
  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. // Create empty file safely
  31. await using var fs = new FileStream(
  32. yamlFilePath,
  33. FileMode.CreateNew,
  34. FileAccess.Write,
  35. FileShare.None);
  36. // optionally write default YAML content
  37. await using var writer = new StreamWriter(fs);
  38. await writer.WriteLineAsync("# default config");
  39. }
  40. builder.Services.AddScoped<ITextFileStore, PhysicalTextFileStore>();
  41. builder.Services.AddSingleton<RackPeekConfigMigrationDeserializer>(sp =>
  42. {
  43. var logger = sp.GetRequiredService<ILogger<YamlMigrationDeserializer<YamlRoot>>>();
  44. // TODO: Add options
  45. var deserializerBuilder = new DeserializerBuilder()
  46. .WithNamingConvention(CamelCaseNamingConvention.Instance)
  47. .IgnoreUnmatchedProperties();
  48. var serializerBuilder = new SerializerBuilder()
  49. .WithNamingConvention(CamelCaseNamingConvention.Instance);
  50. return new RackPeekConfigMigrationDeserializer(
  51. sp,
  52. logger,
  53. deserializerBuilder,
  54. serializerBuilder);
  55. });
  56. builder.Services.AddScoped(sp =>
  57. {
  58. var nav = sp.GetRequiredService<NavigationManager>();
  59. return new HttpClient
  60. {
  61. BaseAddress = new Uri(nav.BaseUri)
  62. };
  63. });
  64. var resources = new ResourceCollection();
  65. builder.Services.AddSingleton(resources);
  66. builder.Services.AddScoped<IResourceCollection>(sp =>
  67. new YamlResourceCollection(
  68. yamlFilePath,
  69. sp.GetRequiredService<ITextFileStore>(),
  70. sp.GetRequiredService<ResourceCollection>(),
  71. sp.GetRequiredService<RackPeekConfigMigrationDeserializer>()));
  72. // Infrastructure
  73. builder.Services.AddYamlRepos();
  74. builder.Services.AddUseCases();
  75. builder.Services.AddCommands();
  76. builder.Services.AddScoped<IConsoleEmulator, ConsoleEmulator>();
  77. // Add services to the container.
  78. builder.Services.AddRazorComponents()
  79. .AddInteractiveServerComponents();
  80. var app = builder.Build();
  81. // Configure the HTTP request pipeline.
  82. if (!app.Environment.IsDevelopment())
  83. {
  84. app.UseExceptionHandler("/Error");
  85. // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
  86. app.UseHsts();
  87. }
  88. app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
  89. app.UseHttpsRedirection();
  90. app.UseStaticFiles();
  91. app.UseAntiforgery();
  92. app.MapStaticAssets();
  93. app.MapRazorComponents<App>()
  94. .AddInteractiveServerRenderMode();
  95. return app;
  96. }
  97. public static async Task Main(string[] args)
  98. {
  99. var builder = WebApplication.CreateBuilder(args);
  100. var app = await BuildApp(builder);
  101. await app.RunAsync();
  102. }
  103. }