diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityDataSeeder.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityDataSeeder.cs index 0ff9e5a55a..16e00c55d6 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityDataSeeder.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityDataSeeder.cs @@ -1,12 +1,14 @@ using System; using System.Threading.Tasks; +using JetBrains.Annotations; namespace Volo.Abp.Identity { public interface IIdentityDataSeeder { Task SeedAsync( - string adminUserPassword, + [NotNull] string adminEmail, + [NotNull] string adminPassword, Guid? tenantId = null); } } \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeedContributor.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeedContributor.cs new file mode 100644 index 0000000000..21cda46613 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeedContributor.cs @@ -0,0 +1,25 @@ +using System.Threading.Tasks; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Identity +{ + public class IdentityDataSeedContributor : IDataSeedContributor, ITransientDependency + { + private readonly IIdentityDataSeeder _identityDataSeeder; + + public IdentityDataSeedContributor(IIdentityDataSeeder identityDataSeeder) + { + _identityDataSeeder = identityDataSeeder; + } + + public Task SeedAsync(DataSeedContext context) + { + return _identityDataSeeder.SeedAsync( + context["AdminEmail"] as string ?? "admin@abp.io", + context["AdminPassword"] as string ?? "1q2w3E*", + context.TenantId + ); + } + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs index 09718049de..20fb67dd06 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; using Volo.Abp.DependencyInjection; @@ -35,34 +34,53 @@ namespace Volo.Abp.Identity [UnitOfWork] public virtual async Task SeedAsync( - string adminUserPassword, + string adminEmail, + string adminPassword, Guid? tenantId = null) { + Check.NotNullOrWhiteSpace(adminEmail, nameof(adminEmail)); + Check.NotNullOrWhiteSpace(adminPassword, nameof(adminPassword)); + var result = new IdentityDataSeedResult(); + //"admin" user const string adminUserName = "admin"; - const string adminRoleName = "admin"; + var adminUser = await _userRepository.FindByNormalizedUserNameAsync( + _lookupNormalizer.Normalize(adminUserName) + ); - //"admin" user - var adminUser = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize(adminUserName)); if (adminUser != null) { return result; } - adminUser = new IdentityUser(_guidGenerator.Create(), adminUserName, "admin@abp.io", tenantId); - adminUser.Name = adminUserName; - (await _userManager.CreateAsync(adminUser, adminUserPassword)).CheckErrors(); + adminUser = new IdentityUser( + _guidGenerator.Create(), + adminUserName, + adminEmail, + tenantId + ) + { + Name = adminUserName + }; + + (await _userManager.CreateAsync(adminUser, adminPassword)).CheckErrors(); result.CreatedAdminUser = true; //"admin" role + const string adminRoleName = "admin"; var adminRole = await _roleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize(adminRoleName)); if (adminRole == null) { - adminRole = new IdentityRole(_guidGenerator.Create(), adminRoleName, tenantId); - - adminRole.IsStatic = true; - adminRole.IsPublic = true; + adminRole = new IdentityRole( + _guidGenerator.Create(), + adminRoleName, + tenantId + ) + { + IsStatic = true, + IsPublic = true + }; (await _roleManager.CreateAsync(adminRole)).CheckErrors(); result.CreatedAdminRole = true; diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestBaseModule.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestBaseModule.cs index f99f70da72..b52136a082 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestBaseModule.cs +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestBaseModule.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Authorization; using Volo.Abp.Autofac; +using Volo.Abp.Data; using Volo.Abp.Modularity; using Volo.Abp.Threading; @@ -28,8 +29,8 @@ namespace Volo.Abp.Identity { using (var scope = context.ServiceProvider.CreateScope()) { - var dataSeeder = scope.ServiceProvider.GetRequiredService(); - AsyncHelper.RunSync(() => dataSeeder.SeedAsync("1q2w3E*")); + var dataSeeder = scope.ServiceProvider.GetRequiredService(); + AsyncHelper.RunSync(() => dataSeeder.SeedAsync()); scope.ServiceProvider .GetRequiredService() diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityDataSeeder_Tests.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityDataSeeder_Tests.cs index a8e31dd6e5..a30cb6dd05 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityDataSeeder_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityDataSeeder_Tests.cs @@ -25,7 +25,7 @@ namespace Volo.Abp.Identity [Fact] public async Task Should_Create_Admin_User_And_Role() { - await _identityDataSeeder.SeedAsync("1q2w3E*"); + await _identityDataSeeder.SeedAsync("admin@abp.io", "1q2w3E*"); (await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("admin"))).ShouldNotBeNull(); (await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("admin"))).Name.ShouldBe("admin"); diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeedContributor.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeedContributor.cs new file mode 100644 index 0000000000..203082828b --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeedContributor.cs @@ -0,0 +1,38 @@ +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Data; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.PermissionManagement +{ + public class PermissionDataSeedContributor : IDataSeedContributor, ITransientDependency + { + protected IPermissionDefinitionManager PermissionDefinitionManager { get; } + protected IPermissionDataSeeder PermissionDataSeeder { get; } + + public PermissionDataSeedContributor( + IPermissionDefinitionManager permissionDefinitionManager, + IPermissionDataSeeder permissionDataSeeder) + { + PermissionDefinitionManager = permissionDefinitionManager; + PermissionDataSeeder = permissionDataSeeder; + } + + public Task SeedAsync(DataSeedContext context) + { + var permissionNames = PermissionDefinitionManager + .GetPermissions() + .Select(p => p.Name) + //TODO: Filter host/tenant permissions! + .ToArray(); + + return PermissionDataSeeder.SeedAsync( + RolePermissionValueProvider.ProviderName, + "admin", + permissionNames, + context.TenantId + ); + } + } +} diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs index 8578d29090..c8b7c93311 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs @@ -3,32 +3,38 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; +using Volo.Abp.Data; namespace Volo.Abp.TenantManagement { [Authorize(TenantManagementPermissions.Tenants.Default)] public class TenantAppService : TenantManagementAppServiceBase, ITenantAppService { - private readonly ITenantRepository _tenantRepository; - private readonly ITenantManager _tenantManager; + protected IDataSeeder DataSeeder { get; } + protected ITenantRepository TenantRepository { get; } + protected ITenantManager TenantManager { get; } - public TenantAppService(ITenantRepository tenantRepository, ITenantManager tenantManager) + public TenantAppService( + ITenantRepository tenantRepository, + ITenantManager tenantManager, + IDataSeeder dataSeeder) { - _tenantRepository = tenantRepository; - _tenantManager = tenantManager; + DataSeeder = dataSeeder; + TenantRepository = tenantRepository; + TenantManager = tenantManager; } public async Task GetAsync(Guid id) { return ObjectMapper.Map( - await _tenantRepository.GetAsync(id) + await TenantRepository.GetAsync(id) ); } public async Task> GetListAsync(GetTenantsInput input) { - var count = await _tenantRepository.GetCountAsync(); - var list = await _tenantRepository.GetListAsync(input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter); + var count = await TenantRepository.GetCountAsync(); + var list = await TenantRepository.GetListAsync(input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter); return new PagedResultDto( count, @@ -39,30 +45,39 @@ namespace Volo.Abp.TenantManagement [Authorize(TenantManagementPermissions.Tenants.Create)] public async Task CreateAsync(TenantCreateDto input) { - var tenant = await _tenantManager.CreateAsync(input.Name); - await _tenantRepository.InsertAsync(tenant); + var tenant = await TenantManager.CreateAsync(input.Name); + await TenantRepository.InsertAsync(tenant); + + using (CurrentTenant.Change(tenant.Id, tenant.Name)) + { + //TODO: Handle database creation? + + //TODO: Set admin email & password..? + await DataSeeder.SeedAsync(tenant.Id); + } + return ObjectMapper.Map(tenant); } [Authorize(TenantManagementPermissions.Tenants.Update)] public async Task UpdateAsync(Guid id, TenantUpdateDto input) { - var tenant = await _tenantRepository.GetAsync(id); - await _tenantManager.ChangeNameAsync(tenant, input.Name); - await _tenantRepository.UpdateAsync(tenant); + var tenant = await TenantRepository.GetAsync(id); + await TenantManager.ChangeNameAsync(tenant, input.Name); + await TenantRepository.UpdateAsync(tenant); return ObjectMapper.Map(tenant); } [Authorize(TenantManagementPermissions.Tenants.Delete)] public async Task DeleteAsync(Guid id) { - var tenant = await _tenantRepository.FindAsync(id); + var tenant = await TenantRepository.FindAsync(id); if (tenant == null) { return; } - await _tenantRepository.DeleteAsync(tenant); + await TenantRepository.DeleteAsync(tenant); } } } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs index 004673784b..f22b508afb 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs @@ -1,5 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.AutoMapper; +using Volo.Abp.AutoMapper; using Volo.Abp.Data; using Volo.Abp.Domain; using Volo.Abp.Modularity;