OSDN Git Service

move request handle methods to API struct (#470)
[bytom/bytom-spv.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/txfeed"
10         "github.com/bytom/errors"
11 )
12
13 // POST /create-txfeed
14 func (a *API) createTxFeed(ctx context.Context, in struct {
15         Alias  string `json:"alias"`
16         Filter string `json:"filter"`
17 }) Response {
18         if err := a.bcr.txFeedTracker.Create(ctx, in.Alias, in.Filter); err != nil {
19                 log.WithField("error", err).Error("Add TxFeed Failed")
20                 return NewErrorResponse(err)
21         }
22         return NewSuccessResponse(nil)
23 }
24
25 func (bcr *BlockchainReactor) getTxFeedByAlias(ctx context.Context, filter string) ([]byte, error) {
26         jf, err := json.Marshal(filter)
27         if err != nil {
28                 return nil, err
29         }
30
31         value := bcr.txFeedTracker.DB.Get(jf)
32         if value == nil {
33                 return nil, errors.New("No transaction feed")
34         }
35
36         return value, nil
37 }
38
39 // POST /get-transaction-feed
40 func (a *API) getTxFeed(ctx context.Context, in struct {
41         Alias string `json:"alias,omitempty"`
42 }) Response {
43         var tmpTxFeed interface{}
44         rawTxfeed, err := a.bcr.getTxFeedByAlias(ctx, in.Alias)
45         if err != nil {
46                 return NewErrorResponse(err)
47         }
48         err = json.Unmarshal(rawTxfeed, &tmpTxFeed)
49         if err != nil {
50                 return NewErrorResponse(err)
51         }
52         data := map[string]interface{}{"txfeed": tmpTxFeed}
53         return NewSuccessResponse(data)
54 }
55
56 // POST /delete-transaction-feed
57 func (a *API) deleteTxFeed(ctx context.Context, in struct {
58         Alias string `json:"alias,omitempty"`
59 }) Response {
60         if err := a.bcr.txFeedTracker.Delete(ctx, in.Alias); err != nil {
61                 return NewErrorResponse(err)
62         }
63         return NewSuccessResponse(nil)
64 }
65
66 // POST /update-transaction-feed
67 func (a *API) updateTxFeed(ctx context.Context, in struct {
68         Alias  string `json:"alias"`
69         Filter string `json:"filter"`
70 }) Response {
71         if err := a.bcr.txFeedTracker.Delete(ctx, in.Alias); err != nil {
72                 return NewErrorResponse(err)
73         }
74         if err := a.bcr.txFeedTracker.Create(ctx, in.Alias, in.Filter); err != nil {
75                 log.WithField("error", err).Error("Update TxFeed Failed")
76                 return NewErrorResponse(err)
77         }
78         return NewSuccessResponse(nil)
79 }
80
81 func (a *API) getTxFeeds() ([]txfeed.TxFeed, error) {
82         txFeed := txfeed.TxFeed{}
83         txFeeds := make([]txfeed.TxFeed, 0)
84
85         iter := a.bcr.txFeedTracker.DB.Iterator()
86         defer iter.Release()
87
88         for iter.Next() {
89                 if err := json.Unmarshal(iter.Value(), &txFeed); err != nil {
90                         return nil, err
91                 }
92                 txFeeds = append(txFeeds, txFeed)
93         }
94
95         return txFeeds, nil
96 }
97
98 // listTxFeeds is an http handler for listing txfeeds. It does not take a filter.
99 // POST /list-transaction-feeds
100 func (a *API) listTxFeeds(ctx context.Context) Response {
101         txFeeds, err := a.getTxFeeds()
102         if err != nil {
103                 return NewErrorResponse(err)
104         }
105
106         return NewSuccessResponse(txFeeds)
107 }