diff --git a/example.config.yaml b/example.config.yaml index c6af74201..b1e063030 100644 --- a/example.config.yaml +++ b/example.config.yaml @@ -8,6 +8,7 @@ server: http: enabled: true port: 3476 + expose_openapi: false tls: enabled: false cert: /etc/letsencrypt/live/yourdomain.com/fullchain.pem diff --git a/internal/config/config.go b/internal/config/config.go index e99ae81ad..7866f7c10 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -37,6 +37,7 @@ type ( HTTP struct { Enabled bool `mapstructure:"enabled"` // Whether the HTTP server is enabled Port string `mapstructure:"port"` // Port for the HTTP server + ExposeOpenAPI bool `mapstructure:"expose_openapi"` // expose OpenAPI configuration TLSConfig TLSConfig `mapstructure:"tls"` // TLS configuration for the HTTP server CORSAllowedOrigins []string `mapstructure:"cors_allowed_origins"` // List of allowed origins for CORS CORSAllowedHeaders []string `mapstructure:"cors_allowed_headers"` // List of allowed headers for CORS @@ -276,6 +277,7 @@ func DefaultConfig() *Config { HTTP: HTTP{ Enabled: true, Port: "3476", + ExposeOpenAPI: false, TLSConfig: TLSConfig{ Enabled: false, }, diff --git a/internal/servers/server.go b/internal/servers/server.go index 5f84626d0..7f99f6a53 100644 --- a/internal/servers/server.go +++ b/internal/servers/server.go @@ -305,24 +305,37 @@ func (s *Container) Run( }), } - mux := runtime.NewServeMux(muxOpts...) + // Create the gRPC gateway mux + grpcMux := runtime.NewServeMux(muxOpts...) - if err = grpcV1.RegisterPermissionHandler(ctx, mux, conn); err != nil { + if err = grpcV1.RegisterPermissionHandler(ctx, grpcMux, conn); err != nil { return err } - if err = grpcV1.RegisterSchemaHandler(ctx, mux, conn); err != nil { + if err = grpcV1.RegisterSchemaHandler(ctx, grpcMux, conn); err != nil { return err } - if err = grpcV1.RegisterDataHandler(ctx, mux, conn); err != nil { + if err = grpcV1.RegisterDataHandler(ctx, grpcMux, conn); err != nil { return err } - if err = grpcV1.RegisterBundleHandler(ctx, mux, conn); err != nil { + if err = grpcV1.RegisterBundleHandler(ctx, grpcMux, conn); err != nil { return err } - if err = grpcV1.RegisterTenancyHandler(ctx, mux, conn); err != nil { + if err = grpcV1.RegisterTenancyHandler(ctx, grpcMux, conn); err != nil { return err } + // Create a new http.ServeMux for serving your OpenAPI file and gRPC gateway + httpMux := http.NewServeMux() + + if srv.HTTP.ExposeOpenAPI { + httpMux.HandleFunc("/openapi.json", func(w http.ResponseWriter, r *http.Request) { + http.ServeFile(w, r, "./docs/api-reference/openapi.json") + }) + } + + // Handle all gRPC gateway routes + httpMux.Handle("/", grpcMux) + httpServer = &http.Server{ Addr: ":" + srv.HTTP.Port, Handler: cors.New(cors.Options{ @@ -333,7 +346,7 @@ func (s *Container) Run( http.MethodGet, http.MethodPost, http.MethodHead, http.MethodPatch, http.MethodDelete, http.MethodPut, }, - }).Handler(mux), + }).Handler(httpMux), ReadHeaderTimeout: 5 * time.Second, }