config.go 1.49 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
package api

import (
	"context"
	"fmt"

	"github.com/ethereum/go-ethereum/log"

	"github.com/ethereum-optimism/optimism/indexer/config"
	"github.com/ethereum-optimism/optimism/indexer/database"
)

// DB represents the abstract DB access the API has.
type DB struct {
	BridgeTransfers database.BridgeTransfersView
	Closer          func() error
}

// DBConfigConnector implements a fully config based DBConnector
type DBConfigConnector struct {
	config.DBConfig
}

func (cfg *DBConfigConnector) OpenDB(ctx context.Context, log log.Logger) (*DB, error) {
25
	db, err := database.NewDB(ctx, log, cfg.DBConfig)
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
	if err != nil {
		return nil, fmt.Errorf("failed to connect to databse: %w", err)
	}
	return &DB{
		BridgeTransfers: db.BridgeTransfers,
		Closer:          db.Close,
	}, nil
}

type TestDBConnector struct {
	BridgeTransfers database.BridgeTransfersView
}

func (tdb *TestDBConnector) OpenDB(ctx context.Context, log log.Logger) (*DB, error) {
	return &DB{
		BridgeTransfers: tdb.BridgeTransfers,
		Closer: func() error {
			log.Info("API service closed test DB view")
			return nil
		},
	}, nil
}

// DBConnector is an interface: the config may provide different ways to access the DB.
// This is implemented in tests to provide custom DB views, or share the DB with other services.
type DBConnector interface {
	OpenDB(ctx context.Context, log log.Logger) (*DB, error)
}

// Config for the API service
type Config struct {
	DB            DBConnector
	HTTPServer    config.ServerConfig
	MetricsServer config.ServerConfig
}