diff --git a/internal/repositories/knowledge_document_repository.go b/internal/repositories/knowledge_document_repository.go index 922254c..476e9d3 100644 --- a/internal/repositories/knowledge_document_repository.go +++ b/internal/repositories/knowledge_document_repository.go @@ -80,6 +80,14 @@ func (r *knowledgeDocumentRepository) Count(db *gorm.DB, cnd *sqls.Cnd) int64 { return cnd.Count(db, &models.KnowledgeDocument{}) } +func (r *knowledgeDocumentRepository) CountActiveByDirectoryID(db *gorm.DB, directoryID int64) int64 { + var count int64 + db.Model(&models.KnowledgeDocument{}). + Where("directory_id = ? AND status <> ?", directoryID, enums.StatusDeleted). + Count(&count) + return count +} + func (r *knowledgeDocumentRepository) Create(db *gorm.DB, t *models.KnowledgeDocument) (err error) { err = db.Create(t).Error return diff --git a/internal/repositories/knowledge_faq_repository.go b/internal/repositories/knowledge_faq_repository.go index e1bd35f..600b148 100644 --- a/internal/repositories/knowledge_faq_repository.go +++ b/internal/repositories/knowledge_faq_repository.go @@ -50,6 +50,14 @@ func (r *knowledgeFAQRepository) Count(db *gorm.DB, cnd *sqls.Cnd) int64 { return cnd.Count(db, &models.KnowledgeFAQ{}) } +func (r *knowledgeFAQRepository) CountActiveByDirectoryID(db *gorm.DB, directoryID int64) int64 { + var count int64 + db.Model(&models.KnowledgeFAQ{}). + Where("directory_id = ? AND status <> ?", directoryID, enums.StatusDeleted). + Count(&count) + return count +} + func (r *knowledgeFAQRepository) Create(db *gorm.DB, t *models.KnowledgeFAQ) error { return db.Create(t).Error } diff --git a/internal/services/knowledge_directory_service.go b/internal/services/knowledge_directory_service.go index 29cb089..488f5e5 100644 --- a/internal/services/knowledge_directory_service.go +++ b/internal/services/knowledge_directory_service.go @@ -117,10 +117,10 @@ func (s *knowledgeDirectoryService) DeleteDirectory(id int64) error { if s.Count(sqls.NewCnd().Eq("parent_id", id)) > 0 { return errorsx.InvalidParamI18n("error.e0316") } - if KnowledgeDocumentService.Count(sqls.NewCnd().Eq("directory_id", id)) > 0 { + if repositories.KnowledgeDocumentRepository.CountActiveByDirectoryID(sqls.DB(), id) > 0 { return errorsx.InvalidParamI18n("error.e0317") } - if KnowledgeFAQService.Count(sqls.NewCnd().Eq("directory_id", id)) > 0 { + if repositories.KnowledgeFAQRepository.CountActiveByDirectoryID(sqls.DB(), id) > 0 { return errorsx.InvalidParamI18n("error.e0315") } return repositories.KnowledgeDirectoryRepository.Delete(sqls.DB(), id) diff --git a/internal/services/knowledge_directory_service_test.go b/internal/services/knowledge_directory_service_test.go index a7fdedd..e12eee5 100644 --- a/internal/services/knowledge_directory_service_test.go +++ b/internal/services/knowledge_directory_service_test.go @@ -93,6 +93,33 @@ func TestKnowledgeDirectoryDeleteRejectsAttachedContent(t *testing.T) { } } +func TestKnowledgeDirectoryDeleteAllowsSoftDeletedDocument(t *testing.T) { + setupKnowledgeDirectoryTestDB(t) + operator := knowledgeDirectoryTestOperator() + kb := createKnowledgeDirectoryTestBase(t, "Document KB", string(enums.KnowledgeBaseTypeDocument)) + directory, err := KnowledgeDirectoryService.CreateDirectory(request.CreateKnowledgeDirectoryRequest{ + KnowledgeBaseID: kb.ID, + Name: "已清空目录", + }, operator) + if err != nil { + t.Fatalf("create directory: %v", err) + } + if err := repositories.KnowledgeDocumentRepository.Create(sqls.DB(), &models.KnowledgeDocument{ + KnowledgeBaseID: kb.ID, + DirectoryID: directory.ID, + Title: "Deleted Doc", + ContentType: enums.KnowledgeDocumentContentTypeMarkdown, + Status: enums.StatusDeleted, + IndexStatus: enums.KnowledgeDocumentIndexStatusPending, + }); err != nil { + t.Fatalf("create soft deleted document: %v", err) + } + + if err := KnowledgeDirectoryService.DeleteDirectory(directory.ID); err != nil { + t.Fatalf("DeleteDirectory() error = %v, want nil when only soft deleted documents exist", err) + } +} + func setupKnowledgeDirectoryTestDB(t *testing.T) { t.Helper() db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=shared"), &gorm.Config{})