OSDN Git Service

Hulk did something
[bytom/vapor.git] / api / txfeeds.go
diff --git a/api/txfeeds.go b/api/txfeeds.go
new file mode 100644 (file)
index 0000000..885fb52
--- /dev/null
@@ -0,0 +1,107 @@
+package api
+
+import (
+       "context"
+       "encoding/json"
+
+       log "github.com/sirupsen/logrus"
+
+       "github.com/vapor/blockchain/txfeed"
+       "github.com/vapor/errors"
+)
+
+// POST /create-txfeed
+func (a *API) createTxFeed(ctx context.Context, in struct {
+       Alias  string `json:"alias"`
+       Filter string `json:"filter"`
+}) Response {
+       if err := a.txFeedTracker.Create(ctx, in.Alias, in.Filter); err != nil {
+               log.WithFields(log.Fields{"module": logModule, "error": err}).Error("Add TxFeed Failed")
+               return NewErrorResponse(err)
+       }
+       return NewSuccessResponse(nil)
+}
+
+// POST /get-transaction-feed
+func (a *API) getTxFeed(ctx context.Context, in struct {
+       Alias string `json:"alias,omitempty"`
+}) Response {
+       var tmpTxFeed interface{}
+       rawTxfeed, err := a.GetTxFeedByAlias(ctx, in.Alias)
+       if err != nil {
+               return NewErrorResponse(err)
+       }
+       err = json.Unmarshal(rawTxfeed, &tmpTxFeed)
+       if err != nil {
+               return NewErrorResponse(err)
+       }
+       data := map[string]interface{}{"txfeed": tmpTxFeed}
+       return NewSuccessResponse(data)
+}
+
+// POST /delete-transaction-feed
+func (a *API) deleteTxFeed(ctx context.Context, in struct {
+       Alias string `json:"alias,omitempty"`
+}) Response {
+       if err := a.txFeedTracker.Delete(ctx, in.Alias); err != nil {
+               return NewErrorResponse(err)
+       }
+       return NewSuccessResponse(nil)
+}
+
+// POST /update-transaction-feed
+func (a *API) updateTxFeed(ctx context.Context, in struct {
+       Alias  string `json:"alias"`
+       Filter string `json:"filter"`
+}) Response {
+       if err := a.txFeedTracker.Delete(ctx, in.Alias); err != nil {
+               return NewErrorResponse(err)
+       }
+       if err := a.txFeedTracker.Create(ctx, in.Alias, in.Filter); err != nil {
+               log.WithFields(log.Fields{"module": logModule, "error": err}).Error("Update TxFeed Failed")
+               return NewErrorResponse(err)
+       }
+       return NewSuccessResponse(nil)
+}
+
+func (a *API) getTxFeeds() ([]txfeed.TxFeed, error) {
+       txFeed := txfeed.TxFeed{}
+       txFeeds := make([]txfeed.TxFeed, 0)
+
+       iter := a.txFeedTracker.DB.Iterator()
+       defer iter.Release()
+
+       for iter.Next() {
+               if err := json.Unmarshal(iter.Value(), &txFeed); err != nil {
+                       return nil, err
+               }
+               txFeeds = append(txFeeds, txFeed)
+       }
+
+       return txFeeds, nil
+}
+
+// listTxFeeds is an http handler for listing txfeeds. It does not take a filter.
+// POST /list-transaction-feeds
+func (a *API) listTxFeeds(ctx context.Context) Response {
+       txFeeds, err := a.getTxFeeds()
+       if err != nil {
+               return NewErrorResponse(err)
+       }
+
+       return NewSuccessResponse(txFeeds)
+}
+
+func (a *API) GetTxFeedByAlias(ctx context.Context, filter string) ([]byte, error) {
+       jf, err := json.Marshal(filter)
+       if err != nil {
+               return nil, err
+       }
+
+       value := a.txFeedTracker.DB.Get(jf)
+       if value == nil {
+               return nil, errors.New("No transaction feed")
+       }
+
+       return value, nil
+}