IwbTenantManager.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using System.Globalization;
  2. using System.Linq;
  3. using System.Text.RegularExpressions;
  4. using System.Threading.Tasks;
  5. using Abp;
  6. using Abp.Application.Features;
  7. using Abp.Domain.Repositories;
  8. using Abp.Domain.Services;
  9. using Abp.Domain.Uow;
  10. using Abp.Events.Bus.Entities;
  11. using Abp.Events.Bus.Handlers;
  12. using Abp.Localization;
  13. using Abp.Runtime.Caching;
  14. using Abp.UI;
  15. using IwbZero.Authorization.Base.Users;
  16. namespace IwbZero.MultiTenancy
  17. {
  18. /// <summary>
  19. /// Tenant manager.
  20. /// Implements domain logic for <see cref="IwbTenant{TUser}"/>.
  21. /// </summary>
  22. /// <typeparam name="TTenant">Type of the application Tenant</typeparam>
  23. /// <typeparam name="TUser">Type of the application User</typeparam>
  24. public class IwbTenantManager<TTenant, TUser> : IDomainService,
  25. IEventHandler<EntityChangedEventData<TTenant>>
  26. where TTenant : IwbTenant<TUser>
  27. where TUser : UserBase
  28. {
  29. // public AbpEditionManager EditionManager { get; set; }
  30. public ILocalizationManager LocalizationManager { get; set; }
  31. protected string LocalizationSourceName { get; set; }
  32. public ICacheManager CacheManager { get; set; }
  33. public IFeatureManager FeatureManager { get; set; }
  34. public IUnitOfWorkManager UnitOfWorkManager { get; set; }
  35. protected IRepository<TTenant> TenantRepository { get; set; }
  36. public IwbTenantManager(
  37. IRepository<TTenant> tenantRepository)
  38. {
  39. TenantRepository = tenantRepository;
  40. LocalizationManager = NullLocalizationManager.Instance;
  41. LocalizationSourceName = IwbZeroConsts.LocalizationSourceName;
  42. }
  43. public virtual IQueryable<TTenant> Tenants => TenantRepository.GetAll();
  44. public virtual async Task CreateAsync(TTenant tenant)
  45. {
  46. await ValidateTenantAsync(tenant);
  47. if (await TenantRepository.FirstOrDefaultAsync(t => t.TenancyName == tenant.TenancyName) != null)
  48. {
  49. throw new UserFriendlyException(string.Format(L("TenancyNameIsAlreadyTaken"), tenant.TenancyName));
  50. }
  51. await TenantRepository.InsertAsync(tenant);
  52. }
  53. public virtual async Task UpdateAsync(TTenant tenant)
  54. {
  55. if (await TenantRepository.FirstOrDefaultAsync(t => t.TenancyName == tenant.TenancyName && t.Id != tenant.Id) != null)
  56. {
  57. throw new UserFriendlyException(string.Format(L("TenancyNameIsAlreadyTaken"), tenant.TenancyName));
  58. }
  59. await TenantRepository.UpdateAsync(tenant);
  60. }
  61. public virtual async Task<TTenant> FindByIdAsync(int id)
  62. {
  63. return await TenantRepository.FirstOrDefaultAsync(a => a.Id == id);
  64. }
  65. public virtual async Task<TTenant> GetByIdAsync(int id)
  66. {
  67. var tenant = await FindByIdAsync(id);
  68. if (tenant == null)
  69. {
  70. throw new AbpException("There is no tenant with id: " + id);
  71. }
  72. return tenant;
  73. }
  74. public virtual Task<TTenant> FindByTenancyNameAsync(string tenancyName)
  75. {
  76. return TenantRepository.FirstOrDefaultAsync(t => t.TenancyName == tenancyName);
  77. }
  78. public virtual async Task DeleteAsync(TTenant tenant)
  79. {
  80. await TenantRepository.DeleteAsync(tenant);
  81. }
  82. protected virtual async Task ValidateTenantAsync(TTenant tenant)
  83. {
  84. await ValidateTenancyNameAsync(tenant.TenancyName);
  85. }
  86. protected virtual Task ValidateTenancyNameAsync(string tenancyName)
  87. {
  88. if (!Regex.IsMatch(tenancyName, TenantBase.TenancyNameRegex))
  89. {
  90. throw new UserFriendlyException(L("InvalidTenancyName"));
  91. }
  92. return Task.FromResult(0);
  93. }
  94. protected virtual string L(string name)
  95. {
  96. return LocalizationManager.GetString(LocalizationSourceName, name);
  97. }
  98. protected virtual string L(string name, CultureInfo cultureInfo)
  99. {
  100. return LocalizationManager.GetString(LocalizationSourceName, name, cultureInfo);
  101. }
  102. public void HandleEvent(EntityChangedEventData<TTenant> eventData)
  103. {
  104. if (eventData.Entity.IsTransient())
  105. {
  106. }
  107. //CacheManager.GetTenantFeatureCache().Remove(eventData.Entity.Id);
  108. }
  109. }
  110. }