using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; namespace ZymonicServices; public class ZymonicSettings : IZymonicSettings { private IZymonicDbContextFactory _contextFactory; private IZymonicLogger _logger; public ZymonicSettings(IZymonicDbContextFactory contextFactory, IZymonicLogger logger, string? baseUri = null, string? systemName = null) { _contextFactory = contextFactory; _logger = logger; if (baseUri != null) { Setting("BaseUri", baseUri); } if (systemName != null) { Setting("SystemName", systemName); } } public string BaseUri() { string? baseUri = Setting("BaseUri"); if (baseUri is null) { throw new ZymonicBasicSettingNotFound("BaseUri"); } return baseUri; } public Dictionary SettingCache { get; set; } = new Dictionary(); public string? Setting(string key, string? value = null, bool noCache = false) { ZymonicSetting? setting; IZymonicDbContext _context; // This is most likely the first use of DbContext so try/catch here try { _context = _contextFactory.CreateDbContext(); } catch (Exception ex) { _logger.LogError("Couldn't create Db Context - {Exception}", ex); throw; } if (noCache || !SettingCache.ContainsKey(key)) { setting = _context.Set().Where(x => x.Key == key).SingleOrDefault(); if (setting is not null) { SettingCache[key] = setting; } } else { setting = SettingCache[key]; } if (value == null) { if (setting != null) { value = setting.Value; } } else if (setting != null) { setting.Value = value; SettingCache[key] = setting; _context.Set().Update(setting); _context.SaveChangesAsync(); } else { setting = new ZymonicSetting { Key = key, Value = value }; SettingCache[key] = setting; _context.Set().Add(setting); _context.SaveChangesAsync(); } return value; } public void ClearSetting(string key) { IZymonicDbContext _context = _contextFactory.CreateDbContext(); ZymonicSetting? setting = _context.Set().Where(x => x.Key == key).SingleOrDefault(); if (setting != null) { setting.Value = null; _context.Set().Update(setting); _context.SaveChangesAsync(); } } public string SystemName() { string? systemName = Setting("SystemName"); if (systemName is null) { throw new ZymonicBasicSettingNotFound("systemName"); } return systemName; } } [ZymonicLocalDbSet] public class ZymonicSetting { [Key] public required string Key { get; set; } public string? Value { get; set; } } public class ZymonicBasicSettingNotFound : Exception { public ZymonicBasicSettingNotFound(string message) : base(message) { } }