using System.Globalization; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; using Abp; using Abp.Application.Features; using Abp.Domain.Repositories; using Abp.Domain.Services; using Abp.Domain.Uow; using Abp.Events.Bus.Entities; using Abp.Events.Bus.Handlers; using Abp.Localization; using Abp.Runtime.Caching; using Abp.UI; using IwbZero.Authorization.Base.Users; namespace IwbZero.MultiTenancy { /// /// Tenant manager. /// Implements domain logic for . /// /// Type of the application Tenant /// Type of the application User public class IwbTenantManager : IDomainService, IEventHandler> where TTenant : IwbTenant where TUser : UserBase { // public AbpEditionManager EditionManager { get; set; } public ILocalizationManager LocalizationManager { get; set; } protected string LocalizationSourceName { get; set; } public ICacheManager CacheManager { get; set; } public IFeatureManager FeatureManager { get; set; } public IUnitOfWorkManager UnitOfWorkManager { get; set; } protected IRepository TenantRepository { get; set; } public IwbTenantManager( IRepository tenantRepository) { TenantRepository = tenantRepository; LocalizationManager = NullLocalizationManager.Instance; LocalizationSourceName = IwbZeroConsts.LocalizationSourceName; } public virtual IQueryable Tenants => TenantRepository.GetAll(); public virtual async Task CreateAsync(TTenant tenant) { await ValidateTenantAsync(tenant); if (await TenantRepository.FirstOrDefaultAsync(t => t.TenancyName == tenant.TenancyName) != null) { throw new UserFriendlyException(string.Format(L("TenancyNameIsAlreadyTaken"), tenant.TenancyName)); } await TenantRepository.InsertAsync(tenant); } public virtual async Task UpdateAsync(TTenant tenant) { if (await TenantRepository.FirstOrDefaultAsync(t => t.TenancyName == tenant.TenancyName && t.Id != tenant.Id) != null) { throw new UserFriendlyException(string.Format(L("TenancyNameIsAlreadyTaken"), tenant.TenancyName)); } await TenantRepository.UpdateAsync(tenant); } public virtual async Task FindByIdAsync(int id) { return await TenantRepository.FirstOrDefaultAsync(a => a.Id == id); } public virtual async Task GetByIdAsync(int id) { var tenant = await FindByIdAsync(id); if (tenant == null) { throw new AbpException("There is no tenant with id: " + id); } return tenant; } public virtual Task FindByTenancyNameAsync(string tenancyName) { return TenantRepository.FirstOrDefaultAsync(t => t.TenancyName == tenancyName); } public virtual async Task DeleteAsync(TTenant tenant) { await TenantRepository.DeleteAsync(tenant); } protected virtual async Task ValidateTenantAsync(TTenant tenant) { await ValidateTenancyNameAsync(tenant.TenancyName); } protected virtual Task ValidateTenancyNameAsync(string tenancyName) { if (!Regex.IsMatch(tenancyName, TenantBase.TenancyNameRegex)) { throw new UserFriendlyException(L("InvalidTenancyName")); } return Task.FromResult(0); } protected virtual string L(string name) { return LocalizationManager.GetString(LocalizationSourceName, name); } protected virtual string L(string name, CultureInfo cultureInfo) { return LocalizationManager.GetString(LocalizationSourceName, name, cultureInfo); } public void HandleEvent(EntityChangedEventData eventData) { if (eventData.Entity.IsTransient()) { } //CacheManager.GetTenantFeatureCache().Remove(eventData.Entity.Id); } } }