From Bulky Gorilla, 6 Years ago, written in Plain Text.
This paste is a reply to Untitled from Scorching Crane - go back
Embed
Viewing differences between Untitled and Re: Untitled
   @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);
    }