all repos

onasty @ 5495cb456caa00f4564d1c1eed06a766811debaf

a one-time notes service

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

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
feat: add oauth2 login for google and github (#109)..., 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
45
	MetricsEnabled bool
46
	MetricsPort    int
47
48
	LogLevel    string
49
	LogFormat   string
50
	LogShowLine bool
51
52
	RateLimiterRPS   int
53
	RateLimiterBurst int
54
	RateLimiterTTL   time.Duration
55
}
56
57
func NewConfig() *Config {
58
	return &Config{
59
		AppEnv:  getenvOrDefault("APP_ENV", "debug"),
60
		AppURL:  getenvOrDefault("APP_URL", ""),
61
		NatsURL: getenvOrDefault("NATS_URL", ""),
62
63
		HTTPPort:            mustGetenvOrDefaultInt("HTTP_PORT", 3000),
64
		HTTPWriteTimeout:    mustParseDuration(getenvOrDefault("HTTP_WRITE_TIMEOUT", "10s")),
65
		HTTPReadTimeout:     mustParseDuration(getenvOrDefault("HTTP_READ_TIMEOUT", "10s")),
66
		HTTPHeaderMaxSizeMb: mustGetenvOrDefaultInt("HTTP_HEADER_MAX_SIZE_MB", 1),
67
68
		PostgresDSN:      getenvOrDefault("POSTGRESQL_DSN", ""),
69
		PasswordSalt:     getenvOrDefault("PASSWORD_SALT", ""),
70
		NotePasswordSalt: getenvOrDefault("NOTE_PASSWORD_SALT", ""),
71
72
		RedisAddr:     getenvOrDefault("REDIS_ADDR", ""),
73
		RedisPassword: getenvOrDefault("REDIS_PASSWORD", ""),
74
		RedisDB:       mustGetenvOrDefaultInt(getenvOrDefault("REDIS_DB", "0"), 0),
75
76
		CacheUsersTTL: mustParseDuration(getenvOrDefault("CACHE_USERS_TTL", "1h")),
77
		CacheNoteTTL:  mustParseDuration(getenvOrDefault("CACHE_NOTE_TTL", "1h")),
78
79
		JwtSigningKey: getenvOrDefault("JWT_SIGNING_KEY", ""),
80
		JwtAccessTokenTTL: mustParseDuration(
81
			getenvOrDefault("JWT_ACCESS_TOKEN_TTL", "15m"),
82
		),
83
		JwtRefreshTokenTTL: mustParseDuration(
84
			getenvOrDefault("JWT_REFRESH_TOKEN_TTL", "24h"),
85
		),
86
87
		GoogleClientID:    getenvOrDefault("GOOGLE_CLIENTID", ""),
88
		GoogleSecret:      getenvOrDefault("GOOGLE_SECRET", ""),
89
		GoogleRedirectURL: getenvOrDefault("GOOGLE_REDIRECTURL", ""),
90
91
		GitHubClientID:    getenvOrDefault("GITHUB_CLIENTID", ""),
92
		GitHubSecret:      getenvOrDefault("GITHUB_SECRET", ""),
93
		GitHubRedirectURL: getenvOrDefault("GITHUB_REDIRECTURL", ""),
94
95
		VerificationTokenTTL: mustParseDuration(
96
			getenvOrDefault("VERIFICATION_TOKEN_TTL", "24h"),
97
		),
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
}