api.go 1.2 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
	"github.com/go-chi/chi/v5/middleware"
14 15
)

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

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

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

27 28
	r.Use(middleware.Heartbeat("/healthz"))

29 30
	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
31
	return &Api{log: logger, Router: r}
32 33
}

Hamdi Allam's avatar
Hamdi Allam committed
34
func (a *Api) Listen(ctx context.Context, port int) error {
Hamdi Allam's avatar
Hamdi Allam committed
35
	a.log.Info("api server listening...", "port", port)
Hamdi Allam's avatar
Hamdi Allam committed
36 37 38
	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
39
		a.log.Error("api server stopped", "err", err)
Hamdi Allam's avatar
Hamdi Allam committed
40
	} else {
Hamdi Allam's avatar
Hamdi Allam committed
41
		a.log.Info("api server stopped")
Hamdi Allam's avatar
Hamdi Allam committed
42 43 44
	}

	return err
45
}