platform: modularize api/gui, add docs-tests-web foundation, and refresh root config

This commit is contained in:
beckline
2026-03-26 22:40:54 +03:00
parent 0e2d7f61ea
commit 6a56d734c2
562 changed files with 70151 additions and 16423 deletions

View File

@@ -0,0 +1,79 @@
package app
import (
"fmt"
"strings"
"time"
)
func buildTransportClientFromCreate(body TransportClientCreateRequest) (TransportClient, error) {
id := sanitizeID(body.ID)
if id == "" {
return TransportClient{}, fmt.Errorf("invalid id")
}
kind := normalizeTransportKind(body.Kind)
if kind == "" {
return TransportClient{}, fmt.Errorf("kind must be singbox|dnstt|phoenix")
}
enabled := true
if body.Enabled != nil {
enabled = *body.Enabled
}
name := strings.TrimSpace(body.Name)
if name == "" {
name = id
}
ifaceID := normalizeTransportIfaceID(body.IfaceID)
client := TransportClient{
ID: id,
Name: name,
Kind: kind,
Enabled: enabled,
Status: TransportClientDown,
IfaceID: ifaceID,
RoutingTable: transportRoutingTableForID(id),
Capabilities: defaultTransportCapabilities(kind),
Config: cloneMap(body.Config),
UpdatedAt: time.Now().UTC().Format(time.RFC3339),
Runtime: TransportClientRuntime{
Backend: "",
AllowedActions: []string{"provision", "start", "stop", "restart"},
LastExitCode: 0,
},
}
if normCfg, _ := normalizeTransportClientConfig(client.Kind, client.Config); normCfg != nil || client.Config != nil {
client.Config = normCfg
}
client.Runtime.Backend = selectTransportBackend(client).ID()
client.Health = TransportClientHealth{
LastCheck: client.UpdatedAt,
}
return client, nil
}
func normalizeTransportKind(k TransportClientKind) TransportClientKind {
switch strings.ToLower(strings.TrimSpace(string(k))) {
case string(TransportClientSingBox):
return TransportClientSingBox
case string(TransportClientDNSTT):
return TransportClientDNSTT
case string(TransportClientPhoenix):
return TransportClientPhoenix
default:
return ""
}
}
func defaultTransportCapabilities(kind TransportClientKind) []string {
switch kind {
case TransportClientSingBox:
return []string{"tcp", "udp", "dns_tunnel"}
case TransportClientDNSTT:
return []string{"tcp", "dns_tunnel"}
case TransportClientPhoenix:
return []string{"tcp", "udp", "ssh_tunnel"}
default:
return nil
}
}