/
controller-helper.js
122 lines (109 loc) · 4.15 KB
/
controller-helper.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
'use strict';
const ccxt = require('ccxt')
, ccxtRestErrors = require('../errors')
, exchangeService = require('../services/exchange-service')
, exchange_response = require('../dto/exchange-response')
, jwtHelper = require('./jwt-helper')
;
function handleError(req, res, label, error) {
let exchangeId;
try {
exchangeId = getExchangeId(req)
} catch (error) {
exchangeId = '???invalid_token???'
}
console.error(`[${exchangeId}] Error on ${label}`);
console.trace(error)
if (error instanceof ccxt.AuthenticationError) {
res.status(401).send();
} else if (error instanceof ccxt.InvalidNonce || error instanceof ccxtRestErrors.AuthError) {
res.status(403).send();
} else if (error instanceof ccxt.OrderNotFound || error instanceof ccxtRestErrors.UnknownExchangeNameError) {
res.status(404).send();
} else if (error instanceof ccxt.InvalidOrder || error instanceof ccxt.InsufficientFunds) {
res.status(400).send();
} else if (error instanceof ccxt.NotSupported || error instanceof ccxtRestErrors.UnsupportedApiError) {
res.status(501).send();
} else if (error instanceof ccxtRestErrors.BrokenExchangeError) {
res.status(503).send();
} else if (error instanceof ccxt.NetworkError) {
res.status(504).send();
} else {
res.status(500).send();
}
}
async function execute(req, res, parameterNamesOrParameterValuesExtractor, functionName, responseTransformer) {
try {
let context = {}
const exchange = await getExchangeFromRequest(req)
let parameterValues
if (typeof(parameterNamesOrParameterValuesExtractor) === 'function') {
parameterValues = parameterNamesOrParameterValuesExtractor(req, context)
} else {
parameterValues = parameterNamesOrParameterValuesExtractor.map(parameterName => req.swagger.params[parameterName].value)
// extract exchange-specific params
let params = Object.assign({}, req.query)
parameterNamesOrParameterValuesExtractor.forEach(paramName => {
delete params[paramName]
})
// add exchange-specific params to parameterValues
parameterValues.push(params)
}
context.parameterValues = parameterValues
if (exchange.has[functionName] === false) {
console.error(`[${exchange.name}] does not support ${functionName}`)
throw new ccxtRestErrors.UnsupportedApiError(`${exchange.name}#${functionName} is not supported`)
} else {
exchange[functionName].apply(exchange, parameterValues)
.then(response => {
res.send(responseTransformer(response, context));
}).catch((error) => {
handleError(req, res, functionName, error)
});
}
} catch (error) {
handleError(req, res, functionName, error)
}
}
async function getExchangeFromRequest(req) {
let exchangeName = getExchangeName(req)
let exchangeId = getExchangeId(req)
let exchange
if (exchangeId) {
exchange = await exchangeService.findByExchangeNameAndExchangeId(exchangeName, exchangeId)
} else {
exchange = await exchangeService.getPublicExchange(exchangeName)
}
return exchange
}
function getExchangeName(req) {
const exchangeName = req.swagger.params.exchangeName && req.swagger.params.exchangeName.value;
if (!ccxt[exchangeName]) {
throw new ccxtRestErrors.UnknownExchangeNameError(`${exchangeName} is not supported`)
} else {
return exchangeName;
}
}
function getExchangeId(req) {
if (req.headers && req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
let token = req.headers.authorization.split('Bearer ')[1]
let decoded = jwtHelper.decode(token)
return decoded.sub
}
return null
}
function renderExchange(exchange, res) {
if (exchange) {
res.send(new exchange_response.ExchangeResponse(exchange));
} else {
res.status(404).send();
}
}
module.exports = {
execute : execute,
getExchangeFromRequest : getExchangeFromRequest,
getExchangeId : getExchangeId,
getExchangeName : getExchangeName,
handleError : handleError,
renderExchange : renderExchange
}