package config import ( "log/slog" "net/url" "os" "strings" ) type Config struct { AppEnv string HTTPAddr string DatabaseURL string JWTSecret string ServerMainBaseURL string ServerMainInternalToken string CORSAllowedOrigin string LogLevel slog.Level } func Load() Config { return Config{ AppEnv: env("APP_ENV", "development"), HTTPAddr: env("HTTP_ADDR", ":8088"), DatabaseURL: gatewayDatabaseURL(), JWTSecret: env("CONFIG_JWT_SECRET", "this is a very secret secret"), ServerMainBaseURL: strings.TrimRight( env("SERVER_MAIN_BASE_URL", "http://localhost:3000"), "/", ), ServerMainInternalToken: env("SERVER_MAIN_INTERNAL_TOKEN", ""), CORSAllowedOrigin: env("CORS_ALLOWED_ORIGIN", "http://localhost:5178"), LogLevel: logLevel(env("LOG_LEVEL", "info")), } } func gatewayDatabaseURL() string { if value := envValue("AI_GATEWAY_DATABASE_URL"); value != "" { return normalizePostgresURL(value) } if value := envValue("DATABASE_URL"); value != "" { return normalizePostgresURL(value) } if memoryURL := envValue("MEMORY_DATABASE_URL"); memoryURL != "" { return normalizePostgresURL(withDatabase(memoryURL, env("AI_GATEWAY_DATABASE_NAME", "easyai_ai_gateway"))) } return normalizePostgresURL("postgresql://easyai:easyai2025@localhost:5432/easyai_ai_gateway?sslmode=disable") } func normalizePostgresURL(raw string) string { parsed, err := url.Parse(raw) if err != nil { return raw } values := parsed.Query() schema := values.Get("schema") if schema == "" { return raw } values.Del("schema") if values.Get("search_path") == "" { values.Set("search_path", schema) } parsed.RawQuery = values.Encode() return parsed.String() } func withDatabase(raw string, databaseName string) string { parsed, err := url.Parse(raw) if err != nil || databaseName == "" { return raw } parsed.Path = "/" + databaseName return parsed.String() } func envValue(key string) string { return strings.TrimSpace(os.Getenv(key)) } func env(key string, fallback string) string { if value := envValue(key); value != "" { return value } return fallback } func logLevel(value string) slog.Level { switch strings.ToLower(value) { case "debug": return slog.LevelDebug case "warn", "warning": return slog.LevelWarn case "error": return slog.LevelError default: return slog.LevelInfo } }