Skip to content
Snippets Groups Projects
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())
		}
	}
}