diff --git a/server/backtask/go.mod b/server/backtask/go.mod index 36a9225c..53d35228 100644 --- a/server/backtask/go.mod +++ b/server/backtask/go.mod @@ -6,6 +6,8 @@ require q5 v1.0.0 require f5 v1.0.0 +require jccommon v1.0.0 + require mt v1.0.0 require mtb v1.0.0 // indirect @@ -54,6 +56,8 @@ replace q5 => ../../third_party/q5 replace f5 => ../../third_party/f5 +replace jccommon => ../jccommon + replace mt => ./mt replace mtb => ./mtb diff --git a/server/backtask/task/taskMgr.go b/server/backtask/task/taskMgr.go index 1da6bc62..55b7d6e1 100644 --- a/server/backtask/task/taskMgr.go +++ b/server/backtask/task/taskMgr.go @@ -1,14 +1,17 @@ package task type taskMgr struct { - HourlyTaskMgr - DailyTaskMgr + //HourlyTaskMgr + //DailyTaskMgr + webHook } -func (t *taskMgr) Init() { - t.HourlyTaskMgr.Init() +func (this *taskMgr) Init() { + //t.HourlyTaskMgr.Init() //t.DailyTaskMgr.Init() + this.webHook.init() } -func (t *taskMgr) UnInit() { +func (this *taskMgr) UnInit() { + this.webHook.unInit() } diff --git a/server/backtask/task/webhook.go b/server/backtask/task/webhook.go new file mode 100644 index 00000000..0bf8970e --- /dev/null +++ b/server/backtask/task/webhook.go @@ -0,0 +1,207 @@ +package task + +import ( + "q5" + "f5" + "jccommon" + "main/constant" + "time" + "strings" +) + +type webHook struct { + +} + +func (this* webHook) init() { + go this.loadWebHookEvent(jccommon.ORDER_UPDATE_EVENT, this.orderUpdatedCb) + go this.loadWebHookEvent(jccommon.ACTIVITY_SALE_EVENT, this.activitySaleCb) +} + +func (this* webHook) unInit() { + +} + +func (this* webHook) loadWebHookEvent(eventName string, cb func(ds *f5.DataSet) bool) { + var lastSyncIdx = this.getLastIdx(eventName) + for true { + if lastSyncIdx < 0 { + lastSyncIdx = this.getLastIdx(eventName) + if lastSyncIdx >= 0 { + continue + } + } else { + var newLastSyncIdx int64 + f5.GetGoStyleDb().RawQuery( + constant.BCEVENT_DB, + "SELECT * FROM t_webhook_event WHERE idx > ? AND event_name = ? LIMIT 1000", + []string{ + q5.ToString(lastSyncIdx), + eventName, + }, + func (err error, ds *f5.DataSet) { + if err == nil { + for ds.Next() { + idx := q5.ToInt64(ds.GetByName("idx")) + if cb(ds) { + if idx > newLastSyncIdx { + newLastSyncIdx = idx + } + } else { + break + } + } + } + }) + if newLastSyncIdx > lastSyncIdx { + lastSyncIdx = newLastSyncIdx + this.saveLastIdx(eventName, lastSyncIdx) + } + } + time.Sleep(time.Second * 3) + } +} + +func (this* webHook) getLastIdx(eventName string) int64 { + var lastSyncIdx int64 = -1 + f5.GetGoStyleDb().OrmSelectOne( + constant.BCEVENT_DB, + "t_webhook_process_last_idx", + [][]string{ + {"event_name", eventName}, + }, + func (err error, ds *f5.DataSet) { + if err != nil { + return + } + if ds.Next() { + lastSyncIdx = q5.ToInt64(ds.GetByName("last_idx")) + } else { + lastSyncIdx = 0 + } + }) + return lastSyncIdx +} + +func (this* webHook) saveLastIdx(eventName string, lastIdx int64) bool { + var result bool = false + nowTime := f5.GetApp().GetRealSeconds() + f5.GetGoStyleDb().Upsert( + constant.BCEVENT_DB, + "t_webhook_process_last_idx", + [][]string{ + {"event_name", eventName}, + }, + [][]string{ + {"last_idx", q5.ToString(lastIdx)}, + }, + [][]string{ + {"event_name", eventName}, + {"last_idx", q5.ToString(lastIdx)}, + {"createtime", q5.ToString(nowTime)}, + {"modifytime", q5.ToString(nowTime)}, + }, + func (err error, lastInsertId int64, rowsAffected int64) { + result = err == nil + }) + return result +} + +func (this* webHook) orderUpdatedCb(ds *f5.DataSet) bool { + nowTime := f5.GetApp().GetRealSeconds() + rawData := ds.GetByName("raw_data") + p := new(jccommon.OrderUpdatedEvent) + err := q5.DecodeJson(rawData, &p) + netId := 13473 + if err == nil { + updateFields := [][]string{ + {"order_id", p.Data.Id}, + {"chain", p.Chain}, + {"status", p.Data.Status.Name}, + {"start_time", q5.SafeToString(p.Data.StartAt)}, + {"end_time", q5.SafeToString(p.Data.EndAt)}, + {"created_at", q5.SafeToString(p.Data.CreatedAt)}, + {"updated_at", q5.SafeToString(p.Data.UpdatedAt)}, + {"event_id", p.EventId}, + {"event_data", rawData}, + {"modifytime", q5.ToString(nowTime)}, + } + insertFields := [][]string{ + {"order_id", p.Data.Id}, + {"chain", p.Chain}, + {"status", p.Data.Status.Name}, + {"net_id", q5.ToString(netId)}, + {"token_id", p.Data.Sell[0].TokenId}, + {"contract_address", strings.ToLower(p.Data.Sell[0].ContractAddress)}, + {"start_time", q5.SafeToString(p.Data.StartAt)}, + {"end_time", q5.SafeToString(p.Data.EndAt)}, + {"created_at", q5.SafeToString(p.Data.CreatedAt)}, + {"updated_at", q5.SafeToString(p.Data.UpdatedAt)}, + {"event_id", p.EventId}, + {"event_data", rawData}, + {"createtime", q5.ToString(nowTime)}, + {"modifytime", q5.ToString(nowTime)}, + } + f5.GetGoStyleDb().UpsertEx( + constant.BCNFT_DB, + "t_order", + [][]string{ + {"net_id", q5.ToString(netId)}, + {"contract_address", strings.ToLower(p.Data.Sell[0].ContractAddress)}, + {"token_id", p.Data.Sell[0].TokenId}, + }, + updateFields, + insertFields, + func (err error, lastInsertId int64, rowsAffected int64) { + if err != nil { + return + } + }, + func (ds *f5.DataSet) bool { + return p.EventId > ds.GetByName("event_id") + }) + } + return true +} + +func (this* webHook) activitySaleCb(ds *f5.DataSet) bool { + nowTime := f5.GetApp().GetRealSeconds() + rawData := ds.GetByName("raw_data") + p := new(jccommon.ActivitySaleEvent) + err := q5.DecodeJson(rawData, &p) + netId := 13473 + if err == nil { + updateFields := [][]string{ + } + insertFields := [][]string{ + {"order_id", p.Data.Details.OrderId}, + {"chain", p.Chain}, + {"net_id", q5.ToString(netId)}, + {"token_id", p.Data.Details.Asset[0].TokenId}, + {"contract_address", strings.ToLower(p.Data.Details.Asset[0].ContractAddress)}, + {"buyer", p.Data.Details.From}, + {"seller", p.Data.Details.To}, + {"event_id", p.EventId}, + {"event_data", rawData}, + {"createtime", q5.ToString(nowTime)}, + {"modifytime", q5.ToString(nowTime)}, + } + f5.GetGoStyleDb().UpsertEx( + constant.BCNFT_DB, + "t_sale", + [][]string{ + {"order_id", p.Data.Details.OrderId}, + }, + updateFields, + insertFields, + func (err error, lastInsertId int64, rowsAffected int64) { + if err != nil { + return + } + }, + func (ds *f5.DataSet) bool { + return p.EventId > ds.GetByName("event_id") + }) + } + return true +} diff --git a/server/jccommon/constant.go b/server/jccommon/constant.go index ca426211..f8c2e0e1 100644 --- a/server/jccommon/constant.go +++ b/server/jccommon/constant.go @@ -9,3 +9,23 @@ const ( ITEM_TYPE_HERO = 3 ITEM_TYPE_GOLD_BULLION = 31 ) + +const ( + ORDER_STATUS_PENDING = "PENDING" + ORDER_STATUS_ACTIVE = "ACTIVE" + ORDER_STATUS_INACTIVE = "INACTIVE" + ORDER_STATUS_CANCELLED = "CANCELLED" + ORDER_STATUS_FILLED = "FILLED" + ORDER_STATUS_EXPIRED = "EXPIRED" +) + +const ( + ORDER_UPDATE_EVENT = "imtbl_zkevm_order_updated" + TRADE_CREATED_EVENT = "imtbl_zkevm_trade_created" + ACTIVITY_SALE_EVENT = "imtbl_zkevm_activity_sale" +) + +const ( + CONTRACT_NAME_CFHero = "CFHero" + CONTRACT_NAME_GoldBrick = "GoldBrick" +) diff --git a/server/jccommon/types.go b/server/jccommon/types.go new file mode 100644 index 00000000..fb940258 --- /dev/null +++ b/server/jccommon/types.go @@ -0,0 +1,42 @@ +package jccommon + +type ActivitySaleEvent struct { + EventName string `json:"event_name"` + EventId string `json:"event_id"` + Chain string `json:"chain"` + Data struct { + Details struct { + To string `json:"to"` + From string `json:"from"` + OrderId string `json:"order_id"` + Asset [] struct { + TokenId string `json:"token_id"` + ContractType string `json:"contract_type"` + ContractAddress string `json:"contract_address"` + } `json:"asset"` + } `json:"details"` + } `json:"data"` +} + +type OrderUpdatedEvent struct { + EventName string `json:"event_name"` + EventId string `json:"event_id"` + Chain string `json:"chain"` + Data struct { + Id string `json:"id"` + Sell [] struct { + TokenId string `json:"token_id"` + ItemType string `json:"item_type"` + EndAmount string `json:"end_amount"` + StartAmount string `json:"start_amount"` + ContractAddress string `json:"contract_address"` + } `json:"sell"` + Status struct { + Name string `json:"name"` + } `json:"status"` + StartAt interface{} `json:"start_at"` + EndAt interface{} `json:"end_at"` + CreatedAt interface{} `json:"created_at"` + UpdatedAt interface{} `json:"updated_at"` + } `json:"data"` +} diff --git a/server/marketserver/common/types.go b/server/marketserver/common/types.go index 376866f6..c977c2f4 100644 --- a/server/marketserver/common/types.go +++ b/server/marketserver/common/types.go @@ -15,47 +15,6 @@ type NftHomeMeta struct { ExternalLink string `json:"external_link"` } -type ActivitySaleEvent struct { - EventName string `json:"event_name"` - EventId string `json:"event_id"` - Chain string `json:"chain"` - Data struct { - Details struct { - To string `json:"to"` - From string `json:"from"` - OrderId string `json:"order_id"` - Asset [] struct { - TokenId string `json:"token_id"` - ContractType string `json:"contract_type"` - ContractAddress string `json:"contract_address"` - } `json:"asset"` - } `json:"details"` - } `json:"data"` -} - -type OrderUpdatedEvent struct { - EventName string `json:"event_name"` - EventId string `json:"event_id"` - Chain string `json:"chain"` - Data struct { - Id string `json:"id"` - Sell [] struct { - TokenId string `json:"token_id"` - ItemType string `json:"item_type"` - EndAmount string `json:"end_amount"` - StartAmount string `json:"start_amount"` - ContractAddress string `json:"contract_address"` - } `json:"sell"` - Status struct { - Name string `json:"name"` - } `json:"status"` - StartAt interface{} `json:"start_at"` - EndAt interface{} `json:"end_at"` - CreatedAt interface{} `json:"created_at"` - UpdatedAt interface{} `json:"updated_at"` - } `json:"data"` -} - type StreamPagination struct { NextCursor string `json:"next_cursor"` PreviousCursor string `json:"previous_cursor"` diff --git a/server/marketserver/constant/constant.go b/server/marketserver/constant/constant.go index 2aab0e07..e650158a 100644 --- a/server/marketserver/constant/constant.go +++ b/server/marketserver/constant/constant.go @@ -14,26 +14,6 @@ const ( MAX_MODULE_IDX ) -const ( - ORDER_STATUS_PENDING = "PENDING" - ORDER_STATUS_ACTIVE = "ACTIVE" - ORDER_STATUS_INACTIVE = "INACTIVE" - ORDER_STATUS_CANCELLED = "CANCELLED" - ORDER_STATUS_FILLED = "FILLED" - ORDER_STATUS_EXPIRED = "EXPIRED" -) - -const ( - ORDER_UPDATE_EVENT = "imtbl_zkevm_order_updated" - TRADE_CREATED_EVENT = "imtbl_zkevm_trade_created" - ACTIVITY_SALE_EVENT = "imtbl_zkevm_activity_sale" -) - -const ( - CONTRACT_NAME_CFHero = "CFHero" - CONTRACT_NAME_GoldBrick = "GoldBrick" -) - const ( SHOPCART_MAX_GOODS_NUM = 20 )