Browse Source

Merge pull request #493 from colinin/permissions-init-independent-db-provider

feat(permissions): Make tenant permission initialization independent of a specific database provider
pull/497/head
yx lin 4 years ago
committed by GitHub
parent
commit
ab2b909735
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 37
      aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/EventBus/Handlers/TenantSynchronizer.cs

37
aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/EventBus/Handlers/TenantSynchronizer.cs

@ -11,6 +11,7 @@ using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Repositories;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Guids; using Volo.Abp.Guids;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
@ -25,6 +26,8 @@ public class TenantSynchronizer :
IDistributedEventHandler<EntityDeletedEto<TenantEto>>, IDistributedEventHandler<EntityDeletedEto<TenantEto>>,
ITransientDependency ITransientDependency
{ {
private const string ModelDatabaseProviderAnnotationKey = "_Abp_DatabaseProvider";
protected ILogger<TenantSynchronizer> Logger { get; } protected ILogger<TenantSynchronizer> Logger { get; }
protected ICurrentTenant CurrentTenant { get; } protected ICurrentTenant CurrentTenant { get; }
protected IGuidGenerator GuidGenerator { get; } protected IGuidGenerator GuidGenerator { get; }
@ -64,21 +67,31 @@ public class TenantSynchronizer :
// EfCore MySql 批量删除还是一条一条的语句? // EfCore MySql 批量删除还是一条一条的语句?
// PermissionGrantRepository.GetDbSet().RemoveRange(grantPermissions); // PermissionGrantRepository.GetDbSet().RemoveRange(grantPermissions);
var dbContext = await PermissionGrantRepository.GetDbContextAsync(); var dbContext = await PermissionGrantRepository.GetDbContextAsync();
var dbProvider = (EfCoreDatabaseProvider?)dbContext.Model[ModelDatabaseProviderAnnotationKey];
if (dbProvider != null)
{
var permissionEntityType = dbContext.Model.FindEntityType(typeof(PermissionGrant)); var permissionEntityType = dbContext.Model.FindEntityType(typeof(PermissionGrant));
var permissionTableName = permissionEntityType.GetTableName(); var permissionTableName = permissionEntityType.GetTableName();
var batchRmovePermissionSql = string.Empty; var batchRmovePermissionSql = string.Empty;
if (dbContext.Database.IsMySql()) switch (dbProvider)
{ {
case EfCoreDatabaseProvider.MySql:
batchRmovePermissionSql = BuildMySqlBatchDeleteScript(permissionTableName, eventData.Entity.Id); batchRmovePermissionSql = BuildMySqlBatchDeleteScript(permissionTableName, eventData.Entity.Id);
} break;
else case EfCoreDatabaseProvider.SqlServer:
{
batchRmovePermissionSql = BuildSqlServerBatchDeleteScript(permissionTableName, eventData.Entity.Id); batchRmovePermissionSql = BuildSqlServerBatchDeleteScript(permissionTableName, eventData.Entity.Id);
break;
default:
Logger.LogWarning($"Tenant permissions data has not removed, Because database provider: {dbProvider} batch statements are not defined!");
return;
} }
await dbContext.Database.ExecuteSqlRawAsync(batchRmovePermissionSql); await dbContext.Database.ExecuteSqlRawAsync(batchRmovePermissionSql);
await unitOfWork.SaveChangesAsync(); await unitOfWork.SaveChangesAsync();
Logger.LogInformation("The tenant permissions data has removed!");
}
} }
} }
@ -117,16 +130,23 @@ public class TenantSynchronizer :
// await PermissionGrantRepository.GetDbSet().AddRangeAsync(grantPermissions); // await PermissionGrantRepository.GetDbSet().AddRangeAsync(grantPermissions);
var dbContext = await PermissionGrantRepository.GetDbContextAsync(); var dbContext = await PermissionGrantRepository.GetDbContextAsync();
var dbProvider = (EfCoreDatabaseProvider?)dbContext.Model[ModelDatabaseProviderAnnotationKey];
if (dbProvider != null)
{
var permissionEntityType = dbContext.Model.FindEntityType(typeof(PermissionGrant)); var permissionEntityType = dbContext.Model.FindEntityType(typeof(PermissionGrant));
var permissionTableName = permissionEntityType.GetTableName(); var permissionTableName = permissionEntityType.GetTableName();
var batchInsertPermissionSql = string.Empty; var batchInsertPermissionSql = string.Empty;
if (dbContext.Database.IsMySql()) switch (dbProvider)
{ {
case EfCoreDatabaseProvider.MySql:
batchInsertPermissionSql = BuildMySqlBatchInsertScript(permissionTableName, eventData.Id, grantPermissions); batchInsertPermissionSql = BuildMySqlBatchInsertScript(permissionTableName, eventData.Id, grantPermissions);
} break;
else case EfCoreDatabaseProvider.SqlServer:
{
batchInsertPermissionSql = BuildSqlServerBatchInsertScript(permissionTableName, eventData.Id, grantPermissions); batchInsertPermissionSql = BuildSqlServerBatchInsertScript(permissionTableName, eventData.Id, grantPermissions);
break;
default:
Logger.LogWarning($"Tenant permissions data has not initialized, Because database provider: {dbProvider} batch statements are not defined!");
return;
} }
await dbContext.Database.ExecuteSqlRawAsync(batchInsertPermissionSql); await dbContext.Database.ExecuteSqlRawAsync(batchInsertPermissionSql);
@ -136,6 +156,7 @@ public class TenantSynchronizer :
} }
} }
} }
}
protected virtual string BuildMySqlBatchInsertScript(string tableName, Guid tenantId, string[] permissions) protected virtual string BuildMySqlBatchInsertScript(string tableName, Guid tenantId, string[] permissions)
{ {

Loading…
Cancel
Save