Skip to content

Commit 80d61ab

Browse files
committed
Update config to load into struct for easier usage
1 parent 47ec022 commit 80d61ab

File tree

2 files changed

+40
-36
lines changed

2 files changed

+40
-36
lines changed

main.go

+14-36
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package main
22

33
import (
44
"database/sql"
5-
"encoding/json"
65
"fmt"
76
"os"
87
"os/signal"
@@ -18,50 +17,30 @@ import (
1817
"github.com/iplay88keys/my-recipe-library/pkg/api"
1918
"github.com/iplay88keys/my-recipe-library/pkg/api/recipes"
2019
"github.com/iplay88keys/my-recipe-library/pkg/api/users"
20+
"github.com/iplay88keys/my-recipe-library/pkg/config"
2121
"github.com/iplay88keys/my-recipe-library/pkg/repositories"
2222
"github.com/iplay88keys/my-recipe-library/pkg/token"
2323

2424
_ "github.com/go-sql-driver/mysql"
2525
)
2626

27-
type Config struct {
28-
DatabaseCreds DBCreds `env:"DATABASE_CREDS, required"`
29-
RedisURL string `env:"REDIS_URL, required"`
30-
AccessSecret string `env:"ACCESS_SECRET, required"`
31-
RefreshSecret string `env:"REFRESH_SECRET, required"`
32-
Port string `env:"PORT"`
33-
Static string `env:"STATIC_DIR"`
34-
}
35-
36-
type DBCreds struct {
37-
URL string `json:"url"`
38-
InstanceName string `json:"gcloud_instance_name"`
39-
DBName string `json:"gcloud_db_name"`
40-
User string `json:"gcloud_user"`
41-
Password string `json:"gcloud_password"`
42-
}
43-
44-
func (d *DBCreds) UnmarshalEnv(data string) error {
45-
return json.Unmarshal([]byte(data), d)
46-
}
47-
4827
func main() {
49-
config := Config{
28+
cfg := config.Config{
5029
Port: "8080",
5130
Static: "ui/build",
5231
}
5332

54-
err := envstruct.Load(&config)
33+
err := envstruct.Load(&cfg)
5534
if err != nil {
5635
panic(err)
5736
}
5837

59-
db, err := connectToMySQL(&config)
38+
db, err := connectToMySQL(&config.MySQLCreds{})
6039
if err != nil {
6140
panic(err)
6241
}
6342

64-
redisClient, err := connectToRedis(config.RedisURL)
43+
redisClient, err := connectToRedis(cfg.RedisURL)
6544
if err != nil {
6645
panic(err)
6746
}
@@ -72,11 +51,11 @@ func main() {
7251
usersRepo := repositories.NewUsersRepository(db)
7352

7453
redisRepo := repositories.NewRedisRepository(redisClient)
75-
tokenService := token.NewService(config.AccessSecret, config.RefreshSecret)
54+
tokenService := token.NewService(cfg.AccessSecret, cfg.RefreshSecret)
7655

7756
a := api.New(&api.Config{
78-
Port: config.Port,
79-
StaticDir: config.Static,
57+
Port: cfg.Port,
58+
StaticDir: cfg.Static,
8059
Validate: tokenService.ValidateToken,
8160
RetrieveAccessDetails: redisRepo.RetrieveTokenDetails,
8261
Endpoints: []*api.Endpoint{
@@ -104,8 +83,7 @@ func main() {
10483
},
10584
})
10685

107-
fmt.Printf("Serving at http://localhost:%s\n", config.Port)
108-
fmt.Println("ctrl-c to quit")
86+
fmt.Printf("Serving at http://localhost:%s\n", cfg.Port)
10987
stopApi := a.Start()
11088

11189
defer stopApi()
@@ -115,10 +93,10 @@ func main() {
11593
blockUntilSigterm()
11694
}
11795

118-
func connectToMySQL(config *Config) (db *sql.DB, err error) {
119-
if config.DatabaseCreds.URL != "" {
96+
func connectToMySQL(config *config.MySQLCreds) (db *sql.DB, err error) {
97+
if config.URL != "" {
12098
var unquotedURL string
121-
url := config.DatabaseCreds.URL
99+
url := config.URL
122100

123101
unquotedURL, err = strconv.Unquote(url)
124102
if err == nil {
@@ -131,8 +109,8 @@ func connectToMySQL(config *Config) (db *sql.DB, err error) {
131109
}
132110

133111
} else {
134-
cfg := mysql.Cfg(config.DatabaseCreds.InstanceName, config.DatabaseCreds.User, config.DatabaseCreds.Password)
135-
cfg.DBName = config.DatabaseCreds.DBName
112+
cfg := mysql.Cfg(config.InstanceName, config.User, config.Password)
113+
cfg.DBName = config.DBName
136114

137115
db, err = mysql.DialCfg(cfg)
138116
if err != nil {

pkg/config/config.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package config
2+
3+
import (
4+
"encoding/json"
5+
)
6+
7+
type Config struct {
8+
MySQLCreds MySQLCreds `env:"MYSQL_CREDS, required"`
9+
RedisURL string `env:"REDIS_URL, required"`
10+
AccessSecret string `env:"ACCESS_SECRET, required"`
11+
RefreshSecret string `env:"REFRESH_SECRET, required"`
12+
Port string `env:"PORT"`
13+
Static string `env:"STATIC_DIR"`
14+
}
15+
16+
type MySQLCreds struct {
17+
URL string `json:"url"`
18+
InstanceName string `json:"gcloud_instance_name"`
19+
DBName string `json:"gcloud_db_name"`
20+
User string `json:"gcloud_user"`
21+
Password string `json:"gcloud_password"`
22+
}
23+
24+
func (d *MySQLCreds) UnmarshalEnv(data string) error {
25+
return json.Unmarshal([]byte(data), d)
26+
}

0 commit comments

Comments
 (0)