using System.Net.Http.Headers; using System.Text.Json; using Blazorise; using Blazorise.Bootstrap5; using Blazorise.Icons.FontAwesome; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.Extensions.Options; using Refit; using WatchIt.DTO.Converters; using WatchIt.Website.Clients; using WatchIt.Website.Components; using WatchIt.Website.Services.Authentication; using WatchIt.Website.Services.Tokens; using _Imports = Blazorise._Imports; namespace WatchIt.Website; public static class Program { #region PUBLIC METHODS public static void Main(string[] args) { WebApplicationBuilder builder = WebApplication.CreateBuilder(args); builder.Services.AddResponseCaching(); builder.Services.AddAuthorizationCore(); builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); builder.Services.AddServices(); builder.Services.AddClients(builder.Configuration); builder.Services.AddBlazorise(options => { options.Immediate = true; }) .AddBootstrap5Providers() .AddFontAwesomeIcons(); var app = builder.Build(); app.UseResponseCaching(); AuthenticationTokenProvider.SetTokenGetterFunc(async _ => { using (var scope = app.Services.CreateScope()) { IAuthenticationService service = scope.ServiceProvider.GetRequiredService(); return await service.GetRawAccessTokenAsync() ?? string.Empty; } }); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseAntiforgery(); app.MapStaticAssets(); app.MapRazorComponents() .AddInteractiveServerRenderMode(); app.Run(); } #endregion #region PRIVATE METHODS private static void AddServices(this IServiceCollection services) { services.AddScoped(); services.AddScoped(); } private static void AddClients(this IServiceCollection services, IConfigurationManager configuration) { string baseUri = configuration.GetValue("Clients:BaseAddress")!; Uri BaseUriFunc(string controller) => new Uri($"{baseUri}/{controller}"); RefitSettings settings = new RefitSettings { ContentSerializer = new SystemTextJsonContentSerializer(new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, Converters = { new ColorJsonConverter(), } }), //AuthorizationHeaderValueGetter = (_, token) => AuthenticationTokenProvider.GetTokenAsync(token) }; Action configureHttpClient = (x, prefix) => { x.BaseAddress = BaseUriFunc(prefix); }; services.AddRefitClient(settings).ConfigureHttpClient(x => configureHttpClient(x, "authentication")); services.AddRefitClient(settings).ConfigureHttpClient(x => configureHttpClient(x, "accounts")); services.AddRefitClient(settings).ConfigureHttpClient(x => configureHttpClient(x, "genders")); services.AddRefitClient(settings).ConfigureHttpClient(x => configureHttpClient(x, "genres")); services.AddRefitClient(settings).ConfigureHttpClient(x => configureHttpClient(x, "media")); services.AddRefitClient(settings).ConfigureHttpClient(x => configureHttpClient(x, "people")); services.AddRefitClient(settings).ConfigureHttpClient(x => configureHttpClient(x, "photos")); services.AddRefitClient(settings).ConfigureHttpClient(x => configureHttpClient(x, "roles")); } #endregion }