2025-10-13 11:07:53 +02:00
|
|
|
package config
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
)
|
|
|
|
|
2025-10-13 16:47:09 +02:00
|
|
|
// Config représente la structure globale de la configuration de l'application.
|
2025-10-13 11:07:53 +02:00
|
|
|
type Config struct {
|
2025-10-13 16:47:09 +02:00
|
|
|
Server ServerConfig
|
|
|
|
Database DatabaseConfig
|
2025-10-13 11:07:53 +02:00
|
|
|
}
|
|
|
|
|
2025-10-13 16:47:09 +02:00
|
|
|
// ServerConfig contient les paramètres de configuration du serveur HTTP.
|
|
|
|
type ServerConfig struct {
|
|
|
|
Address string `mapstructure:"address"`
|
|
|
|
TrustedProxies []string `mapstructure:"trusted_proxies"` // Liste des IPs de proxies de confiance
|
|
|
|
}
|
|
|
|
|
|
|
|
// DatabaseConfig contient les paramètres de configuration de la base de données.
|
2025-10-13 11:07:53 +02:00
|
|
|
type DatabaseConfig struct {
|
|
|
|
Host string `mapstructure:"host"`
|
|
|
|
Port int `mapstructure:"port"`
|
2025-10-13 16:47:09 +02:00
|
|
|
User string `mapstructure:"user"`
|
|
|
|
Password string `mapstructure:"password"`
|
|
|
|
DBName string `mapstructure:"dbname"`
|
|
|
|
SSLMode string `mapstructure:"sslmode"`
|
2025-10-13 11:07:53 +02:00
|
|
|
}
|
|
|
|
|
2025-10-13 16:47:09 +02:00
|
|
|
// LoadConfig charge la configuration depuis un fichier et les variables d'environnement.
|
|
|
|
func LoadConfig(path string) (config Config, err error) {
|
|
|
|
viper.AddConfigPath(path)
|
|
|
|
viper.SetConfigName("config")
|
|
|
|
viper.SetConfigType("yaml")
|
2025-10-13 11:07:53 +02:00
|
|
|
|
2025-10-13 16:47:09 +02:00
|
|
|
viper.SetDefault("server.address", ":8080")
|
|
|
|
viper.SetDefault("server.trusted_proxies", "127.0.0.1, ::1")
|
|
|
|
viper.SetDefault("database.host", "localhost")
|
|
|
|
viper.SetDefault("database.port", 5432)
|
|
|
|
viper.SetDefault("database.user", "default_user")
|
|
|
|
viper.SetDefault("database.password", "")
|
|
|
|
viper.SetDefault("database.dbname", "default_db")
|
|
|
|
viper.SetDefault("database.sslmode", "disable")
|
2025-10-13 11:07:53 +02:00
|
|
|
|
2025-10-13 16:47:09 +02:00
|
|
|
// L'ordre ici est important
|
2025-10-13 11:07:53 +02:00
|
|
|
|
2025-10-13 16:47:09 +02:00
|
|
|
// 1. D'abord, on lit le fichier
|
|
|
|
err = viper.ReadInConfig()
|
|
|
|
if err != nil {
|
2025-10-13 11:07:53 +02:00
|
|
|
if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
|
2025-10-13 16:47:09 +02:00
|
|
|
return
|
2025-10-13 11:07:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-10-13 16:47:09 +02:00
|
|
|
// 2. Ensuite, on prépare Viper à lire les variables d'environnement
|
|
|
|
viper.SetEnvPrefix("APP")
|
2025-10-13 11:07:53 +02:00
|
|
|
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
|
2025-10-13 16:47:09 +02:00
|
|
|
viper.AutomaticEnv() // Dit à Viper de chercher les variables d'environnement
|
2025-10-13 11:07:53 +02:00
|
|
|
|
2025-10-13 16:47:09 +02:00
|
|
|
// 3. Enfin, on déverse le résultat final dans la struct.
|
|
|
|
// C'est à ce moment que la surcharge a lieu.
|
|
|
|
fmt.Printf("[%v]\n", config.Database.DBName)
|
2025-10-13 11:07:53 +02:00
|
|
|
|
2025-10-13 16:47:09 +02:00
|
|
|
err = viper.Unmarshal(&config)
|
|
|
|
return
|
2025-10-13 11:07:53 +02:00
|
|
|
}
|