feat: add application preloader, identity roles, and resilient database initialization with automated seeding
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using NexusReader.Domain.Entities;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace NexusReader.Infrastructure.Persistence;
|
||||
|
||||
public static class DbInitializer
|
||||
{
|
||||
public static async Task SeedAsync(IServiceProvider serviceProvider)
|
||||
{
|
||||
using var scope = serviceProvider.CreateScope();
|
||||
var userManager = scope.ServiceProvider.GetRequiredService<UserManager<NexusUser>>();
|
||||
var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();
|
||||
|
||||
try
|
||||
{
|
||||
Console.WriteLine("[Seeder] Starting database seeding...");
|
||||
|
||||
// Seed Roles
|
||||
string[] roleNames = { "Admin", "User" };
|
||||
foreach (var roleName in roleNames)
|
||||
{
|
||||
var roleExist = await roleManager.RoleExistsAsync(roleName);
|
||||
if (!roleExist)
|
||||
{
|
||||
await roleManager.CreateAsync(new IdentityRole(roleName));
|
||||
Console.WriteLine($"[Seeder] Created role: {roleName}");
|
||||
}
|
||||
}
|
||||
|
||||
// Seed Admin User
|
||||
var adminEmail = "admin@nexus.com";
|
||||
var adminUser = await userManager.FindByEmailAsync(adminEmail);
|
||||
|
||||
if (adminUser == null)
|
||||
{
|
||||
adminUser = new NexusUser
|
||||
{
|
||||
UserName = adminEmail,
|
||||
Email = adminEmail,
|
||||
EmailConfirmed = true,
|
||||
CurrentPlan = "Enterprise",
|
||||
AITokenLimit = 1000000,
|
||||
TenantId = Guid.NewGuid()
|
||||
};
|
||||
|
||||
var createPowerUser = await userManager.CreateAsync(adminUser, "Admin123!");
|
||||
if (createPowerUser.Succeeded)
|
||||
{
|
||||
await userManager.AddToRoleAsync(adminUser, "Admin");
|
||||
Console.WriteLine($"[Seeder] Admin user created successfully: {adminEmail}");
|
||||
}
|
||||
else
|
||||
{
|
||||
var errors = string.Join(", ", createPowerUser.Errors.Select(e => e.Description));
|
||||
Console.WriteLine($"[Seeder] Failed to create admin user: {errors}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("[Seeder] Admin user already exists.");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[Seeder] Critical error during seeding: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user