Skip to content

Commit

Permalink
Fix: event requests (#141)
Browse files Browse the repository at this point in the history
  • Loading branch information
aopoltorzhicky committed Feb 16, 2024
1 parent e233410 commit bd514bc
Show file tree
Hide file tree
Showing 13 changed files with 178 additions and 53 deletions.
16 changes: 15 additions & 1 deletion cmd/api/handler/block.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,21 @@ func (handler *BlockHandler) GetEvents(c echo.Context) error {
}
req.SetDefault()

events, err := handler.events.ByBlock(c.Request().Context(), req.Height, req.Limit, req.Offset)
blockTime, err := handler.block.Time(c.Request().Context(), req.Height)
if err != nil {
if handler.block.IsNoRows(err) {
return returnArray(c, []any{})
}
return internalServerError(c, err)
}

fltrs := storage.EventFilter{
Limit: req.Limit,
Offset: req.Offset,
Time: blockTime.UTC(),
}

events, err := handler.events.ByBlock(c.Request().Context(), req.Height, fltrs)
if err != nil {
return handleError(c, err, handler.block)
}
Expand Down
10 changes: 8 additions & 2 deletions cmd/api/handler/block_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -304,8 +304,13 @@ func (s *BlockTestSuite) TestGetEvents() {
c.SetParamNames("height")
c.SetParamValues("100")

s.blocks.EXPECT().
Time(gomock.Any(), pkgTypes.Level(100)).
Return(testTime, nil).
Times(1)

s.events.EXPECT().
ByBlock(gomock.Any(), pkgTypes.Level(100), 2, 0).
ByBlock(gomock.Any(), pkgTypes.Level(100), gomock.Any()).
Return([]storage.Event{
{
Id: 1,
Expand All @@ -318,7 +323,8 @@ func (s *BlockTestSuite) TestGetEvents() {
"test": "value",
},
},
}, nil)
}, nil).
Times(1)

s.Require().NoError(s.handler.GetEvents(c))
s.Require().Equal(http.StatusOK, rec.Code)
Expand Down
8 changes: 7 additions & 1 deletion cmd/api/handler/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,13 @@ func (handler *TxHandler) GetEvents(c echo.Context) error {
return handleError(c, err, handler.tx)
}

events, err := handler.events.ByTxId(c.Request().Context(), tx.Id, req.Limit, req.Offset)
fltrs := storage.EventFilter{
Limit: req.Limit,
Offset: req.Offset,
Time: tx.Time.UTC(),
}

