OSDN Git Service

Dev (#148)
[bytom/bytom.git] / blockchain / txfeeds.go
1 package blockchain
2
3 import (
4         "context"
5         "encoding/json"
6
7         log "github.com/sirupsen/logrus"
8
9         "github.com/bytom/blockchain/query"
10         "github.com/bytom/blockchain/txfeed"
11 )
12
13 // POST /create-txfeed
14 func (bcr *BlockchainReactor) createTxFeed(ctx context.Context, in struct {
15         Alias  string
16         Filter string
17 }) interface{} {
18         if err := bcr.txFeedTracker.Create(ctx, in.Alias, in.Filter); err != nil {
19                 log.WithField("error", err).Error("Add TxFeed Failed")
20                 return jsendWrapper(nil, ERROR, err.Error())
21         }
22         return jsendWrapper("success", SUCCESS, "")
23 }
24
25 func (bcr *BlockchainReactor) getTxFeedByAlias(ctx context.Context, filter string) (*txfeed.TxFeed, error) {
26         txFeed := &txfeed.TxFeed{}
27
28         jf, err := json.Marshal(filter)
29         if err != nil {
30                 return nil, err
31         }
32
33         value := bcr.txFeedTracker.DB.Get(jf)
34         if value == nil {
35                 return nil, nil
36         }
37
38         if err := json.Unmarshal(value, txFeed); err != nil {
39                 return nil, err
40         }
41         return txFeed, nil
42 }
43
44 // POST /get-transaction-feed
45 func (bcr *BlockchainReactor) getTxFeed(ctx context.Context, in struct {
46         Alias string `json:"alias,omitempty"`
47 }) interface{} {
48         txfeed, err := bcr.getTxFeedByAlias(ctx, in.Alias)
49         if err != nil {
50                 return jsendWrapper(nil, ERROR, err.Error())
51         }
52         return jsendWrapper(txfeed, SUCCESS, "")
53 }
54
55 // POST /delete-transaction-feed
56 func (bcr *BlockchainReactor) deleteTxFeed(ctx context.Context, in struct {
57         Alias string `json:"alias,omitempty"`
58 }) interface{} {
59         if err := bcr.txFeedTracker.Delete(ctx, in.Alias); err != nil {
60                 return jsendWrapper(nil, ERROR, err.Error())
61         }
62         return jsendWrapper("success", SUCCESS, "")
63 }
64
65 // POST /update-transaction-feed
66 func (bcr *BlockchainReactor) updateTxFeed(ctx context.Context, in struct {
67         Alias  string
68         Filter string
69 }) interface{} {
70         if err := bcr.txFeedTracker.Delete(ctx, in.Alias); err != nil {
71                 return jsendWrapper(nil, ERROR, err.Error())
72         }
73         if err := bcr.txFeedTracker.Create(ctx, in.Alias, in.Filter); err != nil {
74                 log.WithField("error", err).Error("Update TxFeed Failed")
75                 return jsendWrapper(nil, ERROR, err.Error())
76         }
77         return jsendWrapper("success", SUCCESS, "")
78 }
79
80 // txAfterIsBefore returns true if a is before b. It returns an error if either
81 // a or b are not valid query.TxAfters.
82 func txAfterIsBefore(a, b string) (bool, error) {
83         aAfter, err := query.DecodeTxAfter(a)
84         if err != nil {
85                 return false, err
86         }
87
88         bAfter, err := query.DecodeTxAfter(b)
89         if err != nil {
90                 return false, err
91         }
92
93         return aAfter.FromBlockHeight < bAfter.FromBlockHeight ||
94                 (aAfter.FromBlockHeight == bAfter.FromBlockHeight &&
95                         aAfter.FromPosition < bAfter.FromPosition), nil
96 }
97
98 func (bcr *BlockchainReactor) getTxFeeds() ([]*txfeed.TxFeed, error) {
99         txFeeds := make([]*txfeed.TxFeed, 0)
100         iter := bcr.txFeedTracker.DB.Iterator()
101         defer iter.Release()
102
103         for iter.Next() {
104                 txFeed := &txfeed.TxFeed{}
105                 if err := json.Unmarshal(iter.Value(), txFeed); err != nil {
106                         return nil, err
107                 }
108                 txFeeds = append(txFeeds, txFeed)
109         }
110         return txFeeds, nil
111 }
112
113 // listTxFeeds is an http handler for listing txfeeds. It does not take a filter.
114 // POST /list-transaction-feeds
115 func (bcr *BlockchainReactor) listTxFeeds(ctx context.Context, in requestQuery) interface{} {
116         txfeeds, err := bcr.getTxFeeds()
117         if err != nil {
118                 return jsendWrapper(nil, ERROR, err.Error())
119         }
120         return jsendWrapper(txfeeds, SUCCESS, "")
121 }