Skip to content
Snippets Groups Projects
cmdServe.gotmpl 2.67 KiB
// Code generated by go-swagger/go-orusapi; DO NOT EDIT.

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"
	"orus.io/orus-io/go-orusapi/database"
	"{{ 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

	AutoMigrate bool `long:"auto-migrate" description:"automatically apply database migrations if needed"`

	API     *operations.{{ pascalize .Name }}API `no-flag:"t"`
}

// Execute setup a server and runs it
func (cmd *ServeCmd) Execute([]string) error {
	if cmd.AutoMigrate {
		if err := database.AutoMigrate(DatabaseOptions.DSN, migrationSource, Logger); err != nil {
			return err
		}
	} else {
		if err := database.IsUptodate(DatabaseOptions.DSN, migrationSource); 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
	}

	if cmd.Server.Prometheus {
		collector := sqlstats.NewStatsCollector("db", db)
		if err := prometheus.Register(collector); err != nil {
			return err
		}
	}

	config := restapi.Config{
		Log: Logger,
		DB: db,
	}
	if err := setupServeConfig(&config); err != nil {
		return err
	}

	cmd.Server.SetLog(Logger)

	configuredAPI, err := restapi.ConfigureAPI(cmd.API, 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()
	serve, err := parser.AddCommand("serve", "Serves the API", "", serveCmd)
	if err != nil {
		Logger.Fatal().Msg(err.Error())
	}

	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())
		}
	}
}