catalog-be servlets refactoring
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / servlets / UserAdminServlet.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.servlets;
22
23 import com.jcabi.aspects.Loggable;
24 import fj.data.Either;
25 import io.swagger.annotations.*;
26 import javax.inject.Inject;
27 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
28 import org.openecomp.sdc.be.components.impl.GroupBusinessLogic;
29 import org.openecomp.sdc.be.config.BeEcompErrorManager;
30 import org.openecomp.sdc.be.dao.api.ActionStatus;
31 import org.openecomp.sdc.be.impl.ComponentsUtils;
32 import org.openecomp.sdc.be.model.User;
33 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
34 import org.openecomp.sdc.be.user.UserBusinessLogic;
35 import org.openecomp.sdc.common.api.Constants;
36 import org.openecomp.sdc.common.log.wrappers.Logger;
37 import org.openecomp.sdc.exception.ResponseFormat;
38
39 import javax.inject.Singleton;
40 import javax.servlet.ServletContext;
41 import javax.servlet.http.HttpServletRequest;
42 import javax.ws.rs.*;
43 import javax.ws.rs.core.Context;
44 import javax.ws.rs.core.MediaType;
45 import javax.ws.rs.core.Response;
46 import java.io.UnsupportedEncodingException;
47 import java.net.URLDecoder;
48 import java.util.ArrayList;
49 import java.util.List;
50
51 @Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
52 @Path("/v1/user")
53 @Api(value = "User Administration", description = "User admininstarator operations")
54 @Singleton
55 public class UserAdminServlet extends BeGenericServlet {
56
57     private static final String UTF_8 = "UTF-8";
58         private static final String START_HANDLE_REQUEST_OF = "Start handle request of {}";
59         private static final String ROLE_DELIMITER = ",";
60     private static final Logger log = Logger.getLogger(UserAdminServlet.class);
61     private final UserBusinessLogic userBusinessLogic;
62
63     @Inject
64     public UserAdminServlet(UserBusinessLogic userBusinessLogic,
65         ComponentsUtils componentsUtils) {
66         super(userBusinessLogic, componentsUtils);
67         this.userBusinessLogic = userBusinessLogic;
68     }
69
70     /***************************************
71      * API start
72      *************************************************************/
73
74     /* User by userId CRUD start */
75
76     /////////////////////////////////////////////////////////////////////////////////////////////////////
77     // retrieve all user details
78     @GET
79     @Path("/{userId}")
80     @Consumes(MediaType.APPLICATION_JSON)
81     @Produces(MediaType.APPLICATION_JSON)
82     @ApiOperation(value = "retrieve user details", httpMethod = "GET", notes = "Returns user details according to userId", response = User.class)
83     @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns user Ok"), @ApiResponse(code = 404, message = "User not found"), @ApiResponse(code = 405, message = "Method Not Allowed"),
84             @ApiResponse(code = 500, message = "Internal Server Error") })
85     public Response get(@ApiParam(value = "userId of user to get", required = true) @PathParam("userId") final String userId, @Context final HttpServletRequest request) {
86
87         String url = request.getMethod() + " " + request.getRequestURI();
88         log.debug("(get) Start handle request of {}", url);
89
90         try {
91             Either<User, ActionStatus> either = userBusinessLogic.getUser(userId, false);
92
93             if (either.isRight()) {
94                 return buildErrorResponse(getComponentsUtils().getResponseFormatByUserId(either.right().value(), userId));
95             } else {
96                 if (either.left().value() != null) {
97                     return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
98                 } else {
99                     return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
100                 }
101             }
102         } catch (Exception e) {
103             BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get User");
104             log.debug("get user failed with unexpected error: {}", e.getMessage(), e);
105             return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
106         }
107     }
108
109     @GET
110     @Path("/{userId}/role")
111     @Consumes(MediaType.APPLICATION_JSON)
112     @Produces(MediaType.APPLICATION_JSON)
113     @ApiOperation(value = "retrieve user role", notes = "Returns user role according to userId", response = String.class)
114     @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns user role Ok"), @ApiResponse(code = 404, message = "User not found"), @ApiResponse(code = 405, message = "Method Not Allowed"),
115             @ApiResponse(code = 500, message = "Internal Server Error") })
116     public Response getRole(@ApiParam(value = "userId of user to get", required = true) @PathParam("userId") final String userId, @Context final HttpServletRequest request) {
117
118         String url = request.getMethod() + " " + request.getRequestURI();
119         log.debug("(getRole) Start handle request of {}", url);
120
121         try {
122             Either<User, ActionStatus> either = userBusinessLogic.getUser(userId, false);
123             if (either.isRight()) {
124                 return buildErrorResponse(getComponentsUtils().getResponseFormatByUserId(either.right().value(), userId));
125             } else {
126                 if (either.left().value() != null) {
127                     String roleJson = "{ \"role\" : \"" + either.left().value().getRole() + "\" }";
128                     return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), roleJson);
129                 } else {
130                     return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
131                 }
132             }
133         } catch (Exception e) {
134             BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get User Role");
135             log.debug("Get user role failed with unexpected error: {}", e);
136             return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
137         }
138     }
139
140     /////////////////////////////////////////////////////////////////////////////////////////////////////
141     // update user role
142     @POST
143     @Path("/{userId}/role")
144     @Consumes(MediaType.APPLICATION_JSON)
145     @Produces(MediaType.APPLICATION_JSON)
146     @ApiOperation(value = "update user role", notes = "Update user role", response = User.class)
147     @ApiResponses(value = { @ApiResponse(code = 200, message = "Update user OK"), @ApiResponse(code = 400, message = "Invalid Content."), @ApiResponse(code = 403, message = "Missing information/Restricted operation"),
148             @ApiResponse(code = 404, message = "User not found"), @ApiResponse(code = 405, message = "Method Not Allowed"), @ApiResponse(code = 409, message = "User already exists"), @ApiResponse(code = 500, message = "Internal Server Error") })
149     public Response updateUserRole(@ApiParam(value = "userId of user to get", required = true) @PathParam("userId") final String userIdUpdateUser, @Context final HttpServletRequest request,
150             @ApiParam(value = "json describe the update role", required = true) String data, @HeaderParam(value = Constants.USER_ID_HEADER) String modifierUserId) {
151
152         String url = request.getMethod() + " " + request.getRequestURI();
153         log.debug(START_HANDLE_REQUEST_OF, url);
154
155         // get modifier id
156         User modifier = new User();
157         modifier.setUserId(modifierUserId);
158         log.debug("modifier id is {}", modifierUserId);
159
160         Response response = null;
161
162         try {
163             User updateInfoUser = getComponentsUtils().convertJsonToObject(data, modifier, User.class, AuditingActionEnum.UPDATE_USER).left().value();
164             Either<User, ResponseFormat> updateUserResponse = userBusinessLogic.updateUserRole(modifier, userIdUpdateUser, updateInfoUser.getRole());
165
166             if (updateUserResponse.isRight()) {
167                 log.debug("failed to update user role");
168                 response = buildErrorResponse(updateUserResponse.right().value());
169                 return response;
170             }
171             response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), updateUserResponse.left().value());
172             return response;
173
174         } catch (Exception e) {
175             BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Update User Metadata");
176             log.debug("Update User Role failed with exception", e);
177             response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
178             return response;
179
180         }
181     }
182
183     /* User role CRUD end */
184
185     /* New user CRUD start */
186     @POST
187     @Consumes(MediaType.APPLICATION_JSON)
188     @Produces(MediaType.APPLICATION_JSON)
189     @ApiOperation(value = "add user", httpMethod = "POST", notes = "Provision new user", response = User.class)
190     @ApiResponses(value = { @ApiResponse(code = 201, message = "New user created"), @ApiResponse(code = 400, message = "Invalid Content."), @ApiResponse(code = 403, message = "Missing information"),
191             @ApiResponse(code = 405, message = "Method Not Allowed"), @ApiResponse(code = 409, message = "User already exists"), @ApiResponse(code = 500, message = "Internal Server Error") })
192     public Response createUser(@Context final HttpServletRequest request, @ApiParam(value = "json describe the user", required = true) String newUserData, @HeaderParam(value = Constants.USER_ID_HEADER) String modifierAttId) {
193
194         String url = request.getMethod() + " " + request.getRequestURI();
195         log.debug(START_HANDLE_REQUEST_OF, url);
196
197         // get modifier id
198         User modifier = new User();
199         modifier.setUserId(modifierAttId);
200         log.debug("modifier id is {}", modifierAttId);
201
202         Response response = null;
203
204         try {
205             User newUserInfo = getComponentsUtils().convertJsonToObject(newUserData, modifier, User.class, AuditingActionEnum.ADD_USER).left().value();
206             Either<User, ResponseFormat> createUserResponse = userBusinessLogic.createUser(modifier, newUserInfo);
207
208             if (createUserResponse.isRight()) {
209                 log.debug("failed to create user");
210                 response = buildErrorResponse(createUserResponse.right().value());
211                 return response;
212             }
213             response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.CREATED), createUserResponse.left().value());
214             return response;
215
216         } catch (Exception e) {
217             BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Update User Metadata");
218             log.debug("Create User failed with exception", e);
219             response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
220             return response;
221
222         }
223     }
224
225     /* New user CRUD end */
226
227     /* User authorization start */
228
229     /////////////////////////////////////////////////////////////////////////////////////////////////////
230     // User Authorization
231     @GET
232     @Path("/authorize")
233     @Consumes(MediaType.APPLICATION_JSON)
234     @Produces(MediaType.APPLICATION_JSON)
235
236     @ApiOperation(value = "authorize", notes = "authorize user", response = User.class)
237     @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns user Ok"), @ApiResponse(code = 403, message = "Restricted Access"), @ApiResponse(code = 500, message = "Internal Server Error") })
238     public Response authorize(@Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId, @HeaderParam("HTTP_CSP_FIRSTNAME") String firstName, @HeaderParam("HTTP_CSP_LASTNAME") String lastName,
239             @HeaderParam("HTTP_CSP_EMAIL") String email) {
240
241         try {
242             userId = userId != null ? URLDecoder.decode(userId, UTF_8) : null;
243             firstName = firstName != null ? URLDecoder.decode(firstName, UTF_8) : null;
244             lastName = lastName != null ? URLDecoder.decode(lastName, UTF_8) : null;
245             email = email != null ? URLDecoder.decode(email, UTF_8) : null;
246         } catch (UnsupportedEncodingException e) {
247             BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Authorize User - decode headers");
248             ResponseFormat errorResponseWrapper = getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR);
249             log.error("#authorize - authorization decoding failed with error: ", e);
250             return buildErrorResponse(errorResponseWrapper);
251         }
252
253         String url = request.getMethod() + " " + request.getRequestURI();
254         log.debug(START_HANDLE_REQUEST_OF, url);
255
256         User authUser = new User();
257         authUser.setUserId(userId);
258         authUser.setFirstName(firstName);
259         authUser.setLastName(lastName);
260         authUser.setEmail(email);
261         log.debug("auth user id is {}", userId);
262
263         Response response = null;
264         try {
265             Either<User, ResponseFormat> authorize = userBusinessLogic.authorize(authUser);
266
267             if (authorize.isRight()) {
268                 log.debug("authorize user failed");
269                 response = buildErrorResponse(authorize.right().value());
270                 return response;
271             }
272             response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), authorize.left().value());
273             return response;
274
275         } catch (Exception e) {
276             log.debug("authorize user failed with unexpected error: {}", e);
277             return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
278         }
279     }
280
281     /* User authorization end */
282
283     @GET
284     @Path("/admins")
285     @Consumes(MediaType.APPLICATION_JSON)
286     @Produces(MediaType.APPLICATION_JSON)
287     @ApiOperation(value = "retrieve all administrators", httpMethod = "GET", notes = "Returns all administrators", response = User.class)
288     @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns user Ok"), @ApiResponse(code = 405, message = "Method Not Allowed"), @ApiResponse(code = 500, message = "Internal Server Error") })
289     public Response getAdminsUser(@Context final HttpServletRequest request) {
290
291         String url = request.getMethod() + " " + request.getRequestURI();
292         log.debug("(get) Start handle request of {}", url);
293
294         try {
295             Either<List<User>, ResponseFormat> either = userBusinessLogic.getAllAdminUsers();
296
297             if (either.isRight()) {
298                 log.debug("Failed to get all admin users");
299                 return buildErrorResponse(either.right().value());
300             } else {
301                 if (either.left().value() != null) {
302                     return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
303                 } else {
304                     return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
305                 }
306             }
307         } catch (Exception e) {
308             BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get All Administrators");
309             log.debug("get all admins failed with unexpected error: {}", e);
310             return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
311         }
312     }
313
314     @GET
315     @Path("/users")
316     @Consumes(MediaType.APPLICATION_JSON)
317     @Produces(MediaType.APPLICATION_JSON)
318     @ApiOperation(value = "Retrieve the list of all active ASDC users or only group of users having specific roles.", httpMethod = "GET", notes = "Returns list of users with the specified roles, or all of users in the case of empty 'roles' header", response = User.class)
319     @ApiResponses(value = { @ApiResponse(code = 200, message = "Returns users Ok"), @ApiResponse(code = 204, message = "No provisioned ASDC users of requested role"), @ApiResponse(code = 403, message = "Restricted Access"),
320             @ApiResponse(code = 400, message = "Missing content"), @ApiResponse(code = 500, message = "Internal Server Error") })
321     public Response getUsersList(@Context final HttpServletRequest request, @ApiParam(value = "Any active user's USER_ID ") @HeaderParam(Constants.USER_ID_HEADER) final String userId,
322             @ApiParam(value = "TESTER,DESIGNER,PRODUCT_STRATEGIST,OPS,PRODUCT_MANAGER,GOVERNOR, ADMIN OR all users by not typing anything") @QueryParam("roles") final String roles) {
323
324         String url = request.getMethod() + " " + request.getRequestURI();
325         log.debug("Start handle request of {} modifier id is {}", url, userId);
326
327         List<String> rolesList = new ArrayList<>();
328         if (roles != null && !roles.trim().isEmpty()) {
329             String[] rolesArr = roles.split(ROLE_DELIMITER);
330             for (String role : rolesArr) {
331                 rolesList.add(role.trim());
332             }
333         }
334
335         try {
336             Either<List<User>, ResponseFormat> either = userBusinessLogic.getUsersList(userId, rolesList, roles);
337
338             if (either.isRight()) {
339                 log.debug("Failed to get ASDC users");
340                 return buildErrorResponse(either.right().value());
341             } else {
342                 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), either.left().value());
343             }
344         } catch (Exception e) {
345             BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get ASDC users");
346             log.debug("get users failed with unexpected error: {}", e);
347             return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
348         }
349
350     }
351
352     /////////////////////////////////////////////////////////////////////////////////////////////////////
353     // delete user
354     @DELETE
355     @Path("/{userId}")
356     @Consumes(MediaType.APPLICATION_JSON)
357     @Produces(MediaType.APPLICATION_JSON)
358     @ApiOperation(value = "delete user", notes = "Delete user", response = User.class)
359     @ApiResponses(value = { @ApiResponse(code = 200, message = "Update deleted OK"), @ApiResponse(code = 400, message = "Invalid Content."), @ApiResponse(code = 403, message = "Missing information"),
360             @ApiResponse(code = 404, message = "User not found"), @ApiResponse(code = 405, message = "Method Not Allowed"), @ApiResponse(code = 409, message = "Restricted operation"), @ApiResponse(code = 500, message = "Internal Server Error") })
361     public Response deActivateUser(@ApiParam(value = "userId of user to get", required = true) @PathParam("userId") final String userId, @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userIdHeader) {
362
363         String url = request.getMethod() + " " + request.getRequestURI();
364         log.debug("Start handle request of {} modifier id is {}", url, userIdHeader);
365
366         User modifier = new User();
367         modifier.setUserId(userIdHeader);
368
369         Response response = null;
370         try {
371             Either<User, ResponseFormat> deactiveUserResponse = userBusinessLogic.deActivateUser(modifier, userId);
372
373             if (deactiveUserResponse.isRight()) {
374                 log.debug("Failed to deactivate user");
375                 response = buildErrorResponse(deactiveUserResponse.right().value());
376                 return response;
377             }
378             response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), deactiveUserResponse.left().value());
379             return response;
380
381         } catch (Exception e) {
382             BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get ASDC users");
383             log.debug("deactivate user failed with unexpected error: {}", e);
384             return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
385         }
386     }
387 }