Files
RenewCMS/internal/infrastructure/config/settings.go
T

85 lines
1.9 KiB
Go

package config
import (
"os"
"strconv"
"strings"
"time"
)
type SmtpSettings struct {
Email string
Password string
Host string
Port int
}
type AuthRateLimitSettings struct {
MaxAttempts int
Window time.Duration
}
type Settings struct {
Environment string
CorsAllowedOrigins []string
PublicURL string
UploadDir string
JWTSecret string
DBFile string
Port string
Smtp SmtpSettings
AuthRateLimit AuthRateLimitSettings
}
func (s Settings) IsProduction() bool {
return s.Environment == "production"
}
func NewSettingsFromEnv() (Settings, error) {
smtpPort, err := intEnv("SMTP_PORT")
if err != nil {
return Settings{}, err
}
authRateLimitMaxAttempts, err := intEnv("AUTH_RATE_LIMIT_MAX_ATTEMPTS")
if err != nil {
return Settings{}, err
}
authRateLimitWindowSeconds, err := intEnv("AUTH_RATE_LIMIT_WINDOW_SECONDS")
if err != nil {
return Settings{}, err
}
return Settings{
Environment: os.Getenv("ENVIRONMENT"),
CorsAllowedOrigins: parseCorsAllowedOrigins(os.Getenv("CORS_ALLOWED_ORIGINS")),
PublicURL: os.Getenv("PUBLIC_URL"),
UploadDir: os.Getenv("UPLOAD_DIR"),
JWTSecret: os.Getenv("JWT_SECRET"),
DBFile: os.Getenv("DB_FILE"),
Port: os.Getenv("PORT"),
Smtp: SmtpSettings{
Email: os.Getenv("SMTP_EMAIL"),
Password: os.Getenv("SMTP_PASSWORD"),
Host: os.Getenv("SMTP_HOST"),
Port: smtpPort,
},
AuthRateLimit: AuthRateLimitSettings{
MaxAttempts: authRateLimitMaxAttempts,
Window: time.Duration(authRateLimitWindowSeconds) * time.Second,
},
}, nil
}
func intEnv(name string) (int, error) {
return strconv.Atoi(os.Getenv(name))
}
func parseCorsAllowedOrigins(raw string) []string {
if raw == "" {
return nil
}
return strings.Split(raw, ";")
}