Files
platforms/backend/api/internal/config/config.go
2026-07-30 18:04:34 +08:00

73 lines
2.9 KiB
Go

// Package config 沿用 sample/server 的 BSM 配置加载与校验方式。
package config
import (
"net"
"net/url"
"strings"
"git.apinb.com/bsm-sdk/core/conf"
)
// Spec 是 Platform API 的运行配置。
var Spec SrvConfig
// GlobalConfig 保存多个管理端共用的运行参数。
type GlobalConfig struct {
UserRegisterURL string `yaml:"UserRegisterURL"`
ManualRechargeMaxAmount int64 `yaml:"ManualRechargeMaxAmount"`
MockVerificationEnabled bool `yaml:"MockVerificationEnabled"`
MockVerificationCode string `yaml:"MockVerificationCode"`
VerificationTTLSeconds int `yaml:"VerificationTTLSeconds"`
VerificationSendIntervalSeconds int `yaml:"VerificationSendIntervalSeconds"`
MockPaymentEnabled bool `yaml:"MockPaymentEnabled"`
DeliveryArrivalRadiusMeters float64 `yaml:"DeliveryArrivalRadiusMeters"`
UploadVideoMaxSize int64 `yaml:"UploadVideoMaxSize"`
FieldEncryptionKey string `yaml:"FieldEncryptionKey"`
}
// WalletConfig 是平台既有钱包逻辑的内部兼容视图,值由 Global 注入。
type WalletConfig struct {
ManualRechargeMaxAmount int64 `yaml:"-"`
}
// SrvConfig 与 sample/server 配置结构保持一致。
type SrvConfig struct {
conf.Base `yaml:",inline"`
Databases *conf.DBConf `yaml:"Databases"`
Rpc map[string]conf.RpcConf `yaml:"Rpc"`
Apm *conf.ApmConf `yaml:"APM"`
Global GlobalConfig `yaml:"Global"`
Wallet WalletConfig `yaml:"-"`
}
// New 初始化 BSM 配置并校验服务监听地址。
func New(srvKey string) {
conf.New(srvKey, &Spec)
Spec.Port = conf.CheckPort(Spec.Port)
Spec.BindIP = conf.CheckIP(Spec.BindIP)
Spec.Addr = net.JoinHostPort(Spec.BindIP, Spec.Port)
conf.NotNil(Spec.Service, Spec.Cache)
if Spec.Global.ManualRechargeMaxAmount <= 0 {
panic("Global.ManualRechargeMaxAmount must be greater than zero")
}
if Spec.Global.VerificationTTLSeconds <= 0 || Spec.Global.VerificationSendIntervalSeconds <= 0 {
panic("Global verification timeouts must be greater than zero")
}
if Spec.Global.MockVerificationEnabled && len(Spec.Global.MockVerificationCode) < 4 {
panic("Global.MockVerificationCode must contain at least four characters")
}
if Spec.Global.DeliveryArrivalRadiusMeters <= 0 || Spec.Global.UploadVideoMaxSize <= 0 {
panic("Global delivery radius and upload video size must be greater than zero")
}
if len(strings.TrimSpace(Spec.Global.FieldEncryptionKey)) < 32 {
panic("Global.FieldEncryptionKey must contain at least 32 characters")
}
Spec.Wallet.ManualRechargeMaxAmount = Spec.Global.ManualRechargeMaxAmount
registerURL, err := url.ParseRequestURI(Spec.Global.UserRegisterURL)
if err != nil || (registerURL.Scheme != "http" && registerURL.Scheme != "https") || registerURL.Host == "" {
panic("Global.UserRegisterURL must be a valid HTTP or HTTPS URL")
}
conf.PrintInfo(Spec.Addr)
}