Files
2021-04-01 14:46:51 +03:00

123 lines
2.8 KiB
Go

package main
import (
"database/sql"
"flag"
"fmt"
"log"
"os"
migrate "github.com/rubenv/sql-migrate"
"github.com/vxcontrol/vxui/server"
)
// PackageVer is semantic version of vxui
var PackageVer string
// PackageRev is revision of vxui build
var PackageRev string
func init() {
if os.Getenv("DB_USER") == "" ||
os.Getenv("DB_PASS") == "" ||
os.Getenv("DB_HOST") == "" ||
os.Getenv("DB_PORT") == "" ||
os.Getenv("DB_NAME") == "" {
panic("DB params is not defined")
}
if (os.Getenv("RECAPTCHA_HTML_KEY") == "") !=
(os.Getenv("RECAPTCHA_API_KEY") == "") {
panic("use reCaptcha HTML and API keys in the time")
}
}
func open(args ...string) (*sql.DB, error) {
addr := fmt.Sprintf("%s:%s@%s/%s?parseTime=true",
os.Getenv("DB_USER"), os.Getenv("DB_PASS"),
fmt.Sprintf("tcp(%s:%s)", os.Getenv("DB_HOST"), os.Getenv("DB_PORT")), os.Getenv("DB_NAME"))
if len(args) > 0 {
addr = fmt.Sprintf("%s:%s@%s/%s?parseTime=true",
args[0], args[1], fmt.Sprintf("tcp(%s:%s)", args[2], args[3]), args[4])
}
dbcon, err := sql.Open("mysql", addr)
if err != nil {
return nil, err
}
dbcon.SetMaxIdleConns(0)
dbcon.SetMaxOpenConns(256)
return dbcon, nil
}
// MigrateUp is function that receives path to migration dir and runs up ones
func MigrateUp(path string) error {
log.Println("SQLMigrateUp: ", path)
db, err := open()
if err != nil {
return err
}
defer db.Close()
migrations := &migrate.FileMigrationSource{
Dir: path,
}
_, err = migrate.Exec(db, "mysql", migrations, migrate.Up)
return err
}
// MigrateDown is function that receives path to migration dir and runs down ones
func MigrateDown(path string) (err error) {
log.Println("SQLMigrateDown: ", path)
db, err := open()
if err != nil {
return err
}
defer db.Close()
migrations := &migrate.FileMigrationSource{
Dir: path,
}
_, err = migrate.Exec(db, "mysql", migrations, migrate.Down)
return err
}
// @title VXUI Swagger API
// @version 1.0
// @description Swagger API for VXControl backend product.
// @termsOfService http://swagger.io/terms/
// @contact.url https://vxcontrol.com
// @contact.name Dmitry Nagibin
// @contact.email admin@vxcontrol.com
// @license.name Proprietary License
// @license.url https://github.com/vxcontrol/vxui/src/master/LICENSE
// @query.collection.format multi
// @BasePath /api/v1
func main() {
var version bool
flag.BoolVar(&version, "version", false, "Print current version of vxui and exit")
flag.Parse()
if version {
fmt.Printf("vxui version is ")
if PackageVer != "" {
fmt.Printf("%s", PackageVer)
} else {
fmt.Printf("develop")
}
if PackageRev != "" {
fmt.Printf("-%s\n", PackageRev)
} else {
fmt.Printf("\n")
}
os.Exit(0)
}
if err := MigrateUp("migrations"); err != nil {
log.Fatalln("failed apply of migrations: ", err)
}
server.Run()
}