all repos

onasty @ af0a94fab22a7ac9abaa6fba93413d3c920c43ac

a one-time notes service

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

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