wormhole-explorer/api/routes/wormscan/address/controller.go

61 lines
1.5 KiB
Go
Raw Normal View History

package address
import (
"github.com/gofiber/fiber/v2"
"github.com/wormhole-foundation/wormhole-explorer/api/handlers/address"
"github.com/wormhole-foundation/wormhole-explorer/api/internal/errors"
"github.com/wormhole-foundation/wormhole-explorer/api/middleware" // required by swaggo
_ "github.com/wormhole-foundation/wormhole-explorer/api/response" // required by swaggo
"go.uber.org/zap"
)
type Controller struct {
srv *address.Service
logger *zap.Logger
}
func NewController(srv *address.Service, logger *zap.Logger) *Controller {
c := Controller{
srv: srv,
logger: logger.With(zap.String("module", "AddressController")),
}
return &c
}
// FindById godoc
// @Description Lookup an address
// @Tags Wormscan
// @ID find-address-by-id
// @Param address path string true "address"
// @Param page query integer false "Page number. Starts at 0."
// @Param pageSize query integer false "Number of elements per page."
// @Success 200 {object} response.Response[address.AddressOverview]
// @Failure 400
// @Failure 404
// @Failure 500
// @Router /api/v1/address/{address} [get]
func (c *Controller) FindById(ctx *fiber.Ctx) error {
Add endpoint `GET /api/v1/transactions` (#388) ### Summary Tracking issue: https://github.com/wormhole-foundation/wormhole-explorer/issues/385 This pull request implements a new endpoint, `GET /api/v1/transactions`, which will be consumed by the wormhole explorer UI. The endpoint returns a paginated list of transactions, in which each element contains a brief overview of the transaction (ID, txHash, status, etc.). It exposes offset-based pagination via the parameters `page` and `pageSize`. Also, results can be obtained for a specific address by using the `address` query parameter. The response model looks like this: ```json { "transactions": [ { "id": "1/5ec18c34b47c63d17ab43b07b9b2319ea5ee2d163bce2e467000174e238c8e7f/12965", "timestamp": "2023-06-08T19:30:19Z", "txHash": "a302c4ab2d6b9a6003951d2e91f8fdbb83cfa20f6ffb588b95ef0290aab37066", "originChain": 1, "status": "ongoing" }, { "id": "22/0000000000000000000000000000000000000000000000000000000000000001/18308", "timestamp": "2023-06-08T19:17:14Z", "txHash": "00000000000000000000000000000000000000000000000000000000000047e7", "originChain": 22, "destinationAddress": "0x00000000000000000000000067e8a40816a983fbe3294aaebd0cc2391815b86b", "destinationChain": 5, "tokenAmount": "0.12", "usdAmount": "0.12012", "symbol": "USDC", "status": "completed" }, ... ] } ``` ### Limitations of the current implementation 1. Doesn't return the total number of results (this may result in a performance issue when we filter by address) 2. Can only filter by receiver address (we don't have sender information in the database yet)
2023-06-12 07:43:48 -07:00
address, err := middleware.ExtractAddressFromPath(ctx, c.logger)
if err != nil {
return err
}
pagination, err := middleware.ExtractPagination(ctx)
if err != nil {
return err
}
response, err := c.srv.GetAddressOverview(ctx.Context(), address, pagination)
if err != nil {
return err
}
if len(response.Data.Vaas) == 0 {
return errors.ErrNotFound
}
return ctx.JSON(response)
}