]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front.git/blame - cmd/web/js/api.js
Admin minimal dashboard.
[perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front.git] / cmd / web / js / api.js
CommitLineData
7a9e5112 1'use strict';
2
989fb5c7 3import App from './app.js';
7a9e5112 4
5var Api = {};
6
7Api.API_HOST = process.env.API_HOST;
8Api.API_PORT = process.env.API_PORT;
9
10if (process.env.API_HTTPS === 'true') {
11 Api.API_ROOT = 'https://';
12} else {
13 Api.API_ROOT = 'http://';
14}
15
16Api.API_ROOT += Api.API_HOST;
17if (Api.API_PORT !== '80') {
18 Api.API_ROOT += ':' + Api.API_PORT;
19}
20
21Api.API_ROOT += '/api';
22
23var ApiEndpoints = {
24 'SIGNUP': {
25 'type': 'POST',
26 'auth': false,
27 'parameters': [
28 {'name': 'email', 'mandatory': true, 'inquery': true},
29 {'name': 'password', 'mandatory': true, 'inquery': true}
30 ],
989fb5c7 31 'buildUrl': function() {
7a9e5112 32 return '/signup';
33 }
34 },
35 'SIGNIN': {
36 'type': 'POST',
37 'auth': false,
38 'parameters': [
39 {'name': 'email', 'mandatory': true, 'inquery': true},
40 {'name': 'password', 'mandatory': true, 'inquery': true}
41 ],
989fb5c7 42 'buildUrl': function() {
7a9e5112 43 return '/signin';
44 }
45 },
85545aba 46 'RESET_PASSWORD': {
47 'type': 'POST',
48 'auth': false,
49 'parameters': [
50 {'name': 'email', 'mandatory': true, 'inquery': true},
51 ],
52 'buildUrl': function() {
53 return '/passwordreset';
54 }
55 },
56 'CHANGE_PASSWORD': {
57 'type': 'POST',
58 'auth': false,
59 'parameters': [
60 {'name': 'token', 'mandatory': true, 'inquery': true},
61 {'name': 'password', 'mandatory': true, 'inquery': true},
62 ],
63 'buildUrl': function() {
64 return '/changepassword';
65 }
66 },
2da5b12c 67 'CONFIRM_EMAIL': {
68 'type': 'POST',
69 'auth': false,
70 'parameters': [
71 {'name': 'token', 'mandatory': true, 'inquery': true},
72 ],
73 'buildUrl': function() {
74 return '/confirmemail';
75 }
76 },
7a9e5112 77 'MARKET': {
78 'type': 'GET',
79 'auth': true,
80 'parameters': [
81 {'name': 'name', 'mandatory': true, 'inquery': false},
82 ],
83 'buildUrl': function(params) {
84 return '/market/' + params.name;
85 }
86 },
24e47979 87 'MARKET_TEST_CREDENTIALS': {
2f91f20a 88 'type': 'GET',
89 'auth': true,
90 'parameters': [
24e47979 91 {'name': 'name', 'mandatory': true, 'inquery': false},
92 ],
93 'buildUrl': function(params) {
94 return '/market/' + params.name + '/test-credentials';
95 }
96 },
97 'MARKET_GET_PORTFOLIO': {
98 'type': 'GET',
99 'auth': true,
100 'parameters': [
101 {'name': 'name', 'mandatory': true, 'inquery': false},
2f91f20a 102 ],
103 'buildUrl': function(params) {
24e47979 104 return '/market/' + params.name + '/portfolio';
2f91f20a 105 }
106 },
7a9e5112 107 'UPDATE_MARKET': {
108 'type': 'POST',
109 'auth': true,
110 'parameters': [
111 {'name': 'name', 'mandatory': true, 'inquery': false},
112 {'name': 'key', 'mandatory': true, 'inquery': true},
113 {'name': 'secret', 'mandatory': true, 'inquery': true},
114 ],
115 'buildUrl': function(params) {
116 return '/market/' + params.name + '/update';
117 }
118 },
d1c0ccfc 119 'USER_ACCOUNT': {
120 'type': 'GET',
121 'auth': true,
122 'parameters': [],
123 'buildUrl': function(params) {
124 return '/user/account';
125 }
126 },
7a9e5112 127 'OTP_ENROLL': {
128 'type': 'GET',
129 'auth': true,
130 'parameters': [],
989fb5c7 131 'buildUrl': function() {
7a9e5112 132 return '/otp/enroll';
133 }
134 },
135 'OTP_VALIDATE': {
136 'type': 'POST',
137 'auth': true,
138 'parameters': [
139 {'name': 'pass', 'mandatory': true, 'inquery': true},
140 ],
989fb5c7 141 'buildUrl': function() {
7a9e5112 142 return '/otp/validate';
143 }
144 },
2e4885d9 145 'ADMIN_PORTFOLIOS': {
146 'type': 'GET',
147 'auth': true,
148 'parameters': [],
149 'buildUrl': function() {
150 return '/admin/portfolios';
151 }
152 },
153
7a9e5112 154};
155
156Api.BuildRequest = function(endpointId, params) {
157 var endpoint = ApiEndpoints[endpointId];
158 var query = {};
159 var url = '';
160 var headers = {};
161 var jwt = App.getUserToken();
162
163 if (endpoint === undefined) {
164 return {'err': 'cannot find endpoint ' + endpointId};
165 }
166
167 if (endpoint.auth === true && (jwt === undefined || jwt === null)) {
168 return {'err': 'this endpoint needs auth'};
169 }
170
171 if (jwt !== undefined && jwt !== null) {
172 headers.Authorization = 'Bearer ' + jwt;
173 }
174
175 for (var i = 0; i < endpoint.parameters.length; i++) {
176 var parameter = endpoint.parameters[i];
177 if (parameter.mandatory === true && params[parameter.name] === undefined) {
178 return {'err': 'parameter \'' + parameter.name + '\' is mandatory'};
179 }
180
181 if (parameter.inquery === true) {
182 query[parameter.name] = params[parameter.name];
183 }
184 }
185
186 url = endpoint.buildUrl(params);
187
188 return {'err': null, 'url': Api.API_ROOT + url, 'headers': headers, 'params': query, 'type': endpoint.type};
189};
190
191Api.Call = function(endpointId, params, fn) {
192 var request = Api.BuildRequest(endpointId, params);
193
194 if (request.err !== null) {
195 console.error('Api BuildRequest error', request.err);
196 fn({'err': request.err}, -1, {});
197 return null;
198 }
199
200 return Api.DoRequest(request.type, request.url, request.params, request.headers, fn);
201};
202
203Api.DoRequest = function(type, url, params, headers, callback) {
204 return $.ajax({
205 data: params,
206 headers: headers,
207 timeout: 30000,
208 dataType: 'json',
209 error: function(xhr, status, err) {
210 if (status === 'abort') {
211 return;
212 }
213
214 var apiStatus = null;
215 var apiResponse = null;
216 var apiCode = null;
217 if (xhr.responseJSON) {
218 apiStatus = xhr.responseJSON.status;
219 apiResponse = xhr.responseJSON.response;
220 apiCode = xhr.responseJSON.code;
221 }
222
223 if (xhr.status === 401 || xhr.status === 403) {
224 if (App.onUserNotAuthorized(xhr.status, apiCode) === false) {
225 return;
226 }
227 }
228
229 callback({'url': url, 'err': err, 'status': status, 'code': apiCode, 'xhr': xhr}, apiStatus, apiResponse);
230 },
231 success: function(data) {
232 var err = null;
233 if (data.status !== 'ok') {
234 err = {'url': url, 'status': status};
235 }
236 callback(err, data.status, data.response);
237 },
238 type: type,
239 url: url
240 });
241};
242
989fb5c7 243export default Api;
7a9e5112 244