public class SettingService(IMartenRepositoryWrapper martenRepositoryWrapper) : ISettingService { public async Task GetSettingAsync(string settingName, CancellationToken cancellationToken = default) { var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType($"Netina.Domain.MartenEntities.Settings.{settingName}"); if (type == null) throw new AppException("Setting not found", ApiResultStatusCode.NotFound); var baseSetting = await martenRepositoryWrapper.SetRepository() .GetEntityAsync(s => s.Name == settingName, cancellationToken); object? setting; if (baseSetting == null) setting = Activator.CreateInstance(type); else setting = JsonConvert.DeserializeObject(baseSetting.JsonData, type) ?? Activator.CreateInstance(type); if (setting == null) throw new AppException("Setting type or base is wrong"); return setting; } public async Task CreateOrUpdateSettingAsync(string settingName, JsonDocument settingObj, CancellationToken cancellationToken = default) { var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType($"Netina.Domain.MartenEntities.Settings.{settingName}"); if (type == null) throw new AppException("Setting not found", ApiResultStatusCode.NotFound); var baseSetting = await martenRepositoryWrapper.SetRepository() .GetEntityAsync(s => s.Name == settingName, cancellationToken); if (baseSetting == null) { baseSetting = new BaseSetting { JsonData = JsonConvert.SerializeObject(settingObj.Deserialize(type)), Name = settingName, DotnetType = type.FullName ?? $"Netina.Domain.MartenEntities.Settings.{settingName}" }; } else { baseSetting.JsonData = JsonConvert.SerializeObject(settingObj.Deserialize(type)); } await martenRepositoryWrapper.SetRepository() .AddOrUpdateEntityAsync(baseSetting, cancellationToken); } }