|
|
package priceupdater
import ( "net/http" "strconv" "time"
"github.com/dghubble/sling" "github.com/hermeznetwork/hermez-node/db/historydb" "github.com/hermeznetwork/hermez-node/log" "github.com/hermeznetwork/tracerr" )
const ( defaultMaxIdleConns = 10 defaultIdleConnTimeout = 10 )
// PriceUpdater definition
type PriceUpdater struct { db *historydb.HistoryDB apiURL string tokenSymbols []string }
// NewPriceUpdater is the constructor for the updater
func NewPriceUpdater(apiURL string, db *historydb.HistoryDB) PriceUpdater { tokenSymbols := []string{} return PriceUpdater{ db: db, apiURL: apiURL, tokenSymbols: tokenSymbols, } }
// UpdatePrices is triggered by the Coordinator, and internally will update the token prices in the db
func (p *PriceUpdater) UpdatePrices() { tr := &http.Transport{ MaxIdleConns: defaultMaxIdleConns, IdleConnTimeout: defaultIdleConnTimeout * time.Second, DisableCompression: true, } httpClient := &http.Client{Transport: tr} client := sling.New().Base(p.apiURL).Client(httpClient)
state := [10]float64{}
for _, tokenSymbol := range p.tokenSymbols { resp, err := client.New().Get("ticker/t" + tokenSymbol + "USD").ReceiveSuccess(&state) errString := tokenSymbol + " not updated, error: " if err != nil { log.Error(errString + err.Error()) continue } if resp.StatusCode != http.StatusOK { log.Error(errString + "response is not 200, is " + strconv.Itoa(resp.StatusCode)) continue } err = p.db.UpdateTokenValue(tokenSymbol, state[6]) if err != nil { log.Error(errString + err.Error()) } } }
// UpdateTokenList get the registered token symbols from HistoryDB
func (p *PriceUpdater) UpdateTokenList() error { tokenSymbols, err := p.db.GetTokenSymbols() if err != nil { return tracerr.Wrap(err) } p.tokenSymbols = tokenSymbols return nil }
|