From 31471f5efadb9b6db53082fcc75a1efd9c75b21e Mon Sep 17 00:00:00 2001 From: wizardchen Date: Mon, 25 May 2026 12:30:20 +0800 Subject: [PATCH] refactor(knowledgeService): update checkStorageEngineConfigured method for improved clarity and functionality - Refactored checkStorageEngineConfigured to be a method of knowledgeService, enhancing encapsulation and readability. - Updated logic to allow fallback to global file service when no storage provider is configured at the KB or tenant level, improving error handling. - Added detailed comments to clarify the method's behavior and internal logic, ensuring better understanding for future maintenance. --- internal/application/service/knowledge.go | 29 +++++++++++++++---- .../application/service/knowledge_create.go | 8 ++--- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/internal/application/service/knowledge.go b/internal/application/service/knowledge.go index 484c124d..8d372482 100644 --- a/internal/application/service/knowledge.go +++ b/internal/application/service/knowledge.go @@ -160,8 +160,14 @@ func (s *knowledgeService) isKnowledgeDeleting(ctx context.Context, tenantID uin } // checkStorageEngineConfigured verifies that the knowledge base has a storage engine configured -// (either at the KB level or via the tenant default). Returns an error if no storage engine is found. -func checkStorageEngineConfigured(ctx context.Context, kb *types.KnowledgeBase) error { +// (either at the KB level or via the tenant default). +// +// 内部版兜底语义:当 KB 与租户都未配置 storage provider 时,如果服务实例持有 +// 全局 FileService(由容器按 STORAGE_TYPE 注入,默认 local),允许直接落到该 +// 全局 fileSvc 上,不再硬性阻断。这与 resolveFileService / resolveFileServiceForPath +// 在 provider 为空时回退到 s.fileSvc 的行为保持一致,避免上层闸门和下游解析口径不一。 +// 仅当 KB/租户/全局三处都拿不到任何可用 FileService 时才报错。 +func (s *knowledgeService) checkStorageEngineConfigured(ctx context.Context, kb *types.KnowledgeBase) error { provider := kb.GetStorageProvider() if provider == "" { tenant, _ := ctx.Value(types.TenantInfoContextKey).(*types.Tenant) @@ -169,10 +175,23 @@ func checkStorageEngineConfigured(ctx context.Context, kb *types.KnowledgeBase) provider = strings.ToLower(strings.TrimSpace(tenant.StorageEngineConfig.DefaultProvider)) } } - if provider == "" { - return werrors.NewBadRequestError("请先为知识库选择存储引擎,再上传内容。请前往知识库设置页面进行配置。") + if provider != "" { + return nil } - return nil + if s != nil && s.fileSvc != nil { + logger.Warnf(ctx, + "[storage] checkStorageEngineConfigured: no KB/tenant provider, fallback to global fileSvc (kb=%s)", + kbIDOrEmpty(kb)) + return nil + } + return werrors.NewBadRequestError("请先为知识库选择存储引擎,再上传内容。请前往知识库设置页面进行配置。") +} + +func kbIDOrEmpty(kb *types.KnowledgeBase) string { + if kb == nil { + return "" + } + return kb.ID } func defaultChannel(ch string) string { diff --git a/internal/application/service/knowledge_create.go b/internal/application/service/knowledge_create.go index 83c6db99..be4dbef2 100644 --- a/internal/application/service/knowledge_create.go +++ b/internal/application/service/knowledge_create.go @@ -56,7 +56,7 @@ func (s *knowledgeService) CreateKnowledgeFromFile(ctx context.Context, return nil, werrors.NewBadRequestError("FAQ 知识库不支持文件上传,请使用 FAQ 导入功能") } - if err := checkStorageEngineConfigured(ctx, kb); err != nil { + if err := s.checkStorageEngineConfigured(ctx, kb); err != nil { return nil, err } @@ -322,7 +322,7 @@ func (s *knowledgeService) CreateKnowledgeFromURL(ctx context.Context, return nil, err } - if err := checkStorageEngineConfigured(ctx, kb); err != nil { + if err := s.checkStorageEngineConfigured(ctx, kb); err != nil { return nil, err } @@ -518,7 +518,7 @@ func (s *knowledgeService) createKnowledgeFromFileURL( return nil, err } - if err := checkStorageEngineConfigured(ctx, kb); err != nil { + if err := s.checkStorageEngineConfigured(ctx, kb); err != nil { return nil, err } @@ -722,7 +722,7 @@ func (s *knowledgeService) CreateKnowledgeFromManual(ctx context.Context, return nil, err } - if err := checkStorageEngineConfigured(ctx, kb); err != nil { + if err := s.checkStorageEngineConfigured(ctx, kb); err != nil { return nil, err }