OSDN Git Service

feat(federation): add address and timestamp (#223)
[bytom/vapor.git] / federation / database / orm / cross_transaction.go
index 5f6ae9e..5da3f51 100644 (file)
@@ -1,21 +1,75 @@
 package orm
 
 import (
+       "database/sql"
+       "encoding/json"
+
+       "github.com/vapor/errors"
+       "github.com/vapor/federation/common"
        "github.com/vapor/federation/types"
 )
 
 type CrossTransaction struct {
-       ID             uint64 `gorm:"primary_key"`
-       ChainID        uint64
-       BlockHeight    uint64
-       BlockHash      string
-       TxIndex        uint64
-       MuxID          string
-       TxHash         string
-       RawTransaction string
-       Status         uint8
-       CreatedAt      types.Timestamp
-       UpdatedAt      types.Timestamp
+       ID                   uint64 `gorm:"primary_key"`
+       ChainID              uint64
+       SourceBlockHeight    uint64
+       SourceBlockTimestamp uint64
+       SourceBlockHash      string
+       SourceTxIndex        uint64
+       SourceMuxID          string
+       SourceTxHash         string
+       SourceRawTransaction string
+       DestBlockHeight      sql.NullInt64  `sql:"default:null"`
+       DestBlockTimestamp   sql.NullInt64  `sql:"default:null"`
+       DestBlockHash        sql.NullString `sql:"default:null"`
+       DestTxIndex          sql.NullInt64  `sql:"default:null"`
+       DestTxHash           sql.NullString `sql:"default:null"`
+       Status               uint8
+       CreatedAt            types.Timestamp
+       UpdatedAt            types.Timestamp
 
        Chain *Chain `gorm:"foreignkey:ChainID"`
+       Reqs  []*CrossTransactionReq
+}
+
+func (c *CrossTransaction) MarshalJSON() ([]byte, error) {
+       var status string
+       switch c.Status {
+       case common.CrossTxPendingStatus:
+               status = common.CrossTxPendingStatusLabel
+       case common.CrossTxCompletedStatus:
+               status = common.CrossTxCompletedStatusLabel
+       default:
+               return nil, errors.New("unknown cross-chain tx status")
+       }
+
+       return json.Marshal(&struct {
+               SourceChainName      string                 `json:"source_chain_name"`
+               SourceBlockHeight    uint64                 `json:"source_block_height"`
+               SourceBlockTimestamp uint64                 `json:"source_block_timestamp"`
+               SourceBlockHash      string                 `json:"source_block_hash"`
+               SourceTxIndex        uint64                 `json:"source_tx_index"`
+               SourceTxHash         string                 `json:"source_tx_hash"`
+               DestBlockHeight      uint64                 `json:"dest_block_height"`
+               DestBlockTimestamp   uint64                 `json:"dest_block_timestamp"`
+               DestBlockHash        string                 `json:"dest_block_hash"`
+               DestTxIndex          uint64                 `json:"dest_tx_index"`
+               DestTxHash           string                 `json:"dest_tx_hash"`
+               Status               string                 `json:"status"`
+               Reqs                 []*CrossTransactionReq `json:"crosschain_requests"`
+       }{
+               SourceChainName:      c.Chain.Name,
+               SourceBlockHeight:    c.SourceBlockHeight,
+               SourceBlockTimestamp: c.SourceBlockTimestamp,
+               SourceBlockHash:      c.SourceBlockHash,
+               SourceTxIndex:        c.SourceTxIndex,
+               SourceTxHash:         c.SourceTxHash,
+               DestBlockHeight:      uint64(c.DestBlockHeight.Int64),
+               DestBlockTimestamp:   uint64(c.DestBlockTimestamp.Int64),
+               DestBlockHash:        c.DestBlockHash.String,
+               DestTxIndex:          uint64(c.DestTxIndex.Int64),
+               DestTxHash:           c.DestTxHash.String,
+               Status:               status,
+               Reqs:                 c.Reqs,
+       })
 }