events, err := handler.events.ByTxId(c.Request().Context(), tx.Id, fltrs)
if err != nil {
return handleError(c, err, handler.tx)
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/api/handler/tx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,7 @@ func (s *TxTestSuite) TestGetEvents() {
Return(testTx, nil)

s.events.EXPECT().
ByTxId(gomock.Any(), uint64(1), 2, 0).
ByTxId(gomock.Any(), uint64(1), gomock.Any()).
Return([]storage.Event{
{
Id: 1,
Expand Down
1 change: 1 addition & 0 deletions internal/storage/block.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ type IBlock interface {
ByHash(ctx context.Context, hash []byte) (Block, error)
ByProposer(ctx context.Context, proposerId uint64, limit, offset int) ([]Block, error)
ListWithStats(ctx context.Context, limit, offset uint64, order storage.SortOrder) ([]*Block, error)
Time(ctx context.Context, height pkgTypes.Level) (time.Time, error)
}

// Block -
Expand Down
10 changes: 8 additions & 2 deletions internal/storage/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,18 @@ import (

var json = jsoniter.ConfigCompatibleWithStandardLibrary

type EventFilter struct {
Limit int
Offset int
Time time.Time
}

//go:generate mockgen -source=$GOFILE -destination=mock/$GOFILE -package=mock -typed
type IEvent interface {
storage.Table[*Event]

ByTxId(ctx context.Context, txId uint64, limit, offset int) ([]Event, error)
ByBlock(ctx context.Context, height pkgTypes.Level, limit, offset int) ([]Event, error)
ByTxId(ctx context.Context, txId uint64, fltrs EventFilter) ([]Event, error)
ByBlock(ctx context.Context, height pkgTypes.Level, fltrs EventFilter) ([]Event, error)
}

// Event -
Expand Down
40 changes: 40 additions & 0 deletions internal/storage/mock/block.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 12 additions & 12 deletions internal/storage/mock/event.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions internal/storage/postgres/block.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ package postgres

import (
"context"
"time"

"github.com/celenium-io/celestia-indexer/internal/storage"
storageTypes "github.com/celenium-io/celestia-indexer/internal/storage/types"
"github.com/celenium-io/celestia-indexer/pkg/types"
pkgTypes "github.com/celenium-io/celestia-indexer/pkg/types"
"github.com/dipdup-net/go-lib/database"
sdk "github.com/dipdup-net/indexer-sdk/pkg/storage"
"github.com/dipdup-net/indexer-sdk/pkg/storage/postgres"
Expand Down Expand Up @@ -243,3 +245,11 @@ func (b *Blocks) ByProposer(ctx context.Context, proposerId uint64, limit, offse
err = query.Scan(ctx)
return
}

func (b *Blocks) Time(ctx context.Context, height pkgTypes.Level) (response time.Time, err error) {
err = b.DB().NewSelect().Model((*storage.Block)(nil)).
Column("time").
Where("height = ?", height).
Scan(ctx, &response)
return
}
12 changes: 12 additions & 0 deletions internal/storage/postgres/block_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,3 +222,15 @@ func (s *StorageTestSuite) TestBlockByProposer() {
s.Require().EqualValues(11000, block.Stats.BlockTime)
s.Require().EqualValues(4, block.Stats.BlobsCount)
}

func (s *StorageTestSuite) TestBlockTime() {
ctx, ctxCancel := context.WithTimeout(context.Background(), 5*time.Second)
defer ctxCancel()

expected, err := time.Parse(time.RFC3339, "2023-07-04T03:10:57Z")
s.Require().NoError(err)

blockTime, err := s.storage.Blocks.Time(ctx, 1000)
s.Require().NoError(err)
s.Require().Equal(expected.UTC(), blockTime.UTC())
}
30 changes: 22 additions & 8 deletions internal/storage/postgres/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ package postgres

import (
"context"
"time"

pkgTypes "github.com/celenium-io/celestia-indexer/pkg/types"

"github.com/celenium-io/celestia-indexer/internal/storage"
"github.com/dipdup-net/go-lib/database"
sdk "github.com/dipdup-net/indexer-sdk/pkg/storage"
"github.com/dipdup-net/indexer-sdk/pkg/storage/postgres"
)

Expand All @@ -26,29 +28,41 @@ func NewEvent(db *database.Bun) *Event {
}

// ByTxId -
func (e *Event) ByTxId(ctx context.Context, txId uint64, limit, offset int) (events []storage.Event, err error) {
func (e *Event) ByTxId(ctx context.Context, txId uint64, fltrs storage.EventFilter) (events []storage.Event, err error) {
query := e.DB().NewSelect().Model(&events).
Where("tx_id = ?", txId)
query = limitScope(query, limit)
query = limitScope(query, fltrs.Limit)
query = sortScope(query, "id", sdk.SortOrderAsc)

if offset > 0 {
query = query.Offset(offset)
if fltrs.Offset > 0 {
query = query.Offset(fltrs.Offset)
}
if !fltrs.Time.IsZero() {
query = query.
Where("time >= ?", fltrs.Time).
Where("time < ?", fltrs.Time.Add(time.Second))
}

err = query.Scan(ctx)
return
}

// ByBlock -
func (e *Event) ByBlock(ctx context.Context, height pkgTypes.Level, limit, offset int) (events []storage.Event, err error) {
func (e *Event) ByBlock(ctx context.Context, height pkgTypes.Level, fltrs storage.EventFilter) (events []storage.Event, err error) {
query := e.DB().NewSelect().Model(&events).
Where("height = ?", height).
Where("tx_id IS NULL")

query = limitScope(query, limit)
query = limitScope(query, fltrs.Limit)
query = sortScope(query, "id", sdk.SortOrderAsc)

if offset > 0 {
query = query.Offset(offset)
if fltrs.Offset > 0 {
query = query.Offset(fltrs.Offset)
}
if !fltrs.Time.IsZero() {
query = query.
Where("time >= ?", fltrs.Time).
Where("time < ?", fltrs.Time.Add(time.Second))
}
err = query.Scan(ctx)
return
Expand Down
42 changes: 42 additions & 0 deletions internal/storage/postgres/event_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// SPDX-FileCopyrightText: 2024 PK Lab AG <[email protected]>
// SPDX-License-Identifier: MIT

package postgres

import (
"context"
"time"

"github.com/celenium-io/celestia-indexer/internal/storage"
"github.com/celenium-io/celestia-indexer/internal/storage/types"
)

func (s *StorageTestSuite) TestEventByTxId() {
ctx, ctxCancel := context.WithTimeout(context.Background(), 5*time.Second)
defer ctxCancel()

events, err := s.storage.Event.ByTxId(ctx, 1, storage.EventFilter{
Limit: 10,
})
s.Require().NoError(err)
s.Require().Len(events, 1)
s.Require().EqualValues(2, events[0].Id)
s.Require().EqualValues(1000, events[0].Height)
s.Require().EqualValues(1, events[0].Position)
s.Require().Equal(types.EventTypeMint, events[0].Type)
}

func (s *StorageTestSuite) TestEventByBlock() {
ctx, ctxCancel := context.WithTimeout(context.Background(), 5*time.Second)
defer ctxCancel()

events, err := s.storage.Event.ByBlock(ctx, 1000, storage.EventFilter{
Limit: 2,
})
s.Require().NoError(err)
s.Require().Len(events, 1)
s.Require().EqualValues(1, events[0].Id)
s.Require().EqualValues(1000, events[0].Height)
s.Require().EqualValues(0, events[0].Position)
s.Require().Equal(types.EventTypeBurn, events[0].Type)
}
Loading

0 comments on commit bd514bc

Please sign in to comment.