Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions public/assets/branding/favicon/site.webmanifest
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{
"name": "",
"short_name": "",
"name": "checq.me",
"short_name": "checq.me",
"icons": [
{
"src": "/android-chrome-192x192.png",
"src": "./android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-512x512.png",
"src": "./android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
Expand Down
23 changes: 0 additions & 23 deletions public/js/ajax_dashboard.js

This file was deleted.

9 changes: 4 additions & 5 deletions public/js/views.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
//EJS Compiled Views - This file was automatically generated on Sun Nov 22 2020 12:59:16 GMT+0100 (Central European Standard Time)

//EJS Compiled Views - This file was automatically generated on Mon Nov 23 2020 19:57:14 GMT+0100 (Central European Standard Time)
ejs.views_include = function(locals) {
return function(path, d) {
return ejs["views_"+path.replace(/\//g,"_")]({...d,...locals}, null, ejs.views_include(locals));
Expand Down Expand Up @@ -790,7 +789,7 @@ function encode_char(c) {
};
;
var __line = 1
, __lines = "<link rel=\"stylesheet\" href=\"/stylesheets/css/flash.min.css\">\n<link href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css\" rel=\"stylesheet\"\n integrity=\"sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN\" crossorigin=\"anonymous\">\n\n\n<div class=\"wrapper\">\n <%- include(\"../../partials/navigation\", {active: 'manager'}) %>\n <main>\n <h1>Classroom Manager</h1>\n <section id=\"class_options\">\n <button onclick=\"add()\" id=\"add_btn\" type=\"button\" class=\"btn btn-primary\">Add Mastery Check</button>\n <button onclick=\"toggle_show_ta_form()\">Assign a TA</button>\n </section>\n <div id=\"add\" class=\"container\"></div>\n <section id=\"ta_form\"></section>\n <section id=\"class_info\"></section>\n <div id=\"list\" class=\"container\"></div>\n \n </main>\n</div>\n\n<script src=\"/js/ajax_mastery.js\"></script>\n<script src=\"/js/flash.min.js\"></script>\n<script src=\"/js/ajax_classroom_manager.js\"></script>\n<script src=\"/js/ajax_topic.js\"></script>\n<script src=\"/js/ejs.min.js\"></script>\n<script src=\"/js/views.js\"></script>\n<script>\n window.onload = init;\n</script>"
, __lines = "<link rel=\"stylesheet\" href=\"/stylesheets/css/flash.min.css\">\n<link href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css\" rel=\"stylesheet\"\n integrity=\"sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN\" crossorigin=\"anonymous\">\n\n\n<div class=\"wrapper\">\n <%- include(\"../../partials/navigation\", {active: 'manager'}) %>\n <main>\n <h1>Classroom Manager</h1>\n <section id=\"class_options\">\n <button onclick=\"add()\" id=\"add_btn\" type=\"button\" class=\"btn btn-primary\">Add Mastery Check</button>\n <button onclick=\"toggle_show_ta_form()\">Assign a TA</button>\n <button onclick=\"toggle_show_topic_form()\">Add Topic</button>\n </section>\n <div id=\"add\" class=\"container\"></div>\n <section id=\"ta_form\"></section>\n <section id=\"topic_form\"></section>\n <section id=\"class_info\"></section>\n <div id=\"list\" class=\"container\"></div>\n \n </main>\n</div>\n\n<script src=\"/js/ajax_mastery.js\"></script>\n<script src=\"/js/flash.min.js\"></script>\n<script src=\"/js/ajax_classroom_manager.js\"></script>\n<script src=\"/js/ajax_topic.js\"></script>\n<script src=\"/js/ejs.min.js\"></script>\n<script src=\"/js/views.js\"></script>\n<script>\n window.onload = init;\n</script>"
, __filename = undefined;
try {
var __output = "";
Expand All @@ -799,8 +798,8 @@ try {
; __append("<link rel=\"stylesheet\" href=\"/stylesheets/css/flash.min.css\">\n<link href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css\" rel=\"stylesheet\"\n integrity=\"sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN\" crossorigin=\"anonymous\">\n\n\n<div class=\"wrapper\">\n ")
; __line = 7
; __append( include("../../partials/navigation", {active: 'manager'}) )
; __append("\n <main>\n <h1>Classroom Manager</h1>\n <section id=\"class_options\">\n <button onclick=\"add()\" id=\"add_btn\" type=\"button\" class=\"btn btn-primary\">Add Mastery Check</button>\n <button onclick=\"toggle_show_ta_form()\">Assign a TA</button>\n </section>\n <div id=\"add\" class=\"container\"></div>\n <section id=\"ta_form\"></section>\n <section id=\"class_info\"></section>\n <div id=\"list\" class=\"container\"></div>\n \n </main>\n</div>\n\n<script src=\"/js/ajax_mastery.js\"></script>\n<script src=\"/js/flash.min.js\"></script>\n<script src=\"/js/ajax_classroom_manager.js\"></script>\n<script src=\"/js/ajax_topic.js\"></script>\n<script src=\"/js/ejs.min.js\"></script>\n<script src=\"/js/views.js\"></script>\n<script>\n window.onload = init;\n</script>")
; __line = 30
; __append("\n <main>\n <h1>Classroom Manager</h1>\n <section id=\"class_options\">\n <button onclick=\"add()\" id=\"add_btn\" type=\"button\" class=\"btn btn-primary\">Add Mastery Check</button>\n <button onclick=\"toggle_show_ta_form()\">Assign a TA</button>\n <button onclick=\"toggle_show_topic_form()\">Add Topic</button>\n </section>\n <div id=\"add\" class=\"container\"></div>\n <section id=\"ta_form\"></section>\n <section id=\"topic_form\"></section>\n <section id=\"class_info\"></section>\n <div id=\"list\" class=\"container\"></div>\n \n </main>\n</div>\n\n<script src=\"/js/ajax_mastery.js\"></script>\n<script src=\"/js/flash.min.js\"></script>\n<script src=\"/js/ajax_classroom_manager.js\"></script>\n<script src=\"/js/ajax_topic.js\"></script>\n<script src=\"/js/ejs.min.js\"></script>\n<script src=\"/js/views.js\"></script>\n<script>\n window.onload = init;\n</script>")
; __line = 32
}
return __output;
} catch (e) {
Expand Down
152 changes: 90 additions & 62 deletions routes/classroom.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,17 @@ const { response } = require("express");

module.exports = router;

// if PROFESSOR/TA = Get all the classrooms where the current user is the professor
// if STUDENT = returns all classes in which the student is enrolled

// COMMON ROUTES

/**
* If PROFESSOR/TA -> Get all the classrooms where the current user is the professor/ta,
* if STUDENT -> returns all classes in which the student is enrolled.
* @name get/classroom
* @function
* @param {string} path - Express path
* @param {callback} middleware - Express middleware.
*/
router.get("/", ensureAuthenticated, (req, res) => {
if (req.user.role == 1 || req.user.role == 0) {
Classroom.find({ lecturer: req.user })
Expand Down Expand Up @@ -55,11 +63,16 @@ router.get("/", ensureAuthenticated, (req, res) => {
}
});

/*
PROFESSOR ROUTES
*/

//Post a new classroom
// PROFESSOR ROUTES

/**
* Route creating a new classroom.
* @name post/classroom/new
* @function
* @param {string} path - Express path
* @param {callback} middleware - Express middleware.
*/
router.post("/new", ensureAuthenticated, ensureProfessor, (req, res) => {
console.log(req.body);
if (!req.body.name || !req.body.description) {
Expand All @@ -86,72 +99,84 @@ router.post("/new", ensureAuthenticated, ensureProfessor, (req, res) => {
})
});

/**
* Route serving a classroom given its id.
* @name get/classroom/:id
* @function
* @param {string} path - Express path
* @param {callback} middleware - Express middleware.
*/
router.get("/:id", ensureAuthenticated, ensureProfessor, (req, res) => {
Classroom.find({ _id: req.params.id })
.populate("teaching_assistants")
.populate("mastery_checks")
.populate("lecturer")
.populate("partecipants")
.then((result) => {
//
res.json(result);
})
.catch((err) => {
console.log(err);
res.json({});
});

.populate("teaching_assistants")
.populate("mastery_checks")
.populate("lecturer")
.populate("partecipants")
.then((result) => {
//
res.json(result);
})
.catch((err) => {
console.log(err);
res.json({});
});
})

//create a new invite link
//TODO: if token for class already exists return the existing one.
router.get(
"/invite/:classroom_id",
ensureAuthenticated,
ensureProfessor,
(req, res) => {
TokenClassroom.findOne({_classroomId: req.params.classroom_id}).then(c_t => {
if(c_t){
res.json(`http://${req.headers.host}/classroom/join/${c_t.token}`)
} else {
Classroom.findById(req.params.classroom_id).then((c) => {
// console.log(c.lecturer.toString() == req.user._id.toString());
if (c && c.lecturer.toString() == req.user._id.toString()) {
let token = new TokenClassroom({
_classroomId: c._id,
token: crypto.randomBytes(20).toString("hex"),
/**
* Route serving the classroom's token given its id.
* @name get/classroom/invite/:classroom_id
* @todo If token for class already exists return the existing one.
* @function
* @param {string} path - Express path
* @param {callback} middleware - Express middleware.
*/
router.get( "/invite/:classroom_id", ensureAuthenticated, ensureProfessor, (req, res) => {
TokenClassroom.findOne({_classroomId: req.params.classroom_id}).then(c_t => {
if(c_t){
res.json(`http://${req.headers.host}/classroom/join/${c_t.token}`)
} else {
Classroom.findById(req.params.classroom_id).then((c) => {
// console.log(c.lecturer.toString() == req.user._id.toString());
if (c && c.lecturer.toString() == req.user._id.toString()) {
let token = new TokenClassroom({
_classroomId: c._id,
token: crypto.randomBytes(20).toString("hex"),
});
token
.save()
.then(() => {
res.json(
`http://${req.headers.host}/classroom/join/${token.token}`
);
})
.catch((err) => {
console.log(err);
res.status(400).end();
});
token
.save()
.then(() => {
res.json(
`http://${req.headers.host}/classroom/join/${token.token}`
);
})
.catch((err) => {
console.log(err);
res.status(400).end();
});
} else {
res.status(400).end();
}
});
}
})
}
);
} else {
res.status(400).end();
}
});
}
})
});


/*
STUDENT ROUTES
*/
// STUDENT ROUTES

//this link will be given to the new students, once clicked it will automatically join the classroom
//this route CANNOT be used as an API to interact with the database from ajax.
/**
* Check if the invite link is valid, in which case the class that the link is referred to will
* be added to the student's classrooms list. This route CANNOT be used as an API to interact
* with the database from ajax.
* @name get/classroom/join/:token
* @function
* @param {string} path - Express path
* @param {callback} middleware - Express middleware.
*/
router.get("/join/:token", ensureAuthenticated, ensureStudent, (req, res) => {
// console.log("here")
TokenClassroom.findOne({ token: req.params.token })
.then((t) => {

let p1 = Classroom.findById(t._classroomId);
let p2 = User.findById(req.user._id);

Expand Down Expand Up @@ -189,7 +214,10 @@ router.get("/join/:token", ensureAuthenticated, ensureStudent, (req, res) => {
});


// Random color chooser
/**
* Random color generator for the newly created classroom
* @returns {string} - random color hex string
*/
function randomColor() {
let colors = ['e53935', 'd81b60', '8e24aa', '5e35b1', '3949ab',
'1e88e5', '039be5', '00acc1', '00897b', '43a047',
Expand Down
87 changes: 41 additions & 46 deletions routes/classrooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,52 +18,47 @@ const { response } = require("express");

module.exports = router;

/**
* Route serving the user's list of classrooms.
* @name get/classrooms
* @function
* @param {string} path - Express path
* @param {callback} middleware - Express middleware.
*/
router.get("/", ensureAuthenticated, (req, res) => {
if (req.user.role == 1 || req.user.role == 0) {
Classroom.find({ lecturer: req.user })
.populate("topics")
.then((result) => {
res.json({ classrooms: result, user: req.user });
})
.catch((err) => {
console.log(err);
res.json({});
});
} else if (req.user.role == 2) {
User.findOne({ _id: req.user._id })
.select({
_id: 1,
role: 1,
classrooms: 1,
})
.then((user) => {
if (user) {
Classroom.find({ _id: { $in: user.classrooms } })
.select({
teaching_assistants: 1,
lecturer: 1,
name: 1,
_id: 1,
color: 1,
description: 1
})
.populate({
path: "teaching_assistants",
select: ["email", "name", "surname"],
})
.populate({
path: "lecturer",
select: ["email", "name", "surname"],
})
.then((re) => {
let Model = {
user: user,
classrooms: re
}
User.findOne({ _id: req.user._id })
.select({
_id: 1,
role: 1,
classrooms: 1,
})
.then((user) => {
if (user) {
Classroom.find({ _id: { $in: user.classrooms } })
.select({
teaching_assistants: 1,
lecturer: 1,
name: 1,
_id: 1,
color: 1,
description: 1
})
.populate({
path: "teaching_assistants",
select: ["email", "name", "surname"],
})
.populate({
path: "lecturer",
select: ["email", "name", "surname"],
})
.then((re) => {
let Model = {
user: user,
classrooms: re
}

res.render('classroom', { model: Model });
});
}
});
}
res.render('classroom', { model: Model });
});
}
});
})
10 changes: 8 additions & 2 deletions routes/dashboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,15 @@ const Classroom = require("../models/Classroom");

module.exports = router;

// Dashboard
/**
* Route serving the dashboard.
* @name get/dashboard
* @function
* @param {string} path - Express path
* @param {callback} middleware - Express middleware.
*/
router.get('/', ensureAuthenticated, (req, res) => {
Classroom.find({ _id: { $in: req.user.classrooms }})
Classroom.find({ _id: { $in: req.user.classrooms } })
.then((classrooms) => {
let Model = {
user: req.user,
Expand Down
Loading