X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=api%2Fmarket_config.go;h=d85af4de9e3c5f3a7e6f18c65d162ce130aa1d1e;hb=2f91f20a8645339385ada602684f4957f20f4da4;hp=3fd10ae000d19fba89f6e86b4911a1dde21bf294;hpb=3602fbf8412d69900d793a963c8e774f487f5e45;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FCryptoportfolio%2FFront.git diff --git a/api/market_config.go b/api/market_config.go index 3fd10ae..d85af4d 100644 --- a/api/market_config.go +++ b/api/market_config.go @@ -2,7 +2,13 @@ package api import ( "fmt" + "strings" + "time" + "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/markets" + + "github.com/jloup/utils" + "github.com/shopspring/decimal" "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/db" ) @@ -42,6 +48,73 @@ func (q MarketConfigQuery) Run() (interface{}, *Error) { return config.Config, nil } +type MarketBalanceQuery struct { + In struct { + User db.User + Market string + Currency string + } +} + +func (q MarketBalanceQuery) ValidateParams() *Error { + if q.In.Market != "poloniex" { + return &Error{BadRequest, "invalid market name", fmt.Errorf("'%v' is not a valid market name", q.In.Market)} + } + + // TODO: we should request market for available currencies. + if q.In.Currency != "BTC" && q.In.Currency != "USDT" && q.In.Currency != "ETH" { + return &Error{BadRequest, "invalid currency, accept [BTC, USDT, ETH]", fmt.Errorf("'%v' is not a valid currency", q.In.Currency)} + } + + return nil +} + +func (q MarketBalanceQuery) Run() (interface{}, *Error) { + config, err := db.GetUserMarketConfig(q.In.User.Id, q.In.Market) + if err != nil { + return nil, NewInternalError(err) + } + + if config.Config["key"] == "" || config.Config["secret"] == "" { + return nil, &Error{BadRequest, "your credentials for this market are not setup", fmt.Errorf("'%v' credentials are not setup", q.In.Market)} + } + + result := struct { + Value decimal.Decimal `json:"value"` + ValueCurrency string `json:"valueCurrency"` + Balance map[string]decimal.Decimal `json:"balance"` + }{} + + resultErr := CallExternalService(fmt.Sprintf("'%s' GetBalanceValue", q.In.Market), EXTERNAL_SERVICE_TIMEOUT_SECONDS*time.Second, func() *Error { + balance, err := Poloniex.GetBalance(config.Config["key"], config.Config["secret"]) + + if utils.ErrIs(err, markets.InvalidCredentials) { + return &Error{InvalidMarketCredentials, "wrong market credentials", fmt.Errorf("wrong '%v' market credentials", q.In.Market)} + } + + if err != nil { + return NewInternalError(err) + } + + value, err := Poloniex.ComputeAccountBalanceValue(balance, q.In.Currency) + if err != nil { + return NewInternalError(err) + } + + result.Balance = balance + result.ValueCurrency = q.In.Currency + result.Value = value.Round(8) + + return nil + }) + + if resultErr != nil { + return nil, resultErr + } + + return &result, nil +} + type UpdateMarketConfigQuery struct { In struct { User db.User @@ -56,6 +129,9 @@ func (q UpdateMarketConfigQuery) ValidateParams() *Error { return &Error{BadRequest, "invalid market name", fmt.Errorf("'%v' is not a valid market name", q.In.Market)} } + q.In.Secret = strings.TrimSpace(q.In.Secret) + q.In.Key = strings.TrimSpace(q.In.Key) + return nil }