Catalog alignment
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / user / UserBusinessLogicExt.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
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 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;
39
40 import java.util.ArrayList;
41 import java.util.List;
42
43 @org.springframework.stereotype.Component
44 public class UserBusinessLogicExt {
45
46     private static final Logger log = Logger.getLogger(UserBusinessLogicExt.class);
47
48     private final UserBusinessLogic userBusinessLogic;
49     private final UserAdminOperation userAdminOperation;
50     private final LifecycleBusinessLogic lifecycleBusinessLogic;
51     private final ComponentsUtils componentsUtils;
52
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;
59     }
60
61
62     public User deActivateUser(String modifierUserId, String userIdToDeactivate) {
63
64         User modifier = userBusinessLogic.getValidModifier(modifierUserId, userIdToDeactivate, AuditingActionEnum.DELETE_USER);
65
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);
70         }
71
72         handleTasksInProgress(userToDeactivate);
73
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;
79     }
80
81     private void handleTasksInProgress(User userToDeactivate) {
82         String userIdToDeactivate = userToDeactivate.getUserId();
83         List<Component> userPendingTasks = userAdminOperation
84                 .getUserActiveComponents(userToDeactivate, getDeactivateUserStateLimitations());
85         if (userPendingTasks.isEmpty()) {
86             return;
87         }
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);
96                 continue;
97             }
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());
102             }
103         }
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);
109         }
110     }
111
112     private LifeCycleTransitionEnum getLifeCycleTransition(LifecycleStateEnum currentState) {
113         LifeCycleTransitionEnum transition = null;
114         if (LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT == currentState) {
115             transition = LifeCycleTransitionEnum.CHECKIN;
116         }
117         return transition;
118     }
119
120     private List<Object> getDeactivateUserStateLimitations() {
121         List<Object> properties = new ArrayList<>();
122         properties.add(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name());
123         return properties;
124     }
125
126     private void handleAuditing(User modifier, User userBefor, User userAfter, ResponseFormat responseFormat, AuditingActionEnum actionName) {
127         componentsUtils.auditAdminUserAction(actionName, modifier, userBefor, userAfter, responseFormat);
128     }
129
130 }