using Hutopy.Modules.Identity.Configuration; using Hutopy.Modules.Identity.Contracts; using Hutopy.Modules.Identity.Data; using Hutopy.Modules.Identity.Services; using Microsoft.AspNetCore.Identity; namespace Hutopy.Modules.Identity; public static class DependencyInjection { public static WebApplicationBuilder AddIdentityModule( this WebApplicationBuilder builder, Action? configureAction = null) { builder.Services.AddDbContext(configureAction); builder.Services.Configure( builder.Configuration.GetRequiredSection(JwtOptions.SectionName)); builder.Services.AddAuthentication() .AddBearerToken(IdentityConstants.BearerScheme); builder.Services.AddAuthorizationBuilder(); builder.Services .AddIdentityCore() .AddUserManager() .AddRoles() .AddEntityFrameworkStores() .AddApiEndpoints() .AddDefaultTokenProviders(); // Singleton services builder.Services.AddSingleton(TimeProvider.System); // Scoped services builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); return builder; } public static async Task UseIdentityModuleAsync( this IApplicationBuilder app, CancellationToken cancellationToken = default) { IServiceScopeFactory scopeFactory = app.ApplicationServices.GetRequiredService(); using IServiceScope scope = scopeFactory.CreateScope(); await using IdentityDbContext context = scope.ServiceProvider.GetRequiredService(); await context.Database.MigrateAsync(cancellationToken); RoleManager roleManager = scope.ServiceProvider.GetRequiredService>(); await TrySeedAsync(roleManager); return app; } private static async Task TrySeedAsync(RoleManager roleManager) { Role administratorRole = new(KnownRoles.Administrator); if (roleManager.Roles.All(r => r.Name != administratorRole.Name)) { await roleManager.CreateAsync(administratorRole); } Role roleCreator = new(KnownRoles.Creator); if (roleManager.Roles.All(r => r.Name != roleCreator.Name)) { await roleManager.CreateAsync(roleCreator); } } }