package market import ( "f5" "fmt" "main/common" "main/constant" . "main/global" "mt" "net/http" "q5" "strings" "github.com/gin-gonic/gin" ) func (this *MarketApi) LockList(c *gin.Context) { netId := q5.ToInt64(c.Param("net_id")) owner := strings.ToLower(c.Param("owner_address")) reqJson := struct { PageSize interface{} `json:"page_size"` Cursor interface{} `json:"cursor"` Search struct { Name string `json:"name"` } `json:"search"` Filter struct { ItemIds []interface{} `json:"item_ids"` HeroRanks []interface{} `json:"hero_ranks"` } `json:"filter"` Sort struct { Fields [] struct { } `json:"fields"` } `json:"sort"` }{} if err := c.ShouldBindJSON(&reqJson); err != nil { c.JSON(http.StatusOK, gin.H{ "errcode": 1, "errmsg": err.Error(), }) return } pageSize := q5.AdjustRangeValue(q5.SafeToInt32(reqJson.PageSize), 1, 20) cursor := q5.SafeToInt64(reqJson.Cursor) sql := fmt.Sprintf(` SELECT * FROM t_nft WHERE idx > %d AND net_id = %d AND last_owner_address = ? AND owner_address != ? AND last_owner_address = last_lock_address`, cursor, netId) params := []string{owner,owner} subFilters := []f5.DbQueryFilter{} { itemIds := map[int32]int32{} if reqJson.Search.Name != "" { mt.Table.Item.Search(reqJson.Search.Name, itemIds) } for _, val := range(reqJson.Filter.ItemIds) { itemId := q5.SafeToInt32(val) itemIds[itemId] = 1 } if len(itemIds) > 0 { inSub := `item_id IN (` i := 0 for key, _ := range(itemIds) { if i == 0 { inSub += q5.ToString(key) } else { inSub += "," + q5.ToString(key) } i += 1 } inSub += ")" q5.AppendSlice(&subFilters, f5.GetDbFilter().Custom(inSub).And()) } } { heroRanks := map[int32]int32{} for _, val := range(reqJson.Filter.HeroRanks) { rank := q5.SafeToInt32(val) heroRanks[rank] = 1 } if len(heroRanks) > 0 { inSub := `quality IN (` i := 0 for key, _ := range(heroRanks) { if i == 0 { inSub += q5.ToString(key) } else { inSub += "," + q5.ToString(key) } i += 1 } inSub += ")" q5.AppendSlice(&subFilters, f5.GetDbFilter().Custom(inSub).And()) } } rspObj := struct { ErrCode int32 `json:"errcode"` ErrMsg string `json:"errmsg"` Page common.StreamPagination `json:"page"` Rows []struct{ Event interface{} `json:"event"` Nft interface{} `json:"nft"` } `json:"rows"` }{} q5.NewSlice(&rspObj.Rows, 0, 10) nfts := []*common.NftDto{} orderBy := " ORDER BY last_lock_time DESC " f5.GetGoStyleDb().StreamPageQuery( constant.BCNFT_DB, pageSize, cursor, sql, params, f5.GetDbFilter().Comp(subFilters...), orderBy, func (err error, pagination *f5.StreamPagination) { rspObj.Page.FillPage(pagination) }, func (ds *f5.DataSet) { p := new(common.NftDto) p.NetId = q5.ToInt32(ds.GetByName("net_id")) p.ContractAddress = ds.GetByName("contract_address") p.TokenId = ds.GetByName("token_id") p.Payload = map[string]interface{}{} p.LockTime = q5.ToInt32(ds.GetByName("last_lock_time")) q5.AppendSlice(&nfts, p) }) GetCacheMgr().GetNfts(nfts) { for _, val := range nfts { p := q5.NewSliceElement(&rspObj.Rows) p.Event = val.Payload jsonData := val.NftCache.GetJsonData() if jsonData != nil { if v, ok := jsonData.(map[string]interface{}); ok { v := q5.MapClone(v) v["last_lock_time"] = val.LockTime jsonData = v } } p.Nft = jsonData } } c.JSON(200, rspObj) }