new unit tests for sdc-be
[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 (eitherUserInDB.isRight() && ActionStatus.USER_INACTIVE.equals(eitherUserInDB.right().value())) { 
151                 // user exist with inactive state - update user data
152             newUser.setLastLoginTime(0L);
153             addOrUpdateUserReq = userAdminOperation.updateUserData(newUser);
154
155         } else { // user not exist - create new user
156
157             if (newUser.getUserId() != null && !userAdminValidator.validateUserId(newUser.getUserId())) {
158                 log.debug("createUser method - user has invalid userId = {}", modifier.getUserId());
159                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_USER_ID, newUser.getUserId());
160                 handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.ADD_USER);
161                 return Either.right(responseFormat);
162             }
163             addOrUpdateUserReq = userAdminOperation.saveUserData(newUser);
164         }
165
166         if (addOrUpdateUserReq.isRight() || addOrUpdateUserReq.left().value() == null) {
167             log.debug("createUser method - failed to create user");
168             return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(addOrUpdateUserReq.right().value())));
169         }
170         log.debug("createUser method - user created");
171         User createdUser = addOrUpdateUserReq.left().value();
172         responseFormat = componentsUtils.getResponseFormat(ActionStatus.CREATED);
173         handleAuditing(modifier, null, createdUser, responseFormat, AuditingActionEnum.ADD_USER);
174         return Either.left(createdUser);
175     }
176
177     @Override
178     public Either<User, ResponseFormat> updateUserRole(User modifier, String userIdToUpdate, String userRole) {
179
180         ResponseFormat responseFormat;
181         String modifierUserId = modifier.getUserId();
182
183         if (modifierUserId == null) {
184             modifier.setUserId("UNKNOWN");
185             log.debug("updateUserRole method -  user header is missing");
186             responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
187             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.UPDATE_USER);
188             return Either.right(responseFormat);
189         }
190
191         Either<User, ActionStatus> eitherCreator = getUser(modifierUserId, false);
192         if (eitherCreator.isRight() || eitherCreator.left().value() == null) {
193             log.debug("updateUserRole method - user is not listed. userId = {}", modifier.getUserId());
194             responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
195             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.UPDATE_USER);
196             return Either.right(responseFormat);
197         }
198
199         modifier = eitherCreator.left().value();
200         if (!modifier.getRole().equals(UserRoleEnum.ADMIN.getName())) {
201             log.debug("updateUserRole method - user is not admin. userId = {}", modifier.getUserId());
202             responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
203             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.UPDATE_USER);
204             return Either.right(responseFormat);
205         }
206
207         if (modifier.getUserId().equals(userIdToUpdate)) {
208             log.debug("updateUserRole method - admin role can only be updated by other admin. userId = {}", modifier.getUserId());
209             responseFormat = componentsUtils.getResponseFormat(ActionStatus.UPDATE_USER_ADMIN_CONFLICT);
210             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.UPDATE_USER);
211             return Either.right(responseFormat);
212         }
213
214         Either<User, ActionStatus> userToUpdateReq = getUser(userIdToUpdate, false);
215         if (userToUpdateReq.isRight() || userToUpdateReq.left().value() == null) {
216             log.debug("updateUserRole method - user not found. userId = {}", modifier.getUserId());
217             responseFormat = componentsUtils.getResponseFormat(ActionStatus.USER_NOT_FOUND, userIdToUpdate);
218             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.UPDATE_USER);
219             return Either.right(responseFormat);
220         }
221
222         if (!userAdminValidator.validateRole(userRole)) {
223             log.debug("updateUserRole method - user has invalid role = {}", modifier.getUserId());
224             responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_ROLE, userRole);
225             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.UPDATE_USER);
226             return Either.right(responseFormat);
227         }
228
229         User newUser = new User();
230         newUser.setRole(userRole);
231         newUser.setUserId(userIdToUpdate);
232         User userToUpdate = userToUpdateReq.left().value();
233         // if(!userRole.equals(UserRoleEnum.ADMIN.getName())){ //this is in
234         // comment until admin will be able to do do check-in/check-out from the
235         // UI
236
237         Either<List<Edge>, StorageOperationStatus> userPendingTasksReq = getPendingUserPendingTasksWithCommit(userToUpdate);
238         if (userPendingTasksReq.isRight()) {
239             log.debug("updateUserRole method - failed to get user pending tasks list userId {}", userIdToUpdate);
240             return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(userPendingTasksReq.right().value())));
241         }
242
243         List<Edge> userPendingTasks = userPendingTasksReq.left().value();
244         if (!userPendingTasks.isEmpty()) {
245             log.debug("updateUserRole method - User canot be updated, user have pending projects userId {}", userIdToUpdate);
246
247             String userTasksStatusForErrorMessage = getUserPendingTaskStatusByRole(UserRoleEnum.valueOf(userToUpdate.getRole()));
248             String userInfo = userToUpdate.getFirstName() + " " + userToUpdate.getLastName() + '(' + userToUpdate.getUserId() + ')';
249             responseFormat = componentsUtils.getResponseFormat(ActionStatus.CANNOT_UPDATE_USER_WITH_ACTIVE_ELEMENTS, userInfo, userTasksStatusForErrorMessage);
250             handleAuditing(modifier, userToUpdate, userToUpdate, responseFormat, AuditingActionEnum.UPDATE_USER);
251             return Either.right(responseFormat);
252         }
253         // }
254         Either<User, StorageOperationStatus> updateUserReq = userAdminOperation.updateUserData(newUser);
255
256         if (updateUserReq.isRight() || updateUserReq.left().value() == null) {
257             log.debug("updateUser method - failed to update user data. userId = {}", modifier.getUserId());
258             return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(updateUserReq.right().value())));
259         }
260
261         responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
262         User updatedUser = updateUserReq.left().value();
263         handleAuditing(modifier, userToUpdate, updatedUser, responseFormat, AuditingActionEnum.UPDATE_USER);
264         return Either.left(updatedUser);
265     }
266
267     @Override
268     public Either<List<User>, ResponseFormat> getAllAdminUsers(ServletContext context) {
269         Either<List<User>, ActionStatus> response = userAdminOperation.getAllUsersWithRole(Role.ADMIN.name(), null);
270
271         if (response.isRight()) {
272             ResponseFormat responseFormat = componentsUtils.getResponseFormat(response.right().value());
273             return Either.right(responseFormat);
274         }
275         return Either.left(response.left().value());
276     }
277
278     @Override
279     public Either<List<User>, ResponseFormat> getUsersList(String modifierAttId, List<String> roles, String rolesStr) {
280         ResponseFormat responseFormat;
281         User user = new User();
282         if (modifierAttId == null) {
283             user.setUserId("UNKNOWN");
284             responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
285             handleGetUsersListAuditing(user, responseFormat, rolesStr);
286             return Either.right(responseFormat);
287         }
288         Either<User, ActionStatus> userResult = getUser(modifierAttId, false);
289         if (userResult.isRight()) {
290             user.setUserId(modifierAttId);
291             if (userResult.right().value().equals(ActionStatus.USER_NOT_FOUND)) {
292                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
293             } else {
294                 responseFormat = componentsUtils.getResponseFormat(userResult.right().value());
295             }
296             BeEcompErrorManager.getInstance().logBeUserMissingError("Get users per roles", modifierAttId);
297
298             handleGetUsersListAuditing(user, responseFormat, rolesStr);
299             return Either.right(responseFormat);
300         }
301         user = userResult.left().value();
302         Either<List<User>, ResponseFormat> getResponse = null;
303         List<User> resultList = new ArrayList<>();
304         if (roles != null && !roles.isEmpty()) {
305             for (String role : roles) {
306                 if (!userAdminValidator.validateRole(role)) {
307                     responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_ROLE, role);
308                     handleGetUsersListAuditing(user, responseFormat, rolesStr);
309                     return Either.right(responseFormat);
310                 }
311                 getResponse = getUsersPerRole(role, user, rolesStr);
312                 resultList.addAll(getResponse.left().value());
313             }
314         } else {
315             rolesStr = "All";
316             getResponse = getUsersPerRole(null, user, rolesStr);
317             if(getResponse.isRight()) {
318                 return getResponse;
319             }
320             resultList.addAll(getResponse.left().value());
321         }
322         responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
323         handleGetUsersListAuditing(user, responseFormat, rolesStr);
324         return Either.left(resultList);
325     }
326
327     private Either<List<User>, ResponseFormat> getUsersPerRole(String role, User user, String rolesStr) {
328         ResponseFormat responseFormat;
329         Either<List<User>, ActionStatus> response = userAdminOperation.getAllUsersWithRole(role, UserStatusEnum.ACTIVE.name());
330         if (response.isRight()) {
331             responseFormat = componentsUtils.getResponseFormat(response.right().value());
332             handleGetUsersListAuditing(user, responseFormat, rolesStr);
333             return Either.right(responseFormat);
334         }
335         return Either.left(response.left().value());
336     }
337
338     private void handleGetUsersListAuditing(User user, ResponseFormat responseFormat, String details) {
339         componentsUtils.auditGetUsersList(AuditingActionEnum.GET_USERS_LIST, user, details, responseFormat);
340     }
341
342     private void handleAuditing(User modifier, User userBefor, User userAfter, ResponseFormat responseFormat, AuditingActionEnum actionName) {
343         componentsUtils.auditAdminUserAction(actionName, modifier, userBefor, userAfter, responseFormat);
344     }
345
346     private void handleUserAccessAuditing(User user, ResponseFormat responseFormat, AuditingActionEnum actionName) {
347         componentsUtils.auditUserAccess(actionName, user, responseFormat);
348     }
349
350     @Override
351     public Either<User, ResponseFormat> deActivateUser(User modifier, String userUniuqeIdToDeactive) {
352
353         ResponseFormat responseFormat;
354         String userId = modifier.getUserId();
355
356         if (userId == null) {
357             modifier.setUserId("UNKNOWN");
358             log.debug("deActivateUser method -  user header is missing");
359             responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
360             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.DELETE_USER);
361             return Either.right(responseFormat);
362         }
363
364         Either<User, ActionStatus> eitherCreator = getUser(userId, false);
365         if (eitherCreator.isRight() || eitherCreator.left().value() == null) {
366             log.debug("deActivateUser method - user is not listed. userId = {}", modifier.getUserId());
367             responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
368             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.DELETE_USER);
369             return Either.right(responseFormat);
370         }
371
372         modifier = eitherCreator.left().value();
373
374         if (!modifier.getRole().equals(UserRoleEnum.ADMIN.getName())) {
375             log.debug("deActivateUser method - user is not admin. userId = {}", modifier.getUserId());
376             responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
377             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.DELETE_USER);
378             return Either.right(responseFormat);
379         }
380
381         if (modifier.getUserId().equals(userUniuqeIdToDeactive)) {
382             log.debug("deActivateUser deActivateUser - admin can only be deactivate by other admin. userId = {}", modifier.getUserId());
383             responseFormat = componentsUtils.getResponseFormat(ActionStatus.DELETE_USER_ADMIN_CONFLICT);
384             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.DELETE_USER);
385             return Either.right(responseFormat);
386         }
387
388         Either<User, ActionStatus> getUserToDeleteResponse = getUser(userUniuqeIdToDeactive, false);
389         if (getUserToDeleteResponse.isRight() || getUserToDeleteResponse.left().value() == null) {
390             log.debug("deActivateUser method - failed to get user by id {}", userUniuqeIdToDeactive);
391             responseFormat = componentsUtils.getResponseFormat(ActionStatus.USER_NOT_FOUND, userUniuqeIdToDeactive);
392             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.DELETE_USER);
393             return Either.right(componentsUtils.getResponseFormat(getUserToDeleteResponse.right().value(), userUniuqeIdToDeactive));
394         }
395
396         User userToDeactivate = getUserToDeleteResponse.left().value();
397         if (userToDeactivate.getStatus().equals(UserStatusEnum.INACTIVE)) {
398             log.debug("deActivateUser method - User already inactive", userUniuqeIdToDeactive);
399             responseFormat = componentsUtils.getResponseFormat(ActionStatus.USER_NOT_FOUND, userUniuqeIdToDeactive);
400             handleAuditing(modifier, null, null, responseFormat, AuditingActionEnum.DELETE_USER);
401             return Either.right(responseFormat);
402         }
403
404         Either<List<Edge>, StorageOperationStatus> userPendingTasksReq = getPendingUserPendingTasksWithCommit(userToDeactivate);
405         if (userPendingTasksReq.isRight()) {
406             log.debug("deActivateUser method - failed to get user pending tasks list", userUniuqeIdToDeactive);
407             return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(userPendingTasksReq.right().value())));
408         }
409
410         List<Edge> userPendingTasks = userPendingTasksReq.left().value();
411         if (userPendingTasks.size() > 0) {
412             log.debug("deActivateUser method - User canot be deleted, user have pending projects", userUniuqeIdToDeactive);
413
414             String userTasksStatusForErrorMessage = getUserPendingTaskStatusByRole(UserRoleEnum.valueOf(userToDeactivate.getRole()));
415             String userInfo = userToDeactivate.getFirstName() + " " + userToDeactivate.getLastName() + '(' + userToDeactivate.getUserId() + ')';
416             responseFormat = componentsUtils.getResponseFormat(ActionStatus.CANNOT_DELETE_USER_WITH_ACTIVE_ELEMENTS, userInfo, userTasksStatusForErrorMessage);
417             handleAuditing(modifier, userToDeactivate, userToDeactivate, responseFormat, AuditingActionEnum.DELETE_USER);
418             return Either.right(responseFormat);
419         }
420
421         Either<User, StorageOperationStatus> deactivateUserReq = userAdminOperation.deActivateUser(userToDeactivate);
422         if (deactivateUserReq.isRight()) {
423             log.debug("deActivateUser method - failed to deactivate user", userUniuqeIdToDeactive);
424             return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(deactivateUserReq.right().value())));
425         }
426         User deactivateUser = deactivateUserReq.left().value();
427         responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
428         handleAuditing(modifier, userToDeactivate, null, responseFormat, AuditingActionEnum.DELETE_USER);
429         return Either.left(deactivateUser);
430     }
431
432     @Override
433     public Either<User, ResponseFormat> authorize(User authUser) {
434
435         ResponseFormat responseFormat;
436
437         String userId = authUser.getUserId();
438
439         if (userId == null) {
440             authUser.setUserId("UNKNOWN");
441             log.debug("deActivateUser method -  user header is missing");
442             responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
443             handleUserAccessAuditing(authUser, responseFormat, AuditingActionEnum.USER_ACCESS);
444             return Either.right(responseFormat);
445         }
446
447         Either<User, ActionStatus> eitherCreator = getUser(userId, false);
448         if (eitherCreator.isRight()) {
449             if (eitherCreator.right().value() == ActionStatus.USER_NOT_FOUND || eitherCreator.right().value() == ActionStatus.USER_INACTIVE) {
450                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_ACCESS);
451                 handleUserAccessAuditing(authUser, responseFormat, AuditingActionEnum.USER_ACCESS);
452                 return Either.right(responseFormat);
453             } else {
454                 return Either.right(componentsUtils.getResponseFormatByUser(eitherCreator.right().value(), authUser));
455             }
456         } else {
457             if (eitherCreator.left().value() == null) {
458                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
459                 return Either.right(responseFormat);
460             }
461         }
462
463         User user = eitherCreator.left().value();
464
465         String firstName = authUser.getFirstName();
466         if (firstName != null && firstName.isEmpty() == false && !firstName.equals(user.getFirstName())) {
467             user.setFirstName(firstName);
468         }
469
470         String lastName = authUser.getLastName();
471         if (lastName != null && lastName.isEmpty() == false && !lastName.equals(user.getLastName())) {
472             user.setLastName(lastName);
473         }
474
475         String email = authUser.getEmail();
476         if (email != null && false == email.isEmpty() && !email.equals(user.getEmail())) {
477             user.setEmail(email);
478         }
479
480         // last login time stamp handle
481         user.setLastLoginTime();
482
483         Either<User, StorageOperationStatus> updateUserReq = userAdminOperation.updateUserData(user);
484
485         if (updateUserReq.isRight()) {
486                 ActionStatus convertFromStorageResponse = componentsUtils.convertFromStorageResponse(updateUserReq.right().value());
487             responseFormat = componentsUtils.getResponseFormatByUser(convertFromStorageResponse, user);
488             handleUserAccessAuditing(user, responseFormat, AuditingActionEnum.USER_ACCESS);
489             return Either.right(responseFormat);
490         }
491
492         User updatedUser = updateUserReq.left().value();
493
494         Long lastLoginTime = user.getLastLoginTime();
495         if (lastLoginTime != null) {
496             updatedUser.setLastLoginTime(lastLoginTime);
497         } else {
498             updatedUser.setLastLoginTime(new Long(0));
499         }
500
501         responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
502         handleUserAccessAuditing(updatedUser, responseFormat, AuditingActionEnum.USER_ACCESS);
503         ASDCKpiApi.countUsersAuthorizations();
504         return Either.left(updatedUser);
505     }
506
507     /*
508      * The method updates user credentials only, the role is neglected The role updated through updateRole method
509      */
510     public Either<User, ResponseFormat> updateUserCredentials(User updatedUserCred) {
511
512         ResponseFormat responseFormat;
513
514         String userId = updatedUserCred.getUserId();
515
516         if (userId == null) {
517             updatedUserCred.setUserId("UNKNOWN");
518             log.debug("updateUserCredentials method - user header is missing");
519             responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
520             handleUserAccessAuditing(updatedUserCred, responseFormat, AuditingActionEnum.USER_ACCESS);
521             return Either.right(responseFormat);
522         }
523
524         Either<User, ActionStatus> eitherCreator = getUser(userId, false);
525         if (eitherCreator.isRight()) {
526             ActionStatus status = eitherCreator.right().value();
527             if (status == ActionStatus.USER_NOT_FOUND || status == ActionStatus.USER_INACTIVE) {
528                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_ACCESS);
529                 handleUserAccessAuditing(updatedUserCred, responseFormat, AuditingActionEnum.USER_ACCESS);
530                 return Either.right(responseFormat);
531             } else {
532                 return Either.right(componentsUtils.getResponseFormatByUser(status, updatedUserCred));
533             }
534         } else {
535             if (eitherCreator.left().value() == null) {
536                 responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
537                 return Either.right(responseFormat);
538             }
539         }
540
541         User user = eitherCreator.left().value();
542
543         String firstName = updatedUserCred.getFirstName();
544         if (firstName != null && firstName.isEmpty() == false && !firstName.equals(user.getFirstName())) {
545             user.setFirstName(firstName);
546         }
547
548         String lastName = updatedUserCred.getLastName();
549         if (lastName != null && lastName.isEmpty() == false && !lastName.equals(user.getLastName())) {
550             user.setLastName(lastName);
551         }
552
553         String email = updatedUserCred.getEmail();
554         if (email != null && false == email.isEmpty() && !email.equals(user.getEmail())) {
555             user.setEmail(email);
556         }
557
558         if (updatedUserCred.getLastLoginTime() != null && user.getLastLoginTime() != null) {
559             if (updatedUserCred.getLastLoginTime() > user.getLastLoginTime()) {
560                 user.setLastLoginTime(updatedUserCred.getLastLoginTime());
561             }
562         } else if (updatedUserCred.getLastLoginTime() != null && user.getLastLoginTime() == null) {
563             user.setLastLoginTime(updatedUserCred.getLastLoginTime());
564         }
565
566         Either<User, StorageOperationStatus> updateUserReq = userAdminOperation.updateUserData(user);
567
568         if (updateUserReq.isRight()) {
569                 ActionStatus convertFromStorageResponse = componentsUtils.convertFromStorageResponse(updateUserReq.right().value());
570             responseFormat = componentsUtils.getResponseFormatByUser(convertFromStorageResponse, user);
571             handleUserAccessAuditing(user, responseFormat, AuditingActionEnum.USER_ACCESS);
572             return Either.right(responseFormat);
573         }
574
575         User updatedUser = updateUserReq.left().value();
576
577         responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
578         handleUserAccessAuditing(updatedUser, responseFormat, AuditingActionEnum.USER_ACCESS);
579         return Either.left(updatedUser);
580     }
581
582     private Either<List<Edge>, StorageOperationStatus> getPendingUserPendingTasksWithCommit(User user) {
583
584         Either<List<Edge>, StorageOperationStatus> result = null;
585
586         try {
587             UserRoleEnum userRole = UserRoleEnum.valueOf(user.getRole());
588             Map<String, Object> properties = new HashMap<String, Object>();
589             switch (userRole) {
590             case DESIGNER:
591             case PRODUCT_STRATEGIST:
592             case PRODUCT_MANAGER:
593                 properties.put(GraphPropertiesDictionary.STATE.getProperty(), LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name());
594                 return userAdminOperation.getUserPendingTasksList(user, properties);
595             case TESTER:
596                 properties.put(GraphPropertiesDictionary.STATE.getProperty(), LifecycleStateEnum.CERTIFICATION_IN_PROGRESS.name());
597                 return userAdminOperation.getUserPendingTasksList(user, properties);
598             case ADMIN:
599                 properties.put(GraphPropertiesDictionary.STATE.getProperty(), LifecycleStateEnum.CERTIFICATION_IN_PROGRESS.name());
600                 properties.put(GraphPropertiesDictionary.STATE.getProperty(), LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name());
601                 return userAdminOperation.getUserPendingTasksList(user, properties);
602             default:
603                 return Either.left(new ArrayList<>());
604             }
605         } finally {
606             // commit will be perform outside!!!
607             if (result == null || result.isRight()) {
608                 log.debug("getUserPendingTasksList failed to perform fetching");
609                 titanDao.rollback();
610             } else {
611                 titanDao.commit();
612             }
613         }
614     }
615
616     private String getUserPendingTaskStatusByRole(UserRoleEnum role) {
617
618         switch (role) {
619         case DESIGNER:
620         case PRODUCT_STRATEGIST:
621         case PRODUCT_MANAGER:
622             return "checked-out";
623
624         case TESTER:
625             return "in-certification";
626         case ADMIN:
627             return "in-certification/checked-out";
628         default:
629             return "";
630         }
631     }
632 }