// Package config charge la configuration de l'application depuis les variables d'environnement. package config import ( "fmt" "os" "time" ) // Config regroupe tous les paramètres de configuration du serveur. type Config struct { DatabaseURL string // chaîne de connexion PostgreSQL JWTSecret []byte // secret de signature des JWT JWTAccessTTL time.Duration // durée de vie des access tokens JWTRefreshTTL time.Duration // durée de vie des refresh tokens StoragePath string // dossier de stockage des PDF sur disque Port string // port d'écoute HTTP CORSOrigin string // origine autorisée pour le CORS } // Load lit la configuration depuis l'environnement et applique les valeurs par défaut. // Retourne une erreur si une variable obligatoire est absente ou invalide. func Load() (*Config, error) { cfg := &Config{ DatabaseURL: os.Getenv("DATABASE_URL"), StoragePath: getEnv("STORAGE_PATH", "/data/documents"), Port: getEnv("PORT", "8080"), CORSOrigin: os.Getenv("CORS_ORIGIN"), } if cfg.DatabaseURL == "" { return nil, fmt.Errorf("la variable d'environnement DATABASE_URL est obligatoire") } secret := os.Getenv("JWT_SECRET") if secret == "" { return nil, fmt.Errorf("la variable d'environnement JWT_SECRET est obligatoire") } cfg.JWTSecret = []byte(secret) accessTTL, err := time.ParseDuration(getEnv("JWT_ACCESS_TTL", "15m")) if err != nil { return nil, fmt.Errorf("JWT_ACCESS_TTL invalide : %w", err) } cfg.JWTAccessTTL = accessTTL refreshTTL, err := time.ParseDuration(getEnv("JWT_REFRESH_TTL", "168h")) if err != nil { return nil, fmt.Errorf("JWT_REFRESH_TTL invalide : %w", err) } cfg.JWTRefreshTTL = refreshTTL return cfg, nil } // getEnv retourne la valeur de la variable d'environnement clef, ou def si absente. func getEnv(key, def string) string { if v := os.Getenv(key); v != "" { return v } return def }