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