794de4ab381e3a38b2eb4af096589e2f9797e3e5
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / user / UserBusinessLogic.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.be.user;
22
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
26 import java.util.Map;
27
28 import javax.annotation.Resource;
29 import javax.servlet.ServletContext;
30
31 import org.apache.tinkerpop.gremlin.structure.Edge;
32 import org.openecomp.sdc.be.config.BeEcompErrorManager;
33 import org.openecomp.sdc.be.dao.api.ActionStatus;
34 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
35 import org.openecomp.sdc.be.dao.titan.TitanGenericDao;
36 import org.openecomp.sdc.be.dao.utils.UserStatusEnum;
37 import org.openecomp.sdc.be.impl.ComponentsUtils;
38 import org.openecomp.sdc.be.model.LifecycleStateEnum;
39 import org.openecomp.sdc.be.model.User;
40 import org.openecomp.sdc.be.model.operations.api.IUserAdminOperation;
41 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
42 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
43 import org.openecomp.sdc.common.api.UserRoleEnum;
44 import org.openecomp.sdc.common.kpi.api.ASDCKpiApi;
45 import org.openecomp.sdc.exception.ResponseFormat;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48 import org.springframework.beans.factory.annotation.Autowired;
49 import org.springframework.stereotype.Component;
50
51 import fj.data.Either;
52
53 @Component("userBusinessLogic")
54 public class UserBusinessLogic implements IUserBusinessLogic {
55
56     private static final Logger log = LoggerFactory.getLogger(UserBusinessLogic.class);
57     private static UserAdminValidator userAdminValidator = UserAdminValidator.getInstance();
58
59     @Resource
60     private IUserAdminOperation userAdminOperation;
61     @Resource
62     private ComponentsUtils componentsUtils;
63     @Autowired
64     private TitanGenericDao titanDao;
65
66     @Override
67     public Either<User, ActionStatus> getUser(String userId, boolean inTransaction) {
68         return userAdminOperation.getUserData(userId, inTransaction);
69     }
70
71     @Override
72     public Either<User, ResponseFormat> createUser(User modifier, User newUser) {
73
74         ResponseFormat responseFormat;
75         String modifierUserId = modifier.getUserId();
76
77         if (modifierUserId == null) {
78             modifier.setUserId("UNKNOWN");
79             log.debug("createUser method -  user header is missing");
80             responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
81             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.ADD_USER);
82             return Either.right(responseFormat);
83         }
84
85         Either<User, ActionStatus> eitherCreator = getUser(modifierUserId, false);
86         if (eitherCreator.isRight() || eitherCreator.left().value() == null) {
87             log.debug("createUser method - user is not listed. userId = {}", modifier.getUserId());
88             responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
89             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.ADD_USER);
90             return Either.right(responseFormat);
91         }
92
93         modifier = eitherCreator.left().value();
94         if (!modifier.getRole().equals(UserRoleEnum.ADMIN.getName())) {
95             log.debug("createUser method - user is not admin = {}", modifier.getUserId());
96             responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
97             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.ADD_USER);
98             return Either.right(responseFormat);
99         }
100
101         // verify user not exist
102         User userFromDb = new User();
103         Either<User, ActionStatus> eitherUserInDB = getUser(newUser.getUserId(), false);
104         if (eitherUserInDB.isRight()) {
105             ActionStatus status = eitherUserInDB.right().value();
106             if (!ActionStatus.USER_NOT_FOUND.equals(status) && !ActionStatus.USER_INACTIVE.equals(status)) {
107                 responseFormat = componentsUtils.getResponseFormat(eitherUserInDB.right().value(), newUser.getUserId());
108                 handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.ADD_USER);
109                 return Either.right(responseFormat);
110             }
111         } else {// User exist in DB
112             userFromDb = eitherUserInDB.left().value();
113             if (userFromDb.getStatus() == UserStatusEnum.ACTIVE) {
114                 responseFormat = componentsUtils.getResponseFormatByUserId(ActionStatus.USER_ALREADY_EXIST, newUser.getUserId());
115                 log.debug("createUser method - user with id {} already exist with id: {}", modifier.getUserId(), userFromDb.getUserId());
116                 handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.ADD_USER);
117                 return Either.right(responseFormat);
118             }
119         }
120
121         newUser.setStatus(UserStatusEnum.ACTIVE);
122
123         // validate Email
124         if (newUser.getEmail() != null && !userAdminValidator.validateEmail(newUser.getEmail())) {
125             log.debug("createUser method - user has invalid email = {}", modifier.getUserId());
126             responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_EMAIL_ADDRESS, newUser.getEmail());
127             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.ADD_USER);
128             return Either.right(responseFormat);
129         }
130
131         // validate Role
132         if (newUser.getRole() == null || newUser.getRole().length() == 0) {
133             newUser.setRole(Role.DESIGNER.name());
134         } else {
135             if (!userAdminValidator.validateRole(newUser.getRole())) {
136                 log.debug("createUser method - user has invalid role = {}", modifier.getUserId());
137                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_ROLE, newUser.getRole());
138                 handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.ADD_USER);
139                 return Either.right(responseFormat);
140             }
141         }
142
143         // handle last login if user is import
144         if (newUser.getLastLoginTime() == null) {
145             newUser.setLastLoginTime(0L);
146         }
147
148         Either<User, StorageOperationStatus> addOrUpdateUserReq;
149
150         if (ActionStatus.USER_INACTIVE.equals(eitherUserInDB.right().value())) { // user
151                                                                                     // exist
152                                                                                     // with
153                                                                                     // inactive
154                                                                                     // state
155                                                                                     // -
156                                                                                     // update
157                                                                                     // user
158                                                                                     // data
159             newUser.setLastLoginTime(0L);
160             addOrUpdateUserReq = userAdminOperation.updateUserData(newUser);
161
162         } else { // user not exist - create new user
163
164             if (newUser.getUserId() != null && !userAdminValidator.validateUserId(newUser.getUserId())) {
165                 log.debug("createUser method - user has invalid userId = {}", modifier.getUserId());
166                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_USER_ID, newUser.getUserId());
167                 handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.ADD_USER);
168                 return Either.right(responseFormat);
169             }
170             addOrUpdateUserReq = userAdminOperation.saveUserData(newUser);
171         }
172
173         if (addOrUpdateUserReq.isRight() || addOrUpdateUserReq.left().value() == null) {
174             log.debug("createUser method - failed to create user");
175             Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(addOrUpdateUserReq.right().value())));
176         }
177         log.debug("createUser method - user created");
178         User createdUser = addOrUpdateUserReq.left().value();
179         responseFormat = componentsUtils.getResponseFormat(ActionStatus.CREATED);
180         handleAuditing(modifier, null, createdUser, responseFormat, AuditingActionEnum.ADD_USER);
181         return Either.left(createdUser);
182     }
183
184     @Override
185     public Either<User, ResponseFormat> updateUserRole(User modifier, String userIdToUpdate, String userRole) {
186
187         ResponseFormat responseFormat;
188         String modifierUserId = modifier.getUserId();
189
190         if (modifierUserId == null) {
191             modifier.setUserId("UNKNOWN");
192             log.debug("updateUserRole method -  user header is missing");
193             responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
194             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.UPDATE_USER);
195             return Either.right(responseFormat);
196         }
197
198         Either<User, ActionStatus> eitherCreator = getUser(modifierUserId, false);
199         if (eitherCreator.isRight() || eitherCreator.left().value() == null) {
200             log.debug("updateUserRole method - user is not listed. userId = {}", modifier.getUserId());
201             responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
202             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.UPDATE_USER);
203             return Either.right(responseFormat);
204         }
205
206         modifier = eitherCreator.left().value();
207         if (!modifier.getRole().equals(UserRoleEnum.ADMIN.getName())) {
208             log.debug("updateUserRole method - user is not admin. userId = {}", modifier.getUserId());
209             responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
210             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.UPDATE_USER);
211             return Either.right(responseFormat);
212         }
213
214         if (modifier.getUserId().equals(userIdToUpdate)) {
215             log.debug("updateUserRole method - admin role can only be updated by other admin. userId = {}", modifier.getUserId());
216             responseFormat = componentsUtils.getResponseFormat(ActionStatus.UPDATE_USER_ADMIN_CONFLICT);
217             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.UPDATE_USER);
218             return Either.right(responseFormat);
219         }
220
221         Either<User, ActionStatus> userToUpdateReq = getUser(userIdToUpdate, false);
222         if (userToUpdateReq.isRight() || userToUpdateReq.left().value() == null) {
223             log.debug("updateUserRole method - user not found. userId = {}", modifier.getUserId());
224             responseFormat = componentsUtils.getResponseFormat(ActionStatus.USER_NOT_FOUND, userIdToUpdate);
225             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.UPDATE_USER);
226             return Either.right(responseFormat);
227         }
228
229         if (!userAdminValidator.validateRole(userRole)) {
230             log.debug("updateUserRole method - user has invalid role = {}", modifier.getUserId());
231             responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_ROLE, userRole);
232             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.UPDATE_USER);
233             return Either.right(responseFormat);
234         }
235
236         User newUser = new User();
237         newUser.setRole(userRole);
238         newUser.setUserId(userIdToUpdate);
239         User userToUpdate = userToUpdateReq.left().value();
240         // if(!userRole.equals(UserRoleEnum.ADMIN.getName())){ //this is in
241         // comment until admin will be able to do do check-in/check-out from the
242         // UI
243
244         Either<List<Edge>, StorageOperationStatus> userPendingTasksReq = getPendingUserPendingTasksWithCommit(userToUpdate);
245         if (userPendingTasksReq.isRight()) {
246             log.debug("updateUserRole method - failed to get user pending tasks list userId {}", userIdToUpdate);
247             return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(userPendingTasksReq.right().value())));
248         }
249
250         List<Edge> userPendingTasks = userPendingTasksReq.left().value();
251         if (!userPendingTasks.isEmpty()) {
252             log.debug("updateUserRole method - User canot be updated, user have pending projects userId {}", userIdToUpdate);
253
254             String userTasksStatusForErrorMessage = getUserPendingTaskStatusByRole(UserRoleEnum.valueOf(userToUpdate.getRole()));
255             String userInfo = userToUpdate.getFirstName() + " " + userToUpdate.getLastName() + '(' + userToUpdate.getUserId() + ')';
256             responseFormat = componentsUtils.getResponseFormat(ActionStatus.CANNOT_UPDATE_USER_WITH_ACTIVE_ELEMENTS, userInfo, userTasksStatusForErrorMessage);
257             handleAuditing(modifier, userToUpdate, userToUpdate, responseFormat, AuditingActionEnum.UPDATE_USER);
258             return Either.right(responseFormat);
259         }
260         // }
261         Either<User, StorageOperationStatus> updateUserReq = userAdminOperation.updateUserData(newUser);
262
263         if (updateUserReq.isRight() || updateUserReq.left().value() == null) {
264             log.debug("updateUser method - failed to update user data. userId = {}", modifier.getUserId());
265             return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(updateUserReq.right().value())));
266         }
267
268         responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
269         User updatedUser = updateUserReq.left().value();
270         handleAuditing(modifier, userToUpdate, updatedUser, responseFormat, AuditingActionEnum.UPDATE_USER);
271         return Either.left(updatedUser);
272     }
273
274     @Override
275     public Either<List<User>, ResponseFormat> getAllAdminUsers(ServletContext context) {
276         Either<List<User>, ActionStatus> response = userAdminOperation.getAllUsersWithRole(Role.ADMIN.name(), null);
277
278         if (response.isRight()) {
279             ResponseFormat responseFormat = componentsUtils.getResponseFormat(response.right().value());
280             return Either.right(responseFormat);
281         }
282         return Either.left(response.left().value());
283     }
284
285     @Override
286     public Either<List<User>, ResponseFormat> getUsersList(String modifierAttId, List<String> roles, String rolesStr) {
287         ResponseFormat responseFormat;
288         User user = new User();
289         if (modifierAttId == null) {
290             user.setUserId("UNKNOWN");
291             responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
292             handleGetUsersListAuditing(user, responseFormat, rolesStr);
293             return Either.right(responseFormat);
294         }
295         Either<User, ActionStatus> userResult = getUser(modifierAttId, false);
296         if (userResult.isRight()) {
297             user.setUserId(modifierAttId);
298             if (userResult.right().value().equals(ActionStatus.USER_NOT_FOUND)) {
299                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
300             } else {
301                 responseFormat = componentsUtils.getResponseFormat(userResult.right().value());
302             }
303             BeEcompErrorManager.getInstance().logBeUserMissingError("Get users per roles", modifierAttId);
304
305             handleGetUsersListAuditing(user, responseFormat, rolesStr);
306             return Either.right(responseFormat);
307         }
308         user = userResult.left().value();
309         Either<List<User>, ResponseFormat> getResponse = null;
310         List<User> resultList = new ArrayList<>();
311         if (roles != null && !roles.isEmpty()) {
312             for (String role : roles) {
313                 if (!userAdminValidator.validateRole(role)) {
314                     responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_ROLE, role);
315                     handleGetUsersListAuditing(user, responseFormat, rolesStr);
316                     return Either.right(responseFormat);
317                 }
318                 getResponse = getUsersPerRole(role, user, rolesStr);
319                 resultList.addAll(getResponse.left().value());
320             }
321         } else {
322             rolesStr = "All";
323             getResponse = getUsersPerRole(null, user, rolesStr);
324             resultList.addAll(getResponse.left().value());
325         }
326         responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
327         handleGetUsersListAuditing(user, responseFormat, rolesStr);
328         return Either.left(resultList);
329     }
330
331     private Either<List<User>, ResponseFormat> getUsersPerRole(String role, User user, String rolesStr) {
332         ResponseFormat responseFormat;
333         Either<List<User>, ActionStatus> response = userAdminOperation.getAllUsersWithRole(role, UserStatusEnum.ACTIVE.name());
334         if (response.isRight()) {
335             responseFormat = componentsUtils.getResponseFormat(response.right().value());
336             handleGetUsersListAuditing(user, responseFormat, rolesStr);
337             return Either.right(responseFormat);
338         }
339         return Either.left(response.left().value());
340     }
341
342     private void handleGetUsersListAuditing(User user, ResponseFormat responseFormat, String details) {
343         componentsUtils.auditGetUsersList(AuditingActionEnum.GET_USERS_LIST, user, details, responseFormat);
344     }
345
346     private void handleAuditing(User modifier, User userBefor, User userAfter, ResponseFormat responseFormat, AuditingActionEnum actionName) {
347         componentsUtils.auditAdminUserAction(actionName, modifier, userBefor, userAfter, responseFormat);
348     }
349
350     private void handleUserAccessAuditing(User user, ResponseFormat responseFormat, AuditingActionEnum actionName) {
351         componentsUtils.auditUserAccess(actionName, user, responseFormat);
352     }
353
354     @Override
355     public Either<User, ResponseFormat> deActivateUser(User modifier, String userUniuqeIdToDeactive) {
356
357         ResponseFormat responseFormat;
358         String userId = modifier.getUserId();
359
360         if (userId == null) {
361             modifier.setUserId("UNKNOWN");
362             log.debug("deActivateUser method -  user header is missing");
363             responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
364             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.DELETE_USER);
365             return Either.right(responseFormat);
366         }
367
368         Either<User, ActionStatus> eitherCreator = getUser(userId, false);
369         if (eitherCreator.isRight() || eitherCreator.left().value() == null) {
370             log.debug("deActivateUser method - user is not listed. userId = {}", modifier.getUserId());
371             responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
372             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.DELETE_USER);
373             return Either.right(responseFormat);
374         }
375
376         modifier = eitherCreator.left().value();
377
378         if (!modifier.getRole().equals(UserRoleEnum.ADMIN.getName())) {
379             log.debug("deActivateUser method - user is not admin. userId = {}", modifier.getUserId());
380             responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
381             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.DELETE_USER);
382             return Either.right(responseFormat);
383         }
384
385         if (modifier.getUserId().equals(userUniuqeIdToDeactive)) {
386             log.debug("deActivateUser deActivateUser - admin can only be deactivate by other admin. userId = {}", modifier.getUserId());
387             responseFormat = componentsUtils.getResponseFormat(ActionStatus.DELETE_USER_ADMIN_CONFLICT);
388             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.DELETE_USER);
389             return Either.right(responseFormat);
390         }
391
392         Either<User, ActionStatus> getUserToDeleteResponse = getUser(userUniuqeIdToDeactive, false);
393         if (getUserToDeleteResponse.isRight() || getUserToDeleteResponse.left().value() == null) {
394             log.debug("deActivateUser method - failed to get user by id {}", userUniuqeIdToDeactive);
395             responseFormat = componentsUtils.getResponseFormat(ActionStatus.USER_NOT_FOUND, userUniuqeIdToDeactive);
396             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.DELETE_USER);
397             return Either.right(componentsUtils.getResponseFormat(getUserToDeleteResponse.right().value(), userUniuqeIdToDeactive));
398         }
399
400         User userToDeactivate = getUserToDeleteResponse.left().value();
401         if (userToDeactivate.getStatus().equals(UserStatusEnum.INACTIVE)) {
402             log.debug("deActivateUser method - User already inactive", userUniuqeIdToDeactive);
403             responseFormat = componentsUtils.getResponseFormat(ActionStatus.USER_NOT_FOUND, userUniuqeIdToDeactive);
404             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.DELETE_USER);
405             return Either.right(responseFormat);
406         }
407
408         Either<List<Edge>, StorageOperationStatus> userPendingTasksReq = getPendingUserPendingTasksWithCommit(userToDeactivate);
409         if (userPendingTasksReq.isRight()) {
410             log.debug("deActivateUser method - failed to get user pending tasks list", userUniuqeIdToDeactive);
411             return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(userPendingTasksReq.right().value())));
412         }
413
414         List<Edge> userPendingTasks = userPendingTasksReq.left().value();
415         if (userPendingTasks.size() > 0) {
416             log.debug("deActivateUser method - User canot be deleted, user have pending projects", userUniuqeIdToDeactive);
417
418             String userTasksStatusForErrorMessage = getUserPendingTaskStatusByRole(UserRoleEnum.valueOf(userToDeactivate.getRole()));
419             String userInfo = userToDeactivate.getFirstName() + " " + userToDeactivate.getLastName() + '(' + userToDeactivate.getUserId() + ')';
420             responseFormat = componentsUtils.getResponseFormat(ActionStatus.CANNOT_DELETE_USER_WITH_ACTIVE_ELEMENTS, userInfo, userTasksStatusForErrorMessage);
421             handleAuditing(modifier, userToDeactivate, userToDeactivate, responseFormat, AuditingActionEnum.DELETE_USER);
422             return Either.right(responseFormat);
423         }
424
425         Either<User, StorageOperationStatus> deactivateUserReq = userAdminOperation.deActivateUser(userToDeactivate);
426         if (deactivateUserReq.isRight()) {
427             log.debug("deActivateUser method - failed to deactivate user", userUniuqeIdToDeactive);
428             return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(deactivateUserReq.right().value())));
429         }
430         User deactivateUser = deactivateUserReq.left().value();
431         responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
432         handleAuditing(modifier, userToDeactivate, null, responseFormat, AuditingActionEnum.DELETE_USER);
433         return Either.left(deactivateUser);
434     }
435
436     @Override
437     public Either<User, ResponseFormat> authorize(User authUser) {
438
439         ResponseFormat responseFormat;
440
441         String userId = authUser.getUserId();
442
443         if (userId == null) {
444             authUser.setUserId("UNKNOWN");
445             log.debug("deActivateUser method -  user header is missing");
446             responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
447             handleUserAccessAuditing(authUser, responseFormat, AuditingActionEnum.USER_ACCESS);
448             return Either.right(responseFormat);
449         }
450
451         Either<User, ActionStatus> eitherCreator = getUser(userId, false);
452         if (eitherCreator.isRight()) {
453             if (eitherCreator.right().value() == ActionStatus.USER_NOT_FOUND || eitherCreator.right().value() == ActionStatus.USER_INACTIVE) {
454                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_ACCESS);
455                 handleUserAccessAuditing(authUser, responseFormat, AuditingActionEnum.USER_ACCESS);
456                 return Either.right(responseFormat);
457             } else {
458                 return Either.right(componentsUtils.getResponseFormatByUser(eitherCreator.right().value(), authUser));
459             }
460         } else {
461             if (eitherCreator.left().value() == null) {
462                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
463                 return Either.right(responseFormat);
464             }
465         }
466
467         User user = eitherCreator.left().value();
468
469         String firstName = authUser.getFirstName();
470         if (firstName != null && firstName.isEmpty() == false && !firstName.equals(user.getFirstName())) {
471             user.setFirstName(firstName);
472         }
473
474         String lastName = authUser.getLastName();
475         if (lastName != null && lastName.isEmpty() == false && !lastName.equals(user.getLastName())) {
476             user.setLastName(lastName);
477         }
478
479         String email = authUser.getEmail();
480         if (email != null && false == email.isEmpty() && !email.equals(user.getEmail())) {
481             user.setEmail(email);
482         }
483
484         // last login time stamp handle
485         user.setLastLoginTime();
486
487         Either<User, StorageOperationStatus> updateUserReq = userAdminOperation.updateUserData(user);
488
489         if (updateUserReq.isRight()) {
490             responseFormat = componentsUtils.getResponseFormatByUser(eitherCreator.right().value(), user);
491             handleUserAccessAuditing(user, responseFormat, AuditingActionEnum.USER_ACCESS);
492             return Either.right(componentsUtils.getResponseFormatByUser(eitherCreator.right().value(), user));
493         }
494
495         User updatedUser = updateUserReq.left().value();
496
497         Long lastLoginTime = user.getLastLoginTime();
498         if (lastLoginTime != null) {
499             updatedUser.setLastLoginTime(lastLoginTime);
500         } else {
501             updatedUser.setLastLoginTime(new Long(0));
502         }
503
504         responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
505         handleUserAccessAuditing(updatedUser, responseFormat, AuditingActionEnum.USER_ACCESS);
506         ASDCKpiApi.countUsersAuthorizations();
507         return Either.left(updatedUser);
508     }
509
510     /*
511      * The method updates user credentials only, the role is neglected The role updated through updateRole method
512      */
513     public Either<User, ResponseFormat> updateUserCredentials(User updatedUserCred) {
514
515         ResponseFormat responseFormat;
516
517         String userId = updatedUserCred.getUserId();
518
519         if (userId == null) {
520             updatedUserCred.setUserId("UNKNOWN");
521             log.debug("updateUserCredentials method - user header is missing");
522             responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
523             handleUserAccessAuditing(updatedUserCred, responseFormat, AuditingActionEnum.USER_ACCESS);
524             return Either.right(responseFormat);
525         }
526
527         Either<User, ActionStatus> eitherCreator = getUser(userId, false);
528         if (eitherCreator.isRight()) {
529             ActionStatus status = eitherCreator.right().value();
530             if (status == ActionStatus.USER_NOT_FOUND || status == ActionStatus.USER_INACTIVE) {
531                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_ACCESS);
532                 handleUserAccessAuditing(updatedUserCred, responseFormat, AuditingActionEnum.USER_ACCESS);
533                 return Either.right(responseFormat);
534             } else {
535                 return Either.right(componentsUtils.getResponseFormatByUser(status, updatedUserCred));
536             }
537         } else {
538             if (eitherCreator.left().value() == null) {
539                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
540                 return Either.right(responseFormat);
541             }
542         }
543
544         User user = eitherCreator.left().value();
545
546         String firstName = updatedUserCred.getFirstName();
547         if (firstName != null && firstName.isEmpty() == false && !firstName.equals(user.getFirstName())) {
548             user.setFirstName(firstName);
549         }
550
551         String lastName = updatedUserCred.getLastName();
552         if (lastName != null && lastName.isEmpty() == false && !lastName.equals(user.getLastName())) {
553             user.setLastName(lastName);
554         }
555
556         String email = updatedUserCred.getEmail();
557         if (email != null && false == email.isEmpty() && !email.equals(user.getEmail())) {
558             user.setEmail(email);
559         }
560
561         if (updatedUserCred.getLastLoginTime() != null && user.getLastLoginTime() != null) {
562             if (updatedUserCred.getLastLoginTime() > user.getLastLoginTime()) {
563                 user.setLastLoginTime(updatedUserCred.getLastLoginTime());
564             }
565         } else if (updatedUserCred.getLastLoginTime() != null && user.getLastLoginTime() == null) {
566             user.setLastLoginTime(updatedUserCred.getLastLoginTime());
567         }
568
569         Either<User, StorageOperationStatus> updateUserReq = userAdminOperation.updateUserData(user);
570
571         if (updateUserReq.isRight()) {
572             responseFormat = componentsUtils.getResponseFormatByUser(eitherCreator.right().value(), user);
573             handleUserAccessAuditing(user, responseFormat, AuditingActionEnum.USER_ACCESS);
574             return Either.right(componentsUtils.getResponseFormatByUser(eitherCreator.right().value(), user));
575         }
576
577         User updatedUser = updateUserReq.left().value();
578
579         responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
580         handleUserAccessAuditing(updatedUser, responseFormat, AuditingActionEnum.USER_ACCESS);
581         return Either.left(updatedUser);
582     }
583
584     private Either<List<Edge>, StorageOperationStatus> getPendingUserPendingTasksWithCommit(User user) {
585
586         Either<List<Edge>, StorageOperationStatus> result = null;
587
588         try {
589             UserRoleEnum userRole = UserRoleEnum.valueOf(user.getRole());
590             Map<String, Object> properties = new HashMap<String, Object>();
591             switch (userRole) {
592             case DESIGNER:
593             case PRODUCT_STRATEGIST:
594             case PRODUCT_MANAGER:
595                 properties.put(GraphPropertiesDictionary.STATE.getProperty(), LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name());
596                 return userAdminOperation.getUserPendingTasksList(user, properties);
597             case TESTER:
598                 properties.put(GraphPropertiesDictionary.STATE.getProperty(), LifecycleStateEnum.CERTIFICATION_IN_PROGRESS.name());
599                 return userAdminOperation.getUserPendingTasksList(user, properties);
600             case ADMIN:
601                 properties.put(GraphPropertiesDictionary.STATE.getProperty(), LifecycleStateEnum.CERTIFICATION_IN_PROGRESS.name());
602                 properties.put(GraphPropertiesDictionary.STATE.getProperty(), LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name());
603                 return userAdminOperation.getUserPendingTasksList(user, properties);
604             default:
605                 return Either.left(new ArrayList<>());
606             }
607         } finally {
608             // commit will be perform outside!!!
609             if (result == null || result.isRight()) {
610                 log.debug("getUserPendingTasksList failed to perform fetching");
611                 titanDao.rollback();
612             } else {
613                 titanDao.commit();
614             }
615         }
616     }
617
618     private String getUserPendingTaskStatusByRole(UserRoleEnum role) {
619
620         switch (role) {
621         case DESIGNER:
622         case PRODUCT_STRATEGIST:
623         case PRODUCT_MANAGER:
624             return "checked-out";
625
626         case TESTER:
627             return "in-certification";
628         case ADMIN:
629             return "in-certification/checked-out";
630         default:
631             return "";
632         }
633     }
634 }