101 lines
3.1 KiB
Go
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))
|
|
}
|