Paralleles WebGUI mit Kestrel, Token-Sicherung und SSE-Logs implementiert
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
using System.Linq;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Routing;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using PolyTraderSharp;
|
||||
using PolyTraderSharp.Services;
|
||||
|
||||
namespace PolyTrader.Web.Endpoints
|
||||
{
|
||||
public static class DashboardEndpoints
|
||||
{
|
||||
public record SetTradingModeRequest(string ModeType, string TargetMode);
|
||||
|
||||
public static IEndpointRouteBuilder MapDashboardEndpoints(this IEndpointRouteBuilder routes)
|
||||
{
|
||||
var group = routes.MapGroup("/api/dashboard");
|
||||
|
||||
group.MapGet("/summary", (TradingState state, IServiceProvider sp) =>
|
||||
{
|
||||
var vpn = sp.GetService<MullvadVpnService>();
|
||||
var watchdog = sp.GetService<WatchdogHeartbeatService>();
|
||||
|
||||
var accounts = state.Accounts.Values.ToList();
|
||||
decimal totalAvailable = accounts.Sum(a => a.AvailableBalance);
|
||||
decimal totalBalance = accounts.Sum(a => a.TotalBalance);
|
||||
|
||||
return Results.Ok(new
|
||||
{
|
||||
globalTradingPaused = state.GlobalTradingPaused,
|
||||
liveTradingMode = state.LiveTradingMode.ToString(),
|
||||
demoTradingMode = state.DemoTradingMode.ToString(),
|
||||
alchemyHealthy = state.IsAlchemyHealthy,
|
||||
globalPnl = state.GlobalPnl,
|
||||
vpnConnected = vpn?.IsConnected ?? false,
|
||||
vpnEnabled = vpn != null,
|
||||
watchdogActive = watchdog != null,
|
||||
accountCount = accounts.Count,
|
||||
totalUsdcBalance = totalAvailable,
|
||||
totalPortfolioValue = totalBalance
|
||||
});
|
||||
});
|
||||
|
||||
group.MapPost("/trading-mode", (SetTradingModeRequest req, TradingState state, TerminalLogger logger) =>
|
||||
{
|
||||
if (req.ModeType.Equals("live", System.StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
if (System.Enum.TryParse<TradingMode>(req.TargetMode, true, out var parsed))
|
||||
{
|
||||
state.LiveTradingMode = parsed;
|
||||
logger.Info($"🌐 WebUI: Live-Trading-Modus auf '{parsed}' geändert.");
|
||||
return Results.Ok(new { success = true, currentMode = state.LiveTradingMode.ToString() });
|
||||
}
|
||||
}
|
||||
else if (req.ModeType.Equals("demo", System.StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
if (System.Enum.TryParse<TradingMode>(req.TargetMode, true, out var parsed))
|
||||
{
|
||||
state.DemoTradingMode = parsed;
|
||||
logger.Info($"🌐 WebUI: Demo-Trading-Modus auf '{parsed}' geändert.");
|
||||
return Results.Ok(new { success = true, currentMode = state.DemoTradingMode.ToString() });
|
||||
}
|
||||
}
|
||||
else if (req.ModeType.Equals("pause", System.StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
state.GlobalTradingPaused = !state.GlobalTradingPaused;
|
||||
logger.Warning($"🌐 WebUI: GlobalTradingPaused auf '{state.GlobalTradingPaused}' umgeschaltet.");
|
||||
return Results.Ok(new { success = true, isPaused = state.GlobalTradingPaused });
|
||||
}
|
||||
|
||||
return Results.BadRequest(new { error = "Ungültiger Modus oder Parametertyp." });
|
||||
});
|
||||
|
||||
return routes;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user