feat: 先搞一个dbmigrator凑合用
This commit is contained in:
		| @ -1,221 +0,0 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Diagnostics; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Runtime.InteropServices; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.Extensions.Logging; | ||||
| using Microsoft.Extensions.Logging.Abstractions; | ||||
| using Volo.Abp.Data; | ||||
| using Volo.Abp.DependencyInjection; | ||||
| using Volo.Abp.Identity; | ||||
| using Volo.Abp.MultiTenancy; | ||||
| using Volo.Abp.TenantManagement; | ||||
|  | ||||
| namespace KonSoft.Admin.Data; | ||||
|  | ||||
| public class AdminDbMigrationService : ITransientDependency | ||||
| { | ||||
|     private readonly ICurrentTenant _currentTenant; | ||||
|  | ||||
|     private readonly IDataSeeder _dataSeeder; | ||||
|     private readonly IEnumerable<IAdminDbSchemaMigrator> _dbSchemaMigrators; | ||||
|     private readonly ITenantRepository _tenantRepository; | ||||
|  | ||||
|     public AdminDbMigrationService( | ||||
|         IDataSeeder dataSeeder, | ||||
|         IEnumerable<IAdminDbSchemaMigrator> dbSchemaMigrators, | ||||
|         ITenantRepository tenantRepository, | ||||
|         ICurrentTenant currentTenant) | ||||
|     { | ||||
|         _dataSeeder = dataSeeder; | ||||
|         _dbSchemaMigrators = dbSchemaMigrators; | ||||
|         _tenantRepository = tenantRepository; | ||||
|         _currentTenant = currentTenant; | ||||
|  | ||||
|         Logger = NullLogger<AdminDbMigrationService>.Instance; | ||||
|     } | ||||
|  | ||||
|     public ILogger<AdminDbMigrationService> Logger { get; set; } | ||||
|  | ||||
|     public async Task MigrateAsync() | ||||
|     { | ||||
|         var initialMigrationAdded = AddInitialMigrationIfNotExist(); | ||||
|  | ||||
|         if (initialMigrationAdded) | ||||
|         { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         Logger.LogInformation("Started database migrations..."); | ||||
|  | ||||
|         await MigrateDatabaseSchemaAsync(); | ||||
|         await SeedDataAsync(); | ||||
|  | ||||
|         Logger.LogInformation("Successfully completed host database migrations."); | ||||
|  | ||||
|         var tenants = await _tenantRepository.GetListAsync(includeDetails: true); | ||||
|  | ||||
|         var migratedDatabaseSchemas = new HashSet<string>(); | ||||
|         foreach (var tenant in tenants) | ||||
|         { | ||||
|             using (_currentTenant.Change(tenant.Id)) | ||||
|             { | ||||
|                 if (tenant.ConnectionStrings.Any()) | ||||
|                 { | ||||
|                     var tenantConnectionStrings = tenant.ConnectionStrings | ||||
|                         .Select(x => x.Value) | ||||
|                         .ToList(); | ||||
|  | ||||
|                     if (!migratedDatabaseSchemas.IsSupersetOf(tenantConnectionStrings)) | ||||
|                     { | ||||
|                         await MigrateDatabaseSchemaAsync(tenant); | ||||
|  | ||||
|                         migratedDatabaseSchemas.AddIfNotContains(tenantConnectionStrings); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 await SeedDataAsync(tenant); | ||||
|             } | ||||
|  | ||||
|             Logger.LogInformation($"Successfully completed {tenant.Name} tenant database migrations."); | ||||
|         } | ||||
|  | ||||
|         Logger.LogInformation("Successfully completed all database migrations."); | ||||
|         Logger.LogInformation("You can safely end this process..."); | ||||
|     } | ||||
|  | ||||
|     private async Task MigrateDatabaseSchemaAsync(Tenant? tenant = null) | ||||
|     { | ||||
|         Logger.LogInformation( | ||||
|             $"Migrating schema for {(tenant == null ? "host" : tenant.Name + " tenant")} database..."); | ||||
|  | ||||
|         foreach (var migrator in _dbSchemaMigrators) | ||||
|         { | ||||
|             await migrator.MigrateAsync(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private async Task SeedDataAsync(Tenant? tenant = null) | ||||
|     { | ||||
|         Logger.LogInformation($"Executing {(tenant == null ? "host" : tenant.Name + " tenant")} database seed..."); | ||||
|  | ||||
|         await _dataSeeder.SeedAsync(new DataSeedContext(tenant?.Id) | ||||
|             .WithProperty(IdentityDataSeedContributor.AdminEmailPropertyName, | ||||
|                 IdentityDataSeedContributor.AdminEmailDefaultValue) | ||||
|             .WithProperty(IdentityDataSeedContributor.AdminPasswordPropertyName, | ||||
|                 IdentityDataSeedContributor.AdminPasswordDefaultValue) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     private bool AddInitialMigrationIfNotExist() | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             if (!DbMigrationsProjectExists()) | ||||
|             { | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|         catch (Exception) | ||||
|         { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         try | ||||
|         { | ||||
|             if (!MigrationsFolderExists()) | ||||
|             { | ||||
|                 AddInitialMigration(); | ||||
|                 return true; | ||||
|             } | ||||
|  | ||||
|             return false; | ||||
|         } | ||||
|         catch (Exception e) | ||||
|         { | ||||
|             Logger.LogWarning("Couldn't determinate if any migrations exist : " + e.Message); | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private bool DbMigrationsProjectExists() | ||||
|     { | ||||
|         var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); | ||||
|  | ||||
|         return dbMigrationsProjectFolder != null; | ||||
|     } | ||||
|  | ||||
|     private bool MigrationsFolderExists() | ||||
|     { | ||||
|         var dbMigrationsProjectFolder = GetEntityFrameworkCoreProjectFolderPath(); | ||||
|         return dbMigrationsProjectFolder != null && | ||||
|                Directory.Exists(Path.Combine(dbMigrationsProjectFolder, "Migrations")); | ||||
|     } | ||||
|  | ||||
|     private void AddInitialMigration() | ||||
|     { | ||||
|         Logger.LogInformation("Creating initial migration..."); | ||||
|  | ||||
|         string argumentPrefix; | ||||
|         string fileName; | ||||
|  | ||||
|         if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) | ||||
|         { | ||||
|             argumentPrefix = "-c"; | ||||
|             fileName = "/bin/bash"; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             argumentPrefix = "/C"; | ||||
|             fileName = "cmd.exe"; | ||||
|         } | ||||
|  | ||||
|         var procStartInfo = new ProcessStartInfo(fileName, | ||||
|             $"{argumentPrefix} \"abp create-migration-and-run-migrator \"{GetEntityFrameworkCoreProjectFolderPath()}\"\"" | ||||
|         ); | ||||
|  | ||||
|         try | ||||
|         { | ||||
|             Process.Start(procStartInfo); | ||||
|         } | ||||
|         catch (Exception) | ||||
|         { | ||||
|             throw new Exception("Couldn't run ABP CLI..."); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private string? GetEntityFrameworkCoreProjectFolderPath() | ||||
|     { | ||||
|         var slnDirectoryPath = GetSolutionDirectoryPath(); | ||||
|  | ||||
|         if (slnDirectoryPath == null) | ||||
|         { | ||||
|             throw new Exception("Solution folder not found!"); | ||||
|         } | ||||
|  | ||||
|         var srcDirectoryPath = Path.Combine(slnDirectoryPath, "src"); | ||||
|  | ||||
|         return Directory.GetDirectories(srcDirectoryPath) | ||||
|             .FirstOrDefault(d => d.EndsWith(".EntityFrameworkCore")); | ||||
|     } | ||||
|  | ||||
|     private string? GetSolutionDirectoryPath() | ||||
|     { | ||||
|         var currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory()); | ||||
|  | ||||
|         while (currentDirectory != null && Directory.GetParent(currentDirectory.FullName) != null) | ||||
|         { | ||||
|             currentDirectory = Directory.GetParent(currentDirectory.FullName); | ||||
|  | ||||
|             if (currentDirectory != null && | ||||
|                 Directory.GetFiles(currentDirectory.FullName).FirstOrDefault(f => f.EndsWith(".sln")) != null) | ||||
|             { | ||||
|                 return currentDirectory.FullName; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| @ -1,8 +0,0 @@ | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace KonSoft.Admin.Data; | ||||
|  | ||||
| public interface IAdminDbSchemaMigrator | ||||
| { | ||||
|     Task MigrateAsync(); | ||||
| } | ||||
| @ -1,15 +0,0 @@ | ||||
| using System.Threading.Tasks; | ||||
| using Volo.Abp.DependencyInjection; | ||||
|  | ||||
| namespace KonSoft.Admin.Data; | ||||
|  | ||||
| /* This is used if database provider does't define | ||||
|  * IAdminDbSchemaMigrator implementation. | ||||
|  */ | ||||
| public class NullAdminDbSchemaMigrator : IAdminDbSchemaMigrator, ITransientDependency | ||||
| { | ||||
|     public Task MigrateAsync() | ||||
|     { | ||||
|         return Task.CompletedTask; | ||||
|     } | ||||
| } | ||||
| @ -1,331 +0,0 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text.Json; | ||||
| using System.Threading.Tasks; | ||||
| using JetBrains.Annotations; | ||||
| using Microsoft.Extensions.Configuration; | ||||
| using Microsoft.Extensions.Localization; | ||||
| using OpenIddict.Abstractions; | ||||
| using Volo.Abp; | ||||
| using Volo.Abp.Authorization.Permissions; | ||||
| using Volo.Abp.Data; | ||||
| using Volo.Abp.DependencyInjection; | ||||
| using Volo.Abp.OpenIddict.Applications; | ||||
| using Volo.Abp.OpenIddict.Scopes; | ||||
| using Volo.Abp.PermissionManagement; | ||||
| using Volo.Abp.Uow; | ||||
|  | ||||
| namespace KonSoft.Admin.OpenIddict; | ||||
|  | ||||
| /* Creates initial data that is needed to property run the application | ||||
|  * and make client-to-server communication possible. | ||||
|  */ | ||||
| public class OpenIddictDataSeedContributor : IDataSeedContributor, ITransientDependency | ||||
| { | ||||
|     private readonly IAbpApplicationManager _applicationManager; | ||||
|     private readonly IConfiguration _configuration; | ||||
|     private readonly IOpenIddictApplicationRepository _openIddictApplicationRepository; | ||||
|     private readonly IOpenIddictScopeRepository _openIddictScopeRepository; | ||||
|     private readonly IPermissionDataSeeder _permissionDataSeeder; | ||||
|     private readonly IOpenIddictScopeManager _scopeManager; | ||||
|     private readonly IStringLocalizer<OpenIddictResponse> L; | ||||
|  | ||||
|     public OpenIddictDataSeedContributor( | ||||
|         IConfiguration configuration, | ||||
|         IOpenIddictApplicationRepository openIddictApplicationRepository, | ||||
|         IAbpApplicationManager applicationManager, | ||||
|         IOpenIddictScopeRepository openIddictScopeRepository, | ||||
|         IOpenIddictScopeManager scopeManager, | ||||
|         IPermissionDataSeeder permissionDataSeeder, | ||||
|         IStringLocalizer<OpenIddictResponse> l) | ||||
|     { | ||||
|         _configuration = configuration; | ||||
|         _openIddictApplicationRepository = openIddictApplicationRepository; | ||||
|         _applicationManager = applicationManager; | ||||
|         _openIddictScopeRepository = openIddictScopeRepository; | ||||
|         _scopeManager = scopeManager; | ||||
|         _permissionDataSeeder = permissionDataSeeder; | ||||
|         L = l; | ||||
|     } | ||||
|  | ||||
|     [UnitOfWork] | ||||
|     public virtual async Task SeedAsync(DataSeedContext context) | ||||
|     { | ||||
|         await CreateScopesAsync(); | ||||
|         await CreateApplicationsAsync(); | ||||
|     } | ||||
|  | ||||
|     private async Task CreateScopesAsync() | ||||
|     { | ||||
|         if (await _openIddictScopeRepository.FindByNameAsync("Admin") == null) | ||||
|         { | ||||
|             await _scopeManager.CreateAsync(new OpenIddictScopeDescriptor | ||||
|             { | ||||
|                 Name = "Admin", DisplayName = "Admin API", Resources = { "Admin" } | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private async Task CreateApplicationsAsync() | ||||
|     { | ||||
|         var commonScopes = new List<string> | ||||
|         { | ||||
|             OpenIddictConstants.Permissions.Scopes.Address, | ||||
|             OpenIddictConstants.Permissions.Scopes.Email, | ||||
|             OpenIddictConstants.Permissions.Scopes.Phone, | ||||
|             OpenIddictConstants.Permissions.Scopes.Profile, | ||||
|             OpenIddictConstants.Permissions.Scopes.Roles, | ||||
|             "Admin" | ||||
|         }; | ||||
|  | ||||
|         var configurationSection = _configuration.GetSection("OpenIddict:Applications"); | ||||
|  | ||||
|  | ||||
|         // Swagger Client | ||||
|         var swaggerClientId = configurationSection["Admin_Swagger:ClientId"]; | ||||
|         if (!swaggerClientId.IsNullOrWhiteSpace()) | ||||
|         { | ||||
|             var swaggerRootUrl = configurationSection["Admin_Swagger:RootUrl"]?.TrimEnd('/'); | ||||
|  | ||||
|             await CreateApplicationAsync( | ||||
|                 swaggerClientId!, | ||||
|                 OpenIddictConstants.ClientTypes.Public, | ||||
|                 OpenIddictConstants.ConsentTypes.Implicit, | ||||
|                 "Swagger Application", | ||||
|                 null, | ||||
|                 [OpenIddictConstants.GrantTypes.AuthorizationCode], | ||||
|                 commonScopes, | ||||
|                 redirectUri: $"{swaggerRootUrl}/swagger/oauth2-redirect.html", | ||||
|                 clientUri: swaggerRootUrl | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private async Task CreateApplicationAsync( | ||||
|         [NotNull] string name, | ||||
|         [NotNull] string type, | ||||
|         [NotNull] string consentType, | ||||
|         string displayName, | ||||
|         string? secret, | ||||
|         List<string> grantTypes, | ||||
|         List<string> scopes, | ||||
|         string? clientUri = null, | ||||
|         string? redirectUri = null, | ||||
|         string? postLogoutRedirectUri = null, | ||||
|         List<string>? permissions = null) | ||||
|     { | ||||
|         if (!string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Public, | ||||
|                 StringComparison.OrdinalIgnoreCase)) | ||||
|         { | ||||
|             throw new BusinessException(L["NoClientSecretCanBeSetForPublicApplications"]); | ||||
|         } | ||||
|  | ||||
|         if (string.IsNullOrEmpty(secret) && string.Equals(type, OpenIddictConstants.ClientTypes.Confidential, | ||||
|                 StringComparison.OrdinalIgnoreCase)) | ||||
|         { | ||||
|             throw new BusinessException(L["TheClientSecretIsRequiredForConfidentialApplications"]); | ||||
|         } | ||||
|  | ||||
|         var client = await _openIddictApplicationRepository.FindByClientIdAsync(name); | ||||
|  | ||||
|         var application = new AbpApplicationDescriptor | ||||
|         { | ||||
|             ClientId = name, | ||||
|             ClientType = type, | ||||
|             ClientSecret = secret, | ||||
|             ConsentType = consentType, | ||||
|             DisplayName = displayName, | ||||
|             ClientUri = clientUri | ||||
|         }; | ||||
|  | ||||
|         Check.NotNullOrEmpty(grantTypes, nameof(grantTypes)); | ||||
|         Check.NotNullOrEmpty(scopes, nameof(scopes)); | ||||
|  | ||||
|         if (new[] { OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.Implicit }.All( | ||||
|                 grantTypes.Contains)) | ||||
|         { | ||||
|             application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeIdToken); | ||||
|  | ||||
|             if (string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) | ||||
|             { | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeIdTokenToken); | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.CodeToken); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (!redirectUri.IsNullOrWhiteSpace() || !postLogoutRedirectUri.IsNullOrWhiteSpace()) | ||||
|         { | ||||
|             application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Logout); | ||||
|         } | ||||
|  | ||||
|         var buildInGrantTypes = new[] | ||||
|         { | ||||
|             OpenIddictConstants.GrantTypes.Implicit, OpenIddictConstants.GrantTypes.Password, | ||||
|             OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.ClientCredentials, | ||||
|             OpenIddictConstants.GrantTypes.DeviceCode, OpenIddictConstants.GrantTypes.RefreshToken | ||||
|         }; | ||||
|  | ||||
|         foreach (var grantType in grantTypes) | ||||
|         { | ||||
|             if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode) | ||||
|             { | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.AuthorizationCode); | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.Code); | ||||
|             } | ||||
|  | ||||
|             if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode || | ||||
|                 grantType == OpenIddictConstants.GrantTypes.Implicit) | ||||
|             { | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Authorization); | ||||
|             } | ||||
|  | ||||
|             if (grantType == OpenIddictConstants.GrantTypes.AuthorizationCode || | ||||
|                 grantType == OpenIddictConstants.GrantTypes.ClientCredentials || | ||||
|                 grantType == OpenIddictConstants.GrantTypes.Password || | ||||
|                 grantType == OpenIddictConstants.GrantTypes.RefreshToken || | ||||
|                 grantType == OpenIddictConstants.GrantTypes.DeviceCode) | ||||
|             { | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Token); | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Revocation); | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Introspection); | ||||
|             } | ||||
|  | ||||
|             if (grantType == OpenIddictConstants.GrantTypes.ClientCredentials) | ||||
|             { | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.ClientCredentials); | ||||
|             } | ||||
|  | ||||
|             if (grantType == OpenIddictConstants.GrantTypes.Implicit) | ||||
|             { | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.Implicit); | ||||
|             } | ||||
|  | ||||
|             if (grantType == OpenIddictConstants.GrantTypes.Password) | ||||
|             { | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.Password); | ||||
|             } | ||||
|  | ||||
|             if (grantType == OpenIddictConstants.GrantTypes.RefreshToken) | ||||
|             { | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.RefreshToken); | ||||
|             } | ||||
|  | ||||
|             if (grantType == OpenIddictConstants.GrantTypes.DeviceCode) | ||||
|             { | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.GrantTypes.DeviceCode); | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.Endpoints.Device); | ||||
|             } | ||||
|  | ||||
|             if (grantType == OpenIddictConstants.GrantTypes.Implicit) | ||||
|             { | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdToken); | ||||
|                 if (string.Equals(type, OpenIddictConstants.ClientTypes.Public, StringComparison.OrdinalIgnoreCase)) | ||||
|                 { | ||||
|                     application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.IdTokenToken); | ||||
|                     application.Permissions.Add(OpenIddictConstants.Permissions.ResponseTypes.Token); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (!buildInGrantTypes.Contains(grantType)) | ||||
|             { | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.Prefixes.GrantType + grantType); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         var buildInScopes = new[] | ||||
|         { | ||||
|             OpenIddictConstants.Permissions.Scopes.Address, OpenIddictConstants.Permissions.Scopes.Email, | ||||
|             OpenIddictConstants.Permissions.Scopes.Phone, OpenIddictConstants.Permissions.Scopes.Profile, | ||||
|             OpenIddictConstants.Permissions.Scopes.Roles | ||||
|         }; | ||||
|  | ||||
|         foreach (var scope in scopes) | ||||
|         { | ||||
|             if (buildInScopes.Contains(scope)) | ||||
|             { | ||||
|                 application.Permissions.Add(scope); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 application.Permissions.Add(OpenIddictConstants.Permissions.Prefixes.Scope + scope); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (redirectUri != null) | ||||
|         { | ||||
|             if (!redirectUri.IsNullOrEmpty()) | ||||
|             { | ||||
|                 if (!Uri.TryCreate(redirectUri, UriKind.Absolute, out var uri) || !uri.IsWellFormedOriginalString()) | ||||
|                 { | ||||
|                     throw new BusinessException(L["InvalidRedirectUri", redirectUri]); | ||||
|                 } | ||||
|  | ||||
|                 if (application.RedirectUris.All(x => x != uri)) | ||||
|                 { | ||||
|                     application.RedirectUris.Add(uri); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (postLogoutRedirectUri != null) | ||||
|         { | ||||
|             if (!postLogoutRedirectUri.IsNullOrEmpty()) | ||||
|             { | ||||
|                 if (!Uri.TryCreate(postLogoutRedirectUri, UriKind.Absolute, out var uri) || | ||||
|                     !uri.IsWellFormedOriginalString()) | ||||
|                 { | ||||
|                     throw new BusinessException(L["InvalidPostLogoutRedirectUri", postLogoutRedirectUri]); | ||||
|                 } | ||||
|  | ||||
|                 if (application.PostLogoutRedirectUris.All(x => x != uri)) | ||||
|                 { | ||||
|                     application.PostLogoutRedirectUris.Add(uri); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (permissions != null) | ||||
|         { | ||||
|             await _permissionDataSeeder.SeedAsync( | ||||
|                 ClientPermissionValueProvider.ProviderName, | ||||
|                 name, | ||||
|                 permissions | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         if (client == null) | ||||
|         { | ||||
|             await _applicationManager.CreateAsync(application); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (!HasSameRedirectUris(client, application)) | ||||
|         { | ||||
|             client.RedirectUris = | ||||
|                 JsonSerializer.Serialize(application.RedirectUris.Select(q => q.ToString().TrimEnd('/'))); | ||||
|             client.PostLogoutRedirectUris = | ||||
|                 JsonSerializer.Serialize(application.PostLogoutRedirectUris.Select(q => q.ToString().TrimEnd('/'))); | ||||
|  | ||||
|             await _applicationManager.UpdateAsync(client.ToModel()); | ||||
|         } | ||||
|  | ||||
|         if (!HasSameScopes(client, application)) | ||||
|         { | ||||
|             client.Permissions = JsonSerializer.Serialize(application.Permissions.Select(q => q.ToString())); | ||||
|             await _applicationManager.UpdateAsync(client.ToModel()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private bool HasSameRedirectUris(OpenIddictApplication existingClient, AbpApplicationDescriptor application) | ||||
|     { | ||||
|         return existingClient.RedirectUris == | ||||
|                JsonSerializer.Serialize(application.RedirectUris.Select(q => q.ToString().TrimEnd('/'))); | ||||
|     } | ||||
|  | ||||
|     private bool HasSameScopes(OpenIddictApplication existingClient, AbpApplicationDescriptor application) | ||||
|     { | ||||
|         return existingClient.Permissions == | ||||
|                JsonSerializer.Serialize(application.Permissions.Select(q => q.ToString().TrimEnd('/'))); | ||||
|     } | ||||
| } | ||||
| @ -1,34 +0,0 @@ | ||||
| using System; | ||||
| using System.Threading.Tasks; | ||||
| using KonSoft.Admin.Data; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using Microsoft.Extensions.DependencyInjection; | ||||
| using Volo.Abp.DependencyInjection; | ||||
|  | ||||
| namespace KonSoft.Admin.EntityFrameworkCore; | ||||
|  | ||||
| public class EntityFrameworkCoreAdminDbSchemaMigrator | ||||
|     : IAdminDbSchemaMigrator, ITransientDependency | ||||
| { | ||||
|     private readonly IServiceProvider _serviceProvider; | ||||
|  | ||||
|     public EntityFrameworkCoreAdminDbSchemaMigrator( | ||||
|         IServiceProvider serviceProvider) | ||||
|     { | ||||
|         _serviceProvider = serviceProvider; | ||||
|     } | ||||
|  | ||||
|     public async Task MigrateAsync() | ||||
|     { | ||||
|         /* We intentionally resolve the AdminDbContext | ||||
|          * from IServiceProvider (instead of directly injecting it) | ||||
|          * to properly get the connection string of the current tenant in the | ||||
|          * current scope. | ||||
|          */ | ||||
|  | ||||
|         await _serviceProvider | ||||
|             .GetRequiredService<AdminDbContext>() | ||||
|             .Database | ||||
|             .MigrateAsync(); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user