254 lines
6.7 KiB
Go
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": "删除成功",
|
|
})
|
|
}
|