· 7 years ago · Feb 07, 2018, 03:32 PM
1/*jshint sub:true*/
2
3(function (angular) {
4
5 'use strict';
6 angular.module('dome.core')
7
8 .service('wsInterceptor', function($q, $rootScope, $injector, WSConstant) {
9
10
11 return {
12 request: function(config) {
13
14 var User = $injector.get('User');
15 if (User.isConnected()) {
16 config.headers['Authorization'] = 'Bearer ' + User.getToken();
17
18 if (!$rootScope.needToRefresh)
19 User.isAlmostExpired();
20 }else {
21 // expired
22 localStorage.removeItem('token');
23 // localStorage.removeItem('userSelected');
24 }
25 return config;
26
27
28 },
29 responseError: function(rejection) {
30
31 if (
32 (rejection.status === 401 || rejection.status === 401) &&
33 rejection.config.url.indexOf(WSConstant.webViewAuthentication) === -1
34 ) {
35 var User = $injector.get('User');
36 User.removeUser();
37 User.logout();
38 }
39 return $q.reject(rejection);
40 }
41 };
42 })
43
44 .config(function ($httpProvider) {
45 $httpProvider.interceptors.push('wsInterceptor');
46 $httpProvider.defaults.headers.post['Content-Type'] = 'application/json;charset=utf-8';
47 })
48
49 .factory('User',function ($interval, $http, md5, $q, WSConstant, appSettings, $state, $window, $rootScope, requestWS, RightsService) {
50
51 function checkConnection() {
52 var networkState = navigator.connection.type;
53
54 if(networkState=="none"){
55
56 window.plugins.toast.showWithOptions(
57 {
58 message: "Aucune connexion internet disponible !",
59 duration: "long",
60 position: "center",
61 }
62
63 );
64
65 }
66
67
68 }
69
70
71 var userData, token, sessionRefresh;
72
73 var userFactory = {
74
75
76 getExpirationDate: function () {
77 if (userFactory.getToken() && typeof userFactory.getToken() === 'string') {
78
79 token = userFactory.getToken();
80
81 if (token.split('.').length === 3) {
82 try {
83 var base64Url = token.split('.')[1];
84 var base64 = base64Url.replace('-', '+').replace('_', '/');
85 var exp = JSON.parse($window.atob(base64)).exp;
86 if (typeof exp === 'number') {
87 return exp;
88 }
89 }
90 catch (e) {
91 return true; // Pass: Non-JWT token that looks like JWT
92 }
93 }
94 return false; // Pass: All other token
95 }
96
97 return false;
98 },
99
100 refreshToken: function () {
101 var refreshToken = userFactory.getUserToken().refresh_token;
102 var url = appSettings.baseUrl + '/oauth/token';
103
104 var string = JSON.stringify({refreshToken: refreshToken});
105 var xhr = new XMLHttpRequest();
106
107 xhr.open('POST',url,true);
108 xhr.setRequestHeader('Content-type','application/json; charset=utf-8');
109
110 xhr.onreadystatechange = function () {
111 if (xhr.readyState === 4 && xhr.status === 200) {
112 localStorage.setItem('token', xhr.responseText);
113 }
114 };
115 xhr.send(string);
116 },
117
118 isConnected: function () {
119
120 if (typeof userFactory.getExpirationDate() === 'number')
121 return moment().unix() < userFactory.getExpirationDate();
122
123 return false;
124 },
125
126 isAlmostExpired: function () {
127
128 var date = userFactory.getExpirationDate();
129
130 // check if it's a date then check if session is under 30 minutes => refresh token
131 if (typeof date === 'number' && moment().add('30', 'minutes').unix().valueOf() > date ) {
132
133 $rootScope.needToRefresh = true;
134 userFactory.refreshToken();
135 }
136 },
137
138
139 getToken: function () {
140 return (userFactory.getUserToken()) ? userFactory.getUserToken().token : false;
141 },
142
143 getUserToken: function () {
144
145 if (typeof localStorage.getItem('token') === 'string') {
146 userData = JSON.parse(localStorage.getItem('token'));
147 return userData;
148 }
149
150 return false;
151 },
152
153 /**
154 *
155 * @param {object} user
156 * @param {object} user.username
157 * @param {object} user.password
158 */
159
160
161
162 login: function (user) {
163 // checkConnection();
164 var data = angular.copy(user);
165 var url = appSettings.baseUrl + '/oauth/token';
166
167 data.password = md5.createHash(data.password || '');
168
169 data.rememberMe = true;
170
171 var defer = $q.defer();
172 $http({
173 url: url,
174 method: 'POST',
175 headers: [{'Content-Type': 'application/json'}],
176 data: data
177 }).then(function (data) {
178
179 if (data.data.statusId === 0) {
180 $http.defaults.headers.common['Authorization'] = 'Bearer ' + data.data.token;
181 localStorage.setItem('token', JSON.stringify(data.data));
182
183 var email= null
184 if(!angular.isUndefined(data.data.email))
185 {email = data.data.email;}
186 localStorage.setItem('email', email) ;
187
188 angular.element('#error_pop_up').closeModalCustom();
189 $rootScope.errorText = '';
190
191 if (angular.isDefined(sessionRefresh)) {
192 $interval.cancel(sessionRefresh);
193 sessionRefresh = undefined;
194 }
195
196 userFactory.beginRefreshToken();
197 defer.resolve(data.data);
198
199 }else {
200 defer.reject(data.data);
201 }
202
203
204 console.log('user.session .login .then: ',data);
205
206
207 }).catch(function (data) {
208 console.log('user.session .login .fail: ',data);
209 defer.reject(data.data);
210 setTimeout(function(){
211
212 function onConfirm(buttonIndex) {
213 (buttonIndex==1) ? location.reload() :navigator.app.exitApp();
214
215 console.log(buttonIndex);
216
217 }
218 var networkState = navigator.connection.type;
219 if(networkState=="none") {
220 console.log($state);
221 navigator.notification.confirm(
222 'Le chargement a échoué. Veuillez vérifier votre connexion.', // message
223 onConfirm, // callback to invoke with index of button pressed
224 'Erreur', // title
225 ['Réessayer','Fermer'] // buttonLabels
226 );
227 }
228
229 }, 3000);
230
231
232
233
234
235 });
236
237 return defer.promise;
238 },
239
240 loginWebView: function (token, benefId) {
241
242 var defer = $q.defer();
243
244 $http({
245 url: appSettings.serviceUrl + WSConstant.webViewAuthentication,
246 method: 'POST',
247 data: {
248 // Token: token,
249 benefProfileId: benefId
250 },
251 headers: {
252 'Authorization': 'Bearer ' + token
253 }
254
255 })
256
257 .then(function (data) {
258 if (data.data.statusId === 0) {
259 $http.defaults.headers.common['Authorization'] = 'Bearer ' + data.data.token;
260 localStorage.setItem('token', JSON.stringify(data.data));
261 defer.resolve(data.data);
262 }else {
263 defer.reject(data.data);
264 }
265 }, defer.reject)
266
267 .catch(function (data) {
268 defer.reject(data.data);
269 });
270
271 return defer.promise;
272 },
273
274 getAccountId: function () {
275 return (userFactory.getUserToken() && userFactory.getUserToken().accountId) ? userFactory.getUserToken().accountId : '';
276 },
277
278 setBenefCount: function (users) {
279 return localStorage.setItem('userCount', (angular.isArray(users)) ? users.length : 0);
280 },
281
282 getBenefCount: function () {
283 return parseInt(localStorage.getItem('userCount'));
284 },
285
286
287 getUserList: function (accountId) {
288
289 var defer = $q.defer();
290 $http({
291 url: appSettings.serviceUrl + WSConstant.getProfileList,
292 method: 'POST',
293 data: {accountId: accountId}
294 }).then(function (data) {
295
296 if (data.data.firstConnexion)
297 $window.localStorage.setItem('firstConnexion', true);
298
299 // $rootScope.$broadcast('User:FirstConnexion');
300 defer.resolve(data.data);
301
302 }).catch(function (data) {
303 switch (data.status) {
304 case 403: defer.reject(data.data);
305 }
306 });
307
308 return defer.promise;
309 },
310
311 logout: function () {
312 localStorage.removeItem('listProcheToPremuim');
313 localStorage.removeItem('credentials');
314 localStorage.removeItem('token');
315 localStorage.removeItem('viewCalender');
316 localStorage.removeItem('userSelected');
317 $http.defaults.headers.common['Authorization'] = null;
318 localStorage.clear();
319 $state.go('home', {}, {reload: true});
320 },
321
322 selectUser: function (user, isPartner) {
323
324 var defer = $q.defer();
325 localStorage.setItem('userSelected', JSON.stringify(user));
326 var profile = {profileId: user.profileId};
327
328 var urls = [
329 $http({
330 url: appSettings.serviceUrl + WSConstant.getProfileDetail,
331 method: 'POST',
332 data: profile
333 })
334 ];
335
336 if ( !isPartner) {
337 urls.push($http({
338 url: (isPartner ? appSettings.partnerUrl :appSettings.serviceUrl) + WSConstant.selectProfileWS,
339 method: 'POST',
340 data: profile
341 }))
342 }
343 $q.all( urls ).then(function (response) {
344 var authenticatedProfileRoleId = response[1].data.authenticatedProfileRoleId
345 //On set les droits de l'utilisateur
346 RightsService.initRights(authenticatedProfileRoleId);
347
348 localStorage.setItem('userDetails', JSON.stringify(response[0]));
349 defer.resolve(response);
350 }, defer.reject);
351
352 return defer.promise;
353 },
354
355 getProfileDetails: function () {
356 return requestWS.callWS( WSConstant.getProfileDetail, {profileId: userFactory.getUserId() });
357 },
358
359 getAvatar: function () {
360 return (userFactory.getuserDetails() && userFactory.getuserDetails().DOME_profileDetail && userFactory.getuserDetails().DOME_profileDetail.avatarFileId) ? userFactory.getuserDetails().DOME_profileDetail.avatarFileId : false;
361 },
362
363 getuserDetails: function () {
364 return (typeof localStorage.getItem('userDetails') === 'string') ? JSON.parse(localStorage.getItem('userDetails')): false;
365 },
366
367 getUserInfo: function () {
368 return (typeof localStorage.getItem('userSelected') === 'string') ? JSON.parse(localStorage.getItem('userSelected')): false;
369 },
370
371 getUserId: function () {
372 return userFactory.getUserInfo() ? userFactory.getUserInfo().profileId : false;
373 },
374
375 removeUser: function () {
376 localStorage.removeItem('userSelected');
377 },
378
379 changePassword: function (oldPassword, newPassword) {
380 var service = WSConstant.modifyPassword,
381 data = {
382 accountId: userFactory.getAccountId(),
383 passwordOLD: md5.createHash(oldPassword),
384 passwordNEW: md5.createHash(newPassword)
385 };
386 return requestWS.callWS(service, data);
387 },
388 newPassword: function (email) {
389 var service = WSConstant.forgetPassword;
390 var data = {
391 login: email
392 // email: email
393 }
394 return requestWS.callWS(service, data);
395 },
396
397 beginRefreshToken: function () {
398 // refresh every 15min (900000)
399 sessionRefresh = $interval(userFactory.refreshToken, 900000);
400 }
401 };
402
403 return userFactory;
404 });
405
406})(angular);