github.com/covergates/covergates@v0.2.2-0.20201009050117-42ef8a19fb95/cmd/server/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/covergates/covergates/config" 8 "github.com/covergates/covergates/core" 9 "github.com/covergates/covergates/routers" 10 "github.com/gin-gonic/gin" 11 log "github.com/sirupsen/logrus" 12 "github.com/urfave/cli/v2" 13 "gorm.io/driver/mysql" 14 "gorm.io/driver/postgres" 15 "gorm.io/driver/sqlite" 16 "gorm.io/gorm" 17 ) 18 19 // Version of covergates server 20 var Version = "0.0" 21 22 func connectDatabase(cfg *config.Config) *gorm.DB { 23 var x *gorm.DB 24 var err error 25 switch cfg.Database.Driver { 26 case "sqlite3": 27 x, err = gorm.Open(sqlite.Open(cfg.Database.Name), &gorm.Config{ 28 DisableForeignKeyConstraintWhenMigrating: true, 29 }) 30 case "postgres": 31 x, err = gorm.Open( 32 postgres.Open( 33 fmt.Sprintf( 34 "host=%s port=%s user=%s password=%s database=%s", 35 cfg.Database.Host, 36 cfg.Database.Port, 37 cfg.Database.User, 38 cfg.Database.Password, 39 cfg.Database.Name, 40 )), &gorm.Config{}) 41 case "mysql": 42 x, err = gorm.Open( 43 mysql.Open( 44 fmt.Sprintf( 45 "%s:%s@tcp(%s:%s)/%s?parseTime=true&loc=Local", 46 cfg.Database.User, 47 cfg.Database.Password, 48 cfg.Database.Host, 49 cfg.Database.Port, 50 cfg.Database.Name, 51 )), &gorm.Config{}, 52 ) 53 case "cloudrun": 54 x, err = gorm.Open( 55 postgres.Open( 56 fmt.Sprintf( 57 "user=%s password=%s database=%s host=%s/%s", 58 cfg.CloudRun.User, 59 cfg.CloudRun.Password, 60 cfg.CloudRun.Name, 61 cfg.CloudRun.Socket, 62 cfg.CloudRun.Instance, 63 )), &gorm.Config{}) 64 default: 65 log.Fatal("database driver not support") 66 } 67 if err != nil { 68 log.Fatal(err) 69 } 70 return x 71 } 72 73 // Run server 74 func Run(c *cli.Context) error { 75 config, err := config.Environ() 76 if err != nil { 77 return err 78 } 79 db := connectDatabase(config) 80 app, err := InitializeApplication(config, db) 81 if err != nil { 82 return err 83 } 84 if config.Database.AutoMigrate { 85 go func() { 86 if err := app.db.Migrate(); err != nil { 87 log.Panic(err) 88 } 89 log.Println("migration done") 90 }() 91 } 92 r := gin.Default() 93 app.routers.RegisterRoutes(r) 94 r.Run(fmt.Sprintf(":%s", config.Server.Port())) 95 return nil 96 } 97 98 func main() { 99 log.SetReportCaller(true) 100 app := &cli.App{ 101 Name: "codecover", 102 Version: Version, 103 Action: Run, 104 } 105 err := app.Run(os.Args) 106 if err != nil { 107 log.Fatal(err) 108 } 109 } 110 111 type application struct { 112 routers *routers.Routers 113 db core.DatabaseService 114 } 115 116 func newApplication( 117 routers *routers.Routers, 118 db core.DatabaseService, 119 ) application { 120 return application{ 121 routers: routers, 122 db: db, 123 } 124 }