diff --git a/internal/config/config.go b/internal/config/config.go new file mode 100644 index 0000000..c366b35 --- /dev/null +++ b/internal/config/config.go @@ -0,0 +1,100 @@ +package config + +import ( + "os" + "strconv" + "time" +) + +type Config struct { + DatabaseURL string + Port string + StorageDir string + MaxFileSize int64 + RateLimit float64 + CORSOrigins []string + GzipLevel int + MaxConnections int32 + MinConnections int32 + ConnLifetime time.Duration + ConnIdleTime time.Duration + HealthCheckPeriod time.Duration + DefaultStorageLimit int64 +} + +func Load() *Config { + return &Config{ + DatabaseURL: getEnv("DATABASE_URL", ""), + Port: getEnv("PORT", "8080"), + StorageDir: getEnv("STORAGE_DIR", "storage"), + MaxFileSize: getEnvInt64("MAX_FILE_SIZE_MB", 100) * 1024 * 1024, + RateLimit: getEnvFloat64("RATE_LIMIT", 20.0), + CORSOrigins: getEnvSlice("CORS_ORIGINS", []string{"*"}), + GzipLevel: getEnvInt("GZIP_LEVEL", 5), + MaxConnections: getEnvInt32("DB_MAX_CONNECTIONS", 100), + MinConnections: getEnvInt32("DB_MIN_CONNECTIONS", 10), + ConnLifetime: getEnvDuration("DB_CONN_LIFETIME", time.Hour), + ConnIdleTime: getEnvDuration("DB_CONN_IDLE_TIME", time.Minute), + HealthCheckPeriod: getEnvDuration("DB_HEALTH_CHECK_PERIOD", 5*time.Second), + DefaultStorageLimit: getEnvInt64("DEFAULT_STORAGE_LIMIT_GB", 1) * 1024 * 1024 * 1024, + } +} + +func getEnv(key, defaultValue string) string { + if value := os.Getenv(key); value != "" { + return value + } + return defaultValue +} + +func getEnvInt(key string, defaultValue int) int { + if value := os.Getenv(key); value != "" { + if intValue, err := strconv.Atoi(value); err == nil { + return intValue + } + } + return defaultValue +} + +func getEnvInt32(key string, defaultValue int32) int32 { + if value := os.Getenv(key); value != "" { + if intValue, err := strconv.ParseInt(value, 10, 32); err == nil { + return int32(intValue) + } + } + return defaultValue +} + +func getEnvInt64(key string, defaultValue int64) int64 { + if value := os.Getenv(key); value != "" { + if intValue, err := strconv.ParseInt(value, 10, 64); err == nil { + return intValue + } + } + return defaultValue +} + +func getEnvFloat64(key string, defaultValue float64) float64 { + if value := os.Getenv(key); value != "" { + if floatValue, err := strconv.ParseFloat(value, 64); err == nil { + return floatValue + } + } + return defaultValue +} + +func getEnvDuration(key string, defaultValue time.Duration) time.Duration { + if value := os.Getenv(key); value != "" { + if duration, err := time.ParseDuration(value); err == nil { + return duration + } + } + return defaultValue +} + +func getEnvSlice(key string, defaultValue []string) []string { + if value := os.Getenv(key); value != "" { + return []string{value} + } + return defaultValue +}