289 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			289 lines
		
	
	
		
			8.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 memory
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/coze-dev/coze-studio/backend/api/model/base"
 | |
| 	model "github.com/coze-dev/coze-studio/backend/api/model/crossdomain/database"
 | |
| 	"github.com/coze-dev/coze-studio/backend/api/model/table"
 | |
| 	"github.com/coze-dev/coze-studio/backend/domain/memory/database/entity"
 | |
| 	database "github.com/coze-dev/coze-studio/backend/domain/memory/database/service"
 | |
| 	"github.com/coze-dev/coze-studio/backend/pkg/lang/ptr"
 | |
| 	"github.com/coze-dev/coze-studio/backend/pkg/lang/slices"
 | |
| )
 | |
| 
 | |
| func convertAddDatabase(req *table.AddDatabaseRequest) *database.CreateDatabaseRequest {
 | |
| 	fieldItems := make([]*model.FieldItem, 0, len(req.FieldList))
 | |
| 	for _, field := range req.FieldList {
 | |
| 		fieldItems = append(fieldItems, &model.FieldItem{
 | |
| 			Name:         field.Name,
 | |
| 			Desc:         field.Desc,
 | |
| 			Type:         field.Type,
 | |
| 			MustRequired: field.MustRequired,
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	return &database.CreateDatabaseRequest{
 | |
| 		Database: &entity.Database{
 | |
| 			IconURI:        req.IconURI,
 | |
| 			CreatorID:      req.CreatorID,
 | |
| 			SpaceID:        req.SpaceID,
 | |
| 			AppID:          req.ProjectID,
 | |
| 			TableName:      req.TableName,
 | |
| 			TableDesc:      req.TableDesc,
 | |
| 			FieldList:      fieldItems,
 | |
| 			RwMode:         req.RwMode,
 | |
| 			PromptDisabled: req.PromptDisabled,
 | |
| 			ExtraInfo:      req.ExtraInfo,
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func ConvertDatabaseRes(res *entity.Database) *table.SingleDatabaseResponse {
 | |
| 	return &table.SingleDatabaseResponse{
 | |
| 		DatabaseInfo: convertDatabaseRes(res),
 | |
| 
 | |
| 		Code: 0,
 | |
| 		Msg:  "success",
 | |
| 		BaseResp: &base.BaseResp{
 | |
| 			StatusCode:    0,
 | |
| 			StatusMessage: "success",
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // ConvertUpdateDatabase converts the API update request to domain request
 | |
| func ConvertUpdateDatabase(req *table.UpdateDatabaseRequest) *database.UpdateDatabaseRequest {
 | |
| 	fieldItems := make([]*model.FieldItem, 0, len(req.FieldList))
 | |
| 	for _, field := range req.FieldList {
 | |
| 		fieldItems = append(fieldItems, &model.FieldItem{
 | |
| 			Name:         field.Name,
 | |
| 			Desc:         field.Desc,
 | |
| 			AlterID:      field.AlterId,
 | |
| 			Type:         field.Type,
 | |
| 			MustRequired: field.MustRequired,
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	return &database.UpdateDatabaseRequest{
 | |
| 		Database: &entity.Database{
 | |
| 			ID:             req.ID,
 | |
| 			IconURI:        req.IconURI,
 | |
| 			TableName:      req.TableName,
 | |
| 			TableDesc:      req.TableDesc,
 | |
| 			FieldList:      fieldItems,
 | |
| 			RwMode:         req.RwMode,
 | |
| 			PromptDisabled: req.PromptDisabled,
 | |
| 			ExtraInfo:      req.ExtraInfo,
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // convertUpdateDatabaseResult converts the domain update response to API response
 | |
| func convertUpdateDatabaseResult(res *database.UpdateDatabaseResponse) *table.SingleDatabaseResponse {
 | |
| 	return &table.SingleDatabaseResponse{
 | |
| 		DatabaseInfo: convertDatabaseRes(res.Database),
 | |
| 
 | |
| 		Code: 0,
 | |
| 		Msg:  "success",
 | |
| 		BaseResp: &base.BaseResp{
 | |
| 			StatusCode:    0,
 | |
| 			StatusMessage: "success",
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func convertDatabaseRes(db *entity.Database) *table.DatabaseInfo {
 | |
| 	fieldItems := make([]*table.FieldItem, 0, len(db.FieldList))
 | |
| 	for _, field := range db.FieldList {
 | |
| 		fieldItems = append(fieldItems, &table.FieldItem{
 | |
| 			Name:          field.Name,
 | |
| 			Desc:          field.Desc,
 | |
| 			Type:          field.Type,
 | |
| 			MustRequired:  field.MustRequired,
 | |
| 			AlterId:       field.AlterID,
 | |
| 			IsSystemField: field.IsSystemField,
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	return &table.DatabaseInfo{
 | |
| 		ID:               db.ID,
 | |
| 		SpaceID:          db.SpaceID,
 | |
| 		ProjectID:        db.AppID,
 | |
| 		IconURI:          db.IconURI,
 | |
| 		IconURL:          db.IconURL,
 | |
| 		TableName:        db.TableName,
 | |
| 		TableDesc:        db.TableDesc,
 | |
| 		Status:           db.Status,
 | |
| 		CreatorID:        db.CreatorID,
 | |
| 		CreateTime:       db.CreatedAtMs,
 | |
| 		UpdateTime:       db.UpdatedAtMs,
 | |
| 		FieldList:        fieldItems,
 | |
| 		ActualTableName:  db.ActualTableName,
 | |
| 		RwMode:           table.BotTableRWMode(db.RwMode),
 | |
| 		PromptDisabled:   db.PromptDisabled,
 | |
| 		IsVisible:        db.IsVisible,
 | |
| 		DraftID:          db.DraftID,
 | |
| 		ExtraInfo:        db.ExtraInfo,
 | |
| 		IsAddedToBot:     db.IsAddedToAgent,
 | |
| 		DatamodelTableID: getDataModelTableID(db.ActualTableName),
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // convertListDatabase converts the API list request to domain request
 | |
| func convertListDatabase(req *table.ListDatabaseRequest) *database.ListDatabaseRequest {
 | |
| 	dRes := &database.ListDatabaseRequest{
 | |
| 		SpaceID:   req.SpaceID,
 | |
| 		TableName: req.TableName,
 | |
| 		TableType: req.TableType,
 | |
| 		AppID:     req.GetProjectID(),
 | |
| 		Limit:     int(req.GetLimit()),
 | |
| 		Offset:    int(req.GetOffset()),
 | |
| 	}
 | |
| 
 | |
| 	if req.CreatorID != nil && *req.CreatorID != 0 {
 | |
| 		dRes.CreatorID = req.CreatorID
 | |
| 	}
 | |
| 
 | |
| 	if len(req.OrderBy) > 0 {
 | |
| 		dRes.OrderBy = make([]*model.OrderBy, len(req.OrderBy))
 | |
| 		for i, order := range req.OrderBy {
 | |
| 			dRes.OrderBy[i] = &model.OrderBy{
 | |
| 				Field:     order.Field,
 | |
| 				Direction: order.Direction,
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return dRes
 | |
| }
 | |
| 
 | |
| // convertListDatabaseRes converts the domain list response to API response
 | |
| func convertListDatabaseRes(res *database.ListDatabaseResponse, bindDatabases []*entity.Database) *table.ListDatabaseResponse {
 | |
| 	databaseInfos := make([]*table.DatabaseInfo, 0, len(res.Databases))
 | |
| 	dbMap := slices.ToMap(bindDatabases, func(e *entity.Database) (int64, *entity.Database) {
 | |
| 		return e.ID, e
 | |
| 	})
 | |
| 	for _, db := range res.Databases {
 | |
| 		databaseInfo := convertDatabaseRes(db)
 | |
| 		if _, ok := dbMap[db.ID]; ok {
 | |
| 			databaseInfo.IsAddedToBot = ptr.Of(true)
 | |
| 		}
 | |
| 		databaseInfos = append(databaseInfos, databaseInfo)
 | |
| 	}
 | |
| 
 | |
| 	return &table.ListDatabaseResponse{
 | |
| 		DatabaseInfoList: databaseInfos,
 | |
| 		TotalCount:       res.TotalCount,
 | |
| 
 | |
| 		Code: 0,
 | |
| 		Msg:  "success",
 | |
| 		BaseResp: &base.BaseResp{
 | |
| 			StatusCode:    0,
 | |
| 			StatusMessage: "success",
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // convertListDatabaseRecordsRes converts domain ListDatabaseRecordResponse to API ListDatabaseRecordsResponse
 | |
| func convertListDatabaseRecordsRes(res *database.ListDatabaseRecordResponse) *table.ListDatabaseRecordsResponse {
 | |
| 	apiRes := &table.ListDatabaseRecordsResponse{
 | |
| 		Data:      res.Records,
 | |
| 		TotalNum:  int32(res.TotalCount),
 | |
| 		HasMore:   res.HasMore,
 | |
| 		FieldList: make([]*table.FieldItem, 0, len(res.FieldList)),
 | |
| 
 | |
| 		Code: 0,
 | |
| 		Msg:  "success",
 | |
| 		BaseResp: &base.BaseResp{
 | |
| 			StatusCode:    0,
 | |
| 			StatusMessage: "success",
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for _, field := range res.FieldList {
 | |
| 		apiRes.FieldList = append(apiRes.FieldList, &table.FieldItem{
 | |
| 			Name:         field.Name,
 | |
| 			Desc:         field.Desc,
 | |
| 			Type:         field.Type,
 | |
| 			MustRequired: field.MustRequired,
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	return apiRes
 | |
| }
 | |
| 
 | |
| func getDataModelTableID(actualTableName string) string {
 | |
| 	tableID := ""
 | |
| 	tableIDStr := strings.Split(actualTableName, "_")
 | |
| 	if len(tableIDStr) < 2 {
 | |
| 		return tableID
 | |
| 	}
 | |
| 
 | |
| 	return tableIDStr[1]
 | |
| }
 | |
| 
 | |
| func convertToBotTableList(databases []*entity.Database, agentID int64, relationMap map[int64]*model.AgentToDatabase) []*table.BotTable {
 | |
| 	if len(databases) == 0 {
 | |
| 		return []*table.BotTable{}
 | |
| 	}
 | |
| 
 | |
| 	botTables := make([]*table.BotTable, 0, len(databases))
 | |
| 	for _, db := range databases {
 | |
| 		fieldItems := make([]*table.FieldItem, 0, len(db.FieldList))
 | |
| 		for _, field := range db.FieldList {
 | |
| 			fieldItems = append(fieldItems, &table.FieldItem{
 | |
| 				Name:          field.Name,
 | |
| 				Desc:          field.Desc,
 | |
| 				Type:          field.Type,
 | |
| 				MustRequired:  field.MustRequired,
 | |
| 				AlterId:       field.AlterID,
 | |
| 				IsSystemField: field.IsSystemField,
 | |
| 			})
 | |
| 		}
 | |
| 
 | |
| 		botTable := &table.BotTable{
 | |
| 			ID:              db.ID,
 | |
| 			BotID:           agentID,
 | |
| 			TableID:         strconv.FormatInt(db.ID, 10),
 | |
| 			TableName:       db.TableName,
 | |
| 			TableDesc:       db.TableDesc,
 | |
| 			Status:          table.BotTableStatus(db.Status),
 | |
| 			CreatorID:       db.CreatorID,
 | |
| 			CreateTime:      db.CreatedAtMs,
 | |
| 			UpdateTime:      db.UpdatedAtMs,
 | |
| 			FieldList:       fieldItems,
 | |
| 			ActualTableName: db.ActualTableName,
 | |
| 			RwMode:          table.BotTableRWMode(db.RwMode),
 | |
| 		}
 | |
| 
 | |
| 		if r, ok := relationMap[db.ID]; ok {
 | |
| 			botTable.ExtraInfo = map[string]string{
 | |
| 				"prompt_disabled": fmt.Sprintf("%t", r.PromptDisabled),
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		botTables = append(botTables, botTable)
 | |
| 	}
 | |
| 
 | |
| 	return botTables
 | |
| }
 |