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": "删除成功", }) }