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

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