122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
/*
 | 
						||
 * Copyright 2025 coze-dev Authors
 | 
						||
 *
 | 
						||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						||
 * you may not use this file except in compliance with the License.
 | 
						||
 * You may obtain a copy of the License at
 | 
						||
 *
 | 
						||
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
						||
 *
 | 
						||
 * Unless required by applicable law or agreed to in writing, software
 | 
						||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						||
 * See the License for the specific language governing permissions and
 | 
						||
 * limitations under the License.
 | 
						||
 */
 | 
						||
 | 
						||
package entity
 | 
						||
 | 
						||
import (
 | 
						||
	"context"
 | 
						||
	"encoding/base64"
 | 
						||
	"fmt"
 | 
						||
	"strconv"
 | 
						||
	"strings"
 | 
						||
	"time"
 | 
						||
 | 
						||
	"github.com/coze-dev/coze-studio/backend/api/model/crossdomain/variables"
 | 
						||
	"github.com/coze-dev/coze-studio/backend/api/model/kvmemory"
 | 
						||
	"github.com/coze-dev/coze-studio/backend/api/model/project_memory"
 | 
						||
	"github.com/coze-dev/coze-studio/backend/pkg/errorx"
 | 
						||
	"github.com/coze-dev/coze-studio/backend/types/errno"
 | 
						||
)
 | 
						||
 | 
						||
type UserVariableMeta struct {
 | 
						||
	*variables.UserVariableMeta
 | 
						||
}
 | 
						||
 | 
						||
func NewUserVariableMeta(v *variables.UserVariableMeta) *UserVariableMeta {
 | 
						||
	return &UserVariableMeta{
 | 
						||
		UserVariableMeta: v,
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
type VariableInstance struct {
 | 
						||
	ID           int64
 | 
						||
	BizType      project_memory.VariableConnector
 | 
						||
	BizID        string
 | 
						||
	Version      string
 | 
						||
	Keyword      string
 | 
						||
	Type         int32
 | 
						||
	Content      string
 | 
						||
	ConnectorUID string
 | 
						||
	ConnectorID  int64
 | 
						||
	CreatedAt    int64
 | 
						||
	UpdatedAt    int64
 | 
						||
}
 | 
						||
 | 
						||
const (
 | 
						||
	sysUUIDKey string = "sys_uuid"
 | 
						||
)
 | 
						||
 | 
						||
func (v *UserVariableMeta) GenSystemKV(ctx context.Context, keyword string) (*kvmemory.KVItem, error) {
 | 
						||
	if keyword != sysUUIDKey { // 外场暂时只支持这一个变量
 | 
						||
		return nil, nil
 | 
						||
	}
 | 
						||
 | 
						||
	return v.genUUID(ctx)
 | 
						||
}
 | 
						||
 | 
						||
func (v *UserVariableMeta) genUUID(ctx context.Context) (*kvmemory.KVItem, error) {
 | 
						||
	if v.BizID == "" {
 | 
						||
		return nil, errorx.New(errno.ErrMemoryGetSysUUIDInstanceCode, errorx.KV("msg", "biz_id is empty"))
 | 
						||
	}
 | 
						||
 | 
						||
	if v.ConnectorUID == "" {
 | 
						||
		return nil, errorx.New(errno.ErrMemoryGetSysUUIDInstanceCode, errorx.KV("msg", "connector_uid is empty"))
 | 
						||
	}
 | 
						||
 | 
						||
	if v.ConnectorID == 0 {
 | 
						||
		return nil, errorx.New(errno.ErrMemoryGetSysUUIDInstanceCode, errorx.KV("msg", "connector_id is empty"))
 | 
						||
	}
 | 
						||
 | 
						||
	encryptSysUUIDKey := v.encryptSysUUIDKey(ctx)
 | 
						||
	now := time.Now().Unix()
 | 
						||
 | 
						||
	return &kvmemory.KVItem{
 | 
						||
		Keyword:    sysUUIDKey,
 | 
						||
		Value:      encryptSysUUIDKey,
 | 
						||
		Schema:     stringSchema,
 | 
						||
		CreateTime: now,
 | 
						||
		UpdateTime: now,
 | 
						||
		IsSystem:   true,
 | 
						||
	}, nil
 | 
						||
}
 | 
						||
 | 
						||
func (v *UserVariableMeta) encryptSysUUIDKey(ctx context.Context) string {
 | 
						||
	// 拼接四个字段,中间用特殊分隔符(如 | )
 | 
						||
	plain := fmt.Sprintf("%d|%s|%s|%d", v.BizType, v.BizID, v.ConnectorUID, v.ConnectorID)
 | 
						||
	return base64.StdEncoding.EncodeToString([]byte(plain))
 | 
						||
}
 | 
						||
 | 
						||
func (v *UserVariableMeta) DecryptSysUUIDKey(ctx context.Context, encryptSysUUIDKey string) *VariableInstance {
 | 
						||
	data, err := base64.StdEncoding.DecodeString(encryptSysUUIDKey)
 | 
						||
	if err != nil {
 | 
						||
		return nil
 | 
						||
	}
 | 
						||
 | 
						||
	parts := strings.Split(string(data), "|")
 | 
						||
	if len(parts) != 4 {
 | 
						||
		return nil
 | 
						||
	}
 | 
						||
 | 
						||
	bizType64, _ := strconv.ParseInt(parts[0], 10, 32)
 | 
						||
	connectorID, _ := strconv.ParseInt(parts[3], 10, 64)
 | 
						||
	return &VariableInstance{
 | 
						||
		BizType:      project_memory.VariableConnector(bizType64),
 | 
						||
		BizID:        parts[1],
 | 
						||
		ConnectorUID: parts[2],
 | 
						||
		ConnectorID:  connectorID,
 | 
						||
	}
 | 
						||
}
 |