feat(TA): update technical analysis service
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
using FinlyticTechnicalAnalysis.Database;
|
||||
using FinlyticTechnicalAnalysis.Entities;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace FinlyticTechnicalAnalysis.Services;
|
||||
|
||||
public interface ISettingsDbService
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the settings.
|
||||
/// </summary>
|
||||
Task<TaSettingsEntity> GetSettingsAsync();
|
||||
/// <summary>
|
||||
/// Saves the settings.
|
||||
/// </summary>
|
||||
Task<TaSettingsEntity> SaveSettingsAsync(TaSettingsEntity settings);
|
||||
/// <summary>
|
||||
/// Updates settings from a dictionary.
|
||||
/// </summary>
|
||||
Task UpdateSettingsFromDictionaryAsync(Dictionary<string, string> dictionary);
|
||||
}
|
||||
|
||||
public class SettingsDbService : ISettingsDbService
|
||||
{
|
||||
private readonly TechnicalAnalysisDbContext _context;
|
||||
|
||||
public SettingsDbService(TechnicalAnalysisDbContext context)
|
||||
{
|
||||
_context = context;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the settings.
|
||||
/// </summary>
|
||||
public async Task<TaSettingsEntity> 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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Saves the settings.
|
||||
/// </summary>
|
||||
public async Task<TaSettingsEntity> 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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates settings from a dictionary.
|
||||
/// </summary>
|
||||
public async Task UpdateSettingsFromDictionaryAsync(Dictionary<string, string> 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user