duidui_fiber/internal/question/handler/knowledge_tree_handler.go
2026-03-27 10:34:03 +08:00

254 lines
6.7 KiB
Go

package handler
import (
"dd_fiber_api/internal/question"
"dd_fiber_api/internal/question/service"
"github.com/gofiber/fiber/v2"
)
// KnowledgeTreeHandler 知识树处理器
type KnowledgeTreeHandler struct {
knowledgeTreeService *service.KnowledgeTreeService
}
// NewKnowledgeTreeHandler 创建知识树处理器
func NewKnowledgeTreeHandler(knowledgeTreeService *service.KnowledgeTreeService) *KnowledgeTreeHandler {
return &KnowledgeTreeHandler{
knowledgeTreeService: knowledgeTreeService,
}
}
// CreateKnowledgeTreeNode 创建知识树节点
func (h *KnowledgeTreeHandler) CreateKnowledgeTreeNode(c *fiber.Ctx) error {
var req service.CreateKnowledgeTreeNodeRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "请求参数解析失败: " + err.Error(),
})
}
if req.Title == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "节点标题不能为空",
})
}
if req.Type == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "知识树类型不能为空",
})
}
if req.Type != question.KnowledgeTreeTypeObjective && req.Type != question.KnowledgeTreeTypeSubjective {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "知识树类型无效,必须是 objective 或 subjective",
})
}
node, err := h.knowledgeTreeService.CreateKnowledgeTreeNode(&req)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": err.Error(),
})
}
return c.JSON(fiber.Map{
"success": true,
"message": "创建成功",
"node": node,
})
}
// GetKnowledgeTreeNode 获取知识树节点
func (h *KnowledgeTreeHandler) GetKnowledgeTreeNode(c *fiber.Ctx) error {
id := c.Query("id")
if id == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "节点ID不能为空",
})
}
node, err := h.knowledgeTreeService.GetKnowledgeTreeNode(id)
if err != nil {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
"success": false,
"message": err.Error(),
})
}
return c.JSON(fiber.Map{
"success": true,
"message": "获取成功",
"node": node,
})
}
// GetAllKnowledgeTreeNodes 获取所有知识树节点(扁平列表)
func (h *KnowledgeTreeHandler) GetAllKnowledgeTreeNodes(c *fiber.Ctx) error {
treeTypeStr := c.Query("type", "")
if treeTypeStr == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "知识树类型不能为空",
})
}
treeType := question.KnowledgeTreeType(treeTypeStr)
if treeType != question.KnowledgeTreeTypeObjective && treeType != question.KnowledgeTreeTypeSubjective {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "知识树类型无效,必须是 objective 或 subjective",
})
}
nodes, err := h.knowledgeTreeService.GetAllKnowledgeTreeNodes(treeType)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": err.Error(),
})
}
return c.JSON(fiber.Map{
"success": true,
"message": "获取成功",
"nodes": nodes,
})
}
// GetKnowledgeTreeByParentID 根据父节点ID获取子节点列表
func (h *KnowledgeTreeHandler) GetKnowledgeTreeByParentID(c *fiber.Ctx) error {
parentID := c.Query("parent_id", "") // 空字符串表示根节点
treeTypeStr := c.Query("type", "")
if treeTypeStr == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "知识树类型不能为空",
})
}
treeType := question.KnowledgeTreeType(treeTypeStr)
if treeType != question.KnowledgeTreeTypeObjective && treeType != question.KnowledgeTreeTypeSubjective {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "知识树类型无效,必须是 objective 或 subjective",
})
}
nodes, err := h.knowledgeTreeService.GetKnowledgeTreeByParentID(parentID, treeType)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": err.Error(),
})
}
return c.JSON(fiber.Map{
"success": true,
"message": "获取成功",
"nodes": nodes,
})
}
// GetKnowledgeTree 获取完整树形结构
func (h *KnowledgeTreeHandler) GetKnowledgeTree(c *fiber.Ctx) error {
treeTypeStr := c.Query("type", "")
if treeTypeStr == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "知识树类型不能为空",
})
}
treeType := question.KnowledgeTreeType(treeTypeStr)
if treeType != question.KnowledgeTreeTypeObjective && treeType != question.KnowledgeTreeTypeSubjective {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "知识树类型无效,必须是 objective 或 subjective",
})
}
tree, err := h.knowledgeTreeService.GetKnowledgeTree(treeType)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": err.Error(),
})
}
return c.JSON(fiber.Map{
"success": true,
"message": "获取成功",
"tree": tree,
})
}
// UpdateKnowledgeTreeNode 更新知识树节点
func (h *KnowledgeTreeHandler) UpdateKnowledgeTreeNode(c *fiber.Ctx) error {
var req service.UpdateKnowledgeTreeNodeRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "请求参数解析失败: " + err.Error(),
})
}
if req.ID == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "节点ID不能为空",
})
}
if req.Title == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "节点标题不能为空",
})
}
err := h.knowledgeTreeService.UpdateKnowledgeTreeNode(&req)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": err.Error(),
})
}
return c.JSON(fiber.Map{
"success": true,
"message": "更新成功",
})
}
// DeleteKnowledgeTreeNode 删除知识树节点
func (h *KnowledgeTreeHandler) DeleteKnowledgeTreeNode(c *fiber.Ctx) error {
id := c.Params("id")
if id == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "节点ID不能为空",
})
}
err := h.knowledgeTreeService.DeleteKnowledgeTreeNode(id)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": err.Error(),
})
}
return c.JSON(fiber.Map{
"success": true,
"message": "删除成功",
})
}