-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathroutes.js
132 lines (117 loc) · 3.52 KB
/
routes.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
const router = require('express').Router()
const path = require('path')
// Requiring Ltijs
const lti = require('ltijs').Provider
// Grading route
router.post('/grade', async (req, res) => {
try {
const idtoken = res.locals.token // IdToken
const score = req.body.grade // User numeric score sent in the body
// Creating Grade object
const gradeObj = {
userId: idtoken.user,
scoreGiven: score,
scoreMaximum: 100,
activityProgress: 'Completed',
gradingProgress: 'FullyGraded'
}
// Selecting linetItem ID
let lineItemId = idtoken.platformContext.endpoint.lineitem // Attempting to retrieve it from idtoken
if (!lineItemId) {
const response = await lti.Grade.getLineItems(idtoken, { resourceLinkId: true })
const lineItems = response.lineItems
if (lineItems.length === 0) {
// Creating line item if there is none
console.log('Creating new line item')
const newLineItem = {
scoreMaximum: 100,
label: 'Grade',
tag: 'grade',
resourceLinkId: idtoken.platformContext.resource.id
}
const lineItem = await lti.Grade.createLineItem(idtoken, newLineItem)
lineItemId = lineItem.id
} else lineItemId = lineItems[0].id
}
// Sending Grade
const responseGrade = await lti.Grade.submitScore(idtoken, lineItemId, gradeObj)
return res.send(responseGrade)
} catch (err) {
console.log(err.message)
return res.status(500).send({ err: err.message })
}
})
// Names and Roles route
// Remember: Public JWK as text not URL when running on localhost!
router.get('/members', async (req, res) => {
try {
console.log("lti.NamesAndRoles token");
console.log(res.locals.token)
const result = await lti.NamesAndRoles.getMembers(res.locals.token)
console.log(result)
if (result) {
return res.send(result.members)
}
else {
return res.sendStatus(500)
}
}
catch (err) {
console.log(err.message)
return res.status(500).send(err.message)
}
})
// Deep linking route
router.post('/deeplink', async (req, res) => {
try {
const resource = req.body
const items = {
type: 'ltiResourceLink',
title: 'Ltijs Demo',
custom: {
name: resource.name,
value: resource.value
}
}
const form = await lti.DeepLinking.createDeepLinkingForm(res.locals.token, items, { message: 'Successfully Registered' })
if (form) return res.send(form)
return res.sendStatus(500)
} catch (err) {
console.log(err.message)
return res.status(500).send(err.message)
}
})
// Return available deep linking resources
router.get('/resources', async (req, res) => {
const resources = [
{
name: 'Resource1',
value: 'value1'
},
{
name: 'Resource2',
value: 'value2'
},
{
name: 'Resource3',
value: 'value3'
}
]
return res.send(resources)
})
// Get user and context information
router.get('/info', async (req, res) => {
const token = res.locals.token
const context = res.locals.context
const info = { }
if (token.userInfo) {
if (token.userInfo.name) info.name = token.userInfo.name
if (token.userInfo.email) info.email = token.userInfo.email
}
if (context.roles) info.roles = context.roles
if (context.context) info.context = context.context
return res.send(info)
})
// Wildcard route to deal with redirecting to React routes
router.get('*', (req, res) => res.sendFile(path.join(__dirname, '../public/index.html')))
module.exports = router