Generic events search in API

This commit is contained in:
Kirill Fedoseev 2022-05-29 19:12:21 +04:00
parent 5fbb5ea7c8
commit a5d142ed2a
4 changed files with 79 additions and 9 deletions

View File

@ -22,8 +22,8 @@ linters-settings:
- default
- prefix(github.com/poanetwork/tokenbridge-monitor)
funlen:
lines: 130
statements: 60
lines: 60
statements: 40
varnamelen:
ignore-names:
- db
@ -49,6 +49,10 @@ issues:
- append only allowed to cuddle with appended value
- for statement without condition should never be cuddled
exclude-rules:
- linters:
- path: cmd
linters:
- cyclop
path: cmd
- funlen
- path: '(.+)_test\.go'
linters:
- funlen

View File

@ -15,7 +15,7 @@ type AlertManager struct {
jobs map[string]*Job
}
//nolint:cyclop
//nolint:cyclop,funlen
func NewAlertManager(logger logging.Logger, db *db.DB, cfg *config.BridgeConfig) (*AlertManager, error) {
provider := NewDBAlertsProvider(db)
jobs := make(map[string]*Job, len(cfg.Alerts))

View File

@ -2,6 +2,7 @@ package middleware
import (
"context"
"errors"
"fmt"
"net/http"
"strconv"
@ -18,11 +19,14 @@ type ctxKey int
const (
bridgeCfgCtxKey ctxKey = iota
chainCfgCtxKey
blockNumberCtxKey
fromBlockNumberCtxKey
toBlockNumberCtxKey
txHashCtxKey
filterCtxKey
)
var ErrInvalidBlockNumber = errors.New("invalid block number parameter")
type FilterContext struct {
ChainID *string
FromBlock *uint
@ -59,6 +63,14 @@ func GetChainConfigMiddleware(cfg *config.Config) func(http.Handler) http.Handle
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
chainID := chi.URLParam(r, "chainID")
if chainID == "" {
chainID = r.URL.Query().Get("chainId")
if chainID == "" {
next.ServeHTTP(w, r)
return
}
}
var chainCfg *config.ChainConfig
for _, c := range cfg.Chains {
if c.ChainID == chainID {
@ -79,13 +91,49 @@ func GetChainConfigMiddleware(cfg *config.Config) func(http.Handler) http.Handle
func GetBlockNumberMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
blockNumber, err := strconv.ParseUint(chi.URLParam(r, "blockNumber"), 10, 32)
blockNumberStr := chi.URLParam(r, "blockNumber")
query := r.URL.Query()
if blockNumberStr == "" {
blockNumberStr = query.Get("blockNumber")
}
var fromBlockStr, toBlockStr string
if blockNumberStr == "" {
fromBlockStr = query.Get("fromBlock")
toBlockStr = query.Get("toBlock")
if fromBlockStr == "" || toBlockStr == "" {
next.ServeHTTP(w, r)
return
}
} else {
fromBlockStr = blockNumberStr
toBlockStr = blockNumberStr
}
fromBlock, err := strconv.ParseUint(fromBlockStr, 10, 32)
if err != nil {
render.Error(w, r, fmt.Errorf("failed to parse blockNumber: %w", err))
return
}
toBlock, err := strconv.ParseUint(toBlockStr, 10, 32)
if err != nil {
render.Error(w, r, fmt.Errorf("failed to parse blockNumber: %w", err))
return
}
ctx := context.WithValue(r.Context(), blockNumberCtxKey, uint(blockNumber))
if fromBlock > toBlock {
render.Error(w, r, fmt.Errorf("fromBlock should be less than toBlock: %w", ErrInvalidBlockNumber))
return
}
if toBlock-fromBlock > 10000 {
render.Error(w, r, fmt.Errorf("cannot request more than 10000 blocks in range: %w", ErrInvalidBlockNumber))
return
}
ctx := r.Context()
ctx = context.WithValue(ctx, fromBlockNumberCtxKey, uint(fromBlock))
ctx = context.WithValue(ctx, toBlockNumberCtxKey, uint(toBlock))
next.ServeHTTP(w, r.WithContext(ctx))
})
}
@ -94,6 +142,14 @@ func GetTxHashMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
txHash := chi.URLParam(r, "txHash")
if txHash == "" {
txHash = r.URL.Query().Get("txHash")
if txHash == "" {
next.ServeHTTP(w, r)
return
}
}
ctx := context.WithValue(r.Context(), txHashCtxKey, common.HexToHash(txHash))
next.ServeHTTP(w, r.WithContext(ctx))
})
@ -108,8 +164,10 @@ func GetFilterMiddleware(next http.Handler) http.Handler {
if cfg, ok := ctx.Value(chainCfgCtxKey).(*config.ChainConfig); ok {
filter.ChainID = &cfg.ChainID
}
if blockNumber, ok := ctx.Value(blockNumberCtxKey).(uint); ok {
if blockNumber, ok := ctx.Value(fromBlockNumberCtxKey).(uint); ok {
filter.FromBlock = &blockNumber
}
if blockNumber, ok := ctx.Value(toBlockNumberCtxKey).(uint); ok {
filter.ToBlock = &blockNumber
}
if txHash, ok := ctx.Value(txHashCtxKey).(common.Hash); ok {

View File

@ -76,6 +76,14 @@ func (p *Presenter) Serve(addr string) error {
r.Use(middleware.GetTxHashMiddleware)
r.Group(registerSearchRoutes)
})
p.root.Group(func(r chi.Router) {
r.Use(middleware.GetChainConfigMiddleware(p.cfg))
r.Use(middleware.GetBlockNumberMiddleware)
r.Use(middleware.GetTxHashMiddleware)
r.Use(middleware.GetFilterMiddleware)
r.Get("/logs", p.GetLogs)
r.Get("/messages", p.GetMessages)
})
return http.ListenAndServe(addr, p.root)
}