MCPcopy Create free account
hub / github.com/53AI/53AIHub / SaveKnowledgeChunk

Function SaveKnowledgeChunk

api/controller/knowledge_management.go:29–104  ·  view source on GitHub ↗

SaveKnowledgeChunk godoc @Summary 保存知识点内容 @Description 一次性保存知识点内容、概要、常见问法和关联知识点,支持大内容自动分块。如果提供chunk_id则更新现有分块,否则创建新的知识点 @Tags 文档分块管理 @Accept json @Produce json @Security BearerAuth @Param request body SaveKnowledgeChunkRequest true "知识点信息" @Success 200 {object} model.CommonResponse{data=SaveKnowledg

(c *gin.Context)

Source from the content-addressed store, hash-verified

27// @Failure 500 {object} model.CommonResponse "服务器内部错误"
28// @Router /api/chunks/knowledge [post]
29func SaveKnowledgeChunk(c *gin.Context) {
30 eid := config.GetEID(c)
31 userID := config.GetUserId(c)
32
33 // 解析请求体
34 var req SaveKnowledgeChunkRequest
35 if err := c.ShouldBindJSON(&req); err != nil {
36 c.JSON(http.StatusBadRequest, model.ParamError.ToResponse(err))
37 return
38 }
39
40 // 验证知识库权限
41 userPermission, err := service.GetUserPermission(eid, model.RESOURCE_TYPE_LIBRARY, req.LibraryID, userID)
42 if err != nil || userPermission < model.PERMISSION_EDIT_KNOWLEDGE {
43 c.JSON(http.StatusForbidden, model.AuthFailed.ToResponse(errors.New("无权限在此知识库创建知识点")))
44 return
45 }
46
47 // 如果指定了 ChunkID,验证分块是否存在且属于指定知识库
48 if req.ChunkID != nil {
49 existingChunk, err := model.GetDocumentChunkByID(eid, *req.ChunkID)
50 if err != nil {
51 c.JSON(http.StatusBadRequest, model.ParamError.ToResponse(fmt.Errorf("指定的分块 %d 不存在", *req.ChunkID)))
52 return
53 }
54 if existingChunk.LibraryID != req.LibraryID {
55 c.JSON(http.StatusBadRequest, model.ParamError.ToResponse(fmt.Errorf("指定的分块 %d 不属于指定知识库", *req.ChunkID)))
56 return
57 }
58 if existingChunk.ChunkType != "knowledge" {
59 c.JSON(http.StatusBadRequest, model.ParamError.ToResponse(fmt.Errorf("指定的分块 %d 不是知识点类型", *req.ChunkID)))
60 return
61 }
62 }
63
64 // 验证关联知识点是否存在且属于同一知识库
65 if len(req.RelatedKnowledgeIDs) > 0 {
66 for _, relatedID := range req.RelatedKnowledgeIDs {
67 relatedChunk, err := model.GetDocumentChunkByID(eid, relatedID)
68 if err != nil {
69 c.JSON(http.StatusBadRequest, model.ParamError.ToResponse(fmt.Errorf("关联知识点 %d 不存在", relatedID)))
70 return
71 }
72 if relatedChunk.LibraryID != req.LibraryID {
73 c.JSON(http.StatusBadRequest, model.ParamError.ToResponse(fmt.Errorf("关联知识点 %d 不属于指定知识库", relatedID)))
74 return
75 }
76 if relatedChunk.ChunkType != "knowledge" {
77 c.JSON(http.StatusBadRequest, model.ParamError.ToResponse(fmt.Errorf("关联的分块 %d 不是知识点类型", relatedID)))
78 return
79 }
80 }
81 }
82
83 // 创建场景下,先校验目标文件是否存在且属于指定知识库
84 if req.ChunkID == nil {
85 file, err := model.GetFileByID(eid, req.FileID)
86 if err != nil {

Callers

nothing calls this directly

Calls 5

GetEIDMethod · 0.80
ToResponseMethod · 0.80
ErrorfMethod · 0.80
NewMethod · 0.45

Tested by

no test coverage detected