diff --git a/src/food-market.api/Seed/DevDataSeeder.cs b/src/food-market.api/Seed/DevDataSeeder.cs index 0bdfe89..403c262 100644 --- a/src/food-market.api/Seed/DevDataSeeder.cs +++ b/src/food-market.api/Seed/DevDataSeeder.cs @@ -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 если ещё нет записи.