]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front.git/blob - cmd/web/js/api.js
c9b4ef5eda1d87bbecb2d3f93d2ce253f31b7e83
[perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front.git] / cmd / web / js / api.js
1 'use strict';
2
3 import App from './app.js';
4
5 var Api = {};
6
7 Api.API_HOST = process.env.API_HOST;
8 Api.API_PORT = process.env.API_PORT;
9
10 if (process.env.API_HTTPS === 'true') {
11 Api.API_ROOT = 'https://';
12 } else {
13 Api.API_ROOT = 'http://';
14 }
15
16 Api.API_ROOT += Api.API_HOST;
17 if (Api.API_PORT !== '80') {
18 Api.API_ROOT += ':' + Api.API_PORT;
19 }
20
21 Api.API_ROOT += '/api';
22
23 var 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 ],
31 'buildUrl': function() {
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 ],
42 'buildUrl': function() {
43 return '/signin';
44 }
45 },
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 },
67 'MARKET': {
68 'type': 'GET',
69 'auth': true,
70 'parameters': [
71 {'name': 'name', 'mandatory': true, 'inquery': false},
72 ],
73 'buildUrl': function(params) {
74 return '/market/' + params.name;
75 }
76 },
77 'MARKET_BALANCE': {
78 'type': 'GET',
79 'auth': true,
80 'parameters': [
81 {'name': 'name', 'mandatory': true, 'inquery': false},
82 {'name': 'currency', 'mandatory': true, 'inquery': true},
83 ],
84 'buildUrl': function(params) {
85 return '/market/' + params.name + '/balance';
86 }
87 },
88 'UPDATE_MARKET': {
89 'type': 'POST',
90 'auth': true,
91 'parameters': [
92 {'name': 'name', 'mandatory': true, 'inquery': false},
93 {'name': 'key', 'mandatory': true, 'inquery': true},
94 {'name': 'secret', 'mandatory': true, 'inquery': true},
95 ],
96 'buildUrl': function(params) {
97 return '/market/' + params.name + '/update';
98 }
99 },
100 'OTP_ENROLL': {
101 'type': 'GET',
102 'auth': true,
103 'parameters': [],
104 'buildUrl': function() {
105 return '/otp/enroll';
106 }
107 },
108 'OTP_VALIDATE': {
109 'type': 'POST',
110 'auth': true,
111 'parameters': [
112 {'name': 'pass', 'mandatory': true, 'inquery': true},
113 ],
114 'buildUrl': function() {
115 return '/otp/validate';
116 }
117 },
118 };
119
120 Api.BuildRequest = function(endpointId, params) {
121 var endpoint = ApiEndpoints[endpointId];
122 var query = {};
123 var url = '';
124 var headers = {};
125 var jwt = App.getUserToken();
126
127 if (endpoint === undefined) {
128 return {'err': 'cannot find endpoint ' + endpointId};
129 }
130
131 if (endpoint.auth === true && (jwt === undefined || jwt === null)) {
132 return {'err': 'this endpoint needs auth'};
133 }
134
135 if (jwt !== undefined && jwt !== null) {
136 headers.Authorization = 'Bearer ' + jwt;
137 }
138
139 for (var i = 0; i < endpoint.parameters.length; i++) {
140 var parameter = endpoint.parameters[i];
141 if (parameter.mandatory === true && params[parameter.name] === undefined) {
142 return {'err': 'parameter \'' + parameter.name + '\' is mandatory'};
143 }
144
145 if (parameter.inquery === true) {
146 query[parameter.name] = params[parameter.name];
147 }
148 }
149
150 url = endpoint.buildUrl(params);
151
152 return {'err': null, 'url': Api.API_ROOT + url, 'headers': headers, 'params': query, 'type': endpoint.type};
153 };
154
155 Api.Call = function(endpointId, params, fn) {
156 var request = Api.BuildRequest(endpointId, params);
157
158 if (request.err !== null) {
159 console.error('Api BuildRequest error', request.err);
160 fn({'err': request.err}, -1, {});
161 return null;
162 }
163
164 return Api.DoRequest(request.type, request.url, request.params, request.headers, fn);
165 };
166
167 Api.DoRequest = function(type, url, params, headers, callback) {
168 return $.ajax({
169 data: params,
170 headers: headers,
171 timeout: 30000,
172 dataType: 'json',
173 error: function(xhr, status, err) {
174 if (status === 'abort') {
175 return;
176 }
177
178 var apiStatus = null;
179 var apiResponse = null;
180 var apiCode = null;
181 if (xhr.responseJSON) {
182 apiStatus = xhr.responseJSON.status;
183 apiResponse = xhr.responseJSON.response;
184 apiCode = xhr.responseJSON.code;
185 }
186
187 if (xhr.status === 401 || xhr.status === 403) {
188 if (App.onUserNotAuthorized(xhr.status, apiCode) === false) {
189 return;
190 }
191 }
192
193 callback({'url': url, 'err': err, 'status': status, 'code': apiCode, 'xhr': xhr}, apiStatus, apiResponse);
194 },
195 success: function(data) {
196 var err = null;
197 if (data.status !== 'ok') {
198 err = {'url': url, 'status': status};
199 }
200 callback(err, data.status, data.response);
201 },
202 type: type,
203 url: url
204 });
205 };
206
207 export default Api;
208