canvas-lti
Version:
A Canvas LTI 1.3 integration tool.
100 lines (90 loc) • 5.21 kB
JavaScript
const jsonConfig = (options) => {
let ltiConfig = {
title: '',
description: '',
scopes: [],
extensions: [],
custom_fields: {},
privacy_level: 'public',
redirect_uris: [],
public_jwk_url: `${configuration.baseURL}${configuration.ltiPath}.well-known/jwks.json`,
target_link_uri: `${configuration.baseURL}${configuration.ltiPath}${configuration.launchPath}`,
oidc_initiation_url: `${configuration.baseURL}${configuration.ltiPath}oidc`,
public_jwk: {},
}
Object.keys(options).forEach(key => {
if (key in ltiConfig) {
switch (key) {
case 'scopes':
if (Array.isArray(options[key])) {
for (let i = 0; i < options[key].length; i++) {
validScopes = {
'create_view_assignment_data': { url: 'https://purl.imsglobal.org/spec/lti-ags/scope/lineitem' },
'view_assignment_data': { url: 'https://purl.imsglobal.org/spec/lti-ags/scope/lineitem.readonly' },
'view_submission_data': { url: 'https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly' },
'create_update_submission_results': { url: 'https://purl.imsglobal.org/spec/lti-ags/scope/score' },
'view_progress_records': { url: 'https://canvas.instructure.com/lti-ags/progress/scope/show' },
'retrieve_user_data': { url: 'https://purl.imsglobal.org/spec/lti-nrps/scope/contextmembership.readonly' },
'update_public_jwk': { url: 'https://canvas.instructure.com/lti/public_jwk/scope/update' },
'lookup_account_info': { url: 'https://canvas.instructure.com/doc/api/file.tools_intro.html#:~:text=https%3A//canvas.instructure.com/lti/account_lookup/scope/show' },
'view_page_content': { url: 'https://canvas.instructure.com/lti/page_content/show' },
};
if (Object.keys(validScopes).includes(options[key][i])) {
ltiConfig.scopes.push(validScopes[options[key][i]].url);
} else {
console.warn(`[Canvas-LTI] Ignoring invalid scope: ${options[key][i]}`);
}
}
}
case 'placements':
if (typeof options[key] === 'object' && !Array.isArray(options[key])) {
let placement = options[key];
if (!placement.title) {
console.warn('[Canvas-LTI] Missing title in placement.');
}
if (!placement.target_link_uri) {
console.warn('[Canvas-LTI] Missing target_link_uri in placement.');
}
if (!placement.type) {
console.warn('[Canvas-LTI] Missing type in placement.');
}
if (!placement.location) {
console.warn('[Canvas-LTI] Missing location in placement.');
}
if (placement.type == 'resource_link') placement.type = 'LtiResourceLinkRequest';
if (placement.type == 'deep_link') placement.type = 'LtiDeepLinkingRequest';
function isValidURI(uri) {
try {
new URL(uri);
return true;
} catch (err) {
return false;
}
}
// Check if target_link_uri is a valid URI
if (!isValidURI(placement.target_link_uri)) {
console.warn('[Canvas-LTI] Invalid target_link_uri:', placement.target_link_uri);
return;
}
let placementObj = {
text: placement.title,
enabled: placement.enabled ? true : false,
icon_url: placement.icon_url ? placement.icon_url : '',
placement: placement.location,
location: placement.location,
message_type: placement.type,
target_link_uri: placement.target_link_uri,
windowTarget: placement.newTab ? '_blank' : '_self',
};
}
break;
default:
ltiConfig[key] = options[key];
break;
}
} else {
console.warn(`[Canvas-LTI] Ignoring JSON option: ${key}`);
}
});
}
module.exports = jsonConfig;