This repository has been archived on 2025-12-25. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
qmi-cloud/server/training/cloudshare.js
Manuel Romero e2d32d954e submit form
2023-05-11 10:44:38 +02:00

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;