yumi-golang/internal/router/voice_room_rocket_routes.go
2026-05-15 23:44:56 +08:00

244 lines
7.3 KiB
Go

package router
import (
"net/http"
"strconv"
"strings"
"chatapp3-golang/internal/config"
"chatapp3-golang/internal/service/voiceroomrocket"
"github.com/gin-gonic/gin"
)
// registerVoiceRoomRocketRoutes 注册语音房火箭 App、后台和内部调试接口。
func registerVoiceRoomRocketRoutes(
engine *gin.Engine,
cfg config.Config,
javaClient authGateway,
service *voiceroomrocket.Service,
) {
if service == nil {
return
}
appGroup := engine.Group("/app/voice-room/rocket")
appGroup.Use(authMiddleware(javaClient))
appGroup.GET("/config", func(c *gin.Context) {
resp, err := service.GetConfig(c.Request.Context(), mustAuthUser(c))
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
appGroup.GET("/level-contents", func(c *gin.Context) {
resp, err := service.GetLevelContents(c.Request.Context(), mustAuthUser(c))
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
appGroup.GET("/status", func(c *gin.Context) {
resp, err := service.GetStatus(c.Request.Context(), mustAuthUser(c), parseInt64(c.Query("roomId")))
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
appGroup.GET("/king", func(c *gin.Context) {
cursor, _ := strconv.Atoi(strings.TrimSpace(c.DefaultQuery("cursor", "1")))
limit, _ := strconv.Atoi(strings.TrimSpace(c.DefaultQuery("limit", "100")))
level, _ := strconv.Atoi(strings.TrimSpace(c.DefaultQuery("level", "1")))
roundNo, _ := strconv.Atoi(strings.TrimSpace(c.DefaultQuery("roundNo", "0")))
resp, err := service.GetKingRanking(c.Request.Context(), mustAuthUser(c), parseInt64(c.Query("roomId")), level, roundNo, cursor, limit)
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
appGroup.GET("/reward-popups", func(c *gin.Context) {
resp, err := service.ListRewardPopups(c.Request.Context(), mustAuthUser(c), parseInt64(c.Query("roomId")))
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
appGroup.POST("/reward-popups/ack", func(c *gin.Context) {
var req voiceroomrocket.AckRewardPopupsRequest
if err := c.ShouldBindJSON(&req); err != nil {
writeError(c, voiceroomrocket.NewAppError(http.StatusBadRequest, "bad_request", err.Error()))
return
}
if err := service.AckRewardPopups(c.Request.Context(), mustAuthUser(c), req); err != nil {
writeError(c, err)
return
}
writeOK(c, gin.H{"success": true})
})
appGroup.GET("/reward-records", func(c *gin.Context) {
cursor, _ := strconv.Atoi(strings.TrimSpace(c.DefaultQuery("cursor", "1")))
limit, _ := strconv.Atoi(strings.TrimSpace(c.DefaultQuery("limit", "20")))
user := mustAuthUser(c)
roomID := parseInt64(c.Query("roomId"))
launchNo := strings.TrimSpace(c.Query("launchNo"))
scope := strings.ToLower(strings.TrimSpace(c.Query("scope")))
var (
resp *voiceroomrocket.RewardRecordPageResponse
err error
)
if launchNo != "" || scope == "room" {
resp, err = service.PageRoomRewardRecords(c.Request.Context(), user, roomID, launchNo, cursor, limit)
} else {
resp, err = service.PageRewardRecords(c.Request.Context(), user, roomID, cursor, limit)
}
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
appGroup.GET("/rule", func(c *gin.Context) {
resp, err := service.GetRule(c.Request.Context(), mustAuthUser(c))
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
adminGroup := engine.Group("/resident-activity/voice-room-rocket")
adminGroup.Use(consoleAuthMiddleware(javaClient))
adminGroup.GET("/config", func(c *gin.Context) {
resp, err := service.GetAdminConfig(c.Request.Context(), c.Query("sysOrigin"))
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
adminGroup.POST("/config/save", func(c *gin.Context) {
var req voiceroomrocket.SaveConfigRequest
if err := c.ShouldBindJSON(&req); err != nil {
writeError(c, voiceroomrocket.NewAppError(http.StatusBadRequest, "bad_request", err.Error()))
return
}
resp, err := service.SaveAdminConfig(c.Request.Context(), req)
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
adminGroup.GET("/level-configs", func(c *gin.Context) {
resp, err := service.ListLevelConfigs(c.Request.Context(), c.Query("sysOrigin"))
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
adminGroup.POST("/level-configs/save", func(c *gin.Context) {
var req voiceroomrocket.SaveLevelConfigsRequest
if err := c.ShouldBindJSON(&req); err != nil {
writeError(c, voiceroomrocket.NewAppError(http.StatusBadRequest, "bad_request", err.Error()))
return
}
resp, err := service.SaveLevelConfigs(c.Request.Context(), req)
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
adminGroup.GET("/reward-configs", func(c *gin.Context) {
level, _ := strconv.Atoi(strings.TrimSpace(c.DefaultQuery("level", "0")))
resp, err := service.ListRewardConfigs(c.Request.Context(), c.Query("sysOrigin"), level)
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
adminGroup.POST("/reward-configs/save", func(c *gin.Context) {
var req voiceroomrocket.SaveRewardConfigsRequest
if err := c.ShouldBindJSON(&req); err != nil {
writeError(c, voiceroomrocket.NewAppError(http.StatusBadRequest, "bad_request", err.Error()))
return
}
resp, err := service.SaveRewardConfigs(c.Request.Context(), req)
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
adminGroup.GET("/launch-records", func(c *gin.Context) {
cursor, _ := strconv.Atoi(strings.TrimSpace(c.DefaultQuery("cursor", "1")))
limit, _ := strconv.Atoi(strings.TrimSpace(c.DefaultQuery("limit", "20")))
resp, err := service.PageAdminLaunchRecords(c.Request.Context(), c.Query("sysOrigin"), parseInt64(c.Query("roomId")), cursor, limit)
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
adminGroup.GET("/reward-records", func(c *gin.Context) {
cursor, _ := strconv.Atoi(strings.TrimSpace(c.DefaultQuery("cursor", "1")))
limit, _ := strconv.Atoi(strings.TrimSpace(c.DefaultQuery("limit", "20")))
resp, err := service.PageAdminRewardRecords(
c.Request.Context(),
c.Query("sysOrigin"),
parseInt64(c.Query("roomId")),
parseInt64(c.Query("userId")),
c.Query("grantStatus"),
cursor,
limit,
)
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
adminGroup.POST("/reward-records/retry", func(c *gin.Context) {
var req struct {
ID int64 `json:"id,string"`
}
if err := c.ShouldBindJSON(&req); err != nil {
writeError(c, voiceroomrocket.NewAppError(http.StatusBadRequest, "bad_request", err.Error()))
return
}
if err := service.RetryReward(c.Request.Context(), req.ID); err != nil {
writeError(c, err)
return
}
writeOK(c, gin.H{"success": true})
})
internalGroup := engine.Group("/internal/voice-room/rocket")
internalGroup.Use(internalSecretMiddleware(cfg.HTTP.InternalCallbackSecret))
internalGroup.POST("/gift-event", func(c *gin.Context) {
body, err := c.GetRawData()
if err != nil {
writeError(c, voiceroomrocket.NewAppError(http.StatusBadRequest, "bad_request", err.Error()))
return
}
resp, err := service.ProcessGiftPayload(c.Request.Context(), string(body))
if err != nil {
writeError(c, err)
return
}
writeOK(c, resp)
})
}
func parseInt64(value string) int64 {
parsed, _ := strconv.ParseInt(strings.TrimSpace(value), 10, 64)
return parsed
}