github.com/percona-lab/go-swagger@v0.19.0/generator/templates/server/configureapi.gotmpl (about)

     1  // This file is safe to edit. Once it exists it will not be overwritten
     2  
     3  {{ if .Copyright -}}// {{ comment .Copyright -}}{{ end }}
     4  
     5  
     6  package {{ .APIPackage }}
     7  
     8  import (
     9    "context"
    10    "crypto/tls"
    11    "net/http"
    12    "log"
    13  
    14    errors "github.com/go-openapi/errors"
    15    runtime "github.com/go-openapi/runtime"
    16    middleware "github.com/go-openapi/runtime/middleware"
    17    security "github.com/go-openapi/runtime/security"
    18  
    19    {{range .DefaultImports}}{{printf "%q" .}}
    20    {{end}}
    21    {{range $key, $value := .Imports}}{{$key}} {{ printf "%q" $value}}
    22    {{end}}
    23  )
    24  {{ $package := .Package }}
    25  
    26  {{ with .GenOpts }}
    27  //go:generate swagger generate server --target {{ .TargetPath }} --name {{ .Name }} --spec {{ .SpecPath }}
    28  {{- if .APIPackage }}{{ if ne .APIPackage "operations" }} --api-package {{ .APIPackage }}{{ end }}{{ end }}
    29  {{- if .ModelPackage }}{{ if ne .ModelPackage "models" }} --model-package {{ .ModelPackage }}{{ end }}{{ end }}
    30  {{- if .ServerPackage }}{{ if ne .ServerPackage "restapi"}} --server-package {{ .ServerPackage }}{{ end }}{{ end }}
    31  {{- if .ClientPackage }}{{ if ne .ClientPackage "client" }} --client-package {{ .ClientPackage }}{{ end }}{{ end }}
    32  {{- if .TemplateDir }} --template-dir {{ .TemplateDir }}{{ end }}
    33  {{- range .Operations }} --operation {{ . }}{{ end }}
    34  {{- range .Tags }} --tags {{ . }}{{ end }}
    35  {{- if .Principal }} --principal {{ .Principal }}{{ end }}
    36  {{- if .DefaultScheme }}{{ if ne .DefaultScheme "http" }} --default-scheme {{ .DefaultScheme }}{{ end }}{{ end }}
    37  {{- range .Models }} --model {{ . }}{{ end }}
    38  {{- if or (not .IncludeModel) (not .IncludeValidator) }} --skip-models{{ end }}
    39  {{- if or (not .IncludeHandler) (not .IncludeParameters ) (not .IncludeResponses) }} --skip-operations{{ end }}
    40  {{- if not .IncludeSupport }} --skip-support{{ end }}
    41  {{- if not .IncludeMain }} --exclude-main{{ end }}
    42  {{- if .ExcludeSpec }} --exclude-spec{{ end }}
    43  {{- if .DumpData }} --dump-data{{ end }}
    44  {{ end }}
    45  func configureFlags(api *{{.Package}}.{{ pascalize .Name }}API) {
    46    // api.CommandLineOptionsGroups = []swag.CommandLineOptionsGroup{ ... }
    47  }
    48  
    49  func configureAPI(api *{{.Package}}.{{ pascalize .Name }}API) http.Handler {
    50    // configure the api here
    51    api.ServeError = errors.ServeError
    52  
    53    // Set your custom logger if needed. Default one is log.Printf
    54    // Expected interface func(string, ...interface{})
    55    //
    56    // Example:
    57    // api.Logger = log.Printf
    58  
    59    {{ range .Consumes }}{{ if .Implementation }}api.{{ pascalize .Name }}Consumer = {{ .Implementation }}
    60    {{else}}api.{{ pascalize .Name }}Consumer = runtime.ConsumerFunc(func(r io.Reader, target interface{}) error {
    61      return errors.NotImplemented("{{.Name}} consumer has not yet been implemented")
    62    }){{end}}
    63    {{end}}
    64    {{ range .Produces }}{{ if .Implementation }}api.{{ pascalize .Name }}Producer = {{ .Implementation }}
    65    {{else}}api.{{ pascalize .Name }}Producer = runtime.ProducerFunc(func(w io.Writer, data interface{}) error {
    66      return errors.NotImplemented("{{.Name}} producer has not yet been implemented")
    67    }){{end}}
    68    {{end}}
    69    {{ range .SecurityDefinitions }}
    70      {{- if .IsBasicAuth }}
    71    // Applies when the Authorization header is set with the Basic scheme
    72    api.{{ pascalize .ID }}Auth = func(user string, pass string) ({{if not ( eq .Principal "interface{}" )}}*{{ end }}{{.Principal}}, error) {
    73      return nil, errors.NotImplemented("basic auth  ({{ .ID }}) has not yet been implemented")
    74    }
    75      {{- else if .IsAPIKeyAuth }}
    76    // Applies when the "{{ .Name }}" {{ .Source }} is set
    77    api.{{ pascalize .ID }}Auth = func(token string) ({{if not ( eq .Principal "interface{}" )}}*{{ end }}{{.Principal}}, error) {
    78      return nil, errors.NotImplemented("api key auth ({{ .ID }}) {{.Name}} from {{.Source}} param [{{ .Name }}] has not yet been implemented")
    79    }
    80      {{- else if .IsOAuth2 }}
    81    api.{{ pascalize .ID }}Auth = func(token string, scopes []string) ({{if not ( eq .Principal "interface{}" )}}*{{ end }}{{.Principal}}, error) {
    82      return nil, errors.NotImplemented("oauth2 bearer auth ({{ .ID }}) has not yet been implemented")
    83    }
    84      {{- end }}
    85    {{- end }}
    86    {{- if .SecurityDefinitions }}
    87  
    88    // Set your custom authorizer if needed. Default one is security.Authorized()
    89    // Expected interface runtime.Authorizer
    90    //
    91    // Example:
    92    // api.APIAuthorizer = security.Authorized()
    93    {{- end }}
    94    {{range .Operations}}if api.{{if ne .Package $package}}{{pascalize .Package}}{{end}}{{ pascalize .Name }}Handler == nil {
    95      api.{{if ne .Package $package}}{{pascalize .Package}}{{end}}{{ pascalize .Name }}Handler = {{.Package}}.{{ pascalize .Name }}HandlerFunc(func(params {{.Package}}.{{ pascalize .Name }}Params{{if .Authorized}}, principal {{if not ( eq .Principal "interface{}" )}}*{{ end }}{{.Principal}}{{end}}) middleware.Responder {
    96        return middleware.NotImplemented("operation {{if ne .Package $package}}{{ .Package}}{{end}}.{{pascalize .Name}} has not yet been implemented")
    97      })
    98    }
    99    {{end}}
   100  
   101    api.ServerShutdown = func() {  }
   102  
   103    return setupGlobalMiddleware(api.Serve(setupMiddlewares))
   104  }
   105  
   106  // The TLS configuration before HTTPS server starts.
   107  func configureTLS(tlsConfig *tls.Config) {
   108    // Make all necessary changes to the TLS configuration here.
   109  }
   110  
   111  // As soon as server is initialized but not run yet, this function will be called.
   112  // If you need to modify a config, store server instance to stop it individually later, this is the place.
   113  // This function can be called multiple times, depending on the number of serving schemes.
   114  // scheme value will be set accordingly: "http", "https" or "unix"
   115  func configureServer(s *http.Server, scheme, addr string) {
   116  }
   117  
   118  // The middleware configuration is for the handler executors. These do not apply to the swagger.json document.
   119  // The middleware executes after routing but before authentication, binding and validation
   120  func setupMiddlewares(handler http.Handler) http.Handler {
   121  	return handler
   122  }
   123  
   124  // The middleware configuration happens before anything, this middleware also applies to serving the swagger.json document.
   125  // So this is a good place to plug in a panic handling middleware, logging and metrics
   126  func setupGlobalMiddleware(handler http.Handler) http.Handler {
   127  	return handler
   128  }