Files
rag-local/kb/service/system_config_service.go
T
2026-08-05 10:28:44 +08:00

101 lines
3.1 KiB
Go

package service
import (
"context"
"time"
"rag-local/common"
"rag-local/kb/consts"
"rag-local/kb/dao"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/gcache"
"github.com/gogf/gf/v2/util/gconv"
)
var SystemConfigService = &systemConfigService{}
type systemConfigService struct{}
func init() {
// 注入指纹校验函数,避免 common → service 循环依赖
common.CheckTokenFingerprint = SystemConfigService.CheckTokenFingerprint
}
// EnsureAccessToken 首次启动生成访问令牌并写入配置;已有则复用。返回当前令牌
func (s *systemConfigService) EnsureAccessToken(ctx context.Context) (string, error) {
token, err := dao.SystemConfig.Get(ctx, consts.CfgKeyAccessToken)
if err != nil {
return "", err
}
if token == "" {
token = common.RandomToken(16)
if err := dao.SystemConfig.Set(ctx, consts.CfgKeyAccessToken, token); err != nil {
return "", err
}
}
return token, nil
}
func (s *systemConfigService) Login(ctx context.Context, token string) (string, error) {
cur, err := dao.SystemConfig.Get(ctx, consts.CfgKeyAccessToken)
if err != nil {
return "", err
}
if cur == "" || token != cur {
return "", gerror.New("访问令牌错误")
}
return common.SignToken("owner", common.TokenFingerprint(cur), common.TokenExpireSeconds)
}
// GetToken 当前访问令牌(设置页展示用)
func (s *systemConfigService) GetToken(ctx context.Context) (string, error) {
return dao.SystemConfig.Get(ctx, consts.CfgKeyAccessToken)
}
// TokenFingerprint 当前令牌指纹(带短缓存,鉴权路径避免频繁查库)
func (s *systemConfigService) TokenFingerprint(ctx context.Context) string {
if v, err := gcache.Get(ctx, "access_token_fp"); err == nil && !v.IsNil() {
return v.String()
}
token, err := dao.SystemConfig.Get(ctx, consts.CfgKeyAccessToken)
if err != nil || token == "" {
return ""
}
fp := common.TokenFingerprint(token)
_ = gcache.Set(ctx, "access_token_fp", fp, 10*time.Second)
return fp
}
func (s *systemConfigService) CheckTokenFingerprint(ctx context.Context, fp string) bool {
return fp != "" && fp == s.TokenFingerprint(ctx)
}
func (s *systemConfigService) RegenerateToken(ctx context.Context) (string, error) {
token := common.RandomToken(16)
if err := dao.SystemConfig.Set(ctx, consts.CfgKeyAccessToken, token); err != nil {
return "", err
}
_, _ = gcache.Remove(ctx, "access_token_fp")
return token, nil
}
func (s *systemConfigService) GetSettings(ctx context.Context) (defaultChatModel, defaultDataset int64, err error) {
v1, err := dao.SystemConfig.Get(ctx, consts.CfgKeyDefaultChatModel)
if err != nil {
return
}
v2, err := dao.SystemConfig.Get(ctx, consts.CfgKeyDefaultDataset)
if err != nil {
return
}
return gconv.Int64(v1), gconv.Int64(v2), nil
}
func (s *systemConfigService) UpdateSettings(ctx context.Context, defaultChatModel, defaultDataset int64) error {
if err := dao.SystemConfig.Set(ctx, consts.CfgKeyDefaultChatModel, gconv.String(defaultChatModel)); err != nil {
return err
}
return dao.SystemConfig.Set(ctx, consts.CfgKeyDefaultDataset, gconv.String(defaultDataset))
}