feat: add CountActiveByDirectoryID method to KnowledgeDocument and KnowledgeFAQ repositories; update directory deletion logic to allow soft-deleted documents

This commit is contained in:
mlogclub
2026-06-07 20:28:33 +08:00
parent a9952a821d
commit 9cfbd57b07
4 changed files with 45 additions and 2 deletions
@@ -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
@@ -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
}
@@ -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)
@@ -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{})