bindbox-game/internal/api/user/bind_douyin_order_app.go

78 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package app
import (
"net/http"
"bindbox-game/internal/code"
"bindbox-game/internal/pkg/core"
"bindbox-game/internal/pkg/validation"
)
type bindDouyinOrderRequest struct {
DouyinID string `json:"douyin_id"`
}
type bindDouyinOrderResponse struct {
DouyinID string `json:"douyin_id"`
}
// BindDouyinOrder 绑定抖音ID
// @Summary 绑定抖音ID
// @Description 输入抖音号Buyer ID绑定到当前用户
// @Tags APP端.用户
// @Accept json
// @Produce json
// @Security LoginVerifyToken
// @Param RequestBody body bindDouyinOrderRequest true "请求参数"
// @Success 200 {object} bindDouyinOrderResponse
// @Failure 400 {object} code.Failure
// @Router /api/app/users/douyin/bind [post]
func (h *handler) BindDouyinOrder() core.HandlerFunc {
return func(ctx core.Context) {
req := new(bindDouyinOrderRequest)
if err := ctx.ShouldBindJSON(req); err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err)))
return
}
if req.DouyinID == "" {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "抖音号不能为空"))
return
}
currentUserID := int64(ctx.SessionUserInfo().Id)
// 0. 检查当前用户信息
currentUser, err := h.readDB.Users.WithContext(ctx.RequestContext()).Where(h.readDB.Users.ID.Eq(currentUserID)).First()
if err != nil {
ctx.AbortWithError(core.Error(http.StatusInternalServerError, code.ServerError, "获取用户信息失败"))
return
}
// 如果已经绑定了相同的 ID直接返回成功
if currentUser.DouyinUserID == req.DouyinID {
ctx.Payload(&bindDouyinOrderResponse{DouyinID: req.DouyinID})
return
}
// 1. 检查该抖音号是否已被其他本地账号绑定
existedUser, _ := h.readDB.Users.WithContext(ctx.RequestContext()).Where(h.readDB.Users.DouyinUserID.Eq(req.DouyinID)).First()
if existedUser != nil && existedUser.ID != currentUserID {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "该抖音号已被其他账号绑定"))
return
}
// 2. 更新本地用户表的 douyin_user_id
if _, err := h.writeDB.Users.WithContext(ctx.RequestContext()).Where(h.writeDB.Users.ID.Eq(currentUserID)).Updates(map[string]any{
"douyin_user_id": req.DouyinID,
}); err != nil {
ctx.AbortWithError(core.Error(http.StatusInternalServerError, code.ServerError, "更新用户信息失败"))
return
}
ctx.Payload(&bindDouyinOrderResponse{
DouyinID: req.DouyinID,
})
}
}