harbor/tools/swagger/templates/server/builder.gotmpl

467 lines
20 KiB
Go Template
Raw Normal View History

// Code generated by go-swagger; DO NOT EDIT.
{{ if .Copyright -}}// {{ comment .Copyright -}}{{ end }}
package {{.Package}}
{{ $package := .Package }}
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"fmt"
"io"
"net/http"
"strings"
"github.com/go-openapi/errors"
"github.com/go-openapi/loads"
"github.com/go-openapi/runtime"
"github.com/go-openapi/runtime/middleware"
"github.com/go-openapi/runtime/security"
"github.com/go-openapi/spec"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
{{ imports .DefaultImports }}
{{ imports .Imports }}
)
// New{{ pascalize .Name }}API creates a new {{ pascalize .Name }} instance
func New{{ pascalize .Name }}API(spec *loads.Document) *{{ pascalize .Name }}API {
return &{{ pascalize .Name }}API{
handlers: make(map[string]map[string]http.Handler),
formats: strfmt.Default,
defaultConsumes: "{{ .DefaultConsumes }}",
defaultProduces: "{{ .DefaultProduces }}",
customConsumers: make(map[string]runtime.Consumer),
customProducers: make(map[string]runtime.Producer),
operationMiddlewares: make(map[string]middleware.Builder),
PreServerShutdown: func() { },
ServerShutdown: func() { },
spec: spec,
useSwaggerUI: false,
ServeError: errors.ServeError,
BasicAuthenticator: security.BasicAuth,
APIKeyAuthenticator: security.APIKeyAuth,
BearerAuthenticator: security.BearerAuth,
{{ range .Consumes }}
{{- if .Implementation }}
{{ pascalize .Name }}Consumer: {{ .Implementation }},
{{- else }}
{{ pascalize .Name }}Consumer: runtime.ConsumerFunc(func(r io.Reader, target interface{}) error {
return errors.NotImplemented("{{.Name}} consumer has not yet been implemented")
}),
{{- end }}
{{- end }}
{{ range .Produces }}
{{- if .Implementation }}
{{ pascalize .Name }}Producer: {{ .Implementation }},
{{- else }}
{{ pascalize .Name }}Producer: runtime.ProducerFunc(func(w io.Writer, data interface{}) error {
return errors.NotImplemented("{{.Name}} producer has not yet been implemented")
}),
{{- end }}
{{- end }}
{{ range .Operations }}
{{ if ne .Package $package }}{{ pascalize .Package }}{{ end }}{{ pascalize .Name }}Handler:
{{- if ne .Package $package }}{{ .PackageAlias }}.{{ end }}{{ pascalize .Name }}HandlerFunc(func(params {{ if ne .Package $package }}{{ .PackageAlias }}.{{end }}
{{- if $.GenOpts.StrictResponders}}
{{- pascalize .Name }}Params{{if .Authorized}}, principal {{if not ( eq .Principal "interface{}" )}}*{{ end }}{{.Principal}}{{end}}) {{if ne .Package $package }}{{ .Package }}.{{ end }}{{ pascalize .Name }}Responder {
return {{if ne .Package $package }}{{ .Package }}.{{ end }}{{ pascalize .Name }}NotImplemented()
{{else}}
{{- pascalize .Name }}Params{{if .Authorized}}, principal {{if not ( eq .Principal "interface{}" )}}*{{ end }}{{.Principal}}{{end}}) middleware.Responder {
return middleware.NotImplemented("operation {{ if ne .Package $package }}{{ .Package }}.{{ end }}{{pascalize .Name}} has not yet been implemented")
{{ end -}}
}),
{{- end }}
{{ range .SecurityDefinitions }}
{{- if .IsBasicAuth }}
// Applies when the Authorization header is set with the Basic scheme
{{ pascalize .ID }}Auth: func(user string, pass string) ({{if not ( eq .Principal "interface{}" )}}*{{ end }}{{.Principal}}, error) {
return nil, errors.NotImplemented("basic auth ({{ .ID }}) has not yet been implemented")
},
{{- end }}
{{- if .IsAPIKeyAuth }}
// Applies when the "{{ .Name }}" {{ .Source }} is set
{{ pascalize .ID }}Auth: func(token string) ({{if not ( eq .Principal "interface{}" )}}*{{ end }}{{.Principal}}, error) {
return nil, errors.NotImplemented("api key auth ({{ .ID }}) {{.Name}} from {{.Source}} param [{{ .Name }}] has not yet been implemented")
},
{{- end }}
{{- if .IsOAuth2 }}
{{ pascalize .ID }}Auth: func(token string, scopes []string) ({{if not ( eq .Principal "interface{}" )}}*{{ end }}{{.Principal}}, error) {
return nil, errors.NotImplemented("oauth2 bearer auth ({{ .ID }}) has not yet been implemented")
},
{{- end }}
{{- end }}
{{- if .SecurityDefinitions }}
// default authorizer is authorized meaning no requests are blocked
APIAuthorizer: security.Authorized(),
{{- end }}
}
}
/*{{ pascalize .Name }}API {{ if .Info }}{{ if .Info.Description }}{{.Info.Description}}{{ else }}the {{ humanize .Name }} API{{ end }}{{ end }} */
type {{ pascalize .Name }}API struct {
spec *loads.Document
context *middleware.Context
handlers map[string]map[string]http.Handler
formats strfmt.Registry
customConsumers map[string]runtime.Consumer
customProducers map[string]runtime.Producer
defaultConsumes string
defaultProduces string
Middleware func(middleware.Builder) http.Handler
useSwaggerUI bool
// operationMiddlewares middleware for operations
operationMiddlewares map[string]middleware.Builder
// BeforePrepare is called before the Prepare of the operation
BeforePrepare func(context.Context, string, interface{}) middleware.Responder
// BasicAuthenticator generates a runtime.Authenticator from the supplied basic auth function.
// It has a default implementation in the security package, however you can replace it for your particular usage.
BasicAuthenticator func(security.UserPassAuthentication) runtime.Authenticator
// APIKeyAuthenticator generates a runtime.Authenticator from the supplied token auth function.
// It has a default implementation in the security package, however you can replace it for your particular usage.
APIKeyAuthenticator func(string, string, security.TokenAuthentication) runtime.Authenticator
// BearerAuthenticator generates a runtime.Authenticator from the supplied bearer token auth function.
// It has a default implementation in the security package, however you can replace it for your particular usage.
BearerAuthenticator func(string, security.ScopedTokenAuthentication) runtime.Authenticator
{{ range .Consumes }}
// {{ pascalize .Name }}Consumer registers a consumer for the following mime types:
{{- range .AllSerializers }}
// - {{ .MediaType }}
{{- end }}
{{ pascalize .Name }}Consumer runtime.Consumer
{{- end }}
{{ range .Produces}}
// {{ pascalize .Name }}Producer registers a producer for the following mime types:
{{- range .AllSerializers }}
// - {{ .MediaType }}
{{- end }}
{{ pascalize .Name }}Producer runtime.Producer
{{- end }}
{{ range .SecurityDefinitions}}
{{- if .IsBasicAuth}}
// {{ pascalize .ID }}Auth registers a function that takes username and password and returns a principal
// it performs authentication with basic auth
{{ pascalize .ID }}Auth func(string, string) ({{ if not ( eq .Principal "interface{}" ) }}*{{ end }}{{ .Principal }}, error)
{{- end }}
{{- if .IsAPIKeyAuth}}
// {{ pascalize .ID }}Auth registers a function that takes a token and returns a principal
// it performs authentication based on an api key {{ .Name }} provided in the {{.Source}}
{{ pascalize .ID }}Auth func(string) ({{ if not ( eq .Principal "interface{}" ) }}*{{ end }}{{ .Principal }}, error)
{{- end }}
{{- if .IsOAuth2 }}
// {{ pascalize .ID }}Auth registers a function that takes an access token and a collection of required scopes and returns a principal
// it performs authentication based on an oauth2 bearer token provided in the request
{{ pascalize .ID }}Auth func(string, []string) ({{ if not ( eq .Principal "interface{}" ) }}*{{ end }}{{ .Principal }}, error)
{{- end }}
{{- end }}
{{- if .SecurityDefinitions }}
// APIAuthorizer provides access control (ACL/RBAC/ABAC) by providing access to the request and authenticated principal
APIAuthorizer runtime.Authorizer
{{- end }}
{{- $package := .Package }}
{{ range .Operations }}
// {{ if ne .Package $package }}{{ pascalize .Package }}{{ end }}{{ pascalize .Name }}Handler sets the operation handler for the {{ humanize .Name }} operation
{{ if ne .Package $package }}{{ pascalize .Package }}{{ end }}{{ pascalize .Name }}Handler {{ if ne .Package $package }}{{ .PackageAlias }}.{{ end }}{{ pascalize .Name }}Handler
{{- end }}
// ServeError is called when an error is received, there is a default handler
// but you can set your own with this
ServeError func(http.ResponseWriter, *http.Request, error)
// PreServerShutdown is called before the HTTP(S) server is shutdown
// This allows for custom functions to get executed before the HTTP(S) server stops accepting traffic
PreServerShutdown func()
// ServerShutdown is called when the HTTP(S) server is shut down and done
// handling all active connections and does not accept connections any more
ServerShutdown func()
// Custom command line argument groups with their descriptions
CommandLineOptionsGroups []swag.CommandLineOptionsGroup
// User defined logger function.
Logger func(string, ...interface{})
}
// UseRedoc for documentation at /docs
func ({{.ReceiverName}} *{{ pascalize .Name }}API) UseRedoc() {
{{.ReceiverName}}.useSwaggerUI = false
}
// UseSwaggerUI for documentation at /docs
func ({{.ReceiverName}} *{{ pascalize .Name }}API) UseSwaggerUI() {
{{.ReceiverName}}.useSwaggerUI = true
}
// SetDefaultProduces sets the default produces media type
func ({{.ReceiverName}} *{{ pascalize .Name }}API) SetDefaultProduces(mediaType string) {
{{.ReceiverName}}.defaultProduces = mediaType
}
// SetDefaultConsumes returns the default consumes media type
func ({{.ReceiverName}} *{{ pascalize .Name }}API) SetDefaultConsumes(mediaType string) {
{{.ReceiverName}}.defaultConsumes = mediaType
}
// SetSpec sets a spec that will be served for the clients.
func ({{.ReceiverName}} *{{ pascalize .Name }}API) SetSpec(spec *loads.Document) {
{{.ReceiverName}}.spec = spec
}
// DefaultProduces returns the default produces media type
func ({{.ReceiverName}} *{{ pascalize .Name }}API) DefaultProduces() string {
return {{.ReceiverName}}.defaultProduces
}
// DefaultConsumes returns the default consumes media type
func ({{.ReceiverName}} *{{ pascalize .Name }}API) DefaultConsumes() string {
return {{.ReceiverName}}.defaultConsumes
}
// Formats returns the registered string formats
func ({{.ReceiverName}} *{{ pascalize .Name }}API) Formats() strfmt.Registry {
return {{.ReceiverName}}.formats
}
// RegisterFormat registers a custom format validator
func ({{.ReceiverName}} *{{ pascalize .Name }}API) RegisterFormat(name string, format strfmt.Format, validator strfmt.Validator) {
{{.ReceiverName}}.formats.Add(name, format, validator)
}
// Validate validates the registrations in the {{ pascalize .Name }}API
func ({{.ReceiverName}} *{{ pascalize .Name }}API) Validate() error {
var unregistered []string
{{ range .Consumes }}
if {{.ReceiverName}}.{{ pascalize .Name }}Consumer == nil {
unregistered = append(unregistered, "{{ pascalize .Name }}Consumer")
}
{{- end }}
{{ range .Produces }}
if {{.ReceiverName}}.{{ pascalize .Name }}Producer == nil {
unregistered = append(unregistered, "{{ pascalize .Name }}Producer")
}
{{- end }}
{{ range .SecurityDefinitions }}
if {{.ReceiverName}}.{{ pascalize .ID }}Auth == nil {
unregistered = append(unregistered, "{{if .IsAPIKeyAuth }}{{ pascalize .Name }}{{ else }}{{ pascalize .ID }}{{ end }}Auth")
}
{{- end }}
{{ range .Operations }}
if {{.ReceiverName}}.{{ if ne .Package $package }}{{ pascalize .Package }}{{ end }}{{ pascalize .Name }}Handler == nil {
unregistered = append(unregistered, "{{ if ne .Package $package }}{{ .Package }}.{{ end }}{{ pascalize .Name }}Handler")
}
{{- end }}
if len(unregistered) > 0 {
return fmt.Errorf("missing registration: %s", strings.Join(unregistered, ", "))
}
return nil
}
// ServeErrorFor gets a error handler for a given operation id
func ({{.ReceiverName}} *{{ pascalize .Name }}API) ServeErrorFor(operationID string) func(http.ResponseWriter, *http.Request, error) {
return {{.ReceiverName}}.ServeError
}
// AuthenticatorsFor gets the authenticators for the specified security schemes
func ({{.ReceiverName}} *{{ pascalize .Name }}API) AuthenticatorsFor(schemes map[string]spec.SecurityScheme) map[string]runtime.Authenticator {
{{- if .SecurityDefinitions }}
result := make(map[string]runtime.Authenticator)
for name := range schemes {
switch name {
{{- range .SecurityDefinitions }}
case "{{.ID}}":
{{- if .IsBasicAuth }}
result[name] = {{.ReceiverName}}.BasicAuthenticator({{ if not ( eq .Principal "interface{}" ) }}func(username, password string) (interface{}, error) {
return {{ end }}{{.ReceiverName}}.{{ pascalize .ID }}Auth{{ if not ( eq .Principal "interface{}" ) }}(username, password)
}{{ end }})
{{- end }}
{{- if .IsAPIKeyAuth }}
scheme := schemes[name]
result[name] = {{.ReceiverName}}.APIKeyAuthenticator(scheme.Name, scheme.In, {{ if not ( eq .Principal "interface{}" ) }}func(token string) (interface{}, error) {
return {{ end }}{{.ReceiverName}}.{{ pascalize .ID }}Auth{{ if not ( eq .Principal "interface{}" ) }}(token)
}{{ end }})
{{- end }}
{{- if .IsOAuth2 }}
result[name] = {{.ReceiverName}}.BearerAuthenticator(name, {{ if not ( eq .Principal "interface{}" ) }}func(token string, scopes []string) (interface{}, error) {
return {{ end }}{{.ReceiverName}}.{{ pascalize .ID }}Auth{{ if not ( eq .Principal "interface{}" ) }}(token, scopes)
}{{ end }})
{{- end }}
{{end}}
}
}
return result
{{- else }}
return nil
{{- end }}
}
// Authorizer returns the registered authorizer
func ({{.ReceiverName}} *{{ pascalize .Name }}API) Authorizer() runtime.Authorizer {
{{- if .SecurityDefinitions }}
return {{.ReceiverName}}.APIAuthorizer
{{- else }}
return nil
{{- end }}
}
// ConsumersFor gets the consumers for the specified media types.
// MIME type parameters are ignored here.
func ({{.ReceiverName}} *{{ pascalize .Name }}API) ConsumersFor(mediaTypes []string) map[string]runtime.Consumer {
{{- if .Consumes }}
result := make(map[string]runtime.Consumer, len(mediaTypes))
for _, mt := range mediaTypes {
switch mt {
{{- range .Consumes }}
{{- range .AllSerializers }}
case "{{ .MediaType }}":
result["{{ .MediaType }}"] = {{.ReceiverName}}.{{ pascalize .Name }}Consumer
{{- end }}
{{- end }}
}
if c, ok := {{.ReceiverName}}.customConsumers[mt]; ok {
result[mt] = c
}
}
return result
{{- else }}
return nil
{{- end }}
}
// ProducersFor gets the producers for the specified media types.
// MIME type parameters are ignored here.
func ({{.ReceiverName}} *{{ pascalize .Name }}API) ProducersFor(mediaTypes []string) map[string]runtime.Producer {
{{- if .Produces }}
result := make(map[string]runtime.Producer, len(mediaTypes))
for _, mt := range mediaTypes {
switch mt {
{{- range .Produces }}
{{- range .AllSerializers }}
case "{{ .MediaType }}":
result["{{ .MediaType }}"] = {{.ReceiverName}}.{{ pascalize .Name }}Producer
{{- end }}
{{- end }}
}
if p, ok := {{.ReceiverName}}.customProducers[mt]; ok {
result[mt] = p
}
}
return result
{{- else }}
return nil
{{- end }}
}
// HandlerFor gets a http.Handler for the provided operation method and path
func ({{.ReceiverName}} *{{ pascalize .Name }}API) HandlerFor(method, path string) (http.Handler, bool) {
if {{.ReceiverName}}.handlers == nil {
return nil, false
}
um := strings.ToUpper(method)
if _, ok := {{.ReceiverName}}.handlers[um]; !ok {
return nil, false
}
if path == "/" {
path = ""
}
h, ok := {{.ReceiverName}}.handlers[um][path]
return h, ok
}
// Context returns the middleware context for the {{ humanize .Name }} API
func ({{.ReceiverName}} *{{ pascalize .Name }}API) Context() *middleware.Context {
if {{.ReceiverName}}.context == nil {
{{.ReceiverName}}.context = middleware.NewRoutableContext({{.ReceiverName}}.spec, {{.ReceiverName}}, nil)
}
return {{ .ReceiverName }}.context
}
func ({{.ReceiverName}} *{{ pascalize .Name }}API) handler(operation string, next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
h := next
if b, ok := {{.ReceiverName}}.operationMiddlewares[operation]; ok {
h = b(h)
}
h.ServeHTTP(w, r)
})
}
func ({{.ReceiverName}} *{{ pascalize .Name }}API) initHandlerCache() {
{{.ReceiverName}}.Context() // don't care about the result, just that the initialization happened
{{- if .Operations }}
if {{ .ReceiverName }}.handlers == nil {
{{.ReceiverName}}.handlers = make(map[string]map[string]http.Handler)
}
{{ range .Operations }}
if {{ .ReceiverName }}.handlers[{{ printf "%q" (upper .Method) }}] == nil {
{{ .ReceiverName }}.handlers[{{ printf "%q" (upper .Method) }}] = make(map[string]http.Handler)
}
{{.ReceiverName}}.handlers[{{ printf "%q" (upper .Method) }}][{{ if eq .Path "/" }}""{{ else }}{{ printf "%q" (cleanPath .Path) }}{{ end }}] = {{ .ReceiverName }}.handler("{{ pascalize .Name }}", {{ if ne .Package $package }}{{ .PackageAlias }}.{{ end }}New{{ pascalize .Name }}({{.ReceiverName}}.context, {{.ReceiverName}}.{{if ne .Package $package}}{{ pascalize .Package }}{{end}}{{ pascalize .Name }}Handler))
{{- end }}
{{- end }}
}
// Serve creates a http handler to serve the API over HTTP
// can be used directly in http.ListenAndServe(":8000", api.Serve(nil))
func ({{.ReceiverName}} *{{ pascalize .Name }}API) Serve(builder middleware.Builder) http.Handler {
{{ .ReceiverName }}.Init()
if {{ .ReceiverName}}.Middleware != nil {
return {{ .ReceiverName }}.Middleware(builder)
}
if {{.ReceiverName}}.useSwaggerUI {
return {{.ReceiverName}}.context.APIHandlerSwaggerUI(builder)
}
return {{.ReceiverName}}.context.APIHandler(builder)
}
// Init allows you to just initialize the handler cache, you can then recompose the middleware as you see fit
func ({{.ReceiverName}} *{{ pascalize .Name }}API) Init() {
if len({{.ReceiverName}}.handlers) == 0 {
{{.ReceiverName}}.initHandlerCache()
}
}
// RegisterConsumer allows you to add (or override) a consumer for a media type.
func ({{.ReceiverName}} *{{ pascalize .Name }}API) RegisterConsumer(mediaType string, consumer runtime.Consumer) {
{{.ReceiverName}}.customConsumers[mediaType] = consumer
}
// RegisterProducer allows you to add (or override) a producer for a media type.
func ({{.ReceiverName}} *{{ pascalize .Name }}API) RegisterProducer(mediaType string, producer runtime.Producer) {
{{.ReceiverName}}.customProducers[mediaType] = producer
}
// AddMiddlewareFor adds a http middleware to existing handler
func ({{.ReceiverName}} *{{ pascalize .Name }}API) AddMiddlewareFor(method, path string, builder middleware.Builder) {
um := strings.ToUpper(method)
if path == "/" {
path = ""
}
{{.ReceiverName}}.Init()
if h, ok := {{.ReceiverName}}.handlers[um][path]; ok {
{{.ReceiverName}}.handlers[method][path] = builder(h)
}
}
// RegisterMiddleware allows you to add (or override) a middleware for operation.
func ({{.ReceiverName}} *{{ pascalize .Name }}API) RegisterMiddleware(operation string, builder middleware.Builder) {
{{.ReceiverName}}.operationMiddlewares[operation] = builder
}