129 lines
3.2 KiB
JavaScript
129 lines
3.2 KiB
JavaScript
const BASEURL = "https://use.cloudshare.com/api/v3/class";
|
|
const axios = require("axios");
|
|
const sha1 = require("js-sha1");
|
|
|
|
const API_KEY = process.env.CLOUDSHARE_API_KEY;
|
|
const API_ID = process.env.CLOUDSHARE_API_ID;
|
|
|
|
function randomString(length) {
|
|
var chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
var result = "";
|
|
for (var i = length; i > 0; --i)
|
|
result += chars[Math.floor(Math.random() * chars.length)];
|
|
return result;
|
|
}
|
|
|
|
function getRequestAuth(url) {
|
|
var timestamp = Math.floor(Date.now() / 1000);
|
|
var token = randomString(10);
|
|
var hmac = `${API_KEY}${url}${timestamp}${token}`;
|
|
var hmacSHA1 = sha1(hmac);
|
|
|
|
return `cs_sha1 userapiid:${API_ID};timestamp:${timestamp};token:${token};hmac:${hmacSHA1}`;
|
|
|
|
};
|
|
|
|
async function _getAllStudentsInClass(classId) {
|
|
var url = `${BASEURL}/${classId}/students?isFull=false`;
|
|
var auth = getRequestAuth(url);
|
|
|
|
try {
|
|
var result = await axios({
|
|
method: "GET",
|
|
url: url,
|
|
headers: {
|
|
Accpet: "application/json",
|
|
"Content-Type": "application/json",
|
|
Authorization: auth,
|
|
},
|
|
});
|
|
|
|
return result.data;
|
|
} catch (error) {
|
|
return {error: error};
|
|
}
|
|
};
|
|
|
|
async function _sendInvitationToUser(classId, userId) {
|
|
var url = `${BASEURL}/actions/sendinvitations?isMultiple=true`;
|
|
var auth = getRequestAuth(url);
|
|
|
|
try {
|
|
var result = await axios({
|
|
method: "POST",
|
|
url: url,
|
|
headers: {
|
|
Accpet: "application/json",
|
|
"Content-Type": "application/json",
|
|
Authorization: auth,
|
|
},
|
|
data: {
|
|
classId: classId,
|
|
studentIds: [userId],
|
|
},
|
|
});
|
|
return result.data;
|
|
} catch (error) {
|
|
return {error: error};
|
|
}
|
|
}
|
|
|
|
async function _addUser(classId, email) {
|
|
var url = `${BASEURL}/${classId}/Students`;
|
|
var auth = getRequestAuth(url);
|
|
|
|
var firstName = email.split("@")[0];
|
|
var lastName = email.split("@")[1];
|
|
|
|
try {
|
|
var result = await axios({
|
|
method: "POST",
|
|
url: url,
|
|
headers: {
|
|
Accpet: "application/json",
|
|
"Content-Type": "application/json",
|
|
Authorization: auth,
|
|
},
|
|
data: {
|
|
email: email,
|
|
firstName: firstName,
|
|
lastName: lastName,
|
|
properties: {},
|
|
},
|
|
});
|
|
|
|
return result.data;
|
|
} catch (error) {
|
|
return {error: error};
|
|
}
|
|
}
|
|
|
|
var addStudentToClass = async function (session, email) {
|
|
|
|
const classId = session.cloudshareClass;
|
|
|
|
console.log(`Executed 'Add Student' to class '${classId}' for user '${email}'`);
|
|
|
|
const students = await _getAllStudentsInClass(classId);
|
|
|
|
let student = students.find(function (user) {
|
|
return user.email === email;
|
|
});
|
|
|
|
if (student) {
|
|
console.log(`Student already in class (${classId}), sending invitation: ${student.email}` );
|
|
return await _sendInvitationToUser(classId, student.id);
|
|
} else {
|
|
console.log(`Adding student to class (${classId}): ${email}`);
|
|
|
|
student = await _addUser(classId, email);
|
|
console.log(`Student Added to class (${classId}): ${email}`);
|
|
console.log(`Student:`, student);
|
|
|
|
return await _sendInvitationToUser(classId, student.studentId);
|
|
|
|
}
|
|
};
|
|
|
|
module.exports.addStudentToClass = addStudentToClass;
|