all repos

onasty @ a9ae72ba6d9d01fcc52c5cd4577e93e3aefb8602

a one-time notes service

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

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
feat: keep metadate on note removal (#96)..., 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
	CacheNoteTTL  time.Duration
26
27
	JwtSigningKey      string
28
	JwtAccessTokenTTL  time.Duration
29
	JwtRefreshTokenTTL time.Duration
30
31
	VerificationTokenTTL time.Duration
32
33
	MetricsEnabled bool
34
	MetricsPort    string
35
36
	LogLevel    string
37
	LogFormat   string
38
	LogShowLine bool
39
40
	RateLimiterRPS   int
41
	RateLimiterBurst int
42
	RateLimiterTTL   time.Duration
43
}
44
45
func NewConfig() *Config {
46
	return &Config{
47
		AppEnv:     getenvOrDefault("APP_ENV", "debug"),
48
		AppURL:     getenvOrDefault("APP_URL", ""),
49
		ServerPort: getenvOrDefault("SERVER_PORT", "3000"),
50
		NatsURL:    getenvOrDefault("NATS_URL", ""),
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
		CacheNoteTTL:  mustParseDuration(getenvOrDefault("CACHE_NOTE_TTL", "1h")),
62
63
		JwtSigningKey: getenvOrDefault("JWT_SIGNING_KEY", ""),
64
		JwtAccessTokenTTL: mustParseDuration(
65
			getenvOrDefault("JWT_ACCESS_TOKEN_TTL", "15m"),
66
		),
67
		JwtRefreshTokenTTL: mustParseDuration(
68
			getenvOrDefault("JWT_REFRESH_TOKEN_TTL", "24h"),
69
		),
70
71
		VerificationTokenTTL: mustParseDuration(
72
			getenvOrDefault("VERIFICATION_TOKEN_TTL", "24h"),
73
		),
74
75
		MetricsPort:    getenvOrDefault("METRICS_PORT", "3001"),
76
		MetricsEnabled: getenvOrDefault("METRICS_ENABLED", "true") == "true",
77
78
		LogLevel:    getenvOrDefault("LOG_LEVEL", "debug"),
79
		LogFormat:   getenvOrDefault("LOG_FORMAT", "json"),
80
		LogShowLine: getenvOrDefault("LOG_SHOW_LINE", "true") == "true",
81
82
		RateLimiterRPS:   mustGetenvOrDefaultInt("RATELIMITER_RPS", 100),
83
		RateLimiterBurst: mustGetenvOrDefaultInt("RATELIMITER_BURST", 10),
84
		RateLimiterTTL:   mustParseDuration(getenvOrDefault("RATELIMITER_TTL", "1m")),
85
	}
86
}
87
88
func (c *Config) IsDevMode() bool {
89
	return c.AppEnv == "debug" || c.AppEnv == "test"
90
}
91
92
func getenvOrDefault(key, def string) string {
93
	if v, ok := os.LookupEnv(key); ok {
94
		return v
95
	}
96
	return def
97
}
98
99
func mustGetenvOrDefaultInt(key string, def int) int {
100
	if v, ok := os.LookupEnv(key); ok {
101
		r, err := strconv.Atoi(v)
102
		if err != nil {
103
			panic(err)
104
		}
105
		return r
106
	}
107
	return def
108
}
109
110
func mustParseDuration(dur string) time.Duration {
111
	d, err := time.ParseDuration(dur)
112
	if err != nil {
113
		panic(errors.Join(errors.New("cannot time.ParseDuration"), err)) //nolint:err113
114
	}
115
116
	return d
117
}