2026-05-25 15:45:57 +08:00

89 lines
2.0 KiB
Go

package userleaderboard
import (
"database/sql"
"errors"
"strconv"
"strings"
"hyapp-admin-server/internal/appctx"
"hyapp-admin-server/internal/integration/roomclient"
"hyapp-admin-server/internal/modules/shared"
"hyapp-admin-server/internal/response"
"github.com/gin-gonic/gin"
)
type Handler struct {
service *Service
}
func New(walletDB *sql.DB, userDB *sql.DB, room roomclient.Client) *Handler {
return &Handler{service: NewService(walletDB, userDB, room)}
}
func (h *Handler) List(c *gin.Context) {
query, ok := parseQuery(c)
if !ok {
return
}
result, err := h.service.List(c.Request.Context(), appctx.FromContext(c.Request.Context()), query)
if err != nil {
if errors.Is(err, errInvalidArgument) {
response.BadRequest(c, "榜单参数不正确")
return
}
response.ServerError(c, "获取用户榜单失败")
return
}
response.OK(c, result)
}
func parseQuery(c *gin.Context) (Query, bool) {
options := shared.ListOptions(c)
boardType := NormalizeBoardType(firstQuery(c, "board_type", "boardType", "type"))
if boardType == "" {
response.BadRequest(c, "榜单类型不正确")
return Query{}, false
}
period := NormalizePeriod(firstQuery(c, "period", "time_dimension", "timeDimension"))
if period == "" {
response.BadRequest(c, "时间维度不正确")
return Query{}, false
}
viewerUserID, ok := optionalInt64(firstQuery(c, "viewer_user_id", "viewerUserId", "user_id", "userId"))
if !ok {
response.BadRequest(c, "用户 ID 不正确")
return Query{}, false
}
return NormalizeQuery(Query{
BoardType: boardType,
Period: period,
Page: options.Page,
PageSize: options.PageSize,
ViewerUserID: viewerUserID,
}), true
}
func optionalInt64(raw string) (int64, bool) {
raw = strings.TrimSpace(raw)
if raw == "" {
return 0, true
}
value, err := strconv.ParseInt(raw, 10, 64)
return value, err == nil && value >= 0
}
func firstQuery(c *gin.Context, keys ...string) string {
for _, key := range keys {
if value := strings.TrimSpace(c.Query(key)); value != "" {
return value
}
}
return ""
}