SettingStore.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. using Abp.Configuration;
  2. using Abp.Dependency;
  3. using Abp.Domain.Repositories;
  4. using Abp.Domain.Uow;
  5. using Abp.MultiTenancy;
  6. using VberZero.BaseSystem;
  7. namespace VberZero.Settings;
  8. /// <summary>
  9. /// Implements <see cref="ISettingStore"/>.
  10. /// </summary>
  11. public class SettingStore : ISettingStore, ITransientDependency
  12. {
  13. private readonly IRepository<SysSetting, long> _settingRepository;
  14. private readonly IUnitOfWorkManager _unitOfWorkManager;
  15. #pragma warning disable CS0162
  16. private readonly int? _tenantId = VzConsts.MultiTenancyEnabled ? null : MultiTenancyConsts.DefaultTenantId;
  17. #pragma warning restore CS0162
  18. /// <summary>
  19. /// Constructor.
  20. /// </summary>
  21. public SettingStore(
  22. IRepository<SysSetting, long> settingRepository,
  23. IUnitOfWorkManager unitOfWorkManager)
  24. {
  25. _settingRepository = settingRepository;
  26. _unitOfWorkManager = unitOfWorkManager;
  27. }
  28. public virtual async Task<List<SettingInfo>> GetAllListAsync(int? tenantId, long? userId)
  29. {
  30. /* Combined SetTenantId and DisableFilter for backward compatibility.
  31. * SetTenantId switches database (for tenant) if needed.
  32. * DisableFilter and Where condition ensures to work even if tenantId is null for single db approach.
  33. * 组合 SetTenantId 和 DisableFilter 以实现向后兼容性。
  34. * 如果需要,SetTenantId 切换数据库(用于租户)。
  35. * DisableFilter 和 Where 条件确保即使对于单个 db 方法来说,tenantId 为 null 也能正常工作。
  36. */
  37. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  38. {
  39. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  40. {
  41. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  42. {
  43. var settingList = await _settingRepository.GetAllListAsync(s =>
  44. s.UserId == userId && s.TenantId == tenantId
  45. );
  46. return settingList
  47. .Select(s => s.ToSettingInfo())
  48. .ToList();
  49. }
  50. }
  51. });
  52. }
  53. public virtual List<SettingInfo> GetAllList(int? tenantId, long? userId)
  54. {
  55. /* Combined SetTenantId and DisableFilter for backward compatibility.
  56. * SetTenantId switches database (for tenant) if needed.
  57. * DisableFilter and Where condition ensures to work even if tenantId is null for single db approach.
  58. */
  59. return _unitOfWorkManager.WithUnitOfWork(() =>
  60. {
  61. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  62. {
  63. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  64. {
  65. return _settingRepository.GetAllList(s =>
  66. s.UserId == userId && s.TenantId == tenantId
  67. )
  68. .Select(s => s.ToSettingInfo())
  69. .ToList();
  70. }
  71. }
  72. });
  73. }
  74. public virtual async Task<SettingInfo> GetSettingOrNullAsync(int? tenantId, long? userId, string name)
  75. {
  76. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  77. {
  78. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  79. {
  80. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  81. {
  82. var settingInfo = await _settingRepository.FirstOrDefaultAsync(s =>
  83. s.UserId == userId && s.Name == name && s.TenantId == tenantId
  84. );
  85. return settingInfo.ToSettingInfo();
  86. }
  87. }
  88. });
  89. }
  90. public virtual SettingInfo GetSettingOrNull(int? tenantId, long? userId, string name)
  91. {
  92. return _unitOfWorkManager.WithUnitOfWork(() =>
  93. {
  94. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  95. {
  96. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  97. {
  98. return _settingRepository.FirstOrDefault(s =>
  99. s.UserId == userId && s.Name == name && s.TenantId == tenantId
  100. ).ToSettingInfo();
  101. }
  102. }
  103. });
  104. }
  105. public virtual async Task DeleteAsync(SettingInfo settingInfo)
  106. {
  107. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  108. {
  109. using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId))
  110. {
  111. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  112. {
  113. await _settingRepository.DeleteAsync(
  114. s => s.UserId == settingInfo.UserId && s.Name == settingInfo.Name &&
  115. s.TenantId == settingInfo.TenantId
  116. );
  117. await _unitOfWorkManager.Current.SaveChangesAsync();
  118. }
  119. }
  120. });
  121. }
  122. public virtual void Delete(SettingInfo settingInfo)
  123. {
  124. _unitOfWorkManager.WithUnitOfWork(() =>
  125. {
  126. using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId))
  127. {
  128. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  129. {
  130. _settingRepository.Delete(
  131. s => s.UserId == settingInfo.UserId && s.Name == settingInfo.Name &&
  132. s.TenantId == settingInfo.TenantId
  133. );
  134. _unitOfWorkManager.Current.SaveChanges();
  135. }
  136. }
  137. });
  138. }
  139. public virtual async Task CreateAsync(SettingInfo settingInfo)
  140. {
  141. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  142. {
  143. using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId))
  144. {
  145. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  146. {
  147. await _settingRepository.InsertAsync(settingInfo.ToSetting());
  148. await _unitOfWorkManager.Current.SaveChangesAsync();
  149. }
  150. }
  151. });
  152. }
  153. public virtual void Create(SettingInfo settingInfo)
  154. {
  155. _unitOfWorkManager.WithUnitOfWork(() =>
  156. {
  157. using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId))
  158. {
  159. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  160. {
  161. _settingRepository.Insert(settingInfo.ToSetting()!);
  162. _unitOfWorkManager.Current.SaveChanges();
  163. }
  164. }
  165. });
  166. }
  167. public virtual async Task UpdateAsync(SettingInfo settingInfo)
  168. {
  169. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  170. {
  171. using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId))
  172. {
  173. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  174. {
  175. var setting = await _settingRepository.FirstOrDefaultAsync(
  176. s => s.TenantId == settingInfo.TenantId &&
  177. s.UserId == settingInfo.UserId &&
  178. s.Name == settingInfo.Name
  179. );
  180. if (setting != null)
  181. {
  182. setting.Value = settingInfo.Value;
  183. }
  184. await _unitOfWorkManager.Current.SaveChangesAsync();
  185. }
  186. }
  187. });
  188. }
  189. public virtual void Update(SettingInfo settingInfo)
  190. {
  191. _unitOfWorkManager.WithUnitOfWork(() =>
  192. {
  193. using (_unitOfWorkManager.Current.SetTenantId(settingInfo.TenantId))
  194. {
  195. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  196. {
  197. var setting = _settingRepository.FirstOrDefault(
  198. s => s.TenantId == settingInfo.TenantId &&
  199. s.UserId == settingInfo.UserId &&
  200. s.Name == settingInfo.Name
  201. );
  202. if (setting != null)
  203. {
  204. setting.Value = settingInfo.Value;
  205. }
  206. _unitOfWorkManager.Current.SaveChanges();
  207. }
  208. }
  209. });
  210. }
  211. }