Paralleles WebGUI mit Kestrel, Token-Sicherung und SSE-Logs implementiert

This commit is contained in:
Richard
2026-09-07 21:55:51 +02:00
parent 28b3aedec7
commit 10f928eb4e
36 changed files with 3114 additions and 266 deletions
@@ -0,0 +1,74 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Options;
using PolyTrader.Web.Configuration;
using PolyTraderSharp.Services;
namespace PolyTrader.Web.Endpoints
{
public static class SettingsEndpoints
{
public record UpdateWebUiSettingsRequest(bool Enabled, int Port, bool LocalOnly, string? AuthToken);
public static IEndpointRouteBuilder MapSettingsEndpoints(this IEndpointRouteBuilder routes)
{
var group = routes.MapGroup("/api/settings");
group.MapGet("/webui", (IOptions<WebUiOptions> optionsProvider) =>
{
var opt = optionsProvider.Value;
return Results.Ok(new
{
enabled = opt.Enabled,
port = opt.Port,
localOnly = opt.LocalOnly,
hasToken = !string.IsNullOrWhiteSpace(opt.AuthToken),
token = opt.AuthToken
});
});
group.MapPost("/webui", (UpdateWebUiSettingsRequest req, IOptions<WebUiOptions> optionsProvider, TerminalLogger logger) =>
{
var opt = optionsProvider.Value;
opt.Enabled = req.Enabled;
opt.Port = req.Port > 0 && req.Port <= 65535 ? req.Port : 5001;
opt.LocalOnly = req.LocalOnly;
if (req.AuthToken != null)
{
opt.AuthToken = req.AuthToken.Trim();
}
WebUiConfigManager.SaveToLocalSettings(opt);
logger.Info($"🌐 WebUI: Einstellungen gespeichert (Port {opt.Port}, LocalOnly: {opt.LocalOnly}).");
return Results.Ok(new
{
success = true,
enabled = opt.Enabled,
port = opt.Port,
localOnly = opt.LocalOnly,
hasToken = !string.IsNullOrWhiteSpace(opt.AuthToken)
});
});
group.MapPost("/webui/generate-token", (IOptions<WebUiOptions> optionsProvider, TerminalLogger logger) =>
{
var opt = optionsProvider.Value;
string newToken = WebUiConfigManager.GenerateSecureToken();
opt.AuthToken = newToken;
WebUiConfigManager.SaveToLocalSettings(opt);
logger.Info("🔐 WebUI: Neues Zugangs-Token generiert und in appsettings.Local.json gespeichert.");
return Results.Ok(new
{
success = true,
token = newToken
});
});
return routes;
}
}
}