183 lines
4.7 KiB
Go
183 lines
4.7 KiB
Go
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)
|
||
}
|
||
|