43 lines
1.2 KiB
Go
43 lines
1.2 KiB
Go
package openapi
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
)
|
|
|
|
// Mount registers the /openapi.json endpoint on the router.
|
|
// The OpenAPI spec is consumed by CI to generate Slate documentation
|
|
// which is served at docs.{domain}. No interactive UI is mounted here.
|
|
func Mount(r chi.Router, spec *OpenAPISpec) {
|
|
// Serve OpenAPI JSON spec (consumed by Widdershins during doc generation)
|
|
r.Get("/openapi.json", func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.Header().Set("Access-Control-Allow-Origin", "*")
|
|
|
|
specBytes, err := spec.JSON()
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
_, _ = w.Write(specBytes)
|
|
})
|
|
|
|
// /docs redirects to the Slate documentation site
|
|
r.Get("/docs", func(w http.ResponseWriter, r *http.Request) {
|
|
// Construct docs URL from current host
|
|
// e.g., api.slug.threesix.ai -> docs.slug.threesix.ai
|
|
scheme := "https"
|
|
if proto := r.Header.Get("X-Forwarded-Proto"); proto != "" {
|
|
scheme = proto
|
|
}
|
|
|
|
// Extract the base domain (remove service prefix if present)
|
|
host := r.Host
|
|
docsURL := scheme + "://docs." + host
|
|
|
|
http.Redirect(w, r, docsURL, http.StatusTemporaryRedirect)
|
|
})
|
|
}
|