package config import ( "log" "os" "strconv" ) type Config struct { Server ServerConfig Database DatabaseConfig Keycloak KeycloakConfig } type ServerConfig struct { Port int Mode string } type DatabaseConfig struct { Host string Port int Username string Password string Database string Schema string } type KeycloakConfig struct { Issuer string Audience string JwksURL string Enabled bool } func LoadConfig() *Config { config := &Config{ Server: ServerConfig{ Port: getEnvAsInt("PORT", 8080), Mode: getEnv("GIN_MODE", "debug"), }, Database: DatabaseConfig{ Host: getEnv("BLUEPRINT_DB_HOST", "localhost"), Port: getEnvAsInt("BLUEPRINT_DB_PORT", 5432), Username: getEnv("BLUEPRINT_DB_USERNAME", "postgres"), Password: getEnv("BLUEPRINT_DB_PASSWORD", "postgres"), Database: getEnv("BLUEPRINT_DB_DATABASE", "api_service"), Schema: getEnv("BLUEPRINT_DB_SCHEMA", "public"), }, Keycloak: KeycloakConfig{ Issuer: getEnv("KEYCLOAK_ISSUER", "https://keycloak.example.com/auth/realms/yourrealm"), Audience: getEnv("KEYCLOAK_AUDIENCE", "your-client-id"), JwksURL: getEnv("KEYCLOAK_JWKS_URL", "https://keycloak.example.com/auth/realms/yourrealm/protocol/openid-connect/certs"), Enabled: getEnvAsBool("KEYCLOAK_ENABLED", true), }, } return config } func getEnv(key, defaultValue string) string { if value := os.Getenv(key); value != "" { return value } return defaultValue } func getEnvAsInt(key string, defaultValue int) int { valueStr := getEnv(key, "") if value, err := strconv.Atoi(valueStr); err == nil { return value } return defaultValue } func getEnvAsBool(key string, defaultValue bool) bool { valueStr := getEnv(key, "") if value, err := strconv.ParseBool(valueStr); err == nil { return value } return defaultValue } func (c *Config) Validate() error { if c.Database.Host == "" { log.Fatal("Database host is required") } if c.Database.Username == "" { log.Fatal("Database username is required") } if c.Database.Password == "" { log.Fatal("Database password is required") } if c.Database.Database == "" { log.Fatal("Database name is required") } // Validate Keycloak configuration if enabled if c.Keycloak.Enabled { if c.Keycloak.Issuer == "" { log.Fatal("Keycloak issuer is required when Keycloak is enabled") } if c.Keycloak.Audience == "" { log.Fatal("Keycloak audience is required when Keycloak is enabled") } if c.Keycloak.JwksURL == "" { log.Fatal("Keycloak JWKS URL is required when Keycloak is enabled") } } return nil }