all repos

onasty @ c5b3657

a one-time notes service

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

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
feat: reset password (#110)..., 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
	NatsURL string
14
15
	HTTPPort            int
16
	HTTPWriteTimeout    time.Duration
17
	HTTPReadTimeout     time.Duration
18
	HTTPHeaderMaxSizeMb int
19
20
	PostgresDSN      string
21
	PasswordSalt     string
22
	NotePasswordSalt string
23
24
	RedisAddr     string
25
	RedisPassword string
26
	RedisDB       int
27
28
	CacheUsersTTL time.Duration
29
	CacheNoteTTL  time.Duration
30
31
	JwtSigningKey      string
32
	JwtAccessTokenTTL  time.Duration
33
	JwtRefreshTokenTTL time.Duration
34
35
	GoogleClientID    string
36
	GoogleSecret      string
37
	GoogleRedirectURL string
38
39
	GitHubClientID    string
40
	GitHubSecret      string
41
	GitHubRedirectURL string
42
43
	VerificationTokenTTL  time.Duration
44
	ResetPasswordTokenTTL time.Duration
45
46
	MetricsEnabled bool
47
	MetricsPort    int
48
49
	LogLevel    string
50
	LogFormat   string
51
	LogShowLine bool
52
53
	RateLimiterRPS   int
54
	RateLimiterBurst int
55
	RateLimiterTTL   time.Duration
56
}
57
58
func NewConfig() *Config {
59
	return &Config{
60
		AppEnv:  getenvOrDefault("APP_ENV", "debug"),
61
		AppURL:  getenvOrDefault("APP_URL", ""),
62
		NatsURL: getenvOrDefault("NATS_URL", ""),
63
64
		HTTPPort:            mustGetenvOrDefaultInt("HTTP_PORT", 3000),
65
		HTTPWriteTimeout:    mustParseDuration(getenvOrDefault("HTTP_WRITE_TIMEOUT", "10s")),
66
		HTTPReadTimeout:     mustParseDuration(getenvOrDefault("HTTP_READ_TIMEOUT", "10s")),
67
		HTTPHeaderMaxSizeMb: mustGetenvOrDefaultInt("HTTP_HEADER_MAX_SIZE_MB", 1),
68
69
		PostgresDSN:      getenvOrDefault("POSTGRESQL_DSN", ""),
70
		PasswordSalt:     getenvOrDefault("PASSWORD_SALT", ""),
71
		NotePasswordSalt: getenvOrDefault("NOTE_PASSWORD_SALT", ""),
72
73
		RedisAddr:     getenvOrDefault("REDIS_ADDR", ""),
74
		RedisPassword: getenvOrDefault("REDIS_PASSWORD", ""),
75
		RedisDB:       mustGetenvOrDefaultInt(getenvOrDefault("REDIS_DB", "0"), 0),
76
77
		CacheUsersTTL: mustParseDuration(getenvOrDefault("CACHE_USERS_TTL", "1h")),
78
		CacheNoteTTL:  mustParseDuration(getenvOrDefault("CACHE_NOTE_TTL", "1h")),
79
80
		JwtSigningKey: getenvOrDefault("JWT_SIGNING_KEY", ""),
81
		JwtAccessTokenTTL: mustParseDuration(
82
			getenvOrDefault("JWT_ACCESS_TOKEN_TTL", "15m"),
83
		),
84
		JwtRefreshTokenTTL: mustParseDuration(
85
			getenvOrDefault("JWT_REFRESH_TOKEN_TTL", "24h"),
86
		),
87
88
		GoogleClientID:    getenvOrDefault("GOOGLE_CLIENTID", ""),
89
		GoogleSecret:      getenvOrDefault("GOOGLE_SECRET", ""),
90
		GoogleRedirectURL: getenvOrDefault("GOOGLE_REDIRECTURL", ""),
91
92
		GitHubClientID:    getenvOrDefault("GITHUB_CLIENTID", ""),
93
		GitHubSecret:      getenvOrDefault("GITHUB_SECRET", ""),
94
		GitHubRedirectURL: getenvOrDefault("GITHUB_REDIRECTURL", ""),
95
96
		VerificationTokenTTL:  mustParseDuration(getenvOrDefault("VERIFICATION_TOKEN_TTL", "24h")),
97
		ResetPasswordTokenTTL: mustParseDuration(getenvOrDefault("RESET_PASSWORD_TOKEN_TTL", "1h")),
98
99
		MetricsPort:    mustGetenvOrDefaultInt("METRICS_PORT", 3001),
100
		MetricsEnabled: getenvOrDefault("METRICS_ENABLED", "true") == "true",
101
102
		LogLevel:    getenvOrDefault("LOG_LEVEL", "debug"),
103
		LogFormat:   getenvOrDefault("LOG_FORMAT", "json"),
104
		LogShowLine: getenvOrDefault("LOG_SHOW_LINE", "true") == "true",
105
106
		RateLimiterRPS:   mustGetenvOrDefaultInt("RATELIMITER_RPS", 100),
107
		RateLimiterBurst: mustGetenvOrDefaultInt("RATELIMITER_BURST", 10),
108
		RateLimiterTTL:   mustParseDuration(getenvOrDefault("RATELIMITER_TTL", "1m")),
109
	}
110
}
111
112
func (c *Config) IsDevMode() bool {
113
	return c.AppEnv == "debug" || c.AppEnv == "test"
114
}
115
116
func getenvOrDefault(key, def string) string {
117
	if v, ok := os.LookupEnv(key); ok {
118
		return v
119
	}
120
	return def
121
}
122
123
func mustGetenvOrDefaultInt(key string, def int) int {
124
	if v, ok := os.LookupEnv(key); ok {
125
		r, err := strconv.Atoi(v)
126
		if err != nil {
127
			panic(err)
128
		}
129
		return r
130
	}
131
	return def
132
}
133
134
func mustParseDuration(dur string) time.Duration {
135
	d, err := time.ParseDuration(dur)
136
	if err != nil {
137
		panic(errors.Join(errors.New("cannot time.ParseDuration"), err)) //nolint:err113
138
	}
139
140
	return d
141
}