* number: student number
* inputs: array of indexed arrays of integers (or html text if not quiz)
* startTime, endTime
+ * discoTime, totalDisco: last disconnect timestamp (if relevant) + total
+ * discoCount: total disconnections
* password: random string identifying student for exam session TEMPORARY
*/
);
},
+ getPaperByNumber: function(aid, number, callback)
+ {
+ db.assessments.findOne(
+ {
+ _id: aid,
+ "papers.number": number,
+ },
+ (err,a) => {
+ if (!!err || !a)
+ return callback(err,a);
+ for (let p of a.papers)
+ {
+ if (p.number == number)
+ return callback(null,p); //reached for sure
+ }
+ }
+ );
+ },
+
startSession: function(aid, number, password, callback)
{
- // TODO: security, do not re-do tasks if already done
db.assessments.update(
{ _id: aid },
{ $push: { papers: {
startTime: Date.now(),
endTime: undefined,
password: password,
+ totalDisco: 0,
+ discoCount: 0,
inputs: [ ], //TODO: this is stage 1, stack indexed answers.
// then build JSON tree for easier access / correct
}}},
);
},
+ // NOTE: no callbacks for 2 next functions, failures are not so important
+ // (because monitored: teachers can see what's going on)
+
+ addDisco: function(aid, number, deltaTime)
+ {
+ db.assessments.update(
+ {
+ _id: aid,
+ "papers.number": number,
+ },
+ { $inc: {
+ "papers.$.discoCount": 1,
+ "papers.$.totalDisco": deltaTime,
+ } },
+ { $set: { "papers.$.discoTime": null } }
+ );
+ },
+
+ setDiscoTime: function(aid, number)
+ {
+ db.assessments.update(
+ {
+ _id: aid,
+ "papers.number": number,
+ },
+ { $set: { "papers.$.discoTime": Date.now() } }
+ );
+ },
+
+ getDiscoTime: function(aid, number, cb)
+ {
+ db.assessments.findOne(
+ { _id: aid },
+ (err,a) => {
+ if (!!err)
+ return cb(err, null);
+ const idx = a.papers.findIndex( item => { return item.number == number; });
+ cb(null, a.papers[idx].discoTime);
+ }
+ );
+ },
+
+ hasInput: function(aid, number, password, idx, cb)
+ {
+ db.assessments.findOne(
+ {
+ _id: aid,
+ "papers.number": number,
+ "papers.password": password,
+ },
+ (err,a) => {
+ if (!!err || !a)
+ return cb(err,a);
+ let papIdx = a.papers.findIndex( item => { return item.number == number; });
+ for (let i of a.papers[papIdx].inputs)
+ {
+ if (i.index == idx)
+ return cb(null,true);
+ }
+ cb(null,false);
+ }
+ );
+ },
+
// https://stackoverflow.com/questions/27874469/mongodb-push-in-nested-array
setInput: function(aid, number, password, input, callback) //input: index + arrayOfInt (or txt)
{