2023-04-12 11:51:33 -07:00
|
|
|
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)
|
2023-04-12 11:51:33 -07:00
|
|
|
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)
|
|
|
|
}
|