- Add FrontendURL to config (FRONTEND_URL or VITE_FRONTEND_URL) - OAuth handlers use config instead of os.Getenv - Update TODOS_AUDIT: mark UUID migration items as resolved - Add ISSUES_P2_BACKLOG.md for GitHub issues - Add ROUTES_ORPHANES.md for routes without UI - Document FRONTEND_URL in .env.example
157 lines
4.4 KiB
Go
157 lines
4.4 KiB
Go
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
|
|
}
|