Skip to content

Commit 39855a4

Browse files
committed
Refactor environment variable handling to use value types and add validation for listen host and port
1 parent c23a1d6 commit 39855a4

28 files changed

+97
-408
lines changed

cmd/app/main.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ import (
1313
)
1414

1515
func main() {
16-
env := config.GetEnv()
16+
env, err := config.GetEnv()
17+
if err != nil {
18+
logger.FatalError("error getting environment variables", logger.KV{"error": err})
19+
}
1720

1821
cr, err := cron.New()
1922
if err != nil {
@@ -43,8 +46,12 @@ func main() {
4346
app.HidePort = true
4447
view.MountRouter(app, servs)
4548

46-
logger.Info("server started at http://localhost:8085")
47-
if err := app.Start(":8085"); err != nil {
49+
address := env.PBW_LISTEN_HOST + ":" + env.PBW_LISTEN_PORT
50+
logger.Info("server started at http://localhost:"+env.PBW_LISTEN_PORT, logger.KV{
51+
"listenHost": env.PBW_LISTEN_HOST,
52+
"listenPort": env.PBW_LISTEN_PORT,
53+
})
54+
if err := app.Start(address); err != nil {
4855
logger.FatalError("error starting server", logger.KV{"error": err})
4956
}
5057
}

cmd/changepw/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ import (
1414
)
1515

1616
func main() {
17-
env := config.GetEnv()
17+
env, err := config.GetEnv()
18+
if err != nil {
19+
panic(err)
20+
}
1821

1922
db := database.Connect(env)
2023
defer db.Close()

cmd/resetdb/main.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,23 @@ func main() {
2828
log.Println("Please enter 'yes' or 'no'")
2929
}
3030

31-
env := config.GetEnv()
31+
env, err := config.GetEnv()
32+
if err != nil {
33+
panic(err)
34+
}
35+
3236
db := connectDB(env)
3337

34-
_, err := db.Exec("DROP SCHEMA public CASCADE; CREATE SCHEMA public;")
38+
_, err = db.Exec("DROP SCHEMA public CASCADE; CREATE SCHEMA public;")
3539
if err != nil {
3640
panic(fmt.Errorf("❌ Could not reset DB: %w", err))
3741
}
3842

3943
log.Println("✅ Database reset")
4044
}
4145

42-
func connectDB(env *config.Env) *sql.DB {
43-
db, err := sql.Open("postgres", *env.PBW_POSTGRES_CONN_STRING)
46+
func connectDB(env config.Env) *sql.DB {
47+
db, err := sql.Open("postgres", env.PBW_POSTGRES_CONN_STRING)
4448
if err != nil {
4549
panic(fmt.Errorf("❌ Could not connect to DB: %w", err))
4650
}

internal/config/env.go

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,45 @@
11
package config
22

33
import (
4-
"github.com/eduardolat/pgbackweb/internal/logger"
4+
"sync"
5+
6+
"github.com/caarlos0/env/v11"
57
"github.com/joho/godotenv"
68
)
79

810
type Env struct {
9-
PBW_ENCRYPTION_KEY *string
10-
PBW_POSTGRES_CONN_STRING *string
11+
PBW_ENCRYPTION_KEY string `env:"PBW_ENCRYPTION_KEY,required"`
12+
PBW_POSTGRES_CONN_STRING string `env:"PBW_POSTGRES_CONN_STRING,required"`
13+
PBW_LISTEN_HOST string `env:"PBW_LISTEN_HOST" envDefault:"0.0.0.0"`
14+
PBW_LISTEN_PORT string `env:"PBW_LISTEN_PORT" envDefault:"8085"`
1115
}
1216

17+
var (
18+
getEnvRes Env
19+
getEnvErr error
20+
getEnvOnce sync.Once
21+
)
22+
1323
// GetEnv returns the environment variables.
1424
//
1525
// If there is an error, it will log it and exit the program.
16-
func GetEnv(disableLogs ...bool) *Env {
17-
pickedDisableLogs := len(disableLogs) > 0 && disableLogs[0]
18-
19-
err := godotenv.Load()
20-
if err == nil && !pickedDisableLogs {
21-
logger.Info("using .env file")
22-
}
23-
24-
env := &Env{
25-
PBW_ENCRYPTION_KEY: getEnvAsString(getEnvAsStringParams{
26-
name: "PBW_ENCRYPTION_KEY",
27-
isRequired: true,
28-
}),
29-
PBW_POSTGRES_CONN_STRING: getEnvAsString(getEnvAsStringParams{
30-
name: "PBW_POSTGRES_CONN_STRING",
31-
isRequired: true,
32-
}),
33-
}
34-
35-
validateEnv(env)
36-
return env
26+
func GetEnv(disableLogs ...bool) (Env, error) {
27+
getEnvOnce.Do(func() {
28+
_ = godotenv.Load()
29+
30+
parsedEnv, err := env.ParseAs[Env]()
31+
if err != nil {
32+
getEnvErr = err
33+
return
34+
}
35+
36+
if err := validateEnv(parsedEnv); err != nil {
37+
getEnvErr = err
38+
return
39+
}
40+
41+
getEnvRes = parsedEnv
42+
})
43+
44+
return getEnvRes, getEnvErr
3745
}

internal/config/env_validate.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,20 @@
11
package config
22

3+
import (
4+
"fmt"
5+
6+
"github.com/eduardolat/pgbackweb/internal/validate"
7+
)
8+
39
// validateEnv runs additional validations on the environment variables.
4-
func validateEnv(env *Env) {}
10+
func validateEnv(env Env) error {
11+
if !validate.ListenHost(env.PBW_LISTEN_HOST) {
12+
return fmt.Errorf("invalid listen address %s", env.PBW_LISTEN_HOST)
13+
}
14+
15+
if !validate.Port(env.PBW_LISTEN_PORT) {
16+
return fmt.Errorf("invalid listen port %s, valid values are 1-65535", env.PBW_LISTEN_PORT)
17+
}
18+
19+
return nil
20+
}

internal/config/helpers.go

Lines changed: 0 additions & 159 deletions
This file was deleted.

0 commit comments

Comments
 (0)