using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Abp.Configuration; using Abp.Dependency; using Abp.Domain.Repositories; using Abp.Domain.Uow; using IwbZero.Authorization.Base.SystemInfo; namespace IwbZero.Configuration { /// /// Implements . /// public class SettingStore : ISettingStore, ITransientDependency { private readonly IRepository _settingRepository; private readonly IUnitOfWorkManager _unitOfWorkManager; /// /// Constructor. /// public SettingStore( IRepository settingRepository, IUnitOfWorkManager unitOfWorkManager) { _settingRepository = settingRepository; _unitOfWorkManager = unitOfWorkManager; } [UnitOfWork] public virtual async Task> GetAllListAsync(int? tenantId, long? userId) { /* Combined SetTenantId and DisableFilter for backward compatibility. * SetTenantId switches database (for tenant) if needed. * DisableFilter and Where condition ensures to work even if tenantId is null for single db approach. */ using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { return (await _settingRepository.GetAllListAsync(s => s.UserId == userId && s.TenantId == tenantId)) .Select(s => s.ToSettingInfo()) .ToList(); } } } [UnitOfWork] public virtual async Task GetSettingOrNullAsync(int? tenantId, long? userId, string name) { using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { return (await _settingRepository.FirstOrDefaultAsync(s => s.UserId == userId && s.Name == name && s.TenantId == tenantId)) .ToSettingInfo(); } } } [UnitOfWork] public virtual async Task DeleteAsync(SettingInfo settingInfo) { using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { await _settingRepository.DeleteAsync( s => s.UserId == settingInfo.UserId && s.Name == settingInfo.Name && s.TenantId == settingInfo.TenantId ); await _unitOfWorkManager.Current.SaveChangesAsync(); } } } [UnitOfWork] public virtual async Task CreateAsync(SettingInfo settingInfo) { using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { var setting = await _settingRepository.FirstOrDefaultAsync( s => (s.TenantId == null || s.TenantId == 1) && s.Name == settingInfo.Name ); if (setting != null) { await _settingRepository.InsertAsync(new SysSetting(settingInfo.TenantId, settingInfo.UserId, settingInfo.Name, settingInfo.Value, setting.DisplayName, setting.Type) { Description = setting.Description }); } await _unitOfWorkManager.Current.SaveChangesAsync(); } } } [UnitOfWork] public virtual async Task UpdateAsync(SettingInfo settingInfo) { using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { var setting = await _settingRepository.FirstOrDefaultAsync( s => s.TenantId == settingInfo.TenantId && s.UserId == settingInfo.UserId && s.Name == settingInfo.Name ); if (setting != null) { setting.Value = settingInfo.Value; } await _unitOfWorkManager.Current.SaveChangesAsync(); } } } } }