'use strict'; import App from './app.js'; var Api = {}; Api.API_HOST = process.env.API_HOST; Api.API_PORT = process.env.API_PORT; if (process.env.API_HTTPS === 'true') { Api.API_ROOT = 'https://'; } else { Api.API_ROOT = 'http://'; } Api.API_ROOT += Api.API_HOST; if (Api.API_PORT !== '80') { Api.API_ROOT += ':' + Api.API_PORT; } Api.API_ROOT += '/api'; var ApiEndpoints = { 'SIGNUP': { 'type': 'POST', 'auth': false, 'parameters': [ {'name': 'email', 'mandatory': true, 'inquery': true}, {'name': 'password', 'mandatory': true, 'inquery': true} ], 'buildUrl': function() { return '/signup'; } }, 'SIGNIN': { 'type': 'POST', 'auth': false, 'parameters': [ {'name': 'email', 'mandatory': true, 'inquery': true}, {'name': 'password', 'mandatory': true, 'inquery': true} ], 'buildUrl': function() { return '/signin'; } }, 'RESET_PASSWORD': { 'type': 'POST', 'auth': false, 'parameters': [ {'name': 'email', 'mandatory': true, 'inquery': true}, ], 'buildUrl': function() { return '/passwordreset'; } }, 'CHANGE_PASSWORD': { 'type': 'POST', 'auth': false, 'parameters': [ {'name': 'token', 'mandatory': true, 'inquery': true}, {'name': 'password', 'mandatory': true, 'inquery': true}, ], 'buildUrl': function() { return '/changepassword'; } }, 'CONFIRM_EMAIL': { 'type': 'POST', 'auth': false, 'parameters': [ {'name': 'token', 'mandatory': true, 'inquery': true}, ], 'buildUrl': function() { return '/confirmemail'; } }, 'MARKET': { 'type': 'GET', 'auth': true, 'parameters': [ {'name': 'name', 'mandatory': true, 'inquery': false}, ], 'buildUrl': function(params) { return '/market/' + params.name; } }, 'MARKET_TEST_CREDENTIALS': { 'type': 'GET', 'auth': true, 'parameters': [ {'name': 'name', 'mandatory': true, 'inquery': false}, ], 'buildUrl': function(params) { return '/market/' + params.name + '/test-credentials'; } }, 'MARKET_GET_PORTFOLIO': { 'type': 'GET', 'auth': true, 'parameters': [ {'name': 'name', 'mandatory': true, 'inquery': false}, ], 'buildUrl': function(params) { return '/market/' + params.name + '/portfolio'; } }, 'UPDATE_MARKET': { 'type': 'POST', 'auth': true, 'parameters': [ {'name': 'name', 'mandatory': true, 'inquery': false}, {'name': 'key', 'mandatory': true, 'inquery': true}, {'name': 'secret', 'mandatory': true, 'inquery': true}, ], 'buildUrl': function(params) { return '/market/' + params.name + '/update'; } }, 'USER_ACCOUNT': { 'type': 'GET', 'auth': true, 'parameters': [], 'buildUrl': function(params) { return '/user/account'; } }, 'OTP_ENROLL': { 'type': 'GET', 'auth': true, 'parameters': [], 'buildUrl': function() { return '/otp/enroll'; } }, 'OTP_VALIDATE': { 'type': 'POST', 'auth': true, 'parameters': [ {'name': 'pass', 'mandatory': true, 'inquery': true}, ], 'buildUrl': function() { return '/otp/validate'; } }, 'ADMIN_PORTFOLIOS': { 'type': 'GET', 'auth': true, 'parameters': [], 'buildUrl': function() { return '/admin/portfolios'; } }, }; Api.BuildRequest = function(endpointId, params) { var endpoint = ApiEndpoints[endpointId]; var query = {}; var url = ''; var headers = {}; var jwt = App.getUserToken(); if (endpoint === undefined) { return {'err': 'cannot find endpoint ' + endpointId}; } if (endpoint.auth === true && (jwt === undefined || jwt === null)) { return {'err': 'this endpoint needs auth'}; } if (jwt !== undefined && jwt !== null) { headers.Authorization = 'Bearer ' + jwt; } for (var i = 0; i < endpoint.parameters.length; i++) { var parameter = endpoint.parameters[i]; if (parameter.mandatory === true && params[parameter.name] === undefined) { return {'err': 'parameter \'' + parameter.name + '\' is mandatory'}; } if (parameter.inquery === true) { query[parameter.name] = params[parameter.name]; } } url = endpoint.buildUrl(params); return {'err': null, 'url': Api.API_ROOT + url, 'headers': headers, 'params': query, 'type': endpoint.type}; }; Api.Call = function(endpointId, params, fn) { var request = Api.BuildRequest(endpointId, params); if (request.err !== null) { console.error('Api BuildRequest error', request.err); fn({'err': request.err}, -1, {}); return null; } return Api.DoRequest(request.type, request.url, request.params, request.headers, fn); }; Api.DoRequest = function(type, url, params, headers, callback) { return $.ajax({ data: params, headers: headers, timeout: 30000, dataType: 'json', error: function(xhr, status, err) { if (status === 'abort') { return; } var apiStatus = null; var apiResponse = null; var apiCode = null; if (xhr.responseJSON) { apiStatus = xhr.responseJSON.status; apiResponse = xhr.responseJSON.response; apiCode = xhr.responseJSON.code; } if (xhr.status === 401 || xhr.status === 403) { if (App.onUserNotAuthorized(xhr.status, apiCode) === false) { return; } } callback({'url': url, 'err': err, 'status': status, 'code': apiCode, 'xhr': xhr}, apiStatus, apiResponse); }, success: function(data) { var err = null; if (data.status !== 'ok') { err = {'url': url, 'status': status}; } callback(err, data.status, data.response); }, type: type, url: url }); }; export default Api;