package admin import ( "net/http" "strconv" "time" "bindbox-game/configs" "bindbox-game/internal/code" "bindbox-game/internal/pkg/core" "bindbox-game/internal/pkg/jwtoken" "bindbox-game/internal/pkg/validation" "bindbox-game/internal/proposal" ) type issueUserTokenResponse struct { Token string `json:"token"` ExpiresIn int64 `json:"expires_in"` } // IssueUserToken 为指定APP用户签发访问令牌 // @Summary 管理端为APP用户签发令牌 // @Description 仅超级管理员可用,用于测试或紧急场景下为指定用户签发APP令牌 // @Tags 管理端.用户 // @Accept json // @Produce json // @Param user_id path integer true "用户ID" // @Success 200 {object} issueUserTokenResponse // @Failure 400 {object} code.Failure // @Router /api/admin/users/{user_id}/token [post] // @Security LoginVerifyToken func (h *handler) IssueUserToken() core.HandlerFunc { return func(ctx core.Context) { if ctx.SessionUserInfo().IsSuper != 1 { ctx.AbortWithError(core.Error(http.StatusBadRequest, 10101, "禁止操作")) return } idStr := ctx.Param("user_id") userID, err := strconv.ParseInt(idStr, 10, 64) if err != nil || userID <= 0 { ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err))) return } u, e := h.readDB.Users.WithContext(ctx.RequestContext()).Where(h.readDB.Users.ID.Eq(userID)).First() if e != nil || u == nil { ctx.AbortWithError(core.Error(http.StatusBadRequest, 20101, "用户不存在")) return } su := proposal.SessionUserInfo{Id: int32(u.ID), UserName: u.Nickname, NickName: u.Nickname, IsSuper: 0, Platform: "APP"} exp := int64(30 * 24 * 3600) token, sErr := jwtoken.New(configs.Get().JWT.PatientSecret).Sign(su, 30*24*time.Hour) if sErr != nil { ctx.AbortWithError(core.Error(http.StatusInternalServerError, 20102, sErr.Error())) return } ctx.Payload(&issueUserTokenResponse{Token: token, ExpiresIn: exp}) } }