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);
}
}