using Infrastructure.Persistence.Identity;
using Microsoft.AspNetCore.Identity;
namespace Admin.Extensions
{
public static class WebApplicationExtensions
{
///
/// 초기 관리자 계정 및 Admin 역할을 시드합니다.
/// 계정이 이미 존재하면 Admin 역할만 보장합니다.
///
public static async Task SeedAdminAccountAsync(this WebApplication app)
{
using var scope = app.Services.CreateScope();
var userManager = scope.ServiceProvider.GetRequiredService>();
var roleManager = scope.ServiceProvider.GetRequiredService>();
const string adminEmail = "jino@dpot.dev";
const string adminPassword = "Admin@1234";
const string adminRoleName = "Admin";
// Admin 역할이 없으면 생성
if (!await roleManager.RoleExistsAsync(adminRoleName))
{
await roleManager.CreateAsync(new IdentityRole(adminRoleName));
}
// 관리자 계정이 없으면 생성
var existingUser = await userManager.FindByEmailAsync(adminEmail);
if (existingUser == null)
{
var adminUser = new ApplicationUser
{
UserName = adminEmail,
Email = adminEmail,
EmailConfirmed = true
};
var result = await userManager.CreateAsync(adminUser, adminPassword);
if (result.Succeeded)
{
await userManager.AddToRoleAsync(adminUser, adminRoleName);
Console.WriteLine($"[Seed] 관리자 계정 생성 완료: {adminEmail}");
}
else
{
Console.WriteLine($"[Seed] 관리자 계정 생성 실패: {string.Join(", ", result.Errors.Select(e => e.Description))}");
}
}
else
{
// 기존 계정이 Admin 역할이 없으면 추가
if (!await userManager.IsInRoleAsync(existingUser, adminRoleName))
{
await userManager.AddToRoleAsync(existingUser, adminRoleName);
Console.WriteLine($"[Seed] 기존 계정에 Admin 역할 부여: {adminEmail}");
}
}
}
}
}