package bellconfig import ( "errors" "fmt" "os" "strconv" "strings" "github.com/go-admin-team/go-admin-core/sdk/config" ) const ( DatabaseURLEnv = "BELL_DATABASE_URL" JWTSecretEnv = "BELL_JWT_SECRET" ) // Environment contains Bell's process-owned settings. It deliberately has no // credentials or secret defaults so Sense and Bell cannot silently share them. type Environment struct { DatabaseURL string JWTSecret string Host string Port int64 } func Load(getenv func(string) string) (Environment, error) { env := Environment{ DatabaseURL: strings.TrimSpace(getenv(DatabaseURLEnv)), JWTSecret: strings.TrimSpace(getenv(JWTSecretEnv)), Host: strings.TrimSpace(getenv("BELL_HOST")), } if env.DatabaseURL == "" { return Environment{}, fmt.Errorf("%s is required", DatabaseURLEnv) } if env.JWTSecret == "" { return Environment{}, fmt.Errorf("%s is required", JWTSecretEnv) } if len(env.JWTSecret) < 32 || env.JWTSecret == "go-admin" || strings.HasPrefix(env.JWTSecret, "__BELL_") { return Environment{}, errors.New("BELL_JWT_SECRET must be a non-default value of at least 32 characters") } if env.Host == "" { env.Host = "127.0.0.1" } if rawPort := strings.TrimSpace(getenv("BELL_PORT")); rawPort != "" { port, err := strconv.ParseInt(rawPort, 10, 64) if err != nil || port < 1 || port > 65535 { return Environment{}, errors.New("BELL_PORT must be between 1 and 65535") } env.Port = port } return env, nil } func ApplyRequiredEnvironment() error { env, err := Load(os.Getenv) if err != nil { return err } config.ApplicationConfig.Name = "bell" config.ApplicationConfig.Host = env.Host if env.Port != 0 { config.ApplicationConfig.Port = env.Port } config.JwtConfig.Secret = env.JWTSecret config.DatabaseConfig.Driver = "postgres" config.DatabaseConfig.Source = env.DatabaseURL for _, database := range config.DatabasesConfig { database.Driver = "postgres" database.Source = env.DatabaseURL } return nil }