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,56 @@
package app
import (
"encoding/json"
"io"
"net/http"
"strings"
)
type trafficAppMarksPostInput struct {
Op TrafficAppMarksOp
Target string
Cgroup string
CgroupRaw string
Unit string
Command string
AppKey string
TimeoutSec int
}
func decodeTrafficAppMarksPostInput(r *http.Request) (trafficAppMarksPostInput, string) {
var body TrafficAppMarksRequest
if r.Body != nil {
defer r.Body.Close()
if err := json.NewDecoder(io.LimitReader(r.Body, 1<<20)).Decode(&body); err != nil && err != io.EOF {
return trafficAppMarksPostInput{}, "bad json"
}
}
in := trafficAppMarksPostInput{
Op: TrafficAppMarksOp(strings.ToLower(strings.TrimSpace(string(body.Op)))),
Target: strings.ToLower(strings.TrimSpace(body.Target)),
Cgroup: strings.TrimSpace(body.Cgroup),
CgroupRaw: body.Cgroup,
Unit: strings.TrimSpace(body.Unit),
Command: strings.TrimSpace(body.Command),
AppKey: strings.TrimSpace(body.AppKey),
TimeoutSec: body.TimeoutSec,
}
if in.Op == "" {
return trafficAppMarksPostInput{}, "missing op"
}
if in.Target == "" {
return trafficAppMarksPostInput{}, "missing target"
}
if in.Target != "vpn" && in.Target != "direct" {
return trafficAppMarksPostInput{}, "target must be vpn|direct"
}
if (in.Op == TrafficAppMarksAdd || in.Op == TrafficAppMarksDel) && in.Cgroup == "" {
return trafficAppMarksPostInput{}, "missing cgroup"
}
if in.TimeoutSec < 0 {
return trafficAppMarksPostInput{}, "timeout_sec must be >= 0"
}
return in, ""
}