You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.4KB

  1. using Blazored.LocalStorage;
  2. using Blazored.Modal;
  3. using Blazored.Toast;
  4. using Microsoft.AspNetCore.Components.Authorization;
  5. using Microsoft.AspNetCore.Components.Web;
  6. using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
  7. using Microsoft.Extensions.Options;
  8. using ReAct_PME.WebUI;
  9. using ReAct_PME.WebUI.ServicesUI;
  10. var builder = WebAssemblyHostBuilder.CreateDefault(args);
  11. // Composants Blazor
  12. builder.RootComponents.Add<App>("#app");
  13. builder.RootComponents.Add<HeadOutlet>("head::after");
  14. // Blazored
  15. builder.Services.AddBlazoredModal();
  16. builder.Services.AddBlazoredToast();
  17. builder.Services.AddBlazoredLocalStorage();
  18. // Authentification
  19. builder.Services.AddScoped<AuthService>();
  20. builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthenticationStateProvider>();
  21. builder.Services.AddAuthorizationCore();
  22. // Chargement dynamique de config JSON
  23. var http = new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) };
  24. // Charge appsettings.json
  25. using var baseStream = await http.GetStreamAsync("appsettings.json");
  26. var configBuilder = new ConfigurationBuilder().AddJsonStream(baseStream);
  27. // Charge aussi appsettings.Development.json si applicable
  28. if (builder.HostEnvironment.IsDevelopment())
  29. {
  30. var devStream = await http.GetStreamAsync("appsettings.Development.json");
  31. configBuilder.AddJsonStream(devStream);
  32. }
  33. // Charge aussi appsettings.Production.json si applicable
  34. if (builder.HostEnvironment.IsProduction())
  35. {
  36. var prodStream = await http.GetStreamAsync("appsettings.Production.json");
  37. configBuilder.AddJsonStream(prodStream);
  38. }
  39. // Injecte la configuration
  40. var config = configBuilder.Build();
  41. builder.Configuration.AddConfiguration(config);
  42. // Bind les sections "ApiBaseUrls" et "ApiJwtBaseUrls"
  43. builder.Services.Configure<ApiBaseUrls>(config.GetSection("ApiBaseUrls"));
  44. builder.Services.Configure<ApiJwtBaseUrls>(config.GetSection("ApiJwtBaseUrls"));
  45. // DÉTECTION dynamique : IP locale => Local, sinon => Remote
  46. builder.Services.Configure<ApiSettings>(options =>
  47. {
  48. var apiUrls = config.GetSection("ApiBaseUrls").Get<ApiBaseUrls>();
  49. var jwtUrls = config.GetSection("ApiJwtBaseUrls").Get<ApiJwtBaseUrls>();
  50. var baseAddress = new Uri(builder.HostEnvironment.BaseAddress);
  51. var host = baseAddress.Host;
  52. bool isLocal = host.StartsWith("localhost") || host.StartsWith("192.168.") || host.StartsWith("127.0.0.1");
  53. options.ApiBaseUrl = isLocal ? apiUrls!.Local : apiUrls!.Remote;
  54. options.ApiJwtBaseUrl = isLocal ? jwtUrls!.Local : jwtUrls!.Remote;
  55. });
  56. // HttpClient
  57. builder.Services.AddScoped(sp =>
  58. {
  59. var settings = sp.GetRequiredService<IOptions<ApiSettings>>().Value;
  60. return new HttpClient { BaseAddress = new Uri(settings.ApiBaseUrl) };
  61. });
  62. // Auth handler
  63. builder.Services.AddTransient<AuthorizedHttpClientHandler>();
  64. // HttpClient JWT
  65. builder.Services.AddHttpClient<ApiService>((sp, client) =>
  66. {
  67. var settings = sp.GetRequiredService<IOptions<ApiSettings>>().Value;
  68. client.BaseAddress = new Uri(settings.ApiBaseUrl);
  69. }).AddHttpMessageHandler<AuthorizedHttpClientHandler>();
  70. // Variante manuelle
  71. builder.Services.AddScoped(sp =>
  72. {
  73. var settings = sp.GetRequiredService<IOptions<ApiSettings>>().Value;
  74. var handler = sp.GetRequiredService<AuthorizedHttpClientHandler>();
  75. handler.InnerHandler = new HttpClientHandler();
  76. return new HttpClient(handler)
  77. {
  78. BaseAddress = new Uri(settings.ApiBaseUrl)
  79. };
  80. });
  81. await builder.Build().RunAsync();