fix(go): Add tenant filter to file queries (#16526)

## Summary

- Add `tenant_id` filtering to `FileDAO.Query`.
- Pass tenant IDs through existing file query call sites.
- Prevent cross-tenant filename and folder duplicate checks.
This commit is contained in:
Hz_
2026-07-02 19:54:22 +08:00
committed by GitHub
parent 11dfea489d
commit dfd95c9c5c
5 changed files with 15 additions and 12 deletions

View File

@@ -314,7 +314,7 @@ func (dao *FileDAO) IsParentFolderExist(parentID string) bool {
}
// Query retrieves files by conditions
func (dao *FileDAO) Query(name string, parentID string) []*entity.File {
func (dao *FileDAO) Query(name string, parentID string, tenantID string) []*entity.File {
var files []*entity.File
query := DB.Model(&entity.File{})
if name != "" {
@@ -323,6 +323,9 @@ func (dao *FileDAO) Query(name string, parentID string) []*entity.File {
if parentID != "" {
query = query.Where("parent_id = ?", parentID)
}
if tenantID != "" {
query = query.Where("tenant_id = ?", tenantID)
}
query.Find(&files)
return files
}

View File

@@ -97,7 +97,7 @@ func (h *FileCommitHandler) resolveDatasetFolderID(datasetID string) (string, er
if err != nil {
return "", err
}
files := h.fileDAO.Query(kb.Name, "")
files := h.fileDAO.Query(kb.Name, "", kb.TenantID)
for _, f := range files {
if f.SourceType == string(entity.FileSourceKnowledgebase) && f.Type == "folder" && f.TenantID == kb.TenantID {
return f.ID, nil

View File

@@ -3323,7 +3323,7 @@ func (s *DocumentService) ensureKBFolder(kb *entity.Knowledgebase, tenantID stri
// newAFileFromKB returns the existing folder named name under parentID, or
// creates it. Mirrors Python FileService.new_a_file_from_kb.
func (s *DocumentService) newAFileFromKB(tenantID, name, parentID string) (*entity.File, error) {
for _, f := range s.fileDAO.Query(name, parentID) {
for _, f := range s.fileDAO.Query(name, parentID, tenantID) {
if f.TenantID == tenantID {
return f, nil
}

View File

@@ -377,7 +377,7 @@ func (s *FileService) UploadFile(tenantID, parentID string, files []*multipart.F
return nil, fmt.Errorf("failed to store file: %w", err)
}
uniqueName := s.getUniqueFilename(fileObjNames[len(fileObjNames)-1], lastFolder.ID)
uniqueName := s.getUniqueFilename(fileObjNames[len(fileObjNames)-1], lastFolder.ID, tenantID)
fileRecord := &entity.File{
ID: s.generateUUID(),
@@ -477,8 +477,8 @@ func (s *FileService) createFolderRecursive(parentFolder *entity.File, names []s
return s.createFolderRecursive(newFolder, names, count+1, tenantID)
}
func (s *FileService) getUniqueFilename(name, parentID string) string {
existingFiles := s.fileDAO.Query(name, parentID)
func (s *FileService) getUniqueFilename(name, parentID, tenantID string) string {
existingFiles := s.fileDAO.Query(name, parentID, tenantID)
if len(existingFiles) == 0 {
return name
}
@@ -490,7 +490,7 @@ func (s *FileService) getUniqueFilename(name, parentID string) string {
counter := 1
for {
newName := fmt.Sprintf("%s_%d%s", nameWithoutExt, counter, ext)
existingFiles = s.fileDAO.Query(newName, parentID)
existingFiles = s.fileDAO.Query(newName, parentID, tenantID)
if len(existingFiles) == 0 {
return newName
}
@@ -517,7 +517,7 @@ func (s *FileService) CreateFolder(tenantID, name, parentID, fileType string) (m
return nil, fmt.Errorf("Parent Folder Doesn't Exist!")
}
existingFiles := s.fileDAO.Query(name, parentID)
existingFiles := s.fileDAO.Query(name, parentID, tenantID)
if len(existingFiles) > 0 {
return nil, fmt.Errorf("Duplicated folder name in the same folder.")
}
@@ -839,7 +839,7 @@ func (s *FileService) MoveFiles(uid string, srcFileIDs []string, destFileID stri
if destFolder != nil {
targetParentID = destFolder.ID
}
existingFiles := s.fileDAO.Query(newName, targetParentID)
existingFiles := s.fileDAO.Query(newName, targetParentID, file.TenantID)
for _, f := range existingFiles {
if f.Name == newName {
return false, "Duplicated file name in the same folder."
@@ -848,7 +848,7 @@ func (s *FileService) MoveFiles(uid string, srcFileIDs []string, destFileID stri
} else if destFolder != nil {
// Plain move (no rename): check for duplicate names in destination folder
for _, file := range files {
existingFiles := s.fileDAO.Query(file.Name, destFolder.ID)
existingFiles := s.fileDAO.Query(file.Name, destFolder.ID, file.TenantID)
for _, f := range existingFiles {
// Ignore the source file itself
if f.ID != file.ID {
@@ -902,7 +902,7 @@ func (s *FileService) moveEntryRecursive(sourceFile *entity.File, destFolder *en
if sourceFile.Type == FileTypeFolder {
// Handle folder move
existingFolders := s.fileDAO.Query(effectiveName, destFolder.ID)
existingFolders := s.fileDAO.Query(effectiveName, destFolder.ID, sourceFile.TenantID)
var newFolder *entity.File
if len(existingFolders) > 0 {
// Prevent moving a folder into itself (self-target merge)

View File

@@ -193,7 +193,7 @@ func (s *SkillSpaceService) CreateSpace(req *CreateSpaceRequest) (map[string]int
// Check if there's an existing folder with the same name under skills folder
// If exists, delete it to prevent duplicate folder names
existingFolders := s.fileDAO.Query(req.Name, skillsFolderID)
existingFolders := s.fileDAO.Query(req.Name, skillsFolderID, req.TenantID)
for _, f := range existingFolders {
if f.Type == "folder" && f.Name == req.Name {
common.Info("Deleting existing space folder with same name", zap.String("folderID", f.ID), zap.String("name", req.Name))