package app import ( "context" "net/http" "time" "bindbox-game/internal/code" "bindbox-game/internal/pkg/core" "bindbox-game/internal/pkg/validation" ) type syncMyDouyinOrdersResponse struct { Message string `json:"message"` DouyinUserID string `json:"douyin_user_id"` TotalFetched int `json:"total_fetched"` NewOrders int `json:"new_orders"` MatchedUsers int `json:"matched_users"` ElapsedMS int64 `json:"elapsed_ms"` } // SyncMyDouyinOrders 同步当前登录用户的抖音订单 // @Summary 同步我的抖音订单 // @Description 从当前登录用户绑定的 douyin_user_id 定向拉取抖音订单并同步到本地 // @Tags APP端.用户 // @Accept json // @Produce json // @Security LoginVerifyToken // @Success 200 {object} syncMyDouyinOrdersResponse // @Failure 400 {object} code.Failure // @Router /api/app/users/douyin/orders/sync [post] func (h *handler) SyncMyDouyinOrders() core.HandlerFunc { return func(ctx core.Context) { currentUserID := int64(ctx.SessionUserInfo().Id) if currentUserID <= 0 { ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, "无效用户信息")) return } currentUser, err := h.readDB.Users.WithContext(ctx.RequestContext()). Where(h.readDB.Users.ID.Eq(currentUserID)). First() if err != nil { ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ServerError, validation.Error(err))) return } bgCtx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) defer cancel() result, err := h.douyin.SyncUserOrders(bgCtx, currentUserID) if err != nil { ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ServerError, validation.Error(err))) return } ctx.Payload(syncMyDouyinOrdersResponse{ Message: "抖音订单同步成功", DouyinUserID: currentUser.DouyinUserID, TotalFetched: result.TotalFetched, NewOrders: result.NewOrders, MatchedUsers: result.MatchedUsers, ElapsedMS: result.ElapsedMS, }) } }