| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- using Abp;
- using Abp.Domain.Repositories;
- using Abp.Domain.Uow;
- using Abp.Events.Bus.Entities;
- using Abp.Events.Bus.Handlers;
- using Abp.Runtime.Caching;
- using Abp.Runtime.Security;
- using VberZero.BaseSystem.MultiTenancy;
- namespace VberZero.MultiTenancy;
- public class TenantCache : ITenantCache, IEventHandler<EntityChangedEventData<Tenant>>
- {
- private readonly ICacheManager _cacheManager;
- private readonly IRepository<Tenant> _tenantRepository;
- private readonly IUnitOfWorkManager _unitOfWorkManager;
- public TenantCache(
- ICacheManager cacheManager,
- IRepository<Tenant> tenantRepository,
- IUnitOfWorkManager unitOfWorkManager)
- {
- _cacheManager = cacheManager;
- _tenantRepository = tenantRepository;
- _unitOfWorkManager = unitOfWorkManager;
- }
- public virtual TenantCacheItem Get(int tenantId)
- {
- var cacheItem = GetOrNull(tenantId);
- if (cacheItem == null)
- {
- throw new AbpException("There is no tenant with given id: " + tenantId);
- }
- return cacheItem;
- }
- public virtual TenantCacheItem Get(string tenancyName)
- {
- var cacheItem = GetOrNull(tenancyName);
- if (cacheItem == null)
- {
- throw new AbpException("There is no tenant with given tenancy name: " + tenancyName);
- }
- return cacheItem;
- }
- public virtual TenantCacheItem GetOrNull(string tenancyName)
- {
- var tenantId = _cacheManager
- .GetTenantByNameCache()
- .Get(
- tenancyName.ToLowerInvariant(),
- () => GetTenantOrNull(tenancyName).Id
- );
- if (tenantId == null)
- {
- return null;
- }
- return Get(tenantId.Value);
- }
- public TenantCacheItem GetOrNull(int tenantId)
- {
- return _cacheManager
- .GetTenantCache()!
- .Get(
- tenantId,
- () =>
- {
- var tenant = GetTenantOrNull(tenantId);
- if (tenant == null)
- {
- return null;
- }
- return CreateTenantCacheItem(tenant);
- }
- );
- }
- public virtual async Task<TenantCacheItem> GetAsync(int tenantId)
- {
- var cacheItem = await GetOrNullAsync(tenantId);
- if (cacheItem == null)
- {
- throw new AbpException("There is no tenant with given id: " + tenantId);
- }
- return cacheItem;
- }
- public virtual async Task<TenantCacheItem> GetAsync(string tenancyName)
- {
- var cacheItem = await GetOrNullAsync(tenancyName);
- if (cacheItem == null)
- {
- throw new AbpException("There is no tenant with given tenancy name: " + tenancyName);
- }
- return cacheItem;
- }
- public virtual async Task<TenantCacheItem> GetOrNullAsync(string tenancyName)
- {
- var tenantId = await _cacheManager
- .GetTenantByNameCache()
- .GetAsync(
- tenancyName.ToLowerInvariant(), async _ => (await GetTenantOrNullAsync(tenancyName)).Id
- );
- if (tenantId == null)
- {
- return null;
- }
- return await GetAsync(tenantId.Value);
- }
- public virtual async Task<TenantCacheItem> GetOrNullAsync(int tenantId)
- {
- return await _cacheManager
- .GetTenantCache()
- .GetAsync(
- tenantId, async _ =>
- {
- var tenant = await GetTenantOrNullAsync(tenantId);
- if (tenant == null)
- {
- return null;
- }
- return CreateTenantCacheItem(tenant);
- }
- );
- }
- protected virtual TenantCacheItem CreateTenantCacheItem(Tenant tenant)
- {
- return new TenantCacheItem
- {
- Id = tenant.Id,
- Name = tenant.Name,
- TenancyName = tenant.TenancyName,
- //EditionId = tenant.EditionId,
- ConnectionString = SimpleStringCipher.Instance.Decrypt(tenant.ConnectionString),
- IsActive = tenant.IsActive
- };
- }
- protected virtual Tenant GetTenantOrNull(int tenantId)
- {
- return _unitOfWorkManager.WithUnitOfWork(() =>
- {
- using (_unitOfWorkManager.Current.SetTenantId(null))
- {
- return _tenantRepository.FirstOrDefault(tenantId);
- }
- });
- }
- protected virtual Tenant GetTenantOrNull(string tenancyName)
- {
- return _unitOfWorkManager.WithUnitOfWork(() =>
- {
- using (_unitOfWorkManager.Current.SetTenantId(null))
- {
- return _tenantRepository.FirstOrDefault(t => t.TenancyName == tenancyName);
- }
- });
- }
- protected virtual async Task<Tenant> GetTenantOrNullAsync(int tenantId)
- {
- return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
- {
- using (_unitOfWorkManager.Current.SetTenantId(null))
- {
- return await _tenantRepository.FirstOrDefaultAsync(tenantId);
- }
- });
- }
- protected virtual async Task<Tenant> GetTenantOrNullAsync(string tenancyName)
- {
- return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
- {
- using (_unitOfWorkManager.Current.SetTenantId(null))
- {
- return await _tenantRepository.FirstOrDefaultAsync(t => t.TenancyName == tenancyName);
- }
- });
- }
- public virtual void HandleEvent(EntityChangedEventData<Tenant> eventData)
- {
- var existingCacheItem = _cacheManager.GetTenantCache().GetOrDefault(eventData.Entity.Id);
- _cacheManager
- .GetTenantByNameCache()
- .Remove(
- existingCacheItem != null
- ? existingCacheItem.TenancyName.ToLowerInvariant()
- : eventData.Entity.TenancyName.ToLowerInvariant()
- );
- _cacheManager
- .GetTenantCache()
- .Remove(eventData.Entity.Id);
- }
- }
|