all repos

onasty @ 9de58ad

a one-time notes service

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

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