feat(assets): update scanner background service, derivative entities, and dynamic settings

This commit is contained in:
2026-08-14 23:55:47 +02:00
parent 2151fd89f0
commit 4d5ab09bbd
18 changed files with 1318 additions and 71 deletions
+17 -5
View File
@@ -1,12 +1,10 @@
using FinlyticAssets.Entities;
using FinlyticCore.Dtos.Assets;
namespace FinlyticCore.Util;
namespace FinlyticAssets.Util;
public static class AssetMapper
{
public static AssetDto ToDto(this AssetEntity entity)
{
var dtoTags = entity.Tags.Select(t => new TagDto
@@ -83,7 +81,21 @@ public static class AssetMapper
LastUpdatedAt = deriv.LastUpdatedAt,
Tags = dtoTags,
DerivativeProductCategories = deriv.DerivativeProductCategories,
UnderlyingIsin = deriv.UnderlyingIsin
UnderlyingIsin = deriv.UnderlyingIsin,
OptionType = deriv.OptionType.ToString(),
ProductCategoryName = deriv.ProductCategoryName,
NextGenProductCategoryName = deriv.NextGenProductCategoryName,
Strike = deriv.Strike,
Barrier = deriv.Barrier,
Leverage = deriv.Leverage,
Size = deriv.Size,
Factor = deriv.Factor,
Delta = deriv.Delta,
Currency = deriv.Currency,
Expiry = deriv.Expiry,
Issuer = deriv.Issuer,
IssuerDisplayName = deriv.IssuerDisplayName,
IssuerImageId = deriv.IssuerImageId
},
SyntheticEntity synth => new SyntheticDto
{
+25 -6
View File
@@ -1,13 +1,8 @@
using System.Text.Json;
using FinlyticAssets.Entities;
using FinlyticAssets.Services;
using FinlyticCore.Entities.Assets;
using FinlyticCore.Models;
using FinlyticCore.Models.Assets;
using FinlyticCore.Util;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace FinlyticAssets.Util;
@@ -61,6 +56,7 @@ public class AssetsMqttClient(
await SubscribeAsync("services/request/assets_Get/#");
await SubscribeAsync("services/request/assets_Search/#");
await SubscribeAsync("services/request/assets_GetDiscovery/#");
await SubscribeAsync("services/request/assets_GetDerivatives/#");
await SubscribeAsync("services/request/assets_FetchLogo/#");
await SubscribeAsync("services/request/health_Ping/#");
await SubscribeAsync("services/config/updated/#");
@@ -119,6 +115,9 @@ public class AssetsMqttClient(
case "assets_GetDiscovery":
responseData = await HandleAssetsGetDiscoveryAsync(payload, dbService);
break;
case "assets_GetDerivatives":
responseData = (await HandleAssetsGetDerivativesAsync(payload, dbService)).Cast<AssetEntity>().ToList();
break;
}
string defaultResponseTopic = $"services/response/{channel}/{correlationId}";
@@ -216,4 +215,24 @@ public class AssetsMqttClient(
}
return await dbService.GetDiscoveryAssetsAsync(limit);
}
private async Task<List<DerivativeEntity>> HandleAssetsGetDerivativesAsync(string payload, IAssetsDbService dbService)
{
if (string.IsNullOrWhiteSpace(payload)) return [];
try
{
var req = JsonSerializer.Deserialize(payload, FinlyticJsonSerializerContext.Default.GetDerivativesRequest);
if (req != null && !string.IsNullOrEmpty(req.UnderlyingIsin))
{
return await dbService.GetDerivativesByUnderlyingAsync(req.UnderlyingIsin, req.OptionType, req.ShouldForceRefresh);
}
}
catch (Exception ex)
{
logger.LogError(ex, "[{Channel}] Error parsing GetDerivativesRequest payload.", "AssetsChannel");
}
return [];
}
}