package config import ( "os" "strings" ) // Config is the payment-broker runtime configuration, all from env. type Config struct { DatabaseURL string JWTSecret string // verifies FlatRender admin JWTs for /v1/admin/* endpoints Port string // PublicBaseURL is the broker's externally reachable base (e.g. https://pay.flatrender.ir). // ZarinPal callbacks and the user redirect target are built from it. PublicBaseURL string // ── ZarinPal (shared default merchant) ────────────────────────────────── // A client_app may override MerchantId/Sandbox; otherwise these defaults apply. ZarinPalMerchantID string ZarinPalSandbox bool // AmountUnit is the unit ZarinPal expects in the amount field: "rial" (official // v4) or "toman". The broker always stores Rial canonically and converts here. ZarinPalAmountUnit string } func getEnv(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback } func Load() Config { base := strings.TrimRight(getEnv("PUBLIC_BASE_URL", "http://localhost:8080"), "/") unit := strings.ToLower(getEnv("ZARINPAL_AMOUNT_UNIT", "rial")) if unit != "toman" { unit = "rial" } return Config{ DatabaseURL: getEnv("DATABASE_URL", "postgres://postgres:postgres@localhost:5432/flatrender?search_path=payment,public"), JWTSecret: getEnv("JWT_SECRET", "change-me"), Port: getEnv("PORT", "8080"), PublicBaseURL: base, ZarinPalMerchantID: getEnv("ZARINPAL_MERCHANT_ID", ""), ZarinPalSandbox: getEnv("ZARINPAL_SANDBOX", "true") == "true", ZarinPalAmountUnit: unit, } } // CallbackURL is the single ZarinPal-verified callback endpoint on this broker. func (c Config) CallbackURL() string { return c.PublicBaseURL + "/callback/zarinpal" }