72 lines
2.6 KiB
C#
72 lines
2.6 KiB
C#
using Baya.Domain.Entities.User;
|
|
using Baya.Infrastructure.Identity.Identity.Manager;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Configuration;
|
|
|
|
namespace Baya.Infrastructure.Identity.Identity.SeedDatabaseService;
|
|
|
|
public interface ISeedDataBase
|
|
{
|
|
Task Seed();
|
|
}
|
|
|
|
public class SeedDataBase : ISeedDataBase
|
|
{
|
|
private readonly AppUserManager _userManager;
|
|
private readonly AppRoleManager _roleManager;
|
|
private readonly IConfiguration _configuration;
|
|
|
|
public SeedDataBase(AppUserManager userManager, AppRoleManager roleManager, IConfiguration configuration)
|
|
{
|
|
_userManager = userManager;
|
|
_roleManager = roleManager;
|
|
_configuration = configuration;
|
|
}
|
|
|
|
public async Task Seed()
|
|
{
|
|
// The full role vocabulary: public actor roles (customer/nurse — self-selectable) and the
|
|
// admin sub-roles (internally provisioned only, never self-assignable).
|
|
foreach (var roleName in RoleNames.All)
|
|
{
|
|
if (!_roleManager.Roles.AsNoTracking().Any(r => r.Name.Equals(roleName)))
|
|
{
|
|
await _roleManager.CreateAsync(new Role
|
|
{
|
|
Name = roleName,
|
|
});
|
|
}
|
|
}
|
|
|
|
await SeedBootstrapAdminAsync();
|
|
}
|
|
|
|
// The bootstrap admin is config-driven, never a committed credential: it is created only when both
|
|
// Seed:AdminUsername and Seed:AdminPassword are supplied (via the environment-specific appsettings file, environment
|
|
// variables in a deployment). With neither configured — the default for Testing and any fresh boot —
|
|
// no admin account is created, so no well-known password ever lands in a real database. Day-to-day
|
|
// admins reach the backoffice through the phone-OTP demo seeds (Development) or are provisioned
|
|
// out-of-band; this account is a break-glass bootstrap only.
|
|
private async Task SeedBootstrapAdminAsync()
|
|
{
|
|
var username = _configuration["Seed:AdminUsername"];
|
|
var password = _configuration["Seed:AdminPassword"];
|
|
|
|
if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
|
|
return;
|
|
|
|
if (_userManager.Users.AsNoTracking().Any(u => u.UserName.Equals(username)))
|
|
return;
|
|
|
|
var user = new User
|
|
{
|
|
UserName = username,
|
|
Email = _configuration["Seed:AdminEmail"] ?? "admin@balinyaar.local",
|
|
PhoneNumberConfirmed = true,
|
|
IsActive = true
|
|
};
|
|
|
|
await _userManager.CreateAsync(user, password);
|
|
await _userManager.AddToRoleAsync(user, "admin");
|
|
}
|
|
} |