FiatRates: store rates as float64 instead of json.Number

This commit is contained in:
Vladyslav Burzakovskyy 2019-12-19 17:30:19 +01:00 committed by Martin
parent 14c64410f7
commit bef572c494
8 changed files with 49 additions and 44 deletions

View File

@ -303,7 +303,7 @@ type BalanceHistory struct {
Txs uint32 `json:"txs"` Txs uint32 `json:"txs"`
ReceivedSat *Amount `json:"received"` ReceivedSat *Amount `json:"received"`
SentSat *Amount `json:"sent"` SentSat *Amount `json:"sent"`
FiatRate string `json:"fiatRate,omitempty"` FiatRate float64 `json:"fiatRate,omitempty"`
Txid string `json:"txid,omitempty"` Txid string `json:"txid,omitempty"`
} }

View File

@ -925,7 +925,7 @@ func (w *Worker) setFiatRateToBalanceHistories(histories BalanceHistories, fiat
continue continue
} }
if rate, found := ticker.Rates[fiat]; found { if rate, found := ticker.Rates[fiat]; found {
bh.FiatRate = string(rate) bh.FiatRate = rate
} }
} }
return nil return nil
@ -1153,7 +1153,7 @@ func (w *Worker) getFiatRatesResult(currency string, ticker *db.CurrencyRatesTic
Rates: ticker.Rates, Rates: ticker.Rates,
}, nil }, nil
} }
rates := make(map[string]json.Number, 1) rates := make(map[string]float64, 1)
timestamp := ticker.Timestamp.UTC().Unix() timestamp := ticker.Timestamp.UTC().Unix()
if rate, found := ticker.Rates[currency]; !found { if rate, found := ticker.Rates[currency]; !found {
return nil, NewAPIError(fmt.Sprintf("Currency %q is not available for timestamp %d.", currency, timestamp), true) return nil, NewAPIError(fmt.Sprintf("Currency %q is not available for timestamp %d.", currency, timestamp), true)

View File

@ -37,14 +37,14 @@ const FiatRatesTimeFormat = "20060102150405" // YYYYMMDDhhmmss
// CurrencyRatesTicker contains coin ticker data fetched from API // CurrencyRatesTicker contains coin ticker data fetched from API
type CurrencyRatesTicker struct { type CurrencyRatesTicker struct {
Timestamp *time.Time // return as unix timestamp in API Timestamp *time.Time // return as unix timestamp in API
Rates map[string]json.Number Rates map[string]float64
} }
// ResultTickerAsString contains formatted CurrencyRatesTicker data // ResultTickerAsString contains formatted CurrencyRatesTicker data
type ResultTickerAsString struct { type ResultTickerAsString struct {
Timestamp int64 `json:"ts,omitempty"` Timestamp int64 `json:"ts,omitempty"`
Rates map[string]json.Number `json:"rates,omitempty"` Rates map[string]float64 `json:"rates,omitempty"`
Error string `json:"error,omitempty"` Error string `json:"error,omitempty"`
} }
// ResultTickersAsString contains a formatted CurrencyRatesTicker list // ResultTickersAsString contains a formatted CurrencyRatesTicker list

View File

@ -9,7 +9,6 @@ import (
"blockbook/tests/dbtestdata" "blockbook/tests/dbtestdata"
"encoding/binary" "encoding/binary"
"encoding/hex" "encoding/hex"
"encoding/json"
"io/ioutil" "io/ioutil"
"math/big" "math/big"
"os" "os"
@ -1131,20 +1130,26 @@ func TestRocksTickers(t *testing.T) {
ts1, _ := time.Parse(FiatRatesTimeFormat, "20190628000000") ts1, _ := time.Parse(FiatRatesTimeFormat, "20190628000000")
ticker1 := &CurrencyRatesTicker{ ticker1 := &CurrencyRatesTicker{
Timestamp: &ts1, Timestamp: &ts1,
Rates: map[string]json.Number{ Rates: map[string]float64{
"usd": "20000", "usd": 20000,
}, },
} }
ts2, _ := time.Parse(FiatRatesTimeFormat, "20190629000000") ts2, _ := time.Parse(FiatRatesTimeFormat, "20190629000000")
ticker2 := &CurrencyRatesTicker{ ticker2 := &CurrencyRatesTicker{
Timestamp: &ts2, Timestamp: &ts2,
Rates: map[string]json.Number{ Rates: map[string]float64{
"usd": "30000", "usd": 30000,
}, },
} }
d.FiatRatesStoreTicker(ticker1) err := d.FiatRatesStoreTicker(ticker1)
if err != nil {
t.Errorf("Error storing ticker! %v", err)
}
d.FiatRatesStoreTicker(ticker2) d.FiatRatesStoreTicker(ticker2)
if err != nil {
t.Errorf("Error storing ticker! %v", err)
}
ticker, err := d.FiatRatesFindTicker(&key) // should find the closest key (ticker1) ticker, err := d.FiatRatesFindTicker(&key) // should find the closest key (ticker1)
if err != nil { if err != nil {

View File

@ -100,7 +100,7 @@ func (cg *Coingecko) getTicker(timestamp *time.Time) (*db.CurrencyRatesTicker, e
type FiatRatesResponse struct { type FiatRatesResponse struct {
MarketData struct { MarketData struct {
Prices map[string]json.Number `json:"current_price"` Prices map[string]float64 `json:"current_price"`
} `json:"market_data"` } `json:"market_data"`
} }

View File

@ -143,7 +143,7 @@ func (rd *RatesDownloader) findEarliestMarketData() (*time.Time, error) {
// syncLatest downloads the latest FiatRates data every rd.PeriodSeconds // syncLatest downloads the latest FiatRates data every rd.PeriodSeconds
func (rd *RatesDownloader) syncLatest() error { func (rd *RatesDownloader) syncLatest() error {
timer := time.NewTimer(rd.periodSeconds) timer := time.NewTimer(rd.periodSeconds)
var lastTickerRates map[string]json.Number = nil var lastTickerRates map[string]float64 = nil
sameTickerCounter := 0 sameTickerCounter := 0
for { for {
ticker, err := rd.downloader.getTicker(nil) ticker, err := rd.downloader.getTicker(nil)

View File

@ -154,7 +154,7 @@ func newPostRequest(u string, body string) *http.Request {
return r return r
} }
func insertFiatRate(date string, rates map[string]json.Number, d *db.RocksDB) error { func insertFiatRate(date string, rates map[string]float64, d *db.RocksDB) error {
convertedDate, err := db.FiatRatesConvertDate(date) convertedDate, err := db.FiatRatesConvertDate(date)
if err != nil { if err != nil {
return err return err
@ -168,39 +168,39 @@ func insertFiatRate(date string, rates map[string]json.Number, d *db.RocksDB) er
// InitTestFiatRates initializes test data for /api/v2/tickers endpoint // InitTestFiatRates initializes test data for /api/v2/tickers endpoint
func InitTestFiatRates(d *db.RocksDB) error { func InitTestFiatRates(d *db.RocksDB) error {
if err := insertFiatRate("20180320020000", map[string]json.Number{ if err := insertFiatRate("20180320020000", map[string]float64{
"usd": "2000.0", "usd": 2000.0,
"eur": "1300.0", "eur": 1300.0,
}, d); err != nil { }, d); err != nil {
return err return err
} }
if err := insertFiatRate("20180320030000", map[string]json.Number{ if err := insertFiatRate("20180320030000", map[string]float64{
"usd": "2001.0", "usd": 2001.0,
"eur": "1301.0", "eur": 1301.0,
}, d); err != nil { }, d); err != nil {
return err return err
} }
if err := insertFiatRate("20180320040000", map[string]json.Number{ if err := insertFiatRate("20180320040000", map[string]float64{
"usd": "2002.0", "usd": 2002.0,
"eur": "1302.0", "eur": 1302.0,
}, d); err != nil { }, d); err != nil {
return err return err
} }
if err := insertFiatRate("20180321055521", map[string]json.Number{ if err := insertFiatRate("20180321055521", map[string]float64{
"usd": "2003.0", "usd": 2003.0,
"eur": "1303.0", "eur": 1303.0,
}, d); err != nil { }, d); err != nil {
return err return err
} }
if err := insertFiatRate("20191121140000", map[string]json.Number{ if err := insertFiatRate("20191121140000", map[string]float64{
"usd": "7814.5", "usd": 7814.5,
"eur": "7100.0", "eur": 7100.0,
}, d); err != nil { }, d); err != nil {
return err return err
} }
return insertFiatRate("20191121143015", map[string]json.Number{ return insertFiatRate("20191121143015", map[string]float64{
"usd": "7914.5", "usd": 7914.5,
"eur": "7134.1", "eur": 7134.1,
}, d) }, d)
} }
@ -569,7 +569,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK, status: http.StatusOK,
contentType: "application/json; charset=utf-8", contentType: "application/json; charset=utf-8",
body: []string{ body: []string{
`{"ts":1574344800,"rates":{"eur":7100.0}}`, `{"ts":1574344800,"rates":{"eur":7100}}`,
}, },
}, },
{ {
@ -578,7 +578,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK, status: http.StatusOK,
contentType: "application/json; charset=utf-8", contentType: "application/json; charset=utf-8",
body: []string{ body: []string{
`{"ts":1521511200,"rates":{"usd":2000.0}}`, `{"ts":1521511200,"rates":{"usd":2000}}`,
}, },
}, },
{ {
@ -587,7 +587,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK, status: http.StatusOK,
contentType: "application/json; charset=utf-8", contentType: "application/json; charset=utf-8",
body: []string{ body: []string{
`{"ts":1521611721,"rates":{"usd":2003.0}}`, `{"ts":1521611721,"rates":{"usd":2003}}`,
}, },
}, },
{ {
@ -785,7 +785,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK, status: http.StatusOK,
contentType: "application/json; charset=utf-8", contentType: "application/json; charset=utf-8",
body: []string{ body: []string{
`[{"time":1521514800,"txs":1,"received":"9876","sent":"0","fiatRate":"1301.0"},{"time":1521594000,"txs":1,"received":"9000","sent":"9876","fiatRate":"1303.0"}]`, `[{"time":1521514800,"txs":1,"received":"9876","sent":"0","fiatRate":1301},{"time":1521594000,"txs":1,"received":"9000","sent":"9876","fiatRate":1303}]`,
}, },
}, },
{ {
@ -821,7 +821,7 @@ func httpTestsBitcoinType(t *testing.T, ts *httptest.Server) {
status: http.StatusOK, status: http.StatusOK,
contentType: "application/json; charset=utf-8", contentType: "application/json; charset=utf-8",
body: []string{ body: []string{
`[{"time":1521514800,"txs":1,"received":"1","sent":"0","fiatRate":"2001.0"}]`, `[{"time":1521514800,"txs":1,"received":"1","sent":"0","fiatRate":2001}]`,
}, },
}, },
{ {
@ -1286,7 +1286,7 @@ func websocketTestsBitcoinType(t *testing.T, ts *httptest.Server) {
"timestamps": []string{"1521507600"}, "timestamps": []string{"1521507600"},
}, },
}, },
want: `{"id":"25","data":{"tickers":[{"ts":1521511200,"rates":{"eur":1300.0}}]}}`, want: `{"id":"25","data":{"tickers":[{"ts":1521511200,"rates":{"eur":1300}}]}}`,
}, },
{ {
name: "websocket getFiatRatesForTimestamps multiple timestamps usd", name: "websocket getFiatRatesForTimestamps multiple timestamps usd",
@ -1308,7 +1308,7 @@ func websocketTestsBitcoinType(t *testing.T, ts *httptest.Server) {
"timestamps": []string{"1570346615", "1574346615"}, "timestamps": []string{"1570346615", "1574346615"},
}, },
}, },
want: `{"id":"27","data":{"tickers":[{"ts":1574344800,"rates":{"eur":7100.0}},{"ts":1574346615,"rates":{"eur":7134.1}}]}}`, want: `{"id":"27","data":{"tickers":[{"ts":1574344800,"rates":{"eur":7100}},{"ts":1574346615,"rates":{"eur":7134.1}}]}}`,
}, },
{ {
name: "websocket getFiatRatesForTimestamps multiple timestamps with an error", name: "websocket getFiatRatesForTimestamps multiple timestamps with an error",
@ -1373,7 +1373,7 @@ func websocketTestsBitcoinType(t *testing.T, ts *httptest.Server) {
"fiat": "usd", "fiat": "usd",
}, },
}, },
want: `{"id":"33","data":[{"time":1521514800,"txs":1,"received":"1","sent":"0","fiatRate":"2001.0"}]}`, want: `{"id":"33","data":[{"time":1521514800,"txs":1,"received":"1","sent":"0","fiatRate":2001}]}`,
}, },
} }

View File

@ -791,7 +791,7 @@ func (s *WebsocketServer) OnNewTxAddr(tx *bchain.Tx, addrDesc bchain.AddressDesc
} }
} }
func (s *WebsocketServer) broadcastTicker(currency string, rates map[string]json.Number) { func (s *WebsocketServer) broadcastTicker(currency string, rates map[string]float64) {
s.fiatRatesSubscriptionsLock.Lock() s.fiatRatesSubscriptionsLock.Lock()
defer s.fiatRatesSubscriptionsLock.Unlock() defer s.fiatRatesSubscriptionsLock.Unlock()
as, ok := s.fiatRatesSubscriptions[currency] as, ok := s.fiatRatesSubscriptions[currency]
@ -820,7 +820,7 @@ func (s *WebsocketServer) broadcastTicker(currency string, rates map[string]json
// OnNewFiatRatesTicker is a callback that broadcasts info about fiat rates affecting subscribed currency // OnNewFiatRatesTicker is a callback that broadcasts info about fiat rates affecting subscribed currency
func (s *WebsocketServer) OnNewFiatRatesTicker(ticker *db.CurrencyRatesTicker) { func (s *WebsocketServer) OnNewFiatRatesTicker(ticker *db.CurrencyRatesTicker) {
for currency, rate := range ticker.Rates { for currency, rate := range ticker.Rates {
s.broadcastTicker(currency, map[string]json.Number{currency: rate}) s.broadcastTicker(currency, map[string]float64{currency: rate})
} }
s.broadcastTicker("!ALL!", ticker.Rates) s.broadcastTicker("!ALL!", ticker.Rates)
} }