feat: add backfill for new permissions in super admin role during catalog seeding
This commit is contained in:
@@ -209,6 +209,25 @@ public sealed class BuiltinBackofficeCatalogSeeder(TikuDbContext dbContext)
|
||||
IsActive = true
|
||||
}));
|
||||
|
||||
var superAdminRoleId = await dbContext.PlatformBackendRoles.AsNoTracking()
|
||||
.Where(role => role.Code == PlatformAdminBootstrapper.SuperAdminRoleCode && role.IsSystem)
|
||||
.Select(role => (Guid?)role.Id)
|
||||
.SingleOrDefaultAsync(cancellationToken);
|
||||
if (superAdminRoleId.HasValue)
|
||||
{
|
||||
var boundPermissionCodes = await dbContext.PlatformBackendRolePermissions.AsNoTracking()
|
||||
.Where(binding => binding.RoleId == superAdminRoleId.Value)
|
||||
.Select(binding => binding.PermissionCode)
|
||||
.ToHashSetAsync(StringComparer.Ordinal, cancellationToken);
|
||||
dbContext.PlatformBackendRolePermissions.AddRange(BackendPermissions.Platform
|
||||
.Where(code => !boundPermissionCodes.Contains(code))
|
||||
.Select(code => new PlatformBackendRolePermission
|
||||
{
|
||||
RoleId = superAdminRoleId.Value,
|
||||
PermissionCode = code
|
||||
}));
|
||||
}
|
||||
|
||||
await dbContext.SaveChangesAsync(cancellationToken);
|
||||
}
|
||||
|
||||
|
||||
@@ -95,6 +95,42 @@ public sealed class BuiltinBackofficeCatalogSeederTests
|
||||
!dbContext.BackendPermissions.Any(permission => permission.Code == menu.PermissionCode)));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Seed_backfills_new_permissions_for_existing_system_super_admin()
|
||||
{
|
||||
using var database = PostgresTestDatabase.Create();
|
||||
await using var dbContext = CreateDbContext(database.ConnectionString);
|
||||
var seeder = new BuiltinBackofficeCatalogSeeder(dbContext);
|
||||
await seeder.SeedAsync();
|
||||
var role = new PlatformBackendRole
|
||||
{
|
||||
Code = PlatformAdminBootstrapper.SuperAdminRoleCode,
|
||||
Name = "超级管理员",
|
||||
Status = BackendRoleStatus.Active,
|
||||
IsSystem = true
|
||||
};
|
||||
dbContext.PlatformBackendRoles.Add(role);
|
||||
dbContext.PlatformBackendRolePermissions.Add(new PlatformBackendRolePermission
|
||||
{
|
||||
RoleId = role.Id,
|
||||
PermissionCode = BackendPermissions.PlatformDashboardView
|
||||
});
|
||||
await dbContext.SaveChangesAsync();
|
||||
dbContext.ChangeTracker.Clear();
|
||||
|
||||
await seeder.SeedAsync();
|
||||
dbContext.ChangeTracker.Clear();
|
||||
await seeder.SeedAsync();
|
||||
|
||||
var permissionCodes = await dbContext.PlatformBackendRolePermissions.AsNoTracking()
|
||||
.Where(binding => binding.RoleId == role.Id)
|
||||
.Select(binding => binding.PermissionCode)
|
||||
.ToArrayAsync();
|
||||
Assert.Equal(BackendPermissions.Platform.Count, permissionCodes.Length);
|
||||
Assert.Contains(BackendPermissions.PlatformQuestionBankManage, permissionCodes);
|
||||
Assert.Equal(BackendPermissions.Platform.Count, permissionCodes.Distinct(StringComparer.Ordinal).Count());
|
||||
}
|
||||
|
||||
private static TikuDbContext CreateDbContext(string connectionString)
|
||||
{
|
||||
var options = new DbContextOptionsBuilder<TikuDbContext>()
|
||||
|
||||
Reference in New Issue
Block a user