all repos

onasty @ 445822dad429b08586716d6fea39fa538f056c51

a one-time notes service

onasty/internal/config/config.go (view raw)

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
feat: mailer service (#55)..., 1 year ago
1
package config
2
3
import (
4
	"errors"
5
	"os"
6
	"strconv"
7
	"time"
8
)
9
10
type Config struct {
11
	AppEnv     string
12
	AppURL     string
13
	ServerPort string
14
	NatsURL    string
15
16
	PostgresDSN      string
17
	PasswordSalt     string
18
	NotePassowrdSalt string
19
20
	RedisAddr     string
21
	RedisPassword string
22
	RedisDB       int
23
24
	CacheUsersTTL time.Duration
25
26
	JwtSigningKey      string
27
	JwtAccessTokenTTL  time.Duration
28
	JwtRefreshTokenTTL time.Duration
29
30
	MailgunFrom          string
31
	MailgunDomain        string
32
	MailgunAPIKey        string
33
	VerificationTokenTTL time.Duration
34
35
	MetricsEnabled bool
36
	MetricsPort    string
37
38
	LogLevel    string
39
	LogFormat   string
40
	LogShowLine bool
41
42
	RateLimiterRPS   int
43
	RateLimiterBurst int
44
	RateLimiterTTL   time.Duration
45
}
46
47
func NewConfig() *Config {
48
	return &Config{
49
		AppEnv:     getenvOrDefault("APP_ENV", "debug"),
50
		AppURL:     getenvOrDefault("APP_URL", ""),
51
		ServerPort: getenvOrDefault("SERVER_PORT", "3000"),
52
		NatsURL:    getenvOrDefault("NATS_URL", ""),
53
54
		PostgresDSN:      getenvOrDefault("POSTGRESQL_DSN", ""),
55
		PasswordSalt:     getenvOrDefault("PASSWORD_SALT", ""),
56
		NotePassowrdSalt: getenvOrDefault("NOTE_PASSWORD_SALT", ""),
57
58
		RedisAddr:     getenvOrDefault("REDIS_ADDR", ""),
59
		RedisPassword: getenvOrDefault("REDIS_PASSWORD", ""),
60
		RedisDB:       mustGetenvOrDefaultInt(getenvOrDefault("REDIS_DB", "0"), 0),
61
62
		CacheUsersTTL: mustParseDuration(getenvOrDefault("CACHE_USERS_TTL", "1h")),
63
64
		JwtSigningKey: getenvOrDefault("JWT_SIGNING_KEY", ""),
65
		JwtAccessTokenTTL: mustParseDuration(
66
			getenvOrDefault("JWT_ACCESS_TOKEN_TTL", "15m"),
67
		),
68
		JwtRefreshTokenTTL: mustParseDuration(
69
			getenvOrDefault("JWT_REFRESH_TOKEN_TTL", "24h"),
70
		),
71
72
		MailgunFrom:   getenvOrDefault("MAILGUN_FROM", ""),
73
		MailgunDomain: getenvOrDefault("MAILGUN_DOMAIN", ""),
74
		MailgunAPIKey: getenvOrDefault("MAILGUN_API_KEY", ""),
75
		VerificationTokenTTL: mustParseDuration(
76
			getenvOrDefault("VERIFICATION_TOKEN_TTL", "24h"),
77
		),
78
79
		MetricsPort:    getenvOrDefault("METRICS_PORT", "3001"),
80
		MetricsEnabled: getenvOrDefault("METRICS_ENABLED", "true") == "true",
81
82
		LogLevel:    getenvOrDefault("LOG_LEVEL", "debug"),
83
		LogFormat:   getenvOrDefault("LOG_FORMAT", "json"),
84
		LogShowLine: getenvOrDefault("LOG_SHOW_LINE", "true") == "true",
85
86
		RateLimiterRPS:   mustGetenvOrDefaultInt("RATELIMITER_RPS", 100),
87
		RateLimiterBurst: mustGetenvOrDefaultInt("RATELIMITER_BURST", 10),
88
		RateLimiterTTL:   mustParseDuration(getenvOrDefault("RATELIMITER_TTL", "1m")),
89
	}
90
}
91
92
func (c *Config) IsDevMode() bool {
93
	return c.AppEnv == "debug" || c.AppEnv == "test"
94
}
95
96
func getenvOrDefault(key, def string) string {
97
	if v, ok := os.LookupEnv(key); ok {
98
		return v
99
	}
100
	return def
101
}
102
103
func mustGetenvOrDefaultInt(key string, def int) int {
104
	if v, ok := os.LookupEnv(key); ok {
105
		r, err := strconv.Atoi(v)
106
		if err != nil {
107
			panic(err)
108
		}
109
		return r
110
	}
111
	return def
112
}
113
114
func mustParseDuration(dur string) time.Duration {
115
	d, err := time.ParseDuration(dur)
116
	if err != nil {
117
		panic(errors.Join(errors.New("cannot time.ParseDuration"), err)) //nolint:err113
118
	}
119
120
	return d
121
}