mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-03 09:11:59 +08:00
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:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user