feat: 更新FAQ条目时返回更新后的数据

This commit is contained in:
wizardchen
2026-01-07 11:50:57 +08:00
parent b71e7084fd
commit be38966cbe
4 changed files with 45 additions and 22 deletions
+7 -4
View File
@@ -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.
+33 -15
View File
@@ -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.
+4 -2
View File
@@ -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,
})
}
+1 -1
View File
@@ -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