feat: add CountActiveByDirectoryID method to KnowledgeDocument and KnowledgeFAQ repositories; update directory deletion logic to allow soft-deleted documents
This commit is contained in:
@@ -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{})
|
||||
|
||||
Reference in New Issue
Block a user