using FinlyticFundamentals.Database; using FinlyticFundamentals.Entities; using Microsoft.EntityFrameworkCore; namespace FinlyticFundamentals.Services; public interface ISettingsDbService { /// /// Gets the settings. /// Task GetSettingsAsync(); /// /// Saves the settings. /// Task SaveSettingsAsync(FundamentalsSettingsEntity settings); /// /// Updates the settings from a dictionary. /// Task UpdateSettingsFromDictionaryAsync(Dictionary dictionary); } public class SettingsDbService : ISettingsDbService { private readonly FundamentalsDbContext _context; public SettingsDbService(FundamentalsDbContext context) { _context = context; } /// /// Gets the settings asynchronously. /// public async Task GetSettingsAsync() { var settings = await _context.Settings.AsNoTracking().FirstOrDefaultAsync(); if (settings == null) { settings = new FundamentalsSettingsEntity { Id = Guid.NewGuid() }; _context.Settings.Add(settings); await _context.SaveChangesAsync(); _context.ChangeTracker.Clear(); } return settings; } /// /// Saves the settings asynchronously. /// public async Task SaveSettingsAsync(FundamentalsSettingsEntity settings) { var existing = await _context.Settings.FirstOrDefaultAsync(); if (existing == null) { if (settings.Id == Guid.Empty) settings.Id = Guid.NewGuid(); _context.Settings.Add(settings); } else { existing.CacheTtlHours = settings.CacheTtlHours; existing.EnableYahooFallback = settings.EnableYahooFallback; existing.UpdatedAt = settings.UpdatedAt; _context.Settings.Update(existing); } await _context.SaveChangesAsync(); return settings; } /// /// Updates the settings from a dictionary asynchronously. /// public async Task UpdateSettingsFromDictionaryAsync(Dictionary dictionary) { var settings = await GetSettingsAsync(); foreach (var (key, value) in dictionary) { if (string.Equals(key, "CacheTtlHours", StringComparison.OrdinalIgnoreCase) && int.TryParse(value, out var ttl)) settings.CacheTtlHours = ttl; else if (string.Equals(key, "EnableYahooFallback", StringComparison.OrdinalIgnoreCase) && bool.TryParse(value, out var fallback)) settings.EnableYahooFallback = fallback; } settings.UpdatedAt = DateTime.UtcNow; await SaveSettingsAsync(settings); } }