api.go 1.16 KB
Newer Older
1 2 3
package api

import (
Hamdi Allam's avatar
Hamdi Allam committed
4
	"context"
5
	"fmt"
Will Cory's avatar
Will Cory committed
6 7
	"net/http"

8
	"github.com/ethereum-optimism/optimism/indexer/api/routes"
Will Cory's avatar
Will Cory committed
9
	"github.com/ethereum-optimism/optimism/indexer/database"
Hamdi Allam's avatar
Hamdi Allam committed
10
	"github.com/ethereum-optimism/optimism/op-service/httputil"
11
	"github.com/ethereum/go-ethereum/log"
12
	"github.com/go-chi/chi/v5"
13 14
)

15
const ethereumAddressRegex = `^0x[a-fA-F0-9]{40}$`
16 17

type Api struct {
Hamdi Allam's avatar
Hamdi Allam committed
18
	log    log.Logger
19
	Router *chi.Mux
20 21
}

Hamdi Allam's avatar
Hamdi Allam committed
22
func NewApi(logger log.Logger, bv database.BridgeTransfersView) *Api {
23
	r := chi.NewRouter()
24
	h := routes.NewRoutes(logger, bv, r)
Hamdi Allam's avatar
Hamdi Allam committed
25

26 27 28
	r.Get("/healthz", h.HealthzHandler)
	r.Get(fmt.Sprintf("/api/v0/deposits/{address:%s}", ethereumAddressRegex), h.L1DepositsHandler)
	r.Get(fmt.Sprintf("/api/v0/withdrawals/{address:%s}", ethereumAddressRegex), h.L2WithdrawalsHandler)
Hamdi Allam's avatar
Hamdi Allam committed
29
	return &Api{log: logger, Router: r}
30 31
}

Hamdi Allam's avatar
Hamdi Allam committed
32
func (a *Api) Listen(ctx context.Context, port int) error {
Hamdi Allam's avatar
Hamdi Allam committed
33
	a.log.Info("api server listening...", "port", port)
Hamdi Allam's avatar
Hamdi Allam committed
34 35 36
	server := http.Server{Addr: fmt.Sprintf(":%d", port), Handler: a.Router}
	err := httputil.ListenAndServeContext(ctx, &server)
	if err != nil {
Hamdi Allam's avatar
Hamdi Allam committed
37
		a.log.Error("api server stopped", "err", err)
Hamdi Allam's avatar
Hamdi Allam committed
38
	} else {
Hamdi Allam's avatar
Hamdi Allam committed
39
		a.log.Info("api server stopped")
Hamdi Allam's avatar
Hamdi Allam committed
40 41 42
	}

	return err
43
}