Browse Source

Implement seed contributors for identity & permission modules and use from tenant management module #924.

pull/926/head
Halil ibrahim Kalkan 7 years ago
parent
commit
40ed47f7dd
  1. 4
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityDataSeeder.cs
  2. 25
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeedContributor.cs
  3. 42
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityDataSeeder.cs
  4. 5
      modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestBaseModule.cs
  5. 2
      modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityDataSeeder_Tests.cs
  6. 38
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDataSeedContributor.cs
  7. 45
      modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs
  8. 3
      modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/AbpTenantManagementDomainModule.cs

4
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<IdentityDataSeedResult> SeedAsync(
string adminUserPassword,
[NotNull] string adminEmail,
[NotNull] string adminPassword,
Guid? tenantId = null);
}
}

25
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
);
}
}
}

42
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<IdentityDataSeedResult> 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;

5
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<IIdentityDataSeeder>();
AsyncHelper.RunSync(() => dataSeeder.SeedAsync("1q2w3E*"));
var dataSeeder = scope.ServiceProvider.GetRequiredService<IDataSeeder>();
AsyncHelper.RunSync(() => dataSeeder.SeedAsync());
scope.ServiceProvider
.GetRequiredService<AbpIdentityTestDataBuilder>()

2
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");

38
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
);
}
}
}

45
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<TenantDto> GetAsync(Guid id)
{
return ObjectMapper.Map<Tenant, TenantDto>(
await _tenantRepository.GetAsync(id)
await TenantRepository.GetAsync(id)
);
}
public async Task<PagedResultDto<TenantDto>> 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<TenantDto>(
count,
@ -39,30 +45,39 @@ namespace Volo.Abp.TenantManagement
[Authorize(TenantManagementPermissions.Tenants.Create)]
public async Task<TenantDto> 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, TenantDto>(tenant);
}
[Authorize(TenantManagementPermissions.Tenants.Update)]
public async Task<TenantDto> 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, TenantDto>(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);
}
}
}

3
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;

Loading…
Cancel
Save