core/internal/port/handler_http_api.go

55 lines
1.3 KiB
Go

package port
import (
"net/http"
"sync"
"gitea.dwysokinski.me/twhelp/corev3/internal/port/internal/apimodel"
"gitea.dwysokinski.me/twhelp/corev3/internal/port/internal/swgui"
"github.com/getkin/kin-openapi/openapi3"
"github.com/go-chi/chi/v5"
"github.com/go-chi/render"
)
type apiHTTPHandler struct {
apimodel.Unimplemented
getOpenAPISchema func() (*openapi3.T, error)
}
func WithOpenAPIConfig(oapiCfg OpenAPIConfig) APIHTTPHandlerOption {
return func(cfg *apiHTTPHandlerConfig) {
cfg.openAPI = oapiCfg
}
}
func NewAPIHTTPHandler(opts ...APIHTTPHandlerOption) http.Handler {
cfg := newAPIHTTPHandlerConfig(opts...)
h := &apiHTTPHandler{
getOpenAPISchema: sync.OnceValues(func() (*openapi3.T, error) {
return getOpenAPISchema(cfg.openAPI)
}),
}
r := chi.NewRouter()
if cfg.openAPI.Enabled {
r.Group(func(r chi.Router) {
if cfg.openAPI.SwaggerEnabled {
r.Handle("/v2/swagger/*", swgui.Handler(
cfg.openAPI.BasePath+"/v2/swagger",
cfg.openAPI.BasePath+"/v2/openapi3.json",
))
}
r.Get("/v2/openapi3.json", h.sendOpenAPIJSON)
})
}
return apimodel.HandlerWithOptions(h, apimodel.ChiServerOptions{BaseRouter: r})
}
func (h *apiHTTPHandler) renderJSON(w http.ResponseWriter, r *http.Request, status int, body any) {
render.Status(r, status)
render.JSON(w, r, body)
}