chore(infra): update compose configurations, mqtt health bridge, and export scripts
This commit is contained in:
@@ -83,6 +83,7 @@ public class AdminSettingsController : ControllerBase
|
||||
["FinlyticAnalyzer"] = "engine",
|
||||
["FinlyticTrades"] = "engine",
|
||||
["FinlyticBot"] = "bot",
|
||||
["FinlyticNotify"] = "notify",
|
||||
// FinlyticSimulation was previously missing from this map entirely, so its settings
|
||||
// (SimulationSettingKeys: slippage/fee defaults, matrix-recompute schedule, etc.) never showed up
|
||||
// in the admin UI's settings screen even though the sim_settings_GetAll/Update RPC channels exist.
|
||||
@@ -209,6 +210,7 @@ public class AdminSettingsController : ControllerBase
|
||||
("FinlyticFundamentals", $"{MqttTopics.Channels.HealthPing}/FinlyticFundamentals", "Financial Statements & Estimates", "PostgreSQL fundamentals"),
|
||||
("FinlyticEngine", $"{MqttTopics.Channels.HealthPing}/FinlyticEngine", "Strategy Screener & Signals", "PostgreSQL engine"),
|
||||
("FinlyticBot", $"{MqttTopics.Channels.HealthPing}/FinlyticBot", "Automated Trading Execution", "PostgreSQL bot"),
|
||||
("FinlyticNotify", $"{MqttTopics.Channels.HealthPing}/FinlyticNotify", "ntfy Push Notifications", "PostgreSQL / Mosquitto"),
|
||||
};
|
||||
|
||||
var results = new List<ServiceHealthStatusDto>
|
||||
|
||||
@@ -149,7 +149,7 @@ app.UseExceptionHandler();
|
||||
app.UseForwardedHeaders(new ForwardedHeadersOptions
|
||||
{
|
||||
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost,
|
||||
KnownNetworks = { },
|
||||
KnownIPNetworks = { },
|
||||
KnownProxies = { }
|
||||
});
|
||||
|
||||
|
||||
@@ -70,6 +70,7 @@ public class SystemHealthBackgroundService : BackgroundService
|
||||
("FinlyticFundamentals", "health_Ping/FinlyticFundamentals", "Financial Statements & Estimates", "PostgreSQL fundamentals"),
|
||||
("FinlyticEngine", "health_Ping/FinlyticEngine", "Strategy Screener & Signals", "PostgreSQL engine"),
|
||||
("FinlyticBot", "health_Ping/FinlyticBot", "Automated Trading Execution", "PostgreSQL bot"),
|
||||
("FinlyticNotify", "health_Ping/FinlyticNotify", "ntfy Push Notifications", "PostgreSQL / Mosquitto"),
|
||||
};
|
||||
|
||||
var results = new List<ServiceHealthStatusDto>
|
||||
|
||||
@@ -9,6 +9,7 @@ using FinlyticBackend.Database;
|
||||
using FinlyticBackend.Hubs;
|
||||
using FinlyticBackend.Services;
|
||||
using FinlyticBackend.Settings;
|
||||
using FinlyticCore.Dtos;
|
||||
using FinlyticCore.Dtos.Bot;
|
||||
using FinlyticCore.Dtos.Logging;
|
||||
using FinlyticCore.Dtos.News;
|
||||
@@ -104,6 +105,11 @@ public class BackendMqttBridge : ManagedMqttClient, IHostedService
|
||||
MqttTopics.RequestFilter(MqttTopics.Channels.BackendGetAggregatedFavorites),
|
||||
HandleGetAggregatedFavoritesRpcAsync);
|
||||
|
||||
// Username lookup RPC Endpoint for FinlyticNotify
|
||||
await SubscribeRpcAsync<UserIdRequest, string?>(
|
||||
MqttTopics.RequestFilter(MqttTopics.Channels.BackendGetUsername),
|
||||
HandleGetUsernameRpcAsync);
|
||||
|
||||
// FinlyticBackend previously never broadcast its OWN structured logs at all (it only relayed other
|
||||
// services' logs received on MqttTopics.LogsWildcard, subscribed above) - it never used
|
||||
// IFinlyticLogger<T>, so FinlyticLogBroadcaster.Broadcast was never invoked for anything happening
|
||||
@@ -286,4 +292,24 @@ public class BackendMqttBridge : ManagedMqttClient, IHostedService
|
||||
"[BackendMqttBridge] Responded to backend_GetAggregatedFavorites with {Count} unique ISINs. [CorrelationId: {CorrelationId}]", isins.Count, correlationId);
|
||||
return isins;
|
||||
}
|
||||
|
||||
private async Task<string?> HandleGetUsernameRpcAsync(UserIdRequest? req, string correlationId)
|
||||
{
|
||||
if (req == null || req.UserId == Guid.Empty) return null;
|
||||
|
||||
using var scope = _scopeFactory.CreateScope();
|
||||
var dbContext = scope.ServiceProvider.GetRequiredService<BackendDbContext>();
|
||||
|
||||
var user = await dbContext.Users
|
||||
.AsNoTracking()
|
||||
.FirstOrDefaultAsync(u => u.Id == req.UserId);
|
||||
|
||||
if (user == null) return null;
|
||||
|
||||
string username = !string.IsNullOrWhiteSpace(user.FullName)
|
||||
? user.FullName.Trim().ToLowerInvariant().Replace(" ", "_")
|
||||
: user.Email.Split('@')[0].Trim().ToLowerInvariant();
|
||||
|
||||
return username;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user