using FinlyticTrades.Database; using FinlyticTrades.Entities; using Microsoft.EntityFrameworkCore; namespace FinlyticTrades.Services; public interface ISettingsDbService { /// /// Gets the current settings. /// Task GetSettingsAsync(); /// /// Saves the provided settings. /// Task SaveSettingsAsync(TradesSettingsEntity settings); /// /// Updates settings from a dictionary of key-value pairs. /// Task UpdateSettingsFromDictionaryAsync(Dictionary dictionary); } public class SettingsDbService : ISettingsDbService { private readonly TradesDbContext _context; /// /// Initializes a new instance of the SettingsDbService class. /// public SettingsDbService(TradesDbContext context) { _context = context; } /// /// Gets the current settings. /// public async Task GetSettingsAsync() { var settings = await _context.Settings.AsNoTracking().FirstOrDefaultAsync(); if (settings == null) { settings = new TradesSettingsEntity { Id = Guid.NewGuid() }; _context.Settings.Add(settings); await _context.SaveChangesAsync(); _context.ChangeTracker.Clear(); } return settings; } /// /// Saves the provided settings. /// public async Task SaveSettingsAsync(TradesSettingsEntity 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.AtrStopLossMultiplier = settings.AtrStopLossMultiplier; existing.RiskPerTradePercentage = settings.RiskPerTradePercentage; existing.MaxOpenPositions = settings.MaxOpenPositions; existing.UpdatedAt = settings.UpdatedAt; _context.Settings.Update(existing); } await _context.SaveChangesAsync(); return settings; } /// /// Updates settings from a dictionary of key-value pairs. /// public async Task UpdateSettingsFromDictionaryAsync(Dictionary dictionary) { var settings = await GetSettingsAsync(); foreach (var (key, value) in dictionary) { if (string.Equals(key, "AtrStopLossMultiplier", StringComparison.OrdinalIgnoreCase) && double.TryParse(value, out var atr)) settings.AtrStopLossMultiplier = atr; else if (string.Equals(key, "RiskPerTradePercentage", StringComparison.OrdinalIgnoreCase) && double.TryParse(value, out var risk)) settings.RiskPerTradePercentage = risk; else if (string.Equals(key, "MaxOpenPositions", StringComparison.OrdinalIgnoreCase) && int.TryParse(value, out var maxPos)) settings.MaxOpenPositions = maxPos; } settings.UpdatedAt = DateTime.UtcNow; await SaveSettingsAsync(settings); } }