You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

72 lines
3.2 KiB

package comm
import (
"fmt"
"strings"
)
// 平台系统服务配置(表 TableSysServiceConfig,存 console 主库 postgres)。
//
// 与「第三方服务配置」(svc_config / ThirdSvcConfig) 的本质区别:
// - svc_config 面向**客户端**:随 user_getthirdsvcs_v2 下发给 App,是应用要用的第三方能力。
// - sys_service_config 面向**平台自身**:对象存储(固件/头像直传)、邮件(生产通知发信)、翻译(后台文案多语言),
// 只有 console/业务后端消费,绝不下发客户端。两者数据表彻底分离,互不影响。
//
// 一行 = 平台的一个服务实例。category 分组(storage/email/translate);同一 category 下 IsDefault 标记默认项
// (storage/translate 多选一,email 通常一条)。凭据字段复用 SvcField(加密字段 AES-256-GCM 落库、前端脱敏)。
// 平台服务类目。
const (
SysCatStorage = "storage" // 对象存储:固件 / 头像等文件直传
SysCatEmail = "email" // 邮件服务:生产通知 / 账号告警发信
SysCatTranslate = "translate" // 翻译服务:后台文案多语言同步
)
// PlatformService 平台系统服务配置行。
type PlatformService struct {
Id string `gorm:"column:id;size:64;primaryKey" json:"id"` // 服务标识,如 storage_aliyun_oss / email / translate_volc
Category string `gorm:"column:category;size:32;index" json:"category"` // storage / email / translate
Name string `gorm:"column:name;size:64" json:"name"` // 展示名
Provider string `gorm:"column:provider;size:64" json:"provider"` // 后端识别用,如 aliyun_oss / smtp / resend / volc
Enable bool `gorm:"column:enable" json:"enable"` // 是否启用
IsDefault bool `gorm:"column:is_default" json:"is_default"` // 该类目下的默认项(storage/translate 多选一)
Fields []SvcField `gorm:"column:fields;type:jsonb;serializer:json" json:"fields"` // 凭据字段(加密字段落库密文)
Createtime int64 `gorm:"column:createtime" json:"createtime"`
Updatetime int64 `gorm:"column:updatetime" json:"updatetime"`
}
func (PlatformService) TableName() string { return TableSysServiceConfig }
// SysFieldInt 取某服务的整型字段值(非加密字段;解析失败返回 def)。
func (s *PlatformService) SysFieldInt(key string, def int) int {
for _, f := range s.Fields {
if f.Key == key {
n := 0
if _, err := fmt.Sscanf(strings.TrimSpace(f.DefValue), "%d", &n); err == nil {
return n
}
return def
}
}
return def
}
// SysFieldPlain 取某服务的字段明文值(加密字段用 encKey 解密;无该字段或解密失败返回空串)。
// 供平台后端消费配置时用(如 api_upload 读 OSS 凭据、sendSmtpEmail 读发信凭据)。
func (s *PlatformService) SysFieldPlain(key, encKey string) string {
for _, f := range s.Fields {
if f.Key != key {
continue
}
v := f.DefValue
if f.Encrypted && v != "" {
if plain, err := Decrypt(encKey, v); err == nil {
v = plain
} else {
return ""
}
}
return v
}
return ""
}