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