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) .filter(p -> p.getRole().equalsIgnoreCase("T")) .flatMap(this::updateProductRoster); } }); } /*** New method to update the Roster if role is teacher *****/ private Mono updateProductRoster(ProvisioningPojo provisioningPojo) { String sectionId = provisioningPojo.getRoster().getToolSectionId(); RosterProductRequest rosterProductRequest = new RosterProductRequest(); SectionWrapper sectionWrapper = new SectionWrapper(); SectionProduct section = new SectionProduct(); SectionDataProduct sectionData = new SectionDataProduct(); ProductInfo productInfo = new ProductInfo(); productInfo.setProductId(provisioningPojo.getProductId()); productInfo.setAddedBy(provisioningPojo.getToolUserId()); List productsInfo = new ArrayList<>(); productsInfo.add(productInfo); sectionData.setProductsInfo(productsInfo); section.setSectionData(sectionData); sectionWrapper.setSection(section); List sectionWrapperList = new ArrayList<>(); sectionWrapperList.add(sectionWrapper); rosterProductRequest.setSectionWrapperList(sectionWrapperList); /*** This is just to start a discussion, I know we wont be doing lines 216 to 224 ***/ return rosterServiceClient.addProductsToSection(sectionId, provisioningPojo.getToolUserId() ,rosterProductRequest) .flatMap(classProductResponse -> { // 216 Optional x = Optional.ofNullable(classProductResponse) .map(ClassProductResponse::getErrorCode); if(x.isEmpty()) { return Mono.just(provisioningPojo); } return Mono.just(provisioningPojo); // 224 }); } 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); }