68 lines
1.6 KiB
Go
68 lines
1.6 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
|
|
"github.com/joho/godotenv"
|
|
)
|
|
|
|
// Config holds all application configuration.
|
|
type Config struct {
|
|
Port string
|
|
DatabaseURL string
|
|
JWTSecret string
|
|
Environment string
|
|
BasePath string // URL path prefix (e.g. "/dev", "/test", or "" for root)
|
|
|
|
// Admin bootstrap (optional — set via K8s secret)
|
|
AdminUsername string
|
|
AdminPassword string
|
|
AdminEmail string
|
|
|
|
// Seed users (dev/test only) — CSV: "user:pass:role,user2:pass2:role2"
|
|
SeedUsers string
|
|
}
|
|
|
|
// Load reads configuration from environment variables.
|
|
// A .env file is loaded if present but not required.
|
|
func Load() *Config {
|
|
// Best-effort .env load (not required in production)
|
|
_ = godotenv.Load()
|
|
|
|
return &Config{
|
|
Port: getEnv("PORT", "8080"),
|
|
DatabaseURL: getEnv("DATABASE_URL", ""),
|
|
JWTSecret: getEnv("JWT_SECRET", "dev-secret-change-me"),
|
|
Environment: getEnv("ENVIRONMENT", "development"),
|
|
BasePath: sanitizeBasePath(getEnv("BASE_PATH", "")),
|
|
AdminUsername: getEnv("SWITCHBOARD_ADMIN_USERNAME", ""),
|
|
AdminPassword: getEnv("SWITCHBOARD_ADMIN_PASSWORD", ""),
|
|
AdminEmail: getEnv("SWITCHBOARD_ADMIN_EMAIL", ""),
|
|
SeedUsers: getEnv("SEED_USERS", ""),
|
|
}
|
|
}
|
|
|
|
// sanitizeBasePath ensures the path starts with / and doesn't end with /.
|
|
// Empty string means root (no prefix).
|
|
func sanitizeBasePath(p string) string {
|
|
if p == "" || p == "/" {
|
|
return ""
|
|
}
|
|
// Ensure leading slash
|
|
if p[0] != '/' {
|
|
p = "/" + p
|
|
}
|
|
// Strip trailing slash
|
|
for len(p) > 1 && p[len(p)-1] == '/' {
|
|
p = p[:len(p)-1]
|
|
}
|
|
return p
|
|
}
|
|
|
|
func getEnv(key, fallback string) string {
|
|
if v := os.Getenv(key); v != "" {
|
|
return v
|
|
}
|
|
return fallback
|
|
}
|