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);
|
await SeedTenantReferencesAsync(db, demoOrg.Id, ct);
|
||||||
|
|
||||||
const string adminEmail = "admin@food-market.local";
|
// SuperAdmin платформы — без OrganizationId, видит все организации
|
||||||
var admin = await userMgr.FindByEmailAsync(adminEmail);
|
const string superAdminEmail = "admin@food-market.local";
|
||||||
if (admin is null)
|
var superAdmin = await userMgr.FindByEmailAsync(superAdminEmail);
|
||||||
|
if (superAdmin is null)
|
||||||
{
|
{
|
||||||
admin = new User
|
superAdmin = new User
|
||||||
{
|
{
|
||||||
UserName = adminEmail,
|
UserName = superAdminEmail,
|
||||||
Email = adminEmail,
|
Email = superAdminEmail,
|
||||||
EmailConfirmed = true,
|
EmailConfirmed = true,
|
||||||
FullName = "System Admin",
|
FullName = "Platform SuperAdmin",
|
||||||
OrganizationId = demoOrg.Id,
|
OrganizationId = null,
|
||||||
};
|
};
|
||||||
var result = await userMgr.CreateAsync(admin, "Admin12345!");
|
var result = await userMgr.CreateAsync(superAdmin, "Admin12345!");
|
||||||
if (result.Succeeded)
|
if (result.Succeeded)
|
||||||
{
|
await userMgr.AddToRoleAsync(superAdmin, SystemRoles.SuperAdmin);
|
||||||
// Только SuperAdmin как Identity-роль. «Администратор» —
|
|
||||||
// организационная роль внутри Employee, не Identity.
|
|
||||||
await userMgr.AddToRoleAsync(admin, SystemRoles.SuperAdmin);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!await userMgr.IsInRoleAsync(admin, SystemRoles.SuperAdmin))
|
// Исправляем старую БД: убираем OrganizationId и пересаживаем на SuperAdmin
|
||||||
await userMgr.AddToRoleAsync(admin, SystemRoles.SuperAdmin);
|
if (superAdmin.OrganizationId is not null)
|
||||||
// Чистим дублирующую Identity-роль Admin (если оставалась с прошлых сидов).
|
{
|
||||||
if (await userMgr.IsInRoleAsync(admin, SystemRoles.Admin))
|
superAdmin.OrganizationId = null;
|
||||||
await userMgr.RemoveFromRoleAsync(admin, SystemRoles.Admin);
|
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 дней
|
// Глобальные SystemSettings — single-row. Сидируем дефолт 30 дней
|
||||||
// retention если ещё нет записи.
|
// retention если ещё нет записи.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue