package config import ( "fmt" "os" "strconv" "strings" "time" ) // getEnv récupère une variable d'environnement avec une valeur par défaut // SECURITY: Removed debug fmt.Printf to avoid leaking config info in production (P0-SECURITY) func getEnv(key, defaultValue string) string { if value := os.Getenv(key); value != "" { return strings.TrimSpace(value) } return defaultValue } // getEnvAsInt retrieves an environment variable as an integer // BE-DB-015: Helper for connection pool configuration func getEnvAsInt(key string, defaultValue int) int { value := os.Getenv(key) if value == "" { return defaultValue } intValue, err := strconv.Atoi(strings.TrimSpace(value)) if err != nil { return defaultValue } return intValue } // getEnvAsDuration retrieves an environment variable as a time.Duration // BE-DB-015: Helper for connection pool configuration func getEnvAsDuration(key string, defaultValue time.Duration) time.Duration { value := os.Getenv(key) if value == "" { return defaultValue } duration, err := time.ParseDuration(strings.TrimSpace(value)) if err != nil { return defaultValue } return duration } // getEnvRequired récupère une variable d'environnement requise (retourne erreur si absente) func getEnvRequired(key string) (string, error) { value := os.Getenv(key) if value == "" { return "", fmt.Errorf("required environment variable %s is not set", key) } return value, nil } // getEnvInt récupère une variable d'environnement entière avec une valeur par défaut 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 } // getEnvBool récupère une variable d'environnement booléenne avec une valeur par défaut func getEnvBool(key string, defaultValue bool) bool { if value := os.Getenv(key); value != "" { if boolValue, err := strconv.ParseBool(value); err == nil { return boolValue } } return defaultValue } // getEnvDuration récupère une variable d'environnement durée avec une valeur par défaut 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 } // getEnvFloat64 récupère une variable d'environnement float64 avec une valeur par défaut 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 } // getEnvStringSlice récupère une variable d'environnement comme une slice de strings // Format attendu: "value1,value2,value3" (séparées par des virgules) func getEnvStringSlice(key string, defaultValue []string) []string { if value := os.Getenv(key); value != "" { // Séparer par virgule et nettoyer les espaces parts := strings.Split(value, ",") result := make([]string, 0, len(parts)) for _, part := range parts { trimmed := strings.TrimSpace(part) if trimmed != "" { result = append(result, trimmed) } } if len(result) > 0 { return result } } return defaultValue } // parseLogAggregationLabels parse les labels d'agrégation de logs depuis une chaîne // Format attendu: "key1=value1,key2=value2" (séparés par des virgules, key=value par paire) func parseLogAggregationLabels(value string) map[string]string { labels := make(map[string]string) if value == "" { return labels } // Séparer par virgule pairs := strings.Split(value, ",") for _, pair := range pairs { pair = strings.TrimSpace(pair) if pair == "" { continue } // Séparer key=value parts := strings.SplitN(pair, "=", 2) if len(parts) == 2 { key := strings.TrimSpace(parts[0]) val := strings.TrimSpace(parts[1]) if key != "" && val != "" { labels[key] = val } } } return labels } // getFrontendURL returns the frontend URL for OAuth redirects, password reset links, etc. // Reads FRONTEND_URL, then VITE_FRONTEND_URL, fallback to http://localhost:5173 for development. func getFrontendURL() string { if v := os.Getenv("FRONTEND_URL"); v != "" { return strings.TrimSpace(v) } if v := os.Getenv("VITE_FRONTEND_URL"); v != "" { return strings.TrimSpace(v) } return "http://localhost:5173" // Fallback for development only; set FRONTEND_URL in production }