-
Christophe de Vienne authored
if info.x-go-orusapi-no-db is true, no database-related code is generated
Christophe de Vienne authoredif info.x-go-orusapi-no-db is true, no database-related code is generated
cmdServe.gotmpl 3.67 KiB
// Code generated by go-swagger/go-orusapi; DO NOT EDIT.
{{ if .Copyright -}}// {{ comment .Copyright -}}{{ end }}
{{- $noDB := not (not (index .Info.Extensions "x-go-orusapi-no-db") ) }}
package cmd
import (
"github.com/dlmiddlecote/sqlstats"
"github.com/go-openapi/loads"
"github.com/jmoiron/sqlx"
flags "github.com/orus-io/go-flags"
"github.com/prometheus/client_golang/prometheus"
orusapi "orus.io/orus-io/go-orusapi"
{{- if not $noDB }}
"orus.io/orus-io/go-orusapi/database"
{{- end }}
"{{ joinFilePath .TargetImportPath "restapi" "operations" }}"
)
// NewServerCmd creates a ServerCmd
func NewServerCmd() *ServeCmd {
swaggerSpec, err := loads.Embedded(restapi.SwaggerJSON, restapi.FlatSwaggerJSON)
if err != nil {
Logger.Fatal().Err(err).Msg("")
}
api := operations.New{{ pascalize .Name }}API(swaggerSpec)
server := orusapi.NewServer(nil)
cmd := ServeCmd{
Server: server,
API: api,
}
return &cmd
}
// ServeCmd is the 'serve' command
type ServeCmd struct {
Server *orusapi.Server
{{- if not $noDB }}
AutoMigrate bool `long:"auto-migrate" description:"automatically apply database migrations if needed"`
{{- end }}
API *operations.{{ pascalize .Name }}API `no-flag:"t"`
}
// Execute setup a server and runs it
func (cmd *ServeCmd) Execute([]string) error {
{{- if not $noDB }}
if cmd.AutoMigrate {
if err := database.AutoMigrate(DatabaseOptions.DSN, migration.Source, Logger); err != nil {
return err
}
} else {
if err := database.IsUptodate(DatabaseOptions.DSN, migration.Source); err != nil {
return err
}
}
db, err := DatabaseOptions.Open()
if err != nil {
return err
}
defer func() {
if err := db.Close(); err != nil {
Logger.Err(err).Msg("could not close database connection properly")
}
}()
if err := db.Ping(); err != nil {
return err
}
{{- end}}
if cmd.Server.Prometheus {
var infoGauge = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "{{ snakize .Name }}_info",
Help: "Informations about the {{ pascalize .Name }} server",
ConstLabels: map[string]string{
"environment": InfoOptions.Environment,
"version": Version,
},
})
infoGauge.Set(1)
if err := prometheus.Register(infoGauge); err != nil {
return err
}
defer prometheus.Unregister(infoGauge)
{{- if not $noDB }}
collector := sqlstats.NewStatsCollector("db", db)
if err := prometheus.Register(collector); err != nil {
return err
}
defer prometheus.Unregister(collector)
{{- end }}
}
config := restapi.Config{
Log: Logger,
{{- if not $noDB }}
DB: db,
{{- end }}
}
if err := setupServeConfig(&config); err != nil {
return err
}
cmd.Server.SetLog(Logger)
cmd.Server.Environment = InfoOptions.Environment
configuredAPI, err := restapi.ConfigureAPI(cmd.API, cmd.Server, config)
if err != nil {
return err
}
cmd.Server.SetAPI(configuredAPI)
defer func() {
if err := cmd.Server.Shutdown(); err != nil {
Logger.Err(err).Msg("error shutting down the server")
}
}()
if err := cmd.Server.Serve(); err != nil {
return err
}
return nil
}
func init() {
var serveCmd = NewServerCmd()
setupServerCmd(serveCmd)
serve, err := parser.AddCommand("serve", "Serves the API", "", serveCmd)
if err != nil {
Logger.Fatal().Msg(err.Error())
}
serve.FindOptionByLongName("socket-path").Default = []string{"/var/run/{{dasherize .Name}}.sock"}
serve.EnvNamespace = "SERVE"
serve.FindOptionByLongName("scheme").EnvDefaultKey = "SCHEME"
for _, optsGroup := range serveCmd.API.CommandLineOptionsGroups {
_, err := serve.AddGroup(optsGroup.ShortDescription, optsGroup.LongDescription, optsGroup.Options)
if err != nil {
Logger.Fatal().Msg(err.Error())
}
}
}