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

286 lines
6.8 KiB
Go

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 字段
})
}