70 lines
2.4 KiB
Go
70 lines
2.4 KiB
Go
package app
|
||
|
||
import (
|
||
"net/http"
|
||
"time"
|
||
|
||
"bindbox-game/internal/code"
|
||
"bindbox-game/internal/pkg/core"
|
||
)
|
||
|
||
type addressShareCreateRequest struct {
|
||
InventoryID int64 `json:"inventory_id"`
|
||
ExpiresAt string `json:"expires_at"`
|
||
ExpiresInMinutes int `json:"expires_in_minutes"`
|
||
}
|
||
|
||
type addressShareCreateResponse struct {
|
||
ShareToken string `json:"share_token"`
|
||
ShareURL string `json:"share_url"`
|
||
ShortLink string `json:"short_link"`
|
||
ExpiresAt time.Time `json:"expires_at"`
|
||
}
|
||
|
||
// CreateAddressShare 创建共享地址链接
|
||
// @Summary 创建共享地址链接
|
||
// @Description 生成一次性分享令牌(不落库),用于邀请他人填写收货地址;令牌默认有效期1小时(无需传过期参数)
|
||
// @Tags APP端.用户
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Param user_id path integer true "用户ID"
|
||
// @Security LoginVerifyToken
|
||
// @Param RequestBody body addressShareCreateRequest true "请求参数:资产ID(过期参数可不传,默认1小时)"
|
||
// @Success 200 {object} addressShareCreateResponse
|
||
// @Failure 400 {object} code.Failure "参数错误/资产不可用"
|
||
// @Router /api/app/users/{user_id}/inventory/address-share/create [post]
|
||
func (h *handler) CreateAddressShare() core.HandlerFunc {
|
||
return func(ctx core.Context) {
|
||
req := new(addressShareCreateRequest)
|
||
rsp := new(addressShareCreateResponse)
|
||
if err := ctx.ShouldBindJSON(req); err != nil || req.InventoryID == 0 {
|
||
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "参数错误"))
|
||
return
|
||
}
|
||
var exp time.Time
|
||
if req.ExpiresInMinutes > 0 {
|
||
exp = time.Now().Add(time.Duration(req.ExpiresInMinutes) * time.Minute)
|
||
} else if req.ExpiresAt != "" {
|
||
if t, err := time.Parse(time.RFC3339, req.ExpiresAt); err == nil {
|
||
exp = t
|
||
} else if mins, err2 := time.ParseDuration(req.ExpiresAt + "m"); err2 == nil {
|
||
exp = time.Now().Add(mins)
|
||
}
|
||
}
|
||
if exp.IsZero() {
|
||
exp = time.Now().Add(60 * time.Minute)
|
||
}
|
||
userID := int64(ctx.SessionUserInfo().Id)
|
||
token, shortLink, exp, err := h.user.CreateAddressShare(ctx.RequestContext(), userID, req.InventoryID, exp)
|
||
if err != nil {
|
||
ctx.AbortWithError(core.Error(http.StatusBadRequest, 10020, err.Error()))
|
||
return
|
||
}
|
||
rsp.ShareToken = token
|
||
rsp.ShortLink = shortLink
|
||
rsp.ExpiresAt = exp
|
||
rsp.ShareURL = "/api/app/address-share/" + token + "/submit"
|
||
ctx.Payload(rsp)
|
||
}
|
||
}
|