124 lines
3.5 KiB
JavaScript
124 lines
3.5 KiB
JavaScript
import { ensureConfig, getConfig } from '@edx/frontend-platform';
|
|
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
|
|
import { bbbPlanTypes } from '../constants';
|
|
|
|
ensureConfig([
|
|
'STUDIO_BASE_URL',
|
|
], 'Course Apps API service');
|
|
|
|
const apiBaseUrl = getConfig().STUDIO_BASE_URL;
|
|
|
|
export const providersApiUrl = `${apiBaseUrl}/api/course_live/providers`;
|
|
export const providerConfigurationApiUrl = `${apiBaseUrl}/api/course_live/course`;
|
|
|
|
function normalizeProviders(data) {
|
|
const apps = Object.entries(data.providers.available).map(([key, app]) => ({
|
|
id: key,
|
|
featureIds: app.features,
|
|
name: app.name,
|
|
piiSharing: app.pii_sharing,
|
|
hasFreeTier: app.has_free_tier,
|
|
}));
|
|
|
|
return {
|
|
activeAppId: data.providers.active,
|
|
selectedAppId: data.providers.active,
|
|
apps,
|
|
};
|
|
}
|
|
|
|
function normalizeLtiConfig(data) {
|
|
if (!data || Object.keys(data).length < 1) {
|
|
return {};
|
|
}
|
|
|
|
return {
|
|
consumerKey: data.lti_1p1_client_key,
|
|
consumerSecret: data.lti_1p1_client_secret,
|
|
launchUrl: data.lti_1p1_launch_url,
|
|
launchEmail: data.lti_config?.additional_parameters?.custom_instructor_email,
|
|
tierType: data.tierType,
|
|
};
|
|
}
|
|
|
|
export function normalizeSettings(data) {
|
|
let tier;
|
|
if (data.provider_type === 'big_blue_button') {
|
|
tier = data.free_tier === true ? bbbPlanTypes.free : bbbPlanTypes.commercial;
|
|
}
|
|
return {
|
|
enabled: data.enabled,
|
|
piiSharingAllowed: data.pii_sharing_allowed,
|
|
appConfig: {
|
|
id: data.provider_type,
|
|
...normalizeLtiConfig({ ...data.lti_configuration, tierType: tier }),
|
|
},
|
|
};
|
|
}
|
|
|
|
export function deNormalizeSettings(data) {
|
|
const ltiConfiguration = {};
|
|
if (data.consumerKey) {
|
|
ltiConfiguration.lti_1p1_client_key = data.consumerKey;
|
|
}
|
|
if (data.consumerSecret) {
|
|
ltiConfiguration.lti_1p1_client_secret = data.consumerSecret;
|
|
}
|
|
if (data.launchUrl) {
|
|
ltiConfiguration.lti_1p1_launch_url = data.launchUrl;
|
|
}
|
|
if (data?.provider === 'zoom' || data.tierType !== 'Free') {
|
|
ltiConfiguration.lti_config = {};
|
|
if (data.launchEmail) {
|
|
ltiConfiguration.lti_config.additional_parameters = {
|
|
custom_instructor_email: data.launchEmail,
|
|
};
|
|
}
|
|
}
|
|
if (Object.keys(ltiConfiguration).length > 0) {
|
|
// Only add this in if we're sending LTI fields.
|
|
// TODO: Eventually support LTI v1.3 here.
|
|
ltiConfiguration.version = 'lti_1p1';
|
|
}
|
|
|
|
const apiData = {
|
|
enabled: data?.enabled || false,
|
|
lti_configuration: Object.keys(ltiConfiguration).length ? ltiConfiguration : undefined,
|
|
provider_type: data?.provider || 'zoom',
|
|
pii_sharing_allowed: data?.piiSharingEnable || false,
|
|
free_tier: data?.provider === 'zoom' ? false : Boolean(data.tierType === 'Free'),
|
|
};
|
|
return apiData;
|
|
}
|
|
|
|
/**
|
|
* Fetches providers for provided course
|
|
* @param {string} courseId
|
|
* @returns {Promise<[{}]>}
|
|
*/
|
|
export async function getLiveProviders(courseId) {
|
|
const { data } = await getAuthenticatedHttpClient()
|
|
.get(`${providersApiUrl}/${courseId}/`);
|
|
|
|
return normalizeProviders(data);
|
|
}
|
|
|
|
/**
|
|
* Fetches provider settings for provided course
|
|
* @param {string} courseId
|
|
* @returns {Promise<[{}]>}
|
|
*/
|
|
export async function getLiveConfiguration(courseId) {
|
|
const { data } = await getAuthenticatedHttpClient()
|
|
.get(`${providerConfigurationApiUrl}/${courseId}/`);
|
|
return normalizeSettings(data);
|
|
}
|
|
|
|
export async function postLiveConfiguration(courseId, config) {
|
|
const { data } = await getAuthenticatedHttpClient().post(
|
|
`${providerConfigurationApiUrl}/${courseId}/`,
|
|
deNormalizeSettings(config),
|
|
);
|
|
return normalizeSettings(data);
|
|
}
|