using Abp.Configuration; using Abp.Dependency; using Abp.Domain.Repositories; using Abp.Domain.Uow; using Abp.MultiTenancy; using VberZero.BaseSystem; namespace VberZero.Settings; /// /// Implements . /// public class SettingStore : ISettingStore, ITransientDependency { private readonly IRepository _settingRepository; private readonly IUnitOfWorkManager _unitOfWorkManager; #pragma warning disable CS0162 private readonly int? _tenantId = VzConsts.MultiTenancyEnabled ? null : MultiTenancyConsts.DefaultTenantId; #pragma warning restore CS0162 /// /// Constructor. /// public SettingStore( IRepository settingRepository, IUnitOfWorkManager unitOfWorkManager) { _settingRepository = settingRepository; _unitOfWorkManager = unitOfWorkManager; } 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. * 组合 SetTenantId 和 DisableFilter 以实现向后兼容性。 * 如果需要,SetTenantId 切换数据库(用于租户)。 * DisableFilter 和 Where 条件确保即使对于单个 db 方法来说,tenantId 为 null 也能正常工作。 */ return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { var settingList = await _settingRepository.GetAllListAsync(s => s.UserId == userId && s.TenantId == tenantId ); return settingList .Select(s => s.ToSettingInfo()) .ToList(); } } }); } public virtual List GetAllList(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. */ return _unitOfWorkManager.WithUnitOfWork(() => { using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { return _settingRepository.GetAllList(s => s.UserId == userId && s.TenantId == tenantId ) .Select(s => s.ToSettingInfo()) .ToList(); } } }); } public virtual async Task GetSettingOrNullAsync(int? tenantId, long? userId, string name) { return await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { var settingInfo = await _settingRepository.FirstOrDefaultAsync(s => s.UserId == userId && s.Name == name && s.TenantId == tenantId ); return settingInfo.ToSettingInfo(); } } }); } public virtual SettingInfo GetSettingOrNull(int? tenantId, long? userId, string name) { return _unitOfWorkManager.WithUnitOfWork(() => { using (_unitOfWorkManager.Current.SetTenantId(tenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { return _settingRepository.FirstOrDefault(s => s.UserId == userId && s.Name == name && s.TenantId == tenantId ).ToSettingInfo(); } } }); } public virtual async Task DeleteAsync(SettingInfo settingInfo) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { 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(); } } }); } public virtual void Delete(SettingInfo settingInfo) { _unitOfWorkManager.WithUnitOfWork(() => { using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { _settingRepository.Delete( s => s.UserId == settingInfo.UserId && s.Name == settingInfo.Name && s.TenantId == settingInfo.TenantId ); _unitOfWorkManager.Current.SaveChanges(); } } }); } public virtual async Task CreateAsync(SettingInfo settingInfo) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { await _settingRepository.InsertAsync(settingInfo.ToSetting()); await _unitOfWorkManager.Current.SaveChangesAsync(); } } }); } public virtual void Create(SettingInfo settingInfo) { _unitOfWorkManager.WithUnitOfWork(() => { using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { _settingRepository.Insert(settingInfo.ToSetting()!); _unitOfWorkManager.Current.SaveChanges(); } } }); } public virtual async Task UpdateAsync(SettingInfo settingInfo) { await _unitOfWorkManager.WithUnitOfWorkAsync(async () => { 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(); } } }); } public virtual void Update(SettingInfo settingInfo) { _unitOfWorkManager.WithUnitOfWork(() => { using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId)) { using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) { var setting = _settingRepository.FirstOrDefault( s => s.TenantId == settingInfo.TenantId && s.UserId == settingInfo.UserId && s.Name == settingInfo.Name ); if (setting != null) { setting.Value = settingInfo.Value; } _unitOfWorkManager.Current.SaveChanges(); } } }); } }