重构(#4): 抽奖奖品改/删 id 走 URL path(RESTful)
- PUT /admin/lottery/prizes/:id、DELETE /admin/lottery/prizes/:id
- handler 从 c.Param("id") 取 id;types 用 path:"id"
- 同步 apis/admin/lottery.api 定义
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -49,11 +49,11 @@ service ppanel {
|
|||||||
|
|
||||||
@doc "Update prize"
|
@doc "Update prize"
|
||||||
@handler UpdateLotteryPrize
|
@handler UpdateLotteryPrize
|
||||||
put /prizes (UpdateAdminLotteryPrizeRequest) returns (AdminLotteryPrize)
|
put /prizes/:id (UpdateAdminLotteryPrizeRequest) returns (AdminLotteryPrize)
|
||||||
|
|
||||||
@doc "Delete prize"
|
@doc "Delete prize"
|
||||||
@handler DeleteLotteryPrize
|
@handler DeleteLotteryPrize
|
||||||
delete /prizes (AdminPrizeIdRequest)
|
delete /prizes/:id (AdminPrizeIdRequest)
|
||||||
|
|
||||||
@doc "List prizes on an activity"
|
@doc "List prizes on an activity"
|
||||||
@handler ListLotteryPrizes
|
@handler ListLotteryPrizes
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
package lottery
|
package lottery
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
adminlottery "github.com/perfect-panel/server/internal/logic/admin/lottery"
|
adminlottery "github.com/perfect-panel/server/internal/logic/admin/lottery"
|
||||||
"github.com/perfect-panel/server/internal/svc"
|
"github.com/perfect-panel/server/internal/svc"
|
||||||
@@ -118,6 +120,9 @@ func UpdateLotteryPrizeHandler(svcCtx *svc.ServiceContext) func(c *gin.Context)
|
|||||||
return func(c *gin.Context) {
|
return func(c *gin.Context) {
|
||||||
var req types.UpdateAdminLotteryPrizeRequest
|
var req types.UpdateAdminLotteryPrizeRequest
|
||||||
_ = c.ShouldBind(&req)
|
_ = c.ShouldBind(&req)
|
||||||
|
if id, err := strconv.ParseInt(c.Param("id"), 10, 64); err == nil {
|
||||||
|
req.Id = id
|
||||||
|
}
|
||||||
if err := svcCtx.Validate(&req); err != nil {
|
if err := svcCtx.Validate(&req); err != nil {
|
||||||
result.ParamErrorResult(c, err)
|
result.ParamErrorResult(c, err)
|
||||||
return
|
return
|
||||||
@@ -132,6 +137,9 @@ func DeleteLotteryPrizeHandler(svcCtx *svc.ServiceContext) func(c *gin.Context)
|
|||||||
return func(c *gin.Context) {
|
return func(c *gin.Context) {
|
||||||
var req types.AdminPrizeIdRequest
|
var req types.AdminPrizeIdRequest
|
||||||
_ = c.ShouldBind(&req)
|
_ = c.ShouldBind(&req)
|
||||||
|
if id, err := strconv.ParseInt(c.Param("id"), 10, 64); err == nil {
|
||||||
|
req.Id = id
|
||||||
|
}
|
||||||
if err := svcCtx.Validate(&req); err != nil {
|
if err := svcCtx.Validate(&req); err != nil {
|
||||||
result.ParamErrorResult(c, err)
|
result.ParamErrorResult(c, err)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ func registerLotteryRoutes(router *gin.Engine, serverCtx *svc.ServiceContext) {
|
|||||||
adminGroup.PUT("/activities/rules", adminLottery.UpdateLotteryRulesHandler(serverCtx))
|
adminGroup.PUT("/activities/rules", adminLottery.UpdateLotteryRulesHandler(serverCtx))
|
||||||
|
|
||||||
adminGroup.POST("/prizes", adminLottery.CreateLotteryPrizeHandler(serverCtx))
|
adminGroup.POST("/prizes", adminLottery.CreateLotteryPrizeHandler(serverCtx))
|
||||||
adminGroup.PUT("/prizes", adminLottery.UpdateLotteryPrizeHandler(serverCtx))
|
adminGroup.PUT("/prizes/:id", adminLottery.UpdateLotteryPrizeHandler(serverCtx))
|
||||||
adminGroup.DELETE("/prizes", adminLottery.DeleteLotteryPrizeHandler(serverCtx))
|
adminGroup.DELETE("/prizes/:id", adminLottery.DeleteLotteryPrizeHandler(serverCtx))
|
||||||
adminGroup.GET("/prizes", adminLottery.ListLotteryPrizesHandler(serverCtx))
|
adminGroup.GET("/prizes", adminLottery.ListLotteryPrizesHandler(serverCtx))
|
||||||
|
|
||||||
adminGroup.POST("/chances/grant", adminLottery.GrantLotteryChanceHandler(serverCtx))
|
adminGroup.POST("/chances/grant", adminLottery.GrantLotteryChanceHandler(serverCtx))
|
||||||
|
|||||||
@@ -261,9 +261,10 @@ type CreateAdminLotteryPrizeRequest struct {
|
|||||||
IsFallback bool `json:"is_fallback"`
|
IsFallback bool `json:"is_fallback"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateAdminLotteryPrizeRequest updates mutable prize fields.
|
// UpdateAdminLotteryPrizeRequest updates mutable prize fields. Id comes from
|
||||||
|
// the URL path (PUT /prizes/:id), not the body.
|
||||||
type UpdateAdminLotteryPrizeRequest struct {
|
type UpdateAdminLotteryPrizeRequest struct {
|
||||||
Id int64 `json:"id" validate:"required"`
|
Id int64 `path:"id" json:"-" validate:"required"`
|
||||||
Slot *int `json:"slot,omitempty"`
|
Slot *int `json:"slot,omitempty"`
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
IconUrl string `json:"icon_url,omitempty"`
|
IconUrl string `json:"icon_url,omitempty"`
|
||||||
@@ -283,9 +284,9 @@ type ListAdminLotteryPrizesResponse struct {
|
|||||||
List []AdminLotteryPrize `json:"list"`
|
List []AdminLotteryPrize `json:"list"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// AdminPrizeIdRequest is used by DELETE / GET single.
|
// AdminPrizeIdRequest is used by DELETE /prizes/:id. Id comes from the URL path.
|
||||||
type AdminPrizeIdRequest struct {
|
type AdminPrizeIdRequest struct {
|
||||||
Id int64 `form:"id" json:"id" validate:"required"`
|
Id int64 `path:"id" form:"id" json:"id" validate:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GrantAdminLotteryChanceRequest gives a specified user N chances on an
|
// GrantAdminLotteryChanceRequest gives a specified user N chances on an
|
||||||
|
|||||||
Reference in New Issue
Block a user