package admin import ( "strconv" "bindbox-game/internal/pkg/core" "bindbox-game/internal/service/user" "go.uber.org/zap" ) // GrantRewardRequest 奖励发放请求(复用service层的结构体) type GrantRewardRequest = user.GrantRewardRequest // GrantRewardResponse 奖励发放响应(复用service层的结构体) type GrantRewardResponse = user.GrantRewardResponse // GrantReward 给用户发放奖励 // @Summary 给用户发放奖励 // @Description 管理员给用户发放奖励,支持实物和虚拟奖品,可选择关联活动和奖励配置 // @Tags 管理端.用户 // @Accept json // @Produce json // @Param user_id path integer true "用户ID" // @Param RequestBody body GrantRewardRequest true "请求参数" // @Success 200 {object} GrantRewardResponse // @Failure 400 {object} code.Failure // @Failure 401 {object} code.Failure // @Failure 403 {object} code.Failure // @Failure 500 {object} code.Failure // @Router /api/admin/users/{user_id}/rewards/grant [post] func (h *handler) GrantReward() core.HandlerFunc { return func(ctx core.Context) { userIDStr := ctx.Param("user_id") if userIDStr == "" { ctx.AbortWithError(core.Error(400, 40001, "用户ID不能为空")) return } // 解析用户ID userID, err := strconv.ParseInt(userIDStr, 10, 64) if err != nil { ctx.AbortWithError(core.Error(400, 40001, "用户ID格式错误")) return } // 权限检查 - 仅超管可以发放奖励 if ctx.SessionUserInfo().IsSuper != 1 { ctx.AbortWithError(core.Error(403, 40301, "无权限发放奖励")) return } // 解析请求参数 req := new(GrantRewardRequest) if err := ctx.ShouldBindJSON(req); err != nil { zap.L().Error("解析奖励发放请求失败", zap.Error(err)) ctx.AbortWithError(core.Error(400, 40001, "参数格式错误")) return } // 调用服务层发放奖励 resp, err := h.userSvc.GrantReward(ctx.RequestContext(), userID, user.GrantRewardRequest(*req)) if err != nil { zap.L().Error("发放奖励失败", zap.Int64("user_id", userID), zap.Error(err), ) ctx.AbortWithError(core.Error(500, 50001, err.Error())) return } // 返回成功响应 ctx.Payload(resp) } }