saveinmed/backend/internal/config/config.go

76 lines
2 KiB
Go

package config
import (
"fmt"
"os"
"strconv"
"time"
)
// Config centralizes runtime configuration loaded from the environment.
type Config struct {
AppName string
Port string
DatabaseURL string
MaxOpenConns int
MaxIdleConns int
ConnMaxIdle time.Duration
MercadoPagoBaseURL string
MarketplaceCommission float64
}
// Load reads configuration from environment variables and applies sane defaults
// for local development.
func Load() Config {
cfg := Config{
AppName: getEnv("APP_NAME", "saveinmed-performance-core"),
Port: getEnv("PORT", "8214"),
DatabaseURL: getEnv("DATABASE_URL", "postgres://postgres:postgres@localhost:5432/saveinmed?sslmode=disable"),
MaxOpenConns: getEnvInt("DB_MAX_OPEN_CONNS", 15),
MaxIdleConns: getEnvInt("DB_MAX_IDLE_CONNS", 5),
ConnMaxIdle: getEnvDuration("DB_CONN_MAX_IDLE", 5*time.Minute),
MercadoPagoBaseURL: getEnv("MERCADOPAGO_BASE_URL", "https://api.mercadopago.com"),
MarketplaceCommission: getEnvFloat("MARKETPLACE_COMMISSION", 2.5),
}
return cfg
}
// Addr returns the address binding for the HTTP server.
func (c Config) Addr() string {
return fmt.Sprintf(":%s", c.Port)
}
func getEnv(key, fallback string) string {
if value := os.Getenv(key); value != "" {
return value
}
return fallback
}
func getEnvInt(key string, fallback int) int {
if value := os.Getenv(key); value != "" {
if parsed, err := strconv.Atoi(value); err == nil {
return parsed
}
}
return fallback
}
func getEnvDuration(key string, fallback time.Duration) time.Duration {
if value := os.Getenv(key); value != "" {
if parsed, err := time.ParseDuration(value); err == nil {
return parsed
}
}
return fallback
}
func getEnvFloat(key string, fallback float64) float64 {
if value := os.Getenv(key); value != "" {
if parsed, err := strconv.ParseFloat(value, 64); err == nil {
return parsed
}
}
return fallback
}