package handler import ( "dd_fiber_api/internal/question/service" "strconv" "github.com/gofiber/fiber/v2" ) // PaperHandler 试卷处理器 type PaperHandler struct { paperService *service.PaperService } // NewPaperHandler 创建试卷处理器 func NewPaperHandler(paperService *service.PaperService) *PaperHandler { return &PaperHandler{ paperService: paperService, } } // CreatePaper 创建试卷 func (h *PaperHandler) CreatePaper(c *fiber.Ctx) error { var req service.CreatePaperRequest if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "请求参数解析失败: " + err.Error(), }) } paper, err := h.paperService.CreatePaper(&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": "创建成功", "paper": paper, }) } // GetPaper 获取试卷 func (h *PaperHandler) GetPaper(c *fiber.Ctx) error { id := c.Query("id") if id == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "试卷ID不能为空", }) } paper, err := h.paperService.GetPaper(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": "获取成功", "paper": paper, }) } // SearchPapers 搜索试卷 func (h *PaperHandler) SearchPapers(c *fiber.Ctx) error { query := c.Query("query", "") pageStr := c.Query("page", "1") pageSizeStr := c.Query("page_size", "10") page, _ := strconv.ParseInt(pageStr, 10, 32) pageSize, _ := strconv.ParseInt(pageSizeStr, 10, 32) papers, total, err := h.paperService.SearchPapers(query, int32(page), int32(pageSize)) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "success": false, "message": err.Error(), }) } return c.JSON(fiber.Map{ "success": true, "message": "搜索成功", "papers": papers, "total": total, "page": page, "page_size": pageSize, }) } // UpdatePaper 更新试卷 func (h *PaperHandler) UpdatePaper(c *fiber.Ctx) error { var req service.UpdatePaperRequest 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.paperService.UpdatePaper(&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": "更新成功", }) } // DeletePaper 删除试卷 func (h *PaperHandler) DeletePaper(c *fiber.Ctx) error { id := c.Query("id") if id == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "试卷ID不能为空", }) } err := h.paperService.DeletePaper(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": "删除成功", }) } // BatchDeletePapers 批量删除试卷 func (h *PaperHandler) BatchDeletePapers(c *fiber.Ctx) error { var req struct { PaperIds []string `json:"paper_ids"` } if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "请求参数解析失败: " + err.Error(), }) } if len(req.PaperIds) == 0 { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "试卷ID列表不能为空", }) } deletedCount, failedIDs, err := h.paperService.BatchDeletePapers(req.PaperIds) 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_paper_ids": failedIDs, }) } // AddQuestionToPaper 添加题目到试卷 func (h *PaperHandler) AddQuestionToPaper(c *fiber.Ctx) error { var req struct { PaperId string `json:"paper_id"` 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 req.PaperId == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "试卷ID不能为空", }) } addedCount, failedIDs, err := h.paperService.AddQuestionToPaper(req.PaperId, 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": "添加题目完成", "added_count": addedCount, "failed_question_ids": failedIDs, }) } // RemoveQuestionFromPaper 从试卷移除题目 func (h *PaperHandler) RemoveQuestionFromPaper(c *fiber.Ctx) error { var req struct { PaperId string `json:"paper_id"` 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 req.PaperId == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "试卷ID不能为空", }) } removedCount, failedIDs, err := h.paperService.RemoveQuestionFromPaper(req.PaperId, 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": "移除题目完成", "removed_count": removedCount, "failed_question_ids": failedIDs, }) } // GetPaperWithAnswers 获取试卷及题目详情(包含答案和解析,用于答题结果页面) func (h *PaperHandler) GetPaperWithAnswers(c *fiber.Ctx) error { id := c.Query("id") if id == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "试卷ID不能为空", }) } paper, err := h.paperService.GetPaperWithAnswers(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": "获取成功", "paper": paper, "data": paper, // 兼容前端可能使用的 data 字段 }) }