Files
X-Agents/server/internal/handler/knowledge_handler.go
DESKTOP-72TV0V4\caoxiaozhu bb04c4afd0 feat: 完善知识库数据模型和服务
- 添加知识库更多字段配置
- 优化知识库服务逻辑
- 添加文档解析相关接口

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 23:02:09 +08:00

225 lines
5.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package handler
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"x-agents/server/internal/model"
"x-agents/server/internal/service"
)
type KnowledgeHandler struct {
service *service.KnowledgeService
}
func NewKnowledgeHandler(s *service.KnowledgeService) *KnowledgeHandler {
return &KnowledgeHandler{service: s}
}
// Create 创建知识库
func (h *KnowledgeHandler) Create(c *gin.Context) {
var req model.CreateKnowledgeRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": err.Error()})
return
}
kb, err := h.service.Create(req)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"id": kb.ID,
"message": "Knowledge base created successfully",
})
}
// List 获取知识库列表
func (h *KnowledgeHandler) List(c *gin.Context) {
list, err := h.service.List()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "message": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"success": true, "data": list})
}
// GetByID 获取知识库详情
func (h *KnowledgeHandler) GetByID(c *gin.Context) {
id := c.Param("id")
if id == "" {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "id is required"})
return
}
kb, err := h.service.GetByID(id)
if err != nil {
c.JSON(http.StatusNotFound, gin.H{"success": false, "message": "Knowledge base not found"})
return
}
c.JSON(http.StatusOK, gin.H{"success": true, "data": kb})
}
// Update 更新知识库
func (h *KnowledgeHandler) Update(c *gin.Context) {
id := c.Param("id")
if id == "" {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "id is required"})
return
}
var req model.UpdateKnowledgeRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": err.Error()})
return
}
if err := h.service.Update(id, req); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "message": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"success": true, "message": "Knowledge base updated"})
}
// Delete 删除知识库
func (h *KnowledgeHandler) Delete(c *gin.Context) {
id := c.Param("id")
if id == "" {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "id is required"})
return
}
if err := h.service.Delete(id); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "message": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"success": true, "message": "Knowledge base deleted"})
}
// ListDocuments 获取知识库下的文档列表
func (h *KnowledgeHandler) ListDocuments(c *gin.Context) {
id := c.Param("id")
if id == "" {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "id is required"})
return
}
status := c.Query("status")
list, err := h.service.ListDocuments(id, status)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "message": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"success": true, "data": list})
}
// UploadDocument 上传文档到知识库
func (h *KnowledgeHandler) UploadDocument(c *gin.Context) {
id := c.Param("id")
if id == "" {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "id is required"})
return
}
file, err := c.FormFile("file")
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "No file uploaded"})
return
}
// 检查文件大小(最大 100MB
if file.Size > 100*1024*1024 {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "File too large (max 100MB)"})
return
}
doc, fileURL, err := h.service.UploadDocument(id, file)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "message": err.Error()})
return
}
if doc == nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "message": "Upload failed"})
return
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"id": doc.ID,
"url": fileURL,
"document": doc,
"message": "Document uploaded",
})
}
// DeleteDocument 删除文档
func (h *KnowledgeHandler) DeleteDocument(c *gin.Context) {
id := c.Param("id")
docID := c.Param("doc_id")
if id == "" || docID == "" {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "id and doc_id are required"})
return
}
if err := h.service.DeleteDocument(id, docID); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "message": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"success": true, "message": "Document deleted"})
}
// ReparseDocument 重新解析文档
func (h *KnowledgeHandler) ReparseDocument(c *gin.Context) {
id := c.Param("id")
docID := c.Param("doc_id")
if id == "" || docID == "" {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "id and doc_id are required"})
return
}
if err := h.service.ReparseDocument(id, docID); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "message": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"success": true, "message": "Document reparse started"})
}
// GetDocumentPreview 获取文档预览
func (h *KnowledgeHandler) GetDocumentPreview(c *gin.Context) {
id := c.Param("id")
docID := c.Param("doc_id")
if id == "" || docID == "" {
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "id and doc_id are required"})
return
}
page := 1
if p := c.Query("page"); p != "" {
if parsed, err := strconv.Atoi(p); err == nil {
page = parsed
}
}
preview, err := h.service.GetDocumentPreview(id, docID, page)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "message": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"success": true, "data": preview})
}