feat(Trades): refactor trades MQTT client and DTOs

This commit is contained in:
2026-08-09 21:01:42 +02:00
parent c74a4456af
commit e7427b7464
21 changed files with 3363 additions and 0 deletions
@@ -0,0 +1,94 @@
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);
}
}