Fix transformer factory

This commit is contained in:
Edvard 2018-10-09 16:03:34 +02:00
parent 1b9e6491da
commit 15e33db33d
3 changed files with 45 additions and 43 deletions

View File

@ -16,52 +16,37 @@ package factories
import ( import (
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/vulcanize/vulcanizedb/pkg/datastore/postgres"
"log" "log"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/vulcanize/vulcanizedb/pkg/core" "github.com/vulcanize/vulcanizedb/pkg/core"
"github.com/vulcanize/vulcanizedb/pkg/datastore/postgres"
"github.com/vulcanize/vulcanizedb/pkg/transformers/shared" "github.com/vulcanize/vulcanizedb/pkg/transformers/shared"
) )
type TransformerInitializer struct {
Config shared.TransformerConfig
Converter Converter
Repository Repository
}
type Model struct {
TransactionIndex uint `db:"tx_idx"`
Raw []byte `db:"raw_log"`
}
type Converter interface {
ToModel(ethLog types.Log) (Model, error)
}
type Repository interface {
Create(headerID int64, models []Model) error
MarkHeaderChecked(headerID int64) error
MissingHeaders(startingBlockNumber, endingBlockNumber int64) ([]core.Header, error)
}
func (initializer TransformerInitializer) NewTransformer(db *postgres.DB, blockChain core.BlockChain) shared.Transformer {
fetcher := shared.NewFetcher(blockChain)
return Transformer{
Config: initializer.Config,
Converter: initializer.Converter,
Fetcher: fetcher,
Repository: initializer.Repository,
}
}
type Transformer struct { type Transformer struct {
Config shared.TransformerConfig Config shared.TransformerConfig
Converter Converter Converter Converter
Fetcher shared.LogFetcher
Repository Repository Repository Repository
Fetcher shared.SettableLogFetcher
}
type Converter interface {
ToModels(ethLog []types.Log) ([]interface{}, error)
}
type Repository interface {
Create(headerID int64, models []interface{}) error
MarkHeaderChecked(headerID int64) error
MissingHeaders(startingBlockNumber, endingBlockNumber int64) ([]core.Header, error)
SetDB(db *postgres.DB)
}
func (transformer Transformer) NewTransformer(db *postgres.DB, bc core.BlockChain) shared.Transformer {
transformer.Repository.SetDB(db)
transformer.Fetcher.SetBC(bc)
return transformer
} }
func (transformer Transformer) Execute() error { func (transformer Transformer) Execute() error {
@ -72,6 +57,7 @@ func (transformer Transformer) Execute() error {
log.Printf("Fetching vat move event logs for %d headers \n", len(missingHeaders)) log.Printf("Fetching vat move event logs for %d headers \n", len(missingHeaders))
for _, header := range missingHeaders { for _, header := range missingHeaders {
// TODO Needs signature in config
topics := [][]common.Hash{{common.HexToHash(shared.VatMoveSignature)}} topics := [][]common.Hash{{common.HexToHash(shared.VatMoveSignature)}}
matchingLogs, err := transformer.Fetcher.FetchLogs(transformer.Config.ContractAddresses, topics, header.BlockNumber) matchingLogs, err := transformer.Fetcher.FetchLogs(transformer.Config.ContractAddresses, topics, header.BlockNumber)
if err != nil { if err != nil {
@ -85,17 +71,21 @@ func (transformer Transformer) Execute() error {
} }
} }
for _, log := range matchingLogs { models, err := transformer.Converter.ToModels(matchingLogs)
model, err := transformer.Converter.ToModel(log)
if err != nil { if err != nil {
return err return err
} }
err = transformer.Repository.Create(header.Id, []Model{model}) // Can't assert the whole collection, need to wash types individually
var typelessModels []interface{}
for _, m := range models {
typelessModels = append(typelessModels, m.(interface{}))
}
err = transformer.Repository.Create(header.Id, typelessModels)
if err != nil { if err != nil {
return err return err
} }
} }
}
return nil return nil
} }

View File

@ -28,10 +28,19 @@ type LogFetcher interface {
FetchLogs(contractAddresses []string, topics [][]common.Hash, blockNumber int64) ([]types.Log, error) FetchLogs(contractAddresses []string, topics [][]common.Hash, blockNumber int64) ([]types.Log, error)
} }
type SettableLogFetcher interface {
LogFetcher
SetBC(bc core.BlockChain)
}
type Fetcher struct { type Fetcher struct {
blockChain core.BlockChain blockChain core.BlockChain
} }
func (fetcher *Fetcher) SetBC(bc core.BlockChain) {
fetcher.blockChain = bc
}
func NewFetcher(blockchain core.BlockChain) Fetcher { func NewFetcher(blockchain core.BlockChain) Fetcher {
return Fetcher{ return Fetcher{
blockChain: blockchain, blockChain: blockchain,

View File

@ -17,6 +17,7 @@ package mocks
import ( import (
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/vulcanize/vulcanizedb/pkg/core"
) )
type MockLogFetcher struct { type MockLogFetcher struct {
@ -35,6 +36,8 @@ func (mlf *MockLogFetcher) FetchLogs(contractAddresses []string, topics [][]comm
return mlf.FetchedLogs, mlf.fetcherError return mlf.FetchedLogs, mlf.fetcherError
} }
func (mlf *MockLogFetcher) SetBC(_ core.BlockChain) {}
func (mlf *MockLogFetcher) SetFetcherError(err error) { func (mlf *MockLogFetcher) SetFetcherError(err error) {
mlf.fetcherError = err mlf.fetcherError = err
} }