Program.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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.Git;
  6. using RackPeek.Domain.Git.UseCases;
  7. using RackPeek.Domain.Git.Queries;
  8. using RackPeek.Domain.Persistence;
  9. using RackPeek.Domain.Persistence.Yaml;
  10. using RackPeek.Web.Api;
  11. using RackPeek.Web.Components;
  12. using Shared.Rcl;
  13. namespace RackPeek.Web;
  14. public class Program {
  15. public static async Task<WebApplication> BuildApp(WebApplicationBuilder builder) {
  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. builder.Services.AddSingleton<IGitRepository>(new LibGit2GitRepository(yamlPath));
  28. builder.Services.AddSingleton<IInitRepoUseCase, InitRepoUseCase>();
  29. builder.Services.AddSingleton<ICommitAllUseCase, CommitAllUseCase>();
  30. builder.Services.AddSingleton<IRestoreAllUseCase, RestoreAllUseCase>();
  31. builder.Services.AddSingleton<IPushUseCase, PushUseCase>();
  32. builder.Services.AddSingleton<IPullUseCase, PullUseCase>();
  33. builder.Services.AddSingleton<IAddRemoteUseCase, AddRemoteUseCase>();
  34. builder.Services.AddSingleton<IGetStatusQuery, GetStatusQuery>();
  35. builder.Services.AddSingleton<IGetBranchQuery, GetBranchQuery>();
  36. builder.Services.AddSingleton<IGetDiffQuery, GetDiffQuery>();
  37. builder.Services.AddSingleton<IGetChangedFilesQuery, GetChangedFilesQuery>();
  38. builder.Services.AddSingleton<IGetLogQuery, GetLogQuery>();
  39. builder.Services.AddSingleton<IGetSyncStatusQuery, GetSyncStatusQuery>();
  40. var yamlFilePath = Path.Combine(yamlPath, yamlFileName);
  41. if (!File.Exists(yamlFilePath)) {
  42. await using var fs = new FileStream(
  43. yamlFilePath,
  44. FileMode.CreateNew,
  45. FileAccess.Write,
  46. FileShare.None);
  47. await using var writer = new StreamWriter(fs);
  48. await writer.WriteLineAsync("# default config");
  49. }
  50. builder.Services.ConfigureHttpJsonOptions(options => {
  51. options.SerializerOptions.Converters.Add(
  52. new JsonStringEnumConverter());
  53. });
  54. builder.Services.AddScoped<ITextFileStore, PhysicalTextFileStore>();
  55. builder.Services.AddScoped(sp => {
  56. NavigationManager nav = sp.GetRequiredService<NavigationManager>();
  57. return new HttpClient {
  58. BaseAddress = new Uri(nav.BaseUri)
  59. };
  60. });
  61. var resources = new ResourceCollection();
  62. builder.Services.AddSingleton(resources);
  63. builder.Services.AddScoped<RackPeekConfigMigrationDeserializer>();
  64. builder.Services.AddScoped<IResourceYamlMigrationService, ResourceYamlMigrationService>();
  65. builder.Services.AddScoped<IResourceCollection>(sp =>
  66. new YamlResourceCollection(
  67. yamlFilePath,
  68. sp.GetRequiredService<ITextFileStore>(),
  69. sp.GetRequiredService<ResourceCollection>(),
  70. sp.GetRequiredService<IResourceYamlMigrationService>()));
  71. // Infrastructure
  72. builder.Services.AddYamlRepos();
  73. builder.Services.AddUseCases();
  74. builder.Services.AddCommands();
  75. builder.Services.AddScoped<IConsoleEmulator, ConsoleEmulator>();
  76. // Razor Components
  77. builder.Services.AddRazorComponents()
  78. .AddInteractiveServerComponents();
  79. WebApplication app = builder.Build();
  80. if (!app.Environment.IsDevelopment()) {
  81. app.UseExceptionHandler("/Error");
  82. app.UseHsts();
  83. }
  84. app.UseHttpsRedirection();
  85. app.UseStaticFiles();
  86. app.UseRouting();
  87. app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
  88. app.UseAntiforgery();
  89. app.MapInventoryApi();
  90. app.MapStaticAssets();
  91. app.MapRazorComponents<App>()
  92. .AddInteractiveServerRenderMode();
  93. return app;
  94. }
  95. public static async Task Main(string[] args) {
  96. WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
  97. WebApplication app = await BuildApp(builder);
  98. await app.RunAsync();
  99. }
  100. }