SettingsService.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. using Microsoft.Extensions.Logging;
  2. using Quadarax.Application.QLiberace.Base.Dtos;
  3. using Quadarax.Application.QLiberace.Base.Entities;
  4. using Quadarax.Application.QLiberace.Base.Repositories;
  5. using Quadarax.Application.QLiberace.Common;
  6. using Quadarax.Application.QLiberace.Common.Attributes;
  7. using Quadarax.Application.QLiberace.Common.Settings;
  8. using Quadarax.Foundation.Core.Business;
  9. using Quadarax.Foundation.Core.Data;
  10. using Quadarax.Foundation.Core.Data.Interface;
  11. using Quadarax.Foundation.Core.Data.Interface.Domain;
  12. using Quadarax.Foundation.Core.Data.Interface.Entity.Dto;
  13. using Quadarax.Foundation.Core.Logging;
  14. using Quadarax.Foundation.Core.Reflection;
  15. namespace Quadarax.Application.QLiberace.Base.Services
  16. {
  17. public class SettingsService : AbstractRepositoryService<RepoSetting>
  18. {
  19. #region *** Constructor ***
  20. public SettingsService(RepoSetting repository, IContext currentContext, IQLogger logger) : base(repository, currentContext, logger)
  21. {
  22. //TODO: add enable (field) functionality in GetSettings, GetSettingsValue, GetSettingsValues, GetSettingValueAsString
  23. //TODO: add method to enable/disable/status setting value
  24. }
  25. #endregion
  26. #region *** Public Operations ***
  27. public ResultPlain CreateSettings<TSettings>(ModuleSetting settings) where TSettings : ModuleSetting
  28. {
  29. if (settings == null)
  30. throw new ArgumentNullException(nameof(settings));
  31. return TryCatchBlock(() =>
  32. {
  33. var attrs = AttributeQuery<ModuleAttribute>.FindAll(typeof(TSettings), true);
  34. if (attrs.Length == 0)
  35. throw new InvalidOperationException(
  36. $"ModuleAttribute is not defined on class '{typeof(TSettings).Name}'.");
  37. if (attrs.Length > 1)
  38. throw new InvalidOperationException(
  39. "ModuleAttribute is defined on more than one ModuleSetting class.");
  40. var settingsFlat = settings.GetData();
  41. foreach (var flat in settingsFlat)
  42. {
  43. var setting = Repository.New();
  44. setting.Code = flat.Item1;
  45. setting.ModuleCode = attrs[0].ModuleCode;
  46. setting.IsEnabled = true;
  47. setting.Description = string.Empty;
  48. setting.ValueTypeQualified = flat.Item2;
  49. setting.Value = flat.Item3?.ToString();
  50. Repository.Set(setting);
  51. }
  52. return new ResultPlain();
  53. });
  54. }
  55. public ResultValueDto<TSettings> GetSettings<TSettings>(string moduleCode) where TSettings : ModuleSetting, new()
  56. {
  57. if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
  58. return TryCatchBlock(() =>
  59. {
  60. if (!Repository.QueryModule(moduleCode, Paging.NoPaging()).Any())
  61. throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundForModuleCode, moduleCode);
  62. var settingDto = Activator.CreateInstance<TSettings>();
  63. if (settingDto == null) throw new ArgumentNullException(nameof(settingDto));
  64. var settings = Repository.QueryModule(moduleCode,Paging.NoPaging());
  65. settingDto.SetData(settings.Select(x=>new Tuple<string, string, object?>(x.Code,x.ValueTypeQualified,x.GetTypedValue())));
  66. return new ResultValueDto<TSettings>(settingDto);
  67. });
  68. }
  69. public ResultValueDto GetSettingsValue<TValue>(string moduleCode, string valueCode)
  70. {
  71. if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
  72. if (string.IsNullOrEmpty(valueCode)) throw new ArgumentNullException(nameof(valueCode));
  73. return TryCatchBlock(() =>
  74. {
  75. var settings = GetSettings(moduleCode, valueCode);
  76. if (settings == null)
  77. throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundCode, valueCode, moduleCode);
  78. return new ResultValueDto(settings.GetTypedValue<TValue>());
  79. });
  80. }
  81. public ResultBoolDto ExistsSettings(string moduleCode)
  82. {
  83. if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
  84. return TryCatchBlock(() =>
  85. {
  86. var result = Repository.QueryModule(moduleCode, Paging.NoPaging()).Any();
  87. return new ResultBoolDto(result);
  88. });
  89. }
  90. public ResultBoolDto ExistsSettingsValue(string moduleCode, string valueCode)
  91. {
  92. if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
  93. if (string.IsNullOrEmpty(valueCode)) throw new ArgumentNullException(nameof(valueCode));
  94. return TryCatchBlock(() =>
  95. {
  96. var result = Repository.QueryModule(moduleCode, Paging.NoPaging()).Any(x => x.Code == valueCode);
  97. return new ResultBoolDto(result);
  98. });
  99. }
  100. public ResultPlain AddSettingsValue<TValue>(string moduleCode, string valueCode, string valueDescription, object value)
  101. {
  102. if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
  103. if (string.IsNullOrEmpty(valueCode)) throw new ArgumentNullException(nameof(valueCode));
  104. return TryCatchBlock<ResultPlain>(() =>
  105. {
  106. var exists = ExistsSettingsValue(moduleCode, valueCode);
  107. if (!exists.IsSuccess) return new ResultPlain(exists.Errors);
  108. if (exists.Value)
  109. throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsAlreadyExistsCode, valueCode, moduleCode);
  110. var settings = Repository.New();
  111. settings.ModuleCode = moduleCode;
  112. settings.Code = valueCode;
  113. settings.Description = valueDescription;
  114. settings.Value = value?.ToString();
  115. var settingsValueTypeQualified = typeof(TValue).FullName;
  116. if (settingsValueTypeQualified != null) settings.ValueTypeQualified = settingsValueTypeQualified;
  117. settings.IsEnabled = true;
  118. //Repository.Commit();
  119. return new ResultPlain();
  120. });
  121. }
  122. public ResultPlain UpdateSettings<TSettings>(ModuleSetting settings) where TSettings : ModuleSetting
  123. {
  124. if (settings == null)
  125. throw new ArgumentNullException(nameof(settings));
  126. return TryCatchBlock(() =>
  127. {
  128. var attrs = AttributeQuery<ModuleAttribute>.FindAll(typeof(TSettings), true);
  129. if (attrs.Length == 0)
  130. throw new InvalidOperationException(
  131. $"ModuleAttribute is not defined on class '{typeof(TSettings).Name}'.");
  132. if (attrs.Length > 1)
  133. throw new InvalidOperationException(
  134. "ModuleAttribute is defined on more than one ModuleSetting class.");
  135. if (!ExistsSettings(attrs[0].ModuleCode).Value)
  136. throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundForModuleCode, attrs[0].ModuleCode);
  137. var settingsFlat = settings.GetData();
  138. foreach (var flat in settingsFlat)
  139. {
  140. var setting = GetSettings(attrs[0].ModuleCode, flat.Item1);
  141. if (setting == null)
  142. throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundCode, flat.Item1, attrs[0].ModuleCode);
  143. setting.Value = GetSettingValueAsString(flat.Item3);
  144. Repository.Set(setting);
  145. }
  146. //Repository.Commit();
  147. return new ResultPlain();
  148. });
  149. }
  150. public ResultPlain UpdateSettingsValue(string moduleCode, string valueCode, object value)
  151. {
  152. if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
  153. if (string.IsNullOrEmpty(valueCode)) throw new ArgumentNullException(nameof(valueCode));
  154. return TryCatchBlock(() =>
  155. {
  156. var exists = ExistsSettingsValue(moduleCode, valueCode);
  157. if (!exists.IsSuccess) return new ResultPlain(exists.Errors);
  158. if (!exists.Value)
  159. throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundCode, valueCode, moduleCode);
  160. var settings = Repository.Get(moduleCode, valueCode);
  161. if (settings==null)
  162. throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundCode, valueCode, moduleCode);
  163. settings.Value = GetSettingValueAsString(value);
  164. Repository.Set(settings);
  165. //Repository.Commit();
  166. return new ResultPlain();
  167. });
  168. }
  169. public ResultPlain AddOrUpdateSettingsValue<TValue>(string moduleCode, string valueCode, object value)
  170. {
  171. return AddOrUpdateSettingsValue<TValue>(moduleCode, valueCode, value, string.Empty);
  172. }
  173. public ResultPlain AddOrUpdateSettingsValue<TValue>(string moduleCode, string valueCode, object value, string valueDescription)
  174. {
  175. if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
  176. if (string.IsNullOrEmpty(valueCode)) throw new ArgumentNullException(nameof(valueCode));
  177. return TryCatchBlock(() =>
  178. {
  179. var exists = ExistsSettingsValue(moduleCode, valueCode);
  180. if (!exists.IsSuccess) return new ResultPlain(exists.Errors);
  181. if (exists.Value)
  182. {
  183. return UpdateSettingsValue(moduleCode, valueCode, value);
  184. }
  185. else
  186. {
  187. return AddSettingsValue<TValue>(moduleCode, valueCode, valueDescription, value);
  188. }
  189. });
  190. }
  191. public ResultSettingsValuesListDto GetSettingsValues(string moduleCode, IPaging paging)
  192. {
  193. if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
  194. return TryCatchBlock(() =>
  195. {
  196. var result = Repository.QueryModule(moduleCode, paging)
  197. .ToDictionary(x => x.Code, y => y.GetTypedValue<object>());
  198. return new ResultSettingsValuesListDto(result);
  199. });
  200. }
  201. #endregion
  202. #region ** Private Operations ***
  203. private Setting? GetSettings(string moduleCode, string valueCode)
  204. {
  205. var settings = Repository.Get(moduleCode, valueCode);
  206. return settings;
  207. }
  208. private string? GetSettingValueAsString(object? value)
  209. {
  210. if (value == null) return null;
  211. if (value is DateTime time)
  212. {
  213. return time.ToString("O");
  214. }
  215. return value.ToString();
  216. }
  217. #endregion
  218. }
  219. }