fix(auth): SuperAdmin платформы без OrganizationId + отдельный Admin для Demo Market
Some checks are pending
Some checks are pending
admin@food-market.local → SuperAdmin (OrganizationId=null, видит все орги) admin@demo-market.local → Admin Demo Market (новый, для тестов орг-уровня) Idempotent-фикс для существующих БД: исправляет роль и чистит OrganizationId. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
c0824518ab
commit
f61d8bc178
|
|
@ -63,36 +63,63 @@ public async Task StartAsync(CancellationToken ct)
|
|||
|
||||
await SeedTenantReferencesAsync(db, demoOrg.Id, ct);
|
||||
|
||||
const string adminEmail = "admin@food-market.local";
|
||||
var admin = await userMgr.FindByEmailAsync(adminEmail);
|
||||
if (admin is null)
|
||||
// SuperAdmin платформы — без OrganizationId, видит все организации
|
||||
const string superAdminEmail = "admin@food-market.local";
|
||||
var superAdmin = await userMgr.FindByEmailAsync(superAdminEmail);
|
||||
if (superAdmin is null)
|
||||
{
|
||||
admin = new User
|
||||
superAdmin = new User
|
||||
{
|
||||
UserName = adminEmail,
|
||||
Email = adminEmail,
|
||||
UserName = superAdminEmail,
|
||||
Email = superAdminEmail,
|
||||
EmailConfirmed = true,
|
||||
FullName = "System Admin",
|
||||
OrganizationId = demoOrg.Id,
|
||||
FullName = "Platform SuperAdmin",
|
||||
OrganizationId = null,
|
||||
};
|
||||
var result = await userMgr.CreateAsync(admin, "Admin12345!");
|
||||
var result = await userMgr.CreateAsync(superAdmin, "Admin12345!");
|
||||
if (result.Succeeded)
|
||||
{
|
||||
// Только SuperAdmin как Identity-роль. «Администратор» —
|
||||
// организационная роль внутри Employee, не Identity.
|
||||
await userMgr.AddToRoleAsync(admin, SystemRoles.SuperAdmin);
|
||||
}
|
||||
await userMgr.AddToRoleAsync(superAdmin, SystemRoles.SuperAdmin);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!await userMgr.IsInRoleAsync(admin, SystemRoles.SuperAdmin))
|
||||
await userMgr.AddToRoleAsync(admin, SystemRoles.SuperAdmin);
|
||||
// Чистим дублирующую Identity-роль Admin (если оставалась с прошлых сидов).
|
||||
if (await userMgr.IsInRoleAsync(admin, SystemRoles.Admin))
|
||||
await userMgr.RemoveFromRoleAsync(admin, SystemRoles.Admin);
|
||||
// Исправляем старую БД: убираем OrganizationId и пересаживаем на SuperAdmin
|
||||
if (superAdmin.OrganizationId is not null)
|
||||
{
|
||||
superAdmin.OrganizationId = null;
|
||||
await userMgr.UpdateAsync(superAdmin);
|
||||
}
|
||||
var roles = await userMgr.GetRolesAsync(superAdmin);
|
||||
if (!roles.Contains(SystemRoles.SuperAdmin))
|
||||
{
|
||||
await userMgr.RemoveFromRolesAsync(superAdmin, roles);
|
||||
await userMgr.AddToRoleAsync(superAdmin, SystemRoles.SuperAdmin);
|
||||
}
|
||||
}
|
||||
|
||||
await SeedAdminEmployeeAsync(db, demoOrg.Id, admin?.Id, ct);
|
||||
// Admin демо-организации — владелец/директор Demo Market
|
||||
const string demoAdminEmail = "admin@demo-market.local";
|
||||
var demoAdmin = await userMgr.FindByEmailAsync(demoAdminEmail);
|
||||
if (demoAdmin is null)
|
||||
{
|
||||
demoAdmin = new User
|
||||
{
|
||||
UserName = demoAdminEmail,
|
||||
Email = demoAdminEmail,
|
||||
EmailConfirmed = true,
|
||||
FullName = "Demo Market Admin",
|
||||
OrganizationId = demoOrg.Id,
|
||||
};
|
||||
var result = await userMgr.CreateAsync(demoAdmin, "Admin12345!");
|
||||
if (result.Succeeded)
|
||||
await userMgr.AddToRoleAsync(demoAdmin, SystemRoles.Admin);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!await userMgr.IsInRoleAsync(demoAdmin, SystemRoles.Admin))
|
||||
await userMgr.AddToRoleAsync(demoAdmin, SystemRoles.Admin);
|
||||
}
|
||||
|
||||
await SeedAdminEmployeeAsync(db, demoOrg.Id, superAdmin?.Id, ct);
|
||||
|
||||
// Глобальные SystemSettings — single-row. Сидируем дефолт 30 дней
|
||||
// retention если ещё нет записи.
|
||||
|
|
|
|||
Loading…
Reference in a new issue