OSDN Git Service

f4a25155839524540b38da0860d05befb7467264
[bytom/vapor.git] / federation / api / handler.go
1 package api
2
3 import (
4         "database/sql"
5         "fmt"
6
7         "github.com/gin-gonic/gin"
8
9         "github.com/vapor/errors"
10         "github.com/vapor/federation/common"
11         "github.com/vapor/federation/database/orm"
12 )
13
14 type listCrosschainTxsReq struct{ Display }
15
16 func (s *Server) ListCrosschainTxs(c *gin.Context, listTxsReq *listCrosschainTxsReq, query *PaginationQuery) ([]*orm.CrossTransaction, error) {
17         var ormTxs []*orm.CrossTransaction
18         txFilter := &orm.CrossTransaction{}
19         if listPending, err := listTxsReq.GetFilterBoolean("list_pending"); err == nil && listPending {
20                 txFilter.Status = common.CrossTxPendingStatus
21         }
22         if listCompleted, err := listTxsReq.GetFilterBoolean("list_completed"); err == nil && listCompleted {
23                 txFilter.Status = common.CrossTxCompletedStatus
24         }
25         if txHash, err := listTxsReq.GetFilterString("source_tx_hash"); err == nil && txHash != "" {
26                 txFilter.SourceTxHash = txHash
27         }
28         if txHash, err := listTxsReq.GetFilterString("dest_tx_hash"); err == nil && txHash != "" {
29                 txFilter.DestTxHash = sql.NullString{txHash, true}
30         }
31         txQuery := s.db.Preload("Chain").Preload("Reqs").Preload("Reqs.Asset").Where(txFilter)
32         if onlyFromMainchain, err := listTxsReq.GetFilterBoolean("only_from_mainchain"); err == nil && onlyFromMainchain {
33                 txQuery = txQuery.Joins("join chains on chains.id = cross_transactions.chain_id").Where("chains.name = ?", common.MainchainName)
34         }
35         if onlyFromSidechain, err := listTxsReq.GetFilterBoolean("only_from_sidechain"); err == nil && onlyFromSidechain {
36                 txQuery = txQuery.Joins("join chains on chains.id = cross_transactions.chain_id").Where("chains.name = ?", common.SidechainName)
37         }
38         txQuery = txQuery.Order(fmt.Sprintf("cross_transactions.source_block_height %s", listTxsReq.Sorter.Order))
39         txQuery = txQuery.Order(fmt.Sprintf("cross_transactions.source_tx_index %s", listTxsReq.Sorter.Order))
40         if err := txQuery.Offset(query.Start).Limit(query.Limit).Find(&ormTxs).Error; err != nil {
41                 return nil, errors.Wrap(err, "query txs")
42         }
43
44         return ormTxs, nil
45 }