95 lines
3.2 KiB
C#
95 lines
3.2 KiB
C#
using FinlyticTrades.Database;
|
|
using FinlyticTrades.Entities;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace FinlyticTrades.Services;
|
|
|
|
public interface ISettingsDbService
|
|
{
|
|
/// <summary>
|
|
/// Gets the current settings.
|
|
/// </summary>
|
|
Task<TradesSettingsEntity> GetSettingsAsync();
|
|
/// <summary>
|
|
/// Saves the provided settings.
|
|
/// </summary>
|
|
Task<TradesSettingsEntity> SaveSettingsAsync(TradesSettingsEntity settings);
|
|
/// <summary>
|
|
/// Updates settings from a dictionary of key-value pairs.
|
|
/// </summary>
|
|
Task UpdateSettingsFromDictionaryAsync(Dictionary<string, string> dictionary);
|
|
}
|
|
|
|
public class SettingsDbService : ISettingsDbService
|
|
{
|
|
private readonly TradesDbContext _context;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the SettingsDbService class.
|
|
/// </summary>
|
|
public SettingsDbService(TradesDbContext context)
|
|
{
|
|
_context = context;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the current settings.
|
|
/// </summary>
|
|
public async Task<TradesSettingsEntity> 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Saves the provided settings.
|
|
/// </summary>
|
|
public async Task<TradesSettingsEntity> 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates settings from a dictionary of key-value pairs.
|
|
/// </summary>
|
|
public async Task UpdateSettingsFromDictionaryAsync(Dictionary<string, string> 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);
|
|
}
|
|
}
|