]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front.git/blob - api/market_config.go
poloniex balance draft
[perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front.git] / api / market_config.go
1 package api
2
3 import (
4 "fmt"
5
6 "github.com/shopspring/decimal"
7 "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/db"
8 "immae.eu/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front/markets"
9 )
10
11 type MarketConfigQuery struct {
12 In struct {
13 User db.User
14 Market string
15 }
16 }
17
18 func (q MarketConfigQuery) ValidateParams() *Error {
19 if q.In.Market != "poloniex" {
20 return &Error{BadRequest, "invalid market name", fmt.Errorf("'%v' is not a valid market name", q.In.Market)}
21 }
22
23 return nil
24 }
25
26 func (q MarketConfigQuery) Run() (interface{}, *Error) {
27 config, err := db.GetUserMarketConfig(q.In.User.Id, q.In.Market)
28 if err != nil {
29 return nil, NewInternalError(err)
30 }
31
32 if config == nil {
33 configMap := make(map[string]string)
34 configMap["key"] = ""
35 configMap["secret"] = ""
36
37 config, err = db.SetUserMarketConfig(q.In.User.Id, q.In.Market, configMap)
38 if err != nil {
39 return nil, NewInternalError(err)
40 }
41
42 }
43
44 return config.Config, nil
45 }
46
47 type MarketBalanceQuery struct {
48 In struct {
49 User db.User
50 Market string
51 Currency string
52 }
53 }
54
55 var Poloniex *markets.Poloniex
56
57 func init() {
58 Poloniex = markets.NewPoloniex()
59 Poloniex.StartTicker()
60 }
61
62 func (q MarketBalanceQuery) ValidateParams() *Error {
63 if q.In.Market != "poloniex" {
64 return &Error{BadRequest, "invalid market name", fmt.Errorf("'%v' is not a valid market name", q.In.Market)}
65 }
66
67 // TODO: we should request market for available currencies.
68 if q.In.Currency != "BTC" || q.In.Currency != "USDT" {
69 return &Error{BadRequest, "invalid currency, accept [BTC, USDT]", fmt.Errorf("'%v' is not a valid currency", q.In.Currency)}
70 }
71
72 return nil
73 }
74
75 func (q MarketBalanceQuery) Run() (interface{}, *Error) {
76 config, err := db.GetUserMarketConfig(q.In.User.Id, q.In.Market)
77 if err != nil {
78 return nil, NewInternalError(err)
79 }
80
81 if config.Config["key"] == "" || config.Config["secret"] == "" {
82 return nil, &Error{BadRequest, "your credentials for this market are not setup", fmt.Errorf("'%v' credentials are not setup", q.In.Market)}
83 }
84
85 balance, err := Poloniex.GetBalance(config.Config["key"], config.Config["secret"], q.In.Currency)
86 if err != nil {
87 return nil, NewInternalError(err)
88 }
89
90 result := struct {
91 Balance decimal.Decimal `json:balance`
92 }{balance}
93
94 return &result, nil
95 }
96
97 type UpdateMarketConfigQuery struct {
98 In struct {
99 User db.User
100 Market string
101 Key string
102 Secret string
103 }
104 }
105
106 func (q UpdateMarketConfigQuery) ValidateParams() *Error {
107 if q.In.Market == "" {
108 return &Error{BadRequest, "invalid market name", fmt.Errorf("'%v' is not a valid market name", q.In.Market)}
109 }
110
111 return nil
112 }
113
114 func (q UpdateMarketConfigQuery) Run() (interface{}, *Error) {
115 configMap := make(map[string]string)
116 if q.In.Key != "" {
117 configMap["key"] = q.In.Key
118 }
119 if q.In.Secret != "" {
120 configMap["secret"] = q.In.Secret
121 }
122
123 _, err := db.SetUserMarketConfig(q.In.User.Id, q.In.Market, configMap)
124 if err != nil {
125 return nil, NewInternalError(err)
126 }
127
128 return nil, nil
129 }