File size: 3,104 Bytes
ca7217f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | package cmd
import (
goflag "flag"
"log"
"os"
"time"
"github.com/gin-gonic/gin"
"github.com/peterbourgon/ff/v3"
"github.com/metatube-community/metatube-sdk-go/database"
"github.com/metatube-community/metatube-sdk-go/engine"
"github.com/metatube-community/metatube-sdk-go/internal/envconfig"
"github.com/metatube-community/metatube-sdk-go/route"
"github.com/metatube-community/metatube-sdk-go/route/auth"
)
var Config = &struct {
// main config
Bind string
Port string
Token string
DSN string
// engine config
RequestTimeout time.Duration
// database config
DBMaxIdleConns int
DBMaxOpenConns int
DBAutoMigrate bool
DBPreparedStmt bool
// version flag
VersionFlag bool
}{}
func init() {
// gin init
gin.DisableConsoleColor()
// flag init
flag := goflag.NewFlagSet("", goflag.ExitOnError)
// flag parse
flag.StringVar(&Config.Bind, "bind", "", "Bind address of server")
flag.StringVar(&Config.Port, "port", "8080", "Port number of server")
flag.StringVar(&Config.Token, "token", "", "Token to access server")
flag.StringVar(&Config.DSN, "dsn", "", "Database Service Name")
flag.DurationVar(&Config.RequestTimeout, "request-timeout", engine.DefaultRequestTimeout, "Timeout per request")
flag.IntVar(&Config.DBMaxIdleConns, "db-max-idle-conns", 0, "Database max idle connections")
flag.IntVar(&Config.DBMaxOpenConns, "db-max-open-conns", 0, "Database max open connections")
flag.BoolVar(&Config.DBAutoMigrate, "db-auto-migrate", false, "Database auto migration")
flag.BoolVar(&Config.DBPreparedStmt, "db-prepared-stmt", false, "Database prepared statement")
flag.BoolVar(&Config.VersionFlag, "version", false, "Show version")
ff.Parse(flag, os.Args[1:], ff.WithEnvVars())
}
func Router(names ...string) *gin.Engine {
db, err := database.Open(&database.Config{
DSN: Config.DSN,
PreparedStmt: Config.DBPreparedStmt,
MaxIdleConns: Config.DBMaxIdleConns,
MaxOpenConns: Config.DBMaxOpenConns,
DisableAutomaticPing: true,
})
if err != nil {
log.Fatal(err)
}
// engine options
var opts []engine.Option
// timeout must >= 1 second
if Config.RequestTimeout >= time.Second {
opts = append(opts, engine.WithRequestTimeout(Config.RequestTimeout))
}
// specify engine name
for _, name := range names {
opts = append(opts, engine.WithEngineName(name))
}
// // set actor provider configs if any
for provider, config := range envconfig.ActorProviderConfigs.Iterator() {
opts = append(opts, engine.WithActorProviderConfig(provider, config))
}
// set movie provider configs if any
for provider, config := range envconfig.MovieProviderConfigs.Iterator() {
opts = append(opts, engine.WithMovieProviderConfig(provider, config))
}
app := engine.New(db, opts...)
// always enable auto migrate for sqlite DB
if app.DBDriver() == database.Sqlite {
Config.DBAutoMigrate = true
}
if err = app.DBAutoMigrate(Config.DBAutoMigrate); err != nil {
log.Fatal(err)
}
var token auth.Validator
if Config.Token != "" {
token = auth.Token(Config.Token)
}
return route.New(app, token)
}
|