package main import ( "fmt" "os" "strings" "github.com/joho/godotenv" ) type Config struct { Port string DatabaseURL string StorageDir string DevMode bool OIDCIssuer string OIDCAudience string OIDCJWKSURL string OIDCAuthURL string OIDCTokenURL string OIDCClientID string OIDCClientSecret string OIDCRedirect string OIDCLogoutURL string } func LoadConfig() (Config, error) { _ = godotenv.Load() cfg := Config{ Port: envOrDefault("PORT", "8080"), DatabaseURL: os.Getenv("DATABASE_URL"), StorageDir: envOrDefault("STORAGE_DIR", "uploads"), DevMode: strings.EqualFold(envOrDefault("DEV_MODE", "false"), "true"), OIDCIssuer: os.Getenv("OIDC_ISSUER"), OIDCAudience: os.Getenv("OIDC_AUDIENCE"), OIDCJWKSURL: os.Getenv("OIDC_JWKS_URL"), OIDCAuthURL: os.Getenv("OIDC_AUTH_URL"), OIDCTokenURL: os.Getenv("OIDC_TOKEN_URL"), OIDCClientID: os.Getenv("OIDC_CLIENT_ID"), OIDCClientSecret: os.Getenv("OIDC_CLIENT_SECRET"), OIDCRedirect: os.Getenv("OIDC_REDIRECT_URL"), OIDCLogoutURL: os.Getenv("OIDC_LOGOUT_URL"), } if cfg.DatabaseURL == "" { return Config{}, fmt.Errorf("DATABASE_URL is required") } if !cfg.DevMode && (cfg.OIDCIssuer == "" || cfg.OIDCAudience == "" || cfg.OIDCJWKSURL == "") { return Config{}, fmt.Errorf("OIDC_ISSUER, OIDC_AUDIENCE, and OIDC_JWKS_URL are required") } if !cfg.DevMode && (cfg.OIDCAuthURL == "" || cfg.OIDCTokenURL == "" || cfg.OIDCClientID == "" || cfg.OIDCClientSecret == "" || cfg.OIDCRedirect == "") { return Config{}, fmt.Errorf("OIDC_AUTH_URL, OIDC_TOKEN_URL, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, and OIDC_REDIRECT_URL are required when DEV_MODE=false") } return cfg, nil } func envOrDefault(key, fallback string) string { value := os.Getenv(key) if value == "" { return fallback } return value }