package serviceadapter import ( "forgejo.riotpiao.com/rock/homelab-frontend/internal/sessions" ) // NewSessionAdapter creates a ServiceAdapter for the sessions service. // // Route mapping (all via X-Service: sessions): // // X-Resource Verb upstream path handler // ────────────────────────────────────────────────────────────── // sessions POST /v1/sessions/create create session // sessions GET /v1/sessions/list list sessions (?status=,?cwd=) // session GET /v1/sessions/get get session (?session_id=) // session PATCH /v1/sessions/patch update session(?session_id=) // milestones POST /v1/sessions/milestones/create create milestone(?session_id=) // episodes GET /v1/sessions/episodes/list list episodes (?session_id=) // episode GET /v1/sessions/episodes/get get episode (?session_id=,?episode_id=) // // Path params (:id, :eid) are passed as query params because the ServiceAdapter // dispatcher does not substitute URL path parameters. func NewSessionAdapter() *ServiceAdapter { return &ServiceAdapter{ Namespace: "poimen", ServiceName: "sessions", Handler: sessions.NewHandler(), Spec: *GetSessionSpec(), } } // GetSessionSpec returns the ServiceAdapter spec for the sessions service. func GetSessionSpec() *Spec { return &Spec{ ServiceName: "sessions", Upstream: Upstream{ URL: "internal://sessions", TimeoutSeconds: 30, }, Auth: Auth{ Required: true, Capability: "sessions:read", }, Resources: []Resource{ { Name: "sessions", Methods: []Method{ { Verb: "POST", UpstreamPath: "/v1/sessions/create", Auth: &Auth{Required: true, Capability: "sessions:write"}, }, { Verb: "GET", UpstreamPath: "/v1/sessions/list", Auth: &Auth{Required: true, Capability: "sessions:read"}, }, }, }, { Name: "session", Methods: []Method{ { Verb: "GET", UpstreamPath: "/v1/sessions/get", Auth: &Auth{Required: true, Capability: "sessions:read"}, }, { Verb: "PATCH", UpstreamPath: "/v1/sessions/patch", Auth: &Auth{Required: true, Capability: "sessions:write"}, }, }, }, { Name: "milestones", Methods: []Method{ { Verb: "POST", UpstreamPath: "/v1/sessions/milestones/create", Auth: &Auth{Required: true, Capability: "sessions:write"}, }, }, }, { Name: "episodes", Methods: []Method{ { Verb: "GET", UpstreamPath: "/v1/sessions/episodes/list", Auth: &Auth{Required: true, Capability: "sessions:read"}, }, }, }, { Name: "episode", Methods: []Method{ { Verb: "GET", UpstreamPath: "/v1/sessions/episodes/get", Auth: &Auth{Required: true, Capability: "sessions:read"}, }, }, }, // sandbox — per-session k8s Pod+PVC+Service lifecycle (§4.15.4) { Name: "sandbox", Methods: []Method{ { Verb: "POST", UpstreamPath: "/v1/sessions/sandbox", Auth: &Auth{Required: true, Capability: "sessions:write"}, }, { Verb: "DELETE", UpstreamPath: "/v1/sessions/sandbox", Auth: &Auth{Required: true, Capability: "sessions:write"}, }, }, }, }, } }