public void linkUserProfile()

in custos-services/custos-integration-services/user-management-service/src/main/java/org/apache/custos/user/management/service/UserManagementService.java [1041:1188]


    public void linkUserProfile(LinkUserProfileRequest request, StreamObserver<OperationStatus> responseObserver) {
        try {
            LOGGER.debug("Request received to linkUserProfile   at " + request.getTenantId());

            GetUserManagementSATokenRequest userManagementSATokenRequest = GetUserManagementSATokenRequest
                    .newBuilder()
                    .setClientId(request.getIamClientId())
                    .setClientSecret(request.getIamClientSecret())
                    .setTenantId(request.getTenantId())
                    .build();
            AuthToken token = identityClient.getUserManagementSATokenRequest(userManagementSATokenRequest);

            if (token != null && token.getAccessToken() != null) {


                UserSearchMetadata metadata = UserSearchMetadata
                        .newBuilder()
                        .setUsername(request.getCurrentUsername()).build();

                UserSearchRequest searchRequest = UserSearchRequest
                        .newBuilder()
                        .setClientId(request.getIamClientId())
                        .setTenantId(request.getTenantId())
                        .setAccessToken(token.getAccessToken())
                        .setUser(metadata)
                        .build();


                UserRepresentation userTobeLinked = iamAdminServiceClient.getUser(searchRequest);


                if (userTobeLinked != null && !userTobeLinked.getUsername().equals("")) {

                    UserSearchMetadata exMetadata = UserSearchMetadata
                            .newBuilder().setUsername(request.getPreviousUsername()).build();

                    UserSearchRequest exSearchRequest = UserSearchRequest
                            .newBuilder()
                            .setClientId(request.getIamClientId())
                            .setTenantId(request.getTenantId())
                            .setAccessToken(token.getAccessToken())
                            .setUser(exMetadata)
                            .build();

                    UserRepresentation exRep = iamAdminServiceClient.getUser(exSearchRequest);

                    if (exRep != null && !exRep.getUsername().equals("")) {

                        boolean profileUpdate = false;

                        List<UserAttribute> userAttributeList = new ArrayList<>();

                        for (String attribute : request.getLinkingAttributesList()) {

                            if ("name".equals(attribute)) {
                                profileUpdate = true;
                                userTobeLinked = userTobeLinked.toBuilder()
                                        .setFirstName(exRep.getFirstName())
                                        .setLastName(exRep.getLastName())
                                        .build();

                            } else if (("email").equals(attribute)) {
                                profileUpdate = true;
                                userTobeLinked = userTobeLinked.toBuilder().setEmail(exRep.getEmail()).build();

                            } else {
                                List<UserAttribute> userAttributes = exRep.getAttributesList().stream().
                                        filter(atr -> atr.getKey().equals(attribute)).collect(Collectors.toList());

                                if (!userAttributes.isEmpty()) {
                                    UserAttribute userAttribute = userAttributes.get(0);
                                    userAttributeList.add(userAttribute);
                                }
                            }
                        }

                        if (profileUpdate) {
                            UpdateUserProfileRequest updateUserProfileRequest = UpdateUserProfileRequest
                                    .newBuilder()
                                    .setUser(userTobeLinked)
                                    .setAccessToken(token.getAccessToken())
                                    .setTenantId(request.getTenantId())
                                    .build();
                            iamAdminServiceClient.updateUserProfile(updateUserProfileRequest);
                        }

                        if (!userAttributeList.isEmpty()) {

                            AddUserAttributesRequest addUserAttributesRequest = AddUserAttributesRequest
                                    .newBuilder()
                                    .addUsers(request.getCurrentUsername())
                                    .addAllAttributes(userAttributeList)
                                    .setTenantId(request.getTenantId())
                                    .setAccessToken(token.getAccessToken())
                                    .setClientId(request.getIamClientId())
                                    .setPerformedBy(request.getPerformedBy())
                                    .build();
                            iamAdminServiceClient.addUserAttributes(addUserAttributesRequest);

                        }


                        UserRepresentation updatedUser = iamAdminServiceClient.getUser(searchRequest);

                        if (updatedUser != null) {

                            UserProfile profile = this.convertToProfile(updatedUser);

                            org.apache.custos.user.profile.service.UserProfileRequest req =
                                    org.apache.custos.user.profile.service.UserProfileRequest
                                            .newBuilder()
                                            .setTenantId(request.getTenantId())
                                            .setProfile(profile)
                                            .build();

                            UserProfile exsistingProfile = userProfileClient.getUser(req);

                            if (exsistingProfile == null || exsistingProfile.getUsername().equals("")) {
                                userProfileClient.createUserProfile(req);
                            } else {
                                userProfileClient.updateUserProfile(req);
                            }
                        }

                        CheckingResponse response = CheckingResponse.newBuilder().setIsExist(true).build();
                        OperationStatus status = OperationStatus.newBuilder().setStatus(response.getIsExist()).build();
                        responseObserver.onNext(status);
                        responseObserver.onCompleted();

                    } else {
                        String msg = "Cannot found existing user ";
                        LOGGER.error(msg);
                        responseObserver.onError(Status.NOT_FOUND.withDescription(msg).asRuntimeException());
                    }

                }
            }

        } catch (Exception ex) {
            String msg = "Error occurred while linking user profile in tenant " + ex.getMessage();
            LOGGER.error(msg, ex);
            if (ex.getMessage().contains("UNAUTHENTICATED")) {
                responseObserver.onError(io.grpc.Status.UNAUTHENTICATED.withDescription(msg).asRuntimeException());
            } else {
                responseObserver.onError(io.grpc.Status.INTERNAL.withDescription(msg).asRuntimeException());
            }
        }
    }