Skip to content

Commit

Permalink
refactor config package (#11)
Browse files Browse the repository at this point in the history
Co-authored-by: Boonyarit Rousamran <hok@Boonyarits-MacBook-Air.local>
  • Loading branch information
hokkung and Boonyarit Rousamran committed Jun 25, 2024
1 parent 550c431 commit d6f3e7c
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 52 deletions.
27 changes: 27 additions & 0 deletions config/app.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package config

import (
"fmt"
"github.com/kelseyhightower/envconfig"
)

type AppProperties struct {
Name string `envconfig:"NAME" default:"groceries_api"`
}

// NewAppProperties creates instance
func NewAppProperties() *AppProperties {
var app AppProperties
err := envconfig.Process(AppPrefix, &app)
if err != nil {
fmt.Println("binding app configuration failed", err.Error())
panic(err)
}

return &app
}

// ProvideAppProperties provides instance for di
func ProvideAppProperties() AppProperties {
return *NewAppProperties()
}
55 changes: 9 additions & 46 deletions config/config.go
Original file line number Diff line number Diff line change
@@ -1,64 +1,27 @@
package config

import (
"fmt"

"github.com/kelseyhightower/envconfig"
)

const AppPrefix = "APP"

type Configuration struct {
AppProperties AppProperties
MysqlProperties MysqlProperties
}

type AppProperties struct {
Name string `envconfig:"NAME" default:"groceries_api"`
}

type MysqlProperties struct {
Host string `envconfig:"MYSQL_HOST" default:"localhost"`
Port string `envconfig:"MYSQL_PORT" default:"3306"`
Name string `envconfig:"MYSQL_DB_NAME" default:"grocery"`
UserName string `envconfig:"MYSQL_USERNAME" default:"root"`
Password string `envconfig:"MYSQL_PASSWORD" default:"root"`
}

func (c *MysqlProperties) DNS() string {
return fmt.Sprintf(
"%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
c.UserName,
c.Password,
c.Host,
c.Port,
c.Name,
)
}

// NewConfiguration returns new config instance
func NewConfiguration() *Configuration {
var app AppProperties
err := envconfig.Process(AppPrefix, &app)
if err != nil {
fmt.Println("binding app configuration failed", err.Error())
panic(err)
}

var mysql MysqlProperties
err = envconfig.Process(AppPrefix, &mysql)
if err != nil {
fmt.Println("binding mysql configuration failed", err.Error())
panic(err)
}

func NewConfiguration(
app AppProperties,
mysql MysqlProperties,
) *Configuration {
return &Configuration{
AppProperties: app,
MysqlProperties: mysql,
}
}

// ProvideConfiguration provides configuration for di
func ProvideConfiguration() Configuration {
return *NewConfiguration()
func ProvideConfiguration(
app AppProperties,
mysql MysqlProperties,
) Configuration {
return *NewConfiguration(app, mysql)
}
42 changes: 42 additions & 0 deletions config/mysql.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package config

import (
"fmt"
"github.com/kelseyhightower/envconfig"
)

type MysqlProperties struct {
Host string `envconfig:"MYSQL_HOST" default:"localhost"`
Port string `envconfig:"MYSQL_PORT" default:"3306"`
Name string `envconfig:"MYSQL_DB_NAME" default:"grocery"`
UserName string `envconfig:"MYSQL_USERNAME" default:"root"`
Password string `envconfig:"MYSQL_PASSWORD" default:"root"`
}

func (c *MysqlProperties) DNS() string {
return fmt.Sprintf(
"%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
c.UserName,
c.Password,
c.Host,
c.Port,
c.Name,
)
}

// NewMysqlProperties creates instance
func NewMysqlProperties() *MysqlProperties {
var mysql MysqlProperties
err := envconfig.Process(AppPrefix, &mysql)
if err != nil {
fmt.Println("binding mysql configuration failed", err.Error())
panic(err)
}

return &mysql
}

// ProvideMysqlProperties provides instance for di
func ProvideMysqlProperties() MysqlProperties {
return *NewMysqlProperties()
}
3 changes: 3 additions & 0 deletions internal/di/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ var APISet = wire.NewSet(
)

var ConfigSet = wire.NewSet(
config.ProvideAppProperties,
config.ProvideMysqlProperties,
config.ProvideConfiguration,
)

Expand Down Expand Up @@ -65,4 +67,5 @@ var ExternalSet = wire.NewSet(

type ApplicationAPI struct {
Server *srv.Server
Config config.Configuration
}
9 changes: 6 additions & 3 deletions internal/di/wire_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions internal/repository/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ type Entity interface {
Table() string
}

func ProvideGormDB(config config.Configuration) (*gorm.DB, error) {
func ProvideGormDB(config config.MysqlProperties) (*gorm.DB, error) {
return NewGormDB(config)
}

Expand All @@ -22,8 +22,8 @@ var entities = []Entity{
&entity2.User{},
}

func NewGormDB(config config.Configuration) (*gorm.DB, error) {
dsn := config.MysqlProperties.DNS()
func NewGormDB(config config.MysqlProperties) (*gorm.DB, error) {
dsn := config.DNS()
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
return nil, err
Expand Down

0 comments on commit d6f3e7c

Please sign in to comment.