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

246 lines
6.0 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 (
"dd_fiber_api/internal/question"
"dd_fiber_api/internal/question/service"
"strconv"
"strings"
"github.com/gofiber/fiber/v2"
)
// QuestionHandler 题目处理器
type QuestionHandler struct {
questionService *service.QuestionService
knowledgeTreeService *service.KnowledgeTreeService
}
// NewQuestionHandler 创建题目处理器
func NewQuestionHandler(questionService *service.QuestionService, knowledgeTreeService *service.KnowledgeTreeService) *QuestionHandler {
return &QuestionHandler{
questionService: questionService,
knowledgeTreeService: knowledgeTreeService,
}
}
// CreateQuestion 创建题目
func (h *QuestionHandler) CreateQuestion(c *fiber.Ctx) error {
var req service.CreateQuestionRequest
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "请求参数解析失败: " + err.Error(),
})
}
question, err := h.questionService.CreateQuestion(&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": "创建成功",
"question": question,
})
}
// GetQuestion 获取题目
func (h *QuestionHandler) GetQuestion(c *fiber.Ctx) error {
id := c.Query("id")
if id == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "题目ID不能为空",
})
}
question, err := h.questionService.GetQuestion(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": "获取成功",
"question": question,
})
}
// SearchQuestions 搜索题目
func (h *QuestionHandler) SearchQuestions(c *fiber.Ctx) error {
query := c.Query("query", "")
qTypeStr := c.Query("type", "0")
knowledgeTreeIdsStr := c.Query("knowledge_tree_ids", "")
pageStr := c.Query("page", "1")
pageSizeStr := c.Query("page_size", "10")
qType, _ := strconv.ParseInt(qTypeStr, 10, 32)
page, _ := strconv.ParseInt(pageStr, 10, 32)
pageSize, _ := strconv.ParseInt(pageSizeStr, 10, 32)
var knowledgeTreeIds []string
if knowledgeTreeIdsStr != "" {
// 逗号分割的知识树ID列表
knowledgeTreeIds = strings.Split(knowledgeTreeIdsStr, ",")
}
questions, total, err := h.questionService.SearchQuestions(
query,
question.QuestionType(qType),
knowledgeTreeIds,
int32(page),
int32(pageSize),
)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": err.Error(),
})
}
// 如果有 KnowledgeTreeService则为每道题附加知识树名称便于前端展示
if h.knowledgeTreeService != nil {
// 收集所有题目中出现过的知识树ID去重
idSet := make(map[string]struct{})
var allIDs []string
for _, q := range questions {
for _, id := range q.KnowledgeTreeIDs {
if id == "" {
continue
}
if _, exists := idSet[id]; !exists {
idSet[id] = struct{}{}
allIDs = append(allIDs, id)
}
}
}
if len(allIDs) > 0 {
// 批量获取名称(不存在的知识树节点会跳过,不报错)
idToName, err := h.knowledgeTreeService.GetKnowledgeTreeNames(allIDs)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": err.Error(),
})
}
// 为每道题填充 KnowledgeTreeNames
for _, q := range questions {
q.KnowledgeTreeNames = nil
for _, id := range q.KnowledgeTreeIDs {
if name, ok := idToName[id]; ok {
q.KnowledgeTreeNames = append(q.KnowledgeTreeNames, name)
}
}
}
}
}
return c.JSON(fiber.Map{
"success": true,
"message": "搜索成功",
"questions": questions,
"total": total,
"page": page,
"page_size": pageSize,
})
}
// UpdateQuestion 更新题目
func (h *QuestionHandler) UpdateQuestion(c *fiber.Ctx) error {
var req service.UpdateQuestionRequest
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不能为空",
})
}
err := h.questionService.UpdateQuestion(&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": "更新成功",
})
}
// DeleteQuestion 删除题目
func (h *QuestionHandler) DeleteQuestion(c *fiber.Ctx) error {
id := c.Query("id")
if id == "" {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "题目ID不能为空",
})
}
err := h.questionService.DeleteQuestion(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": "删除成功",
})
}
// BatchDeleteQuestions 批量删除题目
func (h *QuestionHandler) BatchDeleteQuestions(c *fiber.Ctx) error {
var req struct {
QuestionIds []string `json:"question_ids"`
}
if err := c.BodyParser(&req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "请求参数解析失败: " + err.Error(),
})
}
if len(req.QuestionIds) == 0 {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"success": false,
"message": "题目ID列表不能为空",
})
}
deletedCount, failedIDs, err := h.questionService.BatchDeleteQuestions(req.QuestionIds)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"success": false,
"message": err.Error(),
})
}
return c.JSON(fiber.Map{
"success": true,
"message": "批量删除完成",
"deleted_count": deletedCount,
"failed_question_ids": failedIDs,
})
}