2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2020 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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.be.user;
23 import fj.data.Either;
24 import org.apache.commons.collections.CollectionUtils;
25 import org.openecomp.sdc.be.components.lifecycle.LifecycleBusinessLogic;
26 import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
27 import org.openecomp.sdc.be.dao.api.ActionStatus;
28 import org.openecomp.sdc.be.dao.utils.UserStatusEnum;
29 import org.openecomp.sdc.be.impl.ComponentsUtils;
30 import org.openecomp.sdc.be.model.Component;
31 import org.openecomp.sdc.be.model.LifeCycleTransitionEnum;
32 import org.openecomp.sdc.be.model.LifecycleStateEnum;
33 import org.openecomp.sdc.be.model.User;
34 import org.openecomp.sdc.be.model.operations.impl.UserAdminOperation;
35 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
36 import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode;
37 import org.openecomp.sdc.common.log.wrappers.Logger;
38 import org.openecomp.sdc.exception.ResponseFormat;
40 import java.util.ArrayList;
41 import java.util.List;
43 @org.springframework.stereotype.Component
44 public class UserBusinessLogicExt {
46 private static final Logger log = Logger.getLogger(UserBusinessLogicExt.class);
48 private final UserBusinessLogic userBusinessLogic;
49 private final UserAdminOperation userAdminOperation;
50 private final LifecycleBusinessLogic lifecycleBusinessLogic;
51 private final ComponentsUtils componentsUtils;
53 public UserBusinessLogicExt(UserBusinessLogic userBusinessLogic, UserAdminOperation userAdminOperation,
54 LifecycleBusinessLogic lifecycleBusinessLogic, ComponentsUtils componentsUtils) {
55 this.userBusinessLogic = userBusinessLogic;
56 this.userAdminOperation = userAdminOperation;
57 this.lifecycleBusinessLogic = lifecycleBusinessLogic;
58 this.componentsUtils = componentsUtils;
62 public User deActivateUser(String modifierUserId, String userIdToDeactivate) {
64 User modifier = userBusinessLogic.getValidModifier(modifierUserId, userIdToDeactivate, AuditingActionEnum.DELETE_USER);
66 User userToDeactivate = userBusinessLogic.getUser(userIdToDeactivate, false);
67 if (userToDeactivate.getStatus() == UserStatusEnum.INACTIVE) {
68 log.debug("deActivateUser method - User already inactive", userIdToDeactivate);
69 componentsUtils.auditAdminUserActionAndThrowException(AuditingActionEnum.DELETE_USER, modifier, userToDeactivate, null, ActionStatus.USER_NOT_FOUND, userIdToDeactivate);
72 handleTasksInProgress(userToDeactivate);
74 userAdminOperation.deActivateUser(userToDeactivate);
75 componentsUtils.auditUserAccess(userToDeactivate, ActionStatus.OK);
76 handleAuditing(modifier, userToDeactivate, null, componentsUtils.getResponseFormat(ActionStatus.OK), AuditingActionEnum.DELETE_USER);
77 userBusinessLogic.getFacadeUserOperation().updateUserCache(UserOperationEnum.DEACTIVATE, userToDeactivate.getUserId(), userToDeactivate.getRole());
78 return userToDeactivate;
81 private void handleTasksInProgress(User userToDeactivate) {
82 String userIdToDeactivate = userToDeactivate.getUserId();
83 List<Component> userPendingTasks = userAdminOperation
84 .getUserActiveComponents(userToDeactivate, getDeactivateUserStateLimitations());
85 if (userPendingTasks.isEmpty()) {
88 LifecycleChangeInfoWithAction changeInfo = new LifecycleChangeInfoWithAction("User became inactive");
89 List<String> failedComponents = new ArrayList<>();
90 for (Component component : userPendingTasks) {
91 String componentId = component.getUniqueId();
92 LifecycleStateEnum currentState = component.getLifecycleState();
93 LifeCycleTransitionEnum transition = getLifeCycleTransition(currentState);
94 if (transition == null) {
95 log.debug("Erroneous component state when deactivating user for component {} state is {}", componentId, currentState);
98 Either<? extends Component, ResponseFormat> result = lifecycleBusinessLogic.changeComponentState(component.getComponentType(), componentId, userToDeactivate,
99 transition, changeInfo, false, true);
100 if (result.isRight()) {
101 failedComponents.add(component.getName());
104 if (CollectionUtils.isNotEmpty(failedComponents)) {
105 String componentList = failedComponents.toString();
106 log.error(EcompLoggerErrorCode.DATA_ERROR, "", "", "User cannot be deleted, {} has the following pending projects that cannot be committed: {}", userIdToDeactivate, componentList);
107 String userInfo = userToDeactivate.getFirstName() + " " + userToDeactivate.getLastName() + '(' + userToDeactivate.getUserId() + ')';
108 componentsUtils.auditAdminUserActionAndThrowException(AuditingActionEnum.DELETE_USER, null, userToDeactivate, null, ActionStatus.CANNOT_DELETE_USER_WITH_ACTIVE_ELEMENTS, userInfo, componentList);
112 private LifeCycleTransitionEnum getLifeCycleTransition(LifecycleStateEnum currentState) {
113 LifeCycleTransitionEnum transition = null;
114 if (LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT == currentState) {
115 transition = LifeCycleTransitionEnum.CHECKIN;
120 private List<Object> getDeactivateUserStateLimitations() {
121 List<Object> properties = new ArrayList<>();
122 properties.add(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name());
126 private void handleAuditing(User modifier, User userBefor, User userAfter, ResponseFormat responseFormat, AuditingActionEnum actionName) {
127 componentsUtils.auditAdminUserAction(actionName, modifier, userBefor, userAfter, responseFormat);