diff --git a/client/faq.go b/client/faq.go index 98d05fac5..06b5bc32e 100644 --- a/client/faq.go +++ b/client/faq.go @@ -242,15 +242,18 @@ func (c *Client) GetFAQEntry(ctx context.Context, // UpdateFAQEntry updates a single FAQ entry. func (c *Client) UpdateFAQEntry(ctx context.Context, knowledgeBaseID, entryID string, payload *FAQEntryPayload, -) error { +) (*FAQEntry, error) { path := fmt.Sprintf("/api/v1/knowledge-bases/%s/faq/entries/%s", knowledgeBaseID, entryID) resp, err := c.doRequest(ctx, http.MethodPut, path, payload, nil) if err != nil { - return err + return nil, err } - var response faqSimpleResponse - return parseResponse(resp, &response) + var response FAQEntryResponse + if err := parseResponse(resp, &response); err != nil { + return nil, err + } + return response.Data, nil } // UpdateFAQEntryFieldsBatch updates multiple fields for FAQ entries in bulk. diff --git a/internal/application/service/knowledge.go b/internal/application/service/knowledge.go index 7a01a00cd..f1cb59b05 100644 --- a/internal/application/service/knowledge.go +++ b/internal/application/service/knowledge.go @@ -3420,41 +3420,41 @@ func (s *knowledgeService) GetFAQEntry(ctx context.Context, // UpdateFAQEntry updates a single FAQ entry. func (s *knowledgeService) UpdateFAQEntry(ctx context.Context, kbID string, entryID string, payload *types.FAQEntryPayload, -) error { +) (*types.FAQEntry, error) { if payload == nil { - return werrors.NewBadRequestError("请求体不能为空") + return nil, werrors.NewBadRequestError("请求体不能为空") } kb, err := s.validateFAQKnowledgeBase(ctx, kbID) if err != nil { - return err + return nil, err } kb.EnsureDefaults() tenantID := ctx.Value(types.TenantIDContextKey).(uint64) chunk, err := s.chunkRepo.GetChunkByID(ctx, tenantID, entryID) if err != nil { - return err + return nil, err } if chunk.KnowledgeBaseID != kb.ID { - return werrors.NewForbiddenError("无权操作该 FAQ 条目") + return nil, werrors.NewForbiddenError("无权操作该 FAQ 条目") } if chunk.ChunkType != types.ChunkTypeFAQ { - return werrors.NewBadRequestError("仅支持更新 FAQ 条目") + return nil, werrors.NewBadRequestError("仅支持更新 FAQ 条目") } meta, err := sanitizeFAQEntryPayload(payload) if err != nil { - return err + return nil, err } // 检查标准问和相似问是否与其他条目重复 if err := s.checkFAQQuestionDuplicate(ctx, tenantID, kb.ID, entryID, meta); err != nil { - return err + return nil, err } if existing, err := chunk.FAQMetadata(); err == nil && existing != nil { meta.Version = existing.Version + 1 } if err := chunk.SetFAQMetadata(meta); err != nil { - return err + return nil, err } // 获取索引模式 indexMode := types.FAQIndexModeQuestionOnly @@ -3479,7 +3479,7 @@ func (s *knowledgeService) UpdateFAQEntry(ctx context.Context, } chunk.UpdatedAt = time.Now() if err := s.chunkService.UpdateChunk(ctx, chunk); err != nil { - return err + return nil, err } // Sync is_enabled status to retriever engines if it was updated @@ -3491,22 +3491,40 @@ func (s *knowledgeService) UpdateFAQEntry(ctx context.Context, tenantInfo.GetEffectiveEngines(), ) if err != nil { - return err + return nil, err } if err := retrieveEngine.BatchUpdateChunkEnabledStatus(ctx, chunkStatusMap); err != nil { - return err + return nil, err } } faqKnowledge, err := s.repo.GetKnowledgeByID(ctx, tenantID, chunk.KnowledgeID) if err != nil { - return err + return nil, err } embeddingModel, err := s.modelService.GetEmbeddingModel(ctx, kb.EmbeddingModelID) if err != nil { - return err + return nil, err } - return s.indexFAQChunks(ctx, kb, faqKnowledge, []*types.Chunk{chunk}, embeddingModel, false, true) + if err := s.indexFAQChunks(ctx, kb, faqKnowledge, []*types.Chunk{chunk}, embeddingModel, false, true); err != nil { + return nil, err + } + + // 转换为FAQEntry返回 + entry, err := s.chunkToFAQEntry(chunk, kb) + if err != nil { + return nil, err + } + + // 查询TagName + if entry.TagID != "" { + tag, tagErr := s.tagRepo.GetByID(ctx, tenantID, entry.TagID) + if tagErr == nil && tag != nil { + entry.TagName = tag.Name + } + } + + return entry, nil } // UpdateFAQEntryStatus updates enable status for a FAQ entry. diff --git a/internal/handler/faq.go b/internal/handler/faq.go index d25422016..b88f94b13 100644 --- a/internal/handler/faq.go +++ b/internal/handler/faq.go @@ -162,8 +162,9 @@ func (h *FAQHandler) UpdateEntry(c *gin.Context) { return } - if err := h.knowledgeService.UpdateFAQEntry(ctx, - secutils.SanitizeForLog(c.Param("id")), secutils.SanitizeForLog(c.Param("entry_id")), &req); err != nil { + entry, err := h.knowledgeService.UpdateFAQEntry(ctx, + secutils.SanitizeForLog(c.Param("id")), secutils.SanitizeForLog(c.Param("entry_id")), &req) + if err != nil { logger.ErrorWithFields(ctx, err, nil) c.Error(err) return @@ -171,6 +172,7 @@ func (h *FAQHandler) UpdateEntry(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "success": true, + "data": entry, }) } diff --git a/internal/types/interfaces/knowledge.go b/internal/types/interfaces/knowledge.go index b4f0d80dc..d8d2a7c42 100644 --- a/internal/types/interfaces/knowledge.go +++ b/internal/types/interfaces/knowledge.go @@ -93,7 +93,7 @@ type KnowledgeService interface { // GetFAQEntry retrieves a single FAQ entry by ID. GetFAQEntry(ctx context.Context, kbID string, entryID string) (*types.FAQEntry, error) // UpdateFAQEntry updates a single FAQ entry. - UpdateFAQEntry(ctx context.Context, kbID string, entryID string, payload *types.FAQEntryPayload) error + UpdateFAQEntry(ctx context.Context, kbID string, entryID string, payload *types.FAQEntryPayload) (*types.FAQEntry, error) // UpdateFAQEntryFieldsBatch updates multiple fields for FAQ entries in batch. // Supports updating is_enabled, is_recommended, tag_id, and other fields in a single call. UpdateFAQEntryFieldsBatch(ctx context.Context, kbID string, req *types.FAQEntryFieldsBatchUpdate) error