diff --git a/dbHelper/dbController.go b/dbHelper/dbController.go index 21b47fd1a22bbede0fb37f5aef7d80822e771d0b..913ef9e95057ceccfadd25fdc661958680ad30dc 100644 --- a/dbHelper/dbController.go +++ b/dbHelper/dbController.go @@ -1,17 +1,37 @@ package dbHelper import ( + "errors" "fmt" + "github.com/caarlos0/env/v6" "gorm.io/driver/postgres" "gorm.io/gorm" "mobwebhf/models" + "net/url" + "strings" ) +type PostgresConfig struct { + URL string `env:"DATABASE_URL"` + Host string `env:"POSTGRES_HOST" envDefault:"localhost"` + Port string `env:"POSTGRES_PORT" envDefault:"5432"` + User string `env:"POSTGRES_USER" envDefault:"postgres"` + Password string `env:"POSTGRES_PASSWORD" envDefault:"postgres"` + Database string `env:"POSTGRES_DB" envDefault:"postgres"` +} + var Db *gorm.DB func Dbinit() { - dsn := "host=localhost user=postgres password=almafa port=5432 sslmode=disable TimeZone=Europe/Budapest" - var err error + c := GetPostgresConfig() + // if DATABASE_URL is valid, we will use its constituent values in preference + validConfig, err := validPostgresURL(c.URL) + if err == nil { + c = validConfig + } + + dsn := string("host="+ c.Host + " user=" + c.User + " password=" + c.Password + " port=" + c.Port + " sslmode=disabled TimeZone=Europe/Budapest") + Db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") @@ -26,3 +46,31 @@ func Dbinit() { fmt.Println("Failed to create table") } } + +func GetPostgresConfig() *PostgresConfig { + c := PostgresConfig{} + if err := env.Parse(&c); err != nil { + fmt.Printf("%+v\n", err) + } + return &c +} + +func validPostgresURL(URL string) (*PostgresConfig, error) { + if URL == "" || strings.TrimSpace(URL) == "" { + return nil, errors.New("database url is blank") + } + + validURL, err := url.Parse(URL) + if err != nil { + return nil, err + } + c := &PostgresConfig{} + c.URL = URL + c.Host = validURL.Host + c.Database = validURL.Path + c.Port = validURL.Port() + c.User = validURL.User.Username() + c.Password, _ = validURL.User.Password() + return c, nil +} + diff --git a/go.mod b/go.mod index be9c2ee6b7222ff08b0fb208bdb72d892e5e4a7c..c7e3f37725e7f3210d43e0c479463cda7dfae1df 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( ) require ( + github.com/caarlos0/env/v6 v6.8.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.13.0 // indirect github.com/go-playground/universal-translator v0.17.0 // indirect diff --git a/go.sum b/go.sum index 5ec1d2a170e1e3fa36147bb86e5b8f8170b81ded..a71c0313b3f649e058173bfdeb1a11f034907fb7 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/caarlos0/env/v6 v6.8.0 h1:abF9JinEXaibthiOowf4uSnRBWN66aJOxSpHLH67jeI= +github.com/caarlos0/env/v6 v6.8.0/go.mod h1:FE0jGiAnQqtv2TenJ4KTa8+/T2Ss8kdS5s1VEjasoN0= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=