- @Override
- public Mono<ProvisioningPojo> processLaunchRequest(LaunchJwt launchJwt, String organizationId) {
- return provisionLaunchUsers(launchJwt, organizationId)
- .flatMap(provisioningPojo -> getNamesRolesAndContext(launchJwt)
- .map(namesRoleResponse -> Tuples.of(namesRoleResponse, provisioningPojo)))
- .flatMap(tuple -> processContextFromNamesRolesResponse(tuple.getT1().getContext(), tuple.getT2())
- .map(provisioningPojo -> Tuples.of(tuple.getT1(), provisioningPojo)))
- .flatMap(tuple -> this.provisionClass(tuple.getT1().getMembers(), tuple.getT2()));
- }
- /**
- * Gets the names roles and context.
- *
- * @param launchJwt the launch jwt
- * @return the names roles and context
- */
- private Mono<NamesRoleResponse> getNamesRolesAndContext(LaunchJwt launchJwt) {
- NamesRoleService namesRoleService = launchJwt.getNamesRoleService();
- if(Objects.nonNull(namesRoleService) && StringUtils.isNotBlank(namesRoleService.getContextMembershipsUrl())) {
- String contextUrl = namesRoleService.getContextMembershipsUrl();
- return configurationClient.getPlatformAccessToken(constructAuthInfo(launchJwt))
- .flatMap(oAuth2AccessToken -> namesAndRolesClient.getNamesAndRolesInfo(contextUrl, oAuth2AccessToken.getValue()));
- }
- else if (Objects.nonNull(launchJwt.getContext())) {
- NamesRoleResponse namesRoleResponse = new NamesRoleResponse();
- namesRoleResponse.setMembers(new ArrayList<Member>());
- namesRoleResponse.setContext(constructCourseContext(launchJwt));
- return Mono.just(namesRoleResponse);
- }
- return Mono.empty();
- }
- private Mono<ProvisioningPojo> processContextFromNamesRolesResponse(CourseContext namesRoleCourseContext,
- ProvisioningPojo provisioningPojo) {
- LOGGER.debug("processing context from names and roles API");
- Roster roster = constructRosterPojo(namesRoleCourseContext, provisioningPojo.getOrganizationId());
- provisioningPojo.setRoster(roster);
- return Mono.just(provisioningPojo);
- }
- private Mono<ProvisioningPojo> provisionClass(List<Member> namesRoleMembers, ProvisioningPojo provisioningPojo) {
- return this.checkIfClassExists(provisioningPojo)
- .flatMap(isClassPresent -> {
- if (isClassPresent) {
- return Mono.just(provisioningPojo);
- } else {
- return processMembersFromNamesRolesResponse(namesRoleMembers, provisioningPojo)
- .flatMap(this::createClassAndMapping);
- }
- });
- }
- private Mono<Boolean> checkIfClassExists(ProvisioningPojo provisioningPojo) {
- Mono<String> cmsClassIdMono = emsClassMappingClient.classExistsForExternalClassId(provisioningPojo.getRoster().getExternalClassId())
- .map(ExternalClassMappingData::getData)
- .map(map -> map.entrySet().stream())
- .map(Stream::findFirst)
- .map(Optional::get)
- .map(Entry::getValue)
- .map(ExternalClassMapping::getClassId);
- return cmsClassIdMono
- .flatMap(rosterServiceClient::getClassBySectionId)
- .map(CMSClass::getData)
- .map(ClassData::getSection)
- .map(Section::getId)
- .flatMap(cmsClassId -> {
- provisioningPojo.getRoster().setToolSectionId(cmsClassId);
- return Mono.just(Boolean.TRUE);
- })
- .switchIfEmpty(Mono.defer(() -> Mono.just(Boolean.FALSE)));
- }
- private Mono<ProvisioningPojo> processMembersFromNamesRolesResponse(List<Member> namesRoleMembers, ProvisioningPojo provisioningPojo) {
- LOGGER.debug("provisioning additional Teacher users from names and roles API ");
- Optional<Member> instructor = namesRoleMembers.stream()
- .filter(member -> RumbaRole.T.name()
- .equalsIgnoreCase(classProvisoningHelper.obtainRumbaRoleFromLTIRoles(member.getRoles())))
- .findFirst();
- if(provisioningPojo.getRole().equals(RumbaRole.S.name()) && instructor.isPresent()) {
- 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);
- }