all repos

onasty @ 9f4dd4beef61d8ada28beac0547d46b7d5a9ec13

a one-time notes service

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

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