From a5d142ed2a17375d53a32a43f49e5b9fb7d1939c Mon Sep 17 00:00:00 2001 From: Kirill Fedoseev Date: Sun, 29 May 2022 19:12:21 +0400 Subject: [PATCH] Generic events search in API --- .golangci.yml | 12 ++++-- monitor/alerts/alert_manager.go | 2 +- presenter/http/middleware/filter.go | 66 +++++++++++++++++++++++++++-- presenter/presenter.go | 8 ++++ 4 files changed, 79 insertions(+), 9 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index abdd6e5..d4a8e01 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -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 diff --git a/monitor/alerts/alert_manager.go b/monitor/alerts/alert_manager.go index ccafef8..1a31542 100644 --- a/monitor/alerts/alert_manager.go +++ b/monitor/alerts/alert_manager.go @@ -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)) diff --git a/presenter/http/middleware/filter.go b/presenter/http/middleware/filter.go index d4d39e4..15919b6 100644 --- a/presenter/http/middleware/filter.go +++ b/presenter/http/middleware/filter.go @@ -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 { diff --git a/presenter/presenter.go b/presenter/presenter.go index c7f8075..814fe0e 100644 --- a/presenter/presenter.go +++ b/presenter/presenter.go @@ -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) }