TenantAppServiceBase.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using Abp.Application.Services.Dto;
  2. using Abp.Auditing;
  3. using Abp.Authorization;
  4. using Abp.Domain.Repositories;
  5. using Abp.Extensions;
  6. using Abp.Linq.Extensions;
  7. using Abp.Runtime.Security;
  8. using VberZero.AppService.Base;
  9. using VberZero.AppService.Base.Dto;
  10. using VberZero.AppService.MultiTenancy.Dto;
  11. using VberZero.Auditing;
  12. using VberZero.Authorization.Roles;
  13. using VberZero.Authorization.Users;
  14. using VberZero.BaseSystem.MultiTenancy;
  15. using VberZero.BaseSystem.Users;
  16. using VberZero.MultiTenancy;
  17. using VberZero.Tools.StringModel;
  18. namespace VberZero.AppService.MultiTenancy;
  19. [AbpAuthorize, AuditLog("租户管理", "租户")]
  20. public class TenantAppServiceBase : VzCrudAppServiceBase<Tenant, TenantDto, int, VzPagedRequestDto, CreateTenantDto, TenantDto>, ITenantAppServiceBase
  21. {
  22. private readonly VzTenantManager _tenantManager;
  23. //private readonly EditionManager _editionManager;
  24. private readonly VzUserManager _userManager;
  25. private readonly VzRoleManager _roleManager;
  26. private readonly IVzDbMigrator _vzDbMigrator;
  27. public TenantAppServiceBase(
  28. IRepository<Tenant, int> repository,
  29. VzTenantManager tenantManager,
  30. VzUserManager userManager,
  31. VzRoleManager roleManager, IVzDbMigrator vzDbMigrator)
  32. : base(repository)
  33. {
  34. _tenantManager = tenantManager;
  35. _userManager = userManager;
  36. _roleManager = roleManager;
  37. _vzDbMigrator = vzDbMigrator;
  38. }
  39. public override async Task Create(CreateTenantDto input)
  40. {
  41. CheckCreatePermission();
  42. // Create tenant
  43. var tenant = ObjectMapper.Map<Tenant>(input);
  44. tenant.ConnectionString = input.ConnectionString.IsNullOrEmpty()
  45. ? null
  46. : SimpleStringCipher.Instance.Encrypt(input.ConnectionString);
  47. //var defaultEdition = await _editionManager.FindByNameAsync(EditionManager.DefaultEditionName);
  48. //if (defaultEdition != null)
  49. //{
  50. // tenant.EditionId = defaultEdition.Id;
  51. //}
  52. await _tenantManager.CreateAsync(tenant);
  53. await CurrentUnitOfWork.SaveChangesAsync(); // To get new tenant's id.
  54. // Create tenant database
  55. _vzDbMigrator.CreateOrMigrateForTenant(tenant);
  56. // We are working entities of new tenant, so changing tenant filter
  57. using (CurrentUnitOfWork.SetTenantId(tenant.Id))
  58. {
  59. // Create static roles for new tenant
  60. CheckErrors(await _roleManager.CreateStaticRoles(tenant.Id));
  61. await CurrentUnitOfWork.SaveChangesAsync(); // To get static role ids
  62. // Grant all permissions to admin role
  63. var adminRole = _roleManager.Roles.Single(r => r.Name == VzStaticRoleNames.Tenants.Admin);
  64. await _roleManager.GrantAllPermissionsAsync(adminRole);
  65. // Create admin user for the tenant
  66. var adminUser = User.CreateTenantAdminUser(tenant.Id, input.AdminEmailAddress);
  67. await _userManager.InitializeOptionsAsync(tenant.Id);
  68. CheckErrors(await _userManager.CreateAsync(adminUser, User.DefaultPassword));
  69. await CurrentUnitOfWork.SaveChangesAsync(); // To get admin user's id
  70. // Assign admin user to role!
  71. CheckErrors(await _userManager.AddToRoleAsync(adminUser, adminRole.Name));
  72. await CurrentUnitOfWork.SaveChangesAsync();
  73. }
  74. }
  75. protected override void MapToEntity(TenantDto updateInput, Tenant entity)
  76. {
  77. // Manually mapped since TenantDto contains non-editable properties too.
  78. entity.Name = updateInput.Name;
  79. entity.TenancyName = updateInput.TenancyName;
  80. entity.IsActive = updateInput.IsActive;
  81. }
  82. public override async Task Delete(VzEntityDto<int> input)
  83. {
  84. CheckDeletePermission();
  85. var tenant = await _tenantManager.GetByIdAsync(input.Id);
  86. await _tenantManager.DeleteAsync(tenant);
  87. }
  88. [DisableAuditing]
  89. public override async Task<PagedResultDto<TenantDto>> GetAll(VzPagedRequestDto input)
  90. {
  91. var query = CreateFilteredQuery(input);
  92. var totalCount = await AsyncQueryableExecuter.CountAsync(query);
  93. query = ApplySorting(query, input);
  94. query = ApplyPaging(query, input);
  95. var entities = await AsyncQueryableExecuter.ToListAsync(query);
  96. return new PagedResultDto<TenantDto>(totalCount, entities.Select(MapToEntityDto).ToList());
  97. }
  98. protected override IQueryable<T> SelfSorting<T>(IQueryable<T> query, VzPagedRequestDto input)
  99. {
  100. if (query is IQueryable<Tenant> queryable)
  101. return (IQueryable<T>)queryable.OrderBy(r => r.CreationTime);
  102. return query;
  103. }
  104. protected override IQueryable<T> KeyWordFilter<T>(IQueryable<T> query, string keyword)
  105. {
  106. if (query is IQueryable<Tenant> queryable)
  107. return (IQueryable<T>)queryable.WhereIf(keyword.NotEmpty(), a =>
  108. a.Name.Contains(keyword) || a.TenancyName.Contains(keyword));
  109. return query;
  110. }
  111. }