package handler import ( "dd_fiber_api/internal/camp" "dd_fiber_api/internal/camp/service" "github.com/gofiber/fiber/v2" ) // ProgressHandler 用户进度处理器 type ProgressHandler struct { progressService *service.ProgressService } // NewProgressHandler 创建用户进度处理器 func NewProgressHandler(progressService *service.ProgressService) *ProgressHandler { return &ProgressHandler{ progressService: progressService, } } // UpdateUserProgress 更新用户进度 func (h *ProgressHandler) UpdateUserProgress(c *fiber.Ctx) error { var req camp.UpdateUserProgressRequest if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "请求参数解析失败: " + err.Error(), }) } // 验证必填字段 if req.UserID == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "用户ID不能为空", }) } if req.TaskID == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "任务ID不能为空", }) } // 验证 ReviewStatus if req.ReviewStatus == "" { req.ReviewStatus = camp.ReviewStatusPending } resp, err := h.progressService.UpdateUserProgress(&req) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "success": false, "message": "更新用户进度失败: " + err.Error(), }) } if !resp.Success { return c.Status(fiber.StatusBadRequest).JSON(resp) } return c.Status(fiber.StatusOK).JSON(resp) } // GetUserProgress 获取用户进度 func (h *ProgressHandler) GetUserProgress(c *fiber.Ctx) error { var req camp.GetUserProgressRequest if err := c.QueryParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "请求参数解析失败: " + err.Error(), }) } if req.UserID == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "用户ID不能为空", }) } if req.TaskID == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "任务ID不能为空", }) } resp, err := h.progressService.GetUserProgress(req.UserID, req.TaskID) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "success": false, "message": "获取用户进度失败: " + err.Error(), }) } // 如果进度不存在,返回 200 但 success=false,而不是 404 // 这样可以区分"路由不存在"和"数据不存在" if !resp.Success { return c.Status(fiber.StatusOK).JSON(resp) } return c.Status(fiber.StatusOK).JSON(resp) } // ListUserProgress 列出用户进度 func (h *ProgressHandler) ListUserProgress(c *fiber.Ctx) error { var req camp.ListUserProgressRequest if err := c.QueryParser(&req); err != nil { req.Page = 1 req.PageSize = 10 } resp, err := h.progressService.ListUserProgress(&req) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "success": false, "message": "获取用户进度列表失败: " + err.Error(), }) } return c.Status(fiber.StatusOK).JSON(resp) } // GetPendingReviewCount 获取待审核任务数量(用于后台右上角提示) func (h *ProgressHandler) GetPendingReviewCount(c *fiber.Ctx) error { req := &camp.ListUserProgressRequest{ ReviewStatus: string(camp.ReviewStatusPending), Page: 1, PageSize: 1, } resp, err := h.progressService.ListUserProgress(req) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "success": false, "message": "获取待审核数量失败: " + err.Error(), }) } return c.Status(fiber.StatusOK).JSON(fiber.Map{ "success": true, "count": resp.Total, }) } // ResetTaskProgress 重置任务进度 func (h *ProgressHandler) ResetTaskProgress(c *fiber.Ctx) error { var req camp.ResetTaskProgressRequest if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "请求参数解析失败: " + err.Error(), }) } if req.UserID == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "用户ID不能为空", }) } if req.TaskID == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "任务ID不能为空", }) } resp, err := h.progressService.ResetTaskProgress(req.UserID, req.TaskID) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "success": false, "message": "重置任务进度失败: " + err.Error(), }) } if !resp.Success { return c.Status(fiber.StatusBadRequest).JSON(resp) } return c.Status(fiber.StatusOK).JSON(resp) }