package apiserver import ( "net/http" "gitea.perlbach24.de/scripte/nexarch/internal/auth" ) // Server registriert versionierte API-Routen (Akzeptanzkriterium 1: unter // /api/{version}/...) und verdrahtet fuer jede Route dieselbe Middleware- // Kette (Logging -> Auth+Tenantkontext -> Handler). type Server struct { mux *http.ServeMux issuer *auth.TokenIssuer routes []string } func NewServer(issuer *auth.TokenIssuer) *Server { return &Server{mux: http.NewServeMux(), issuer: issuer} } // Handle registriert pattern unter der angegebenen Version, z.B. // Handle("v1", "/things", h) -> erreichbar unter /api/v1/things. Verschiedene // Versionen sind unabhaengige Pfade — eine neue Version beeintraechtigt // bestehende nicht (Akzeptanzkriterium 1 / Pruefung 3). func (s *Server) Handle(version, pattern string, h http.HandlerFunc) { full := "/api/" + version + pattern s.routes = append(s.routes, full) s.mux.HandleFunc(full, loggingMiddleware(authAndTenantContext(s.issuer, h))) } // RegisteredPaths liefert alle ueber Handle/HandleV1 tatsaechlich // registrierten Pfade — die einzige Quelle der Wahrheit fuer den // Drift-Abgleich mit dem OpenAPI-Dokument (API-04, siehe internal/openapi). // Rein additive Buchfuehrung, keine Verhaltensaenderung von Handle. func (s *Server) RegisteredPaths() []string { out := make([]string, len(s.routes)) copy(out, s.routes) return out } // HandleV1 ist die Kurzform fuer die aktuelle Hauptversion. func (s *Server) HandleV1(pattern string, h http.HandlerFunc) { s.Handle("v1", pattern, h) } func (s *Server) Handler() http.Handler { return s.mux }