private Mono provisionClass(List namesRoleMembers, ProvisioningPojo provisioningPojo) { return this.checkIfClassExists(provisioningPojo).flatMap(isClassPresent -> { /**** Move the code into a new private method ****/ if (isClassPresent) { if (isTeacher(provisioningPojo, provisioningPojo.getToolUserId())) { List existingTeacher = provisioningPojo.getRoster().getExistingTeacherIds() .stream() .filter(staff -> staff.getStaffPiId().equalsIgnoreCase(provisioningPojo.getToolUserId())) .collect(Collectors.toList()); if(existingTeacher.isEmpty()) { // call the roster service to update Roster with teacher } } else if (isStudent(provisioningPojo, provisioningPojo.getToolUserId())) { List existingStudent = provisioningPojo.getRoster().getExistingStudentIds() .stream() .filter(staff -> staff.getStudentPiId().equalsIgnoreCase(provisioningPojo.getToolUserId())) .collect(Collectors.toList()); if (existingStudent.isEmpty()) { // call the roster service to update Roster with Student } } // update product List existingProduct = provisioningPojo.getRoster().getExistingProductIds() .stream() .filter(products -> products.getProductId().equalsIgnoreCase(provisioningPojo.getProductId())) .collect(Collectors.toList()); if (existingProduct.isEmpty()) { // call the roster service to update Roster with Product } return Mono.just(provisioningPojo); } else { return processMembersFromNamesRolesResponse(namesRoleMembers, provisioningPojo) .flatMap(this::createClassAndMapping); } }); } private Mono checkIfClassExists(ProvisioningPojo provisioningPojo) { return emsClassMappingClient.classExistsForExternalClassId(provisioningPojo.getRoster().getExternalClassId()) .flatMap(externalClassMappingData -> { Optional optionalClassId = Optional.ofNullable(externalClassMappingData) .map(ExternalClassMappingData::getData) .map(map -> map.entrySet().stream()) .map(Stream::findFirst) .map(Optional::get) .map(Entry::getValue) .map(ExternalClassMapping::getClassId); if (optionalClassId.isPresent()) { return rosterServiceClient.getClassBySectionId(optionalClassId.get()) .flatMap(cmsClass -> { Optional cmsClassId = Optional.ofNullable(cmsClass) .map(CMSClass::getData) .map(ClassData::getSection) .map(Section::getId); /**** update ProvisioningPojo Pojo ****/ if (cmsClassId.isPresent()) { provisioningPojo.getRoster().setToolSectionId(cmsClassId.get()); provisioningPojo.getRoster() .setExistingTeacherIds(cmsClass.getData().getSection().getData().getSectionInfo().getStaff()); provisioningPojo.getRoster() .setExistingStudentIds(cmsClass.getData().getSection().getData().getSectionInfo().getStudents()); provisioningPojo.getRoster() .setExistingProductIds(cmsClass.getData().getSection().getData().getSectionProductsAssociationList()); if (isStudent(provisioningPojo, provisioningPojo.getToolUserId()) && provisioningPojo.getRoster().getExistingTeacherIds().isEmpty()) { provisioningPojo.setUpdateStaffIfStudent(true); } return Mono.just(Boolean.TRUE); } return Mono.just(Boolean.FALSE); }); } return Mono.just(Boolean.FALSE); }); } private Mono processMembersFromNamesRolesResponse(List namesRoleMembers, ProvisioningPojo provisioningPojo) { LOGGER.debug("provisioning additional Teacher users from names and roles API "); Optional instructor = namesRoleMembers.stream() .filter(member -> RumbaRole.T.name() .equalsIgnoreCase(classProvisoningHelper.obtainRumbaRoleFromLTIRoles(member.getRoles()))) .findFirst(); /**** If student user then check if staff present in cms class if not then add the staff to Staff Roster ****/ if(provisioningPojo.getRole().equals(RumbaRole.S.name()) && instructor.isPresent()) { if (provisioningPojo.updateStaffIfStudent) { // call Roster service to update the Staff } MemberData memberData = constructMemberData(instructor.get(), provisioningPojo); return provisioningService.enableUserProvisioning(memberData) .map(rumbaTeacherId -> { RosterMember rosterMember = new RosterMember(); rosterMember.setUserId(instructor.get().getUserId()); rosterMember.setRole(memberData.getRole()); rosterMember.setExternalUserId(memberData.getExternalUserId()); rosterMember.setToolUserId(rumbaTeacherId); provisioningPojo.getMembers().add(rosterMember); LOGGER.debug("provisioningPojo : {}", provisioningPojo); return provisioningPojo; }); } return Mono.just(provisioningPojo); }