using FinlyticTechnicalAnalysis.Database; using FinlyticTechnicalAnalysis.Entities; using Microsoft.EntityFrameworkCore; namespace FinlyticTechnicalAnalysis.Services; public interface ISettingsDbService { /// /// Gets the settings. /// Task GetSettingsAsync(); /// /// Saves the settings. /// Task SaveSettingsAsync(TaSettingsEntity settings); /// /// Updates settings from a dictionary. /// Task UpdateSettingsFromDictionaryAsync(Dictionary dictionary); } public class SettingsDbService : ISettingsDbService { private readonly TechnicalAnalysisDbContext _context; public SettingsDbService(TechnicalAnalysisDbContext context) { _context = context; } /// /// Gets the settings. /// public async Task GetSettingsAsync() { var settings = await _context.Settings.AsNoTracking().FirstOrDefaultAsync(); if (settings == null) { settings = new TaSettingsEntity { Id = Guid.NewGuid() }; _context.Settings.Add(settings); await _context.SaveChangesAsync(); _context.ChangeTracker.Clear(); } return settings; } /// /// Saves the settings. /// public async Task SaveSettingsAsync(TaSettingsEntity 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.EmaShortPeriod = settings.EmaShortPeriod; existing.SmaMediumPeriod = settings.SmaMediumPeriod; existing.SmaLongPeriod = settings.SmaLongPeriod; existing.RsiOverboughtLimit = settings.RsiOverboughtLimit; existing.RsiOversoldLimit = settings.RsiOversoldLimit; existing.SupertrendMultiplier = settings.SupertrendMultiplier; existing.UpdatedAt = settings.UpdatedAt; _context.Settings.Update(existing); } await _context.SaveChangesAsync(); return settings; } /// /// Updates settings from a dictionary. /// public async Task UpdateSettingsFromDictionaryAsync(Dictionary dictionary) { var settings = await GetSettingsAsync(); foreach (var (key, value) in dictionary) { if (string.Equals(key, "EmaShortPeriod", StringComparison.OrdinalIgnoreCase) && int.TryParse(value, out var esp)) settings.EmaShortPeriod = esp; else if (string.Equals(key, "SmaMediumPeriod", StringComparison.OrdinalIgnoreCase) && int.TryParse(value, out var smp)) settings.SmaMediumPeriod = smp; else if (string.Equals(key, "SmaLongPeriod", StringComparison.OrdinalIgnoreCase) && int.TryParse(value, out var slp)) settings.SmaLongPeriod = slp; else if (string.Equals(key, "RsiOverboughtLimit", StringComparison.OrdinalIgnoreCase) && double.TryParse(value, out var rsiOb)) settings.RsiOverboughtLimit = rsiOb; else if (string.Equals(key, "RsiOversoldLimit", StringComparison.OrdinalIgnoreCase) && double.TryParse(value, out var rsiOs)) settings.RsiOversoldLimit = rsiOs; else if (string.Equals(key, "SupertrendMultiplier", StringComparison.OrdinalIgnoreCase) && double.TryParse(value, out var stm)) settings.SupertrendMultiplier = stm; } settings.UpdatedAt = DateTime.UtcNow; await SaveSettingsAsync(settings); } }