Skip to content

Commit

Permalink
Add /v2/rewards/:smesherId/:layer endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
kacpersaw committed May 28, 2024
1 parent f1ac2aa commit 2c60f7a
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 0 deletions.
19 changes: 19 additions & 0 deletions internal/api/handler/rewards.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/spacemeshos/explorer-backend/internal/service"
"go.mongodb.org/mongo-driver/bson"
"net/http"
"strconv"

"github.com/spacemeshos/explorer-backend/model"
)
Expand Down Expand Up @@ -38,6 +39,24 @@ func Reward(c echo.Context) error {
return c.JSON(http.StatusOK, DataResponse{Data: []*model.Reward{reward}})
}

func RewardV2(c echo.Context) error {
cc := c.(*ApiContext)
layer := c.Param("layer")
layerId, err := strconv.Atoi(layer)
if err != nil {
return c.NoContent(http.StatusBadRequest)
}
reward, err := cc.Service.GetRewardV2(context.TODO(), c.Param("smesherId"), uint32(layerId))
if err != nil {
if err == service.ErrNotFound {
return echo.ErrNotFound
}
return fmt.Errorf("failed to get reward `%s` info: %w", c.Param("id"), err)
}

return c.JSON(http.StatusOK, DataResponse{Data: []*model.Reward{reward}})
}

func TotalRewards(c echo.Context) error {
cc := c.(*ApiContext)

Expand Down
1 change: 1 addition & 0 deletions internal/api/router/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ func Init(e *echo.Echo) {
e.GET("/rewards", handler.Rewards)
e.GET("/rewards/total", handler.TotalRewards)
e.GET("/rewards/:id", handler.Reward)
e.GET("/v2/rewards/:smesherId/:layer", handler.RewardV2)

e.GET("/accounts", handler.Accounts)
e.GET("/accounts/:id", handler.Account)
Expand Down
11 changes: 11 additions & 0 deletions internal/service/reward.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,17 @@ func (e *Service) GetReward(ctx context.Context, rewardID string) (*model.Reward
return reward, nil
}

func (e *Service) GetRewardV2(ctx context.Context, smesherID string, layer uint32) (*model.Reward, error) {
reward, err := e.storage.GetRewardV2(ctx, smesherID, layer)
if err != nil {
return nil, fmt.Errorf("error while getting reward: %w", err)
}
if reward == nil {
return nil, ErrNotFound
}
return reward, nil
}

// GetRewards returns rewards by filter.
func (e *Service) GetRewards(ctx context.Context, page, perPage int64) ([]*model.Reward, int64, error) {
return e.getRewards(ctx, &bson.D{}, options.Find().SetSort(bson.D{{Key: "layer", Value: -1}}).SetLimit(perPage).SetSkip((page-1)*perPage))
Expand Down
1 change: 1 addition & 0 deletions internal/storage/storagereader/abstract.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ type StorageReader interface {
CountCoinbaseRewards(ctx context.Context, coinbase string) (total, count int64, err error)
GetRewards(ctx context.Context, query *bson.D, opts ...*options.FindOptions) ([]*model.Reward, error)
GetReward(ctx context.Context, rewardID string) (*model.Reward, error)
GetRewardV2(ctx context.Context, smesherID string, layer uint32) (*model.Reward, error)
GetLatestReward(ctx context.Context, coinbase string) (*model.Reward, error)
GetTotalRewards(ctx context.Context, filter *bson.D) (total, count int64, err error)

Expand Down
15 changes: 15 additions & 0 deletions internal/storage/storagereader/rewards.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,21 @@ func (s *Reader) GetReward(ctx context.Context, rewardID string) (*model.Reward,
return reward, nil
}

func (s *Reader) GetRewardV2(ctx context.Context, smesherID string, layer uint32) (*model.Reward, error) {
cursor, err := s.db.Collection("rewards").Find(ctx, &bson.D{{Key: "smesher", Value: smesherID}, {Key: "layer", Value: layer}})
if err != nil {
return nil, fmt.Errorf("error while getting reward by smesher `%s` and layer `%d`: %w", smesherID, layer, err)
}
if !cursor.Next(ctx) {
return nil, nil
}
var reward *model.Reward
if err = cursor.Decode(&reward); err != nil {
return nil, fmt.Errorf("error while decoding reward smesher `%s` layer `%d`: %w", smesherID, layer, err)
}
return reward, nil
}

// CountCoinbaseRewards returns the number of rewards for given coinbase address.
func (s *Reader) CountCoinbaseRewards(ctx context.Context, coinbase string) (total, count int64, err error) {
matchStage := bson.D{{Key: "$match", Value: bson.D{{Key: "coinbase", Value: coinbase}}}}
Expand Down
1 change: 1 addition & 0 deletions model/reward.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ type Reward struct {

type RewardService interface {
GetReward(ctx context.Context, rewardID string) (*Reward, error)
GetRewardV2(ctx context.Context, smesherID string, layer uint32) (*Reward, error)
GetRewards(ctx context.Context, page, perPage int64) ([]*Reward, int64, error)
GetTotalRewards(ctx context.Context, filter *bson.D) (int64, int64, error)
}
Expand Down

0 comments on commit 2c60f7a

Please sign in to comment.