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());
}
}
}