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)
| 27 | // @Failure 500 {object} model.CommonResponse "服务器内部错误" |
| 28 | // @Router /api/chunks/knowledge [post] |
| 29 | func 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 { |
nothing calls this directly
no test coverage detected