feat(core): update DTOs, Trade Republic client, Yahoo scrapers, and dynamic settings

This commit is contained in:
2026-08-14 23:55:02 +02:00
parent 3d8af3940b
commit 4f733bf8c3
511 changed files with 1990 additions and 1080548 deletions
@@ -2,7 +2,7 @@ using System;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using FinlyticCore.Models.TradeRepublic;
using FinlyticCore.Dtos.TradeRepublic;
using FinlyticCore.Models.Assets;
using Microsoft.Extensions.Logging;
@@ -53,6 +53,22 @@ public interface ITradeRepublicService
/// <param name="subId">The subscription ID to unsubscribe.</param>
/// <returns>A task representing the async operation.</returns>
Task UnsubscribeRealtimeTickerAsync(int subId);
/// <summary>
/// Fetches stock details (company description, events, earnings, analyst ratings) for a specific ISIN.
/// </summary>
/// <param name="isin">The ISIN of the stock.</param>
/// <param name="cancellationToken">A cancellation token.</param>
/// <returns>The stock details response, or null if failed.</returns>
Task<TradeRepublicStockDetailsResponse?> GetStockDetailsAsync(string isin, CancellationToken cancellationToken = default);
/// <summary>
/// Fetches derivative products (KnockOuts, Warrants, Factor Certificates) for an underlying ISIN.
/// </summary>
/// <param name="request">The derivative query parameters.</param>
/// <param name="cancellationToken">A cancellation token.</param>
/// <returns>The derivatives response, or null if failed.</returns>
Task<TradeRepublicDerivativesResponse?> GetDerivativesAsync(TradeRepublicDerivativesRequest request, CancellationToken cancellationToken = default);
}
public class TradeRepublicService : ITradeRepublicService, IDisposable
@@ -179,6 +195,37 @@ public class TradeRepublicService : ITradeRepublicService, IDisposable
await _client.UnsubscribeTickerAsync(subId);
}
/// <inheritdoc />
public async Task<TradeRepublicStockDetailsResponse?> GetStockDetailsAsync(string isin, CancellationToken cancellationToken = default)
{
try
{
await EnsureConnectedAsync();
var req = new TradeRepublicStockDetailsRequest(Id: isin);
return await _client.SendRequestAsync<TradeRepublicStockDetailsResponse, TradeRepublicStockDetailsRequest>(req, cancellationToken);
}
catch (Exception ex)
{
_logger.LogError(ex, "[{Channel}] Error while fetching stock details for ISIN {Isin}", "TradeRepublicChannel", isin);
return null;
}
}
/// <inheritdoc />
public async Task<TradeRepublicDerivativesResponse?> GetDerivativesAsync(TradeRepublicDerivativesRequest request, CancellationToken cancellationToken = default)
{
try
{
await EnsureConnectedAsync();
return await _client.SendRequestAsync<TradeRepublicDerivativesResponse, TradeRepublicDerivativesRequest>(request, cancellationToken);
}
catch (Exception ex)
{
_logger.LogError(ex, "[{Channel}] Error while fetching derivatives for underlying {Underlying}", "TradeRepublicChannel", request.Underlying);
return null;
}
}
private async void OnInactivityTimeout(object? sender, ElapsedEventArgs e)
{
try