]>
Commit | Line | Data |
---|---|---|
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 | } |