UNPKG

canvas-lti

Version:

A Canvas LTI 1.3 integration tool.

100 lines (90 loc) 5.21 kB
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;