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  }