quizzer
Version:
Quizzer is a webserver for collaborative writing lab support. Based on a _fail early, fail often? approach to written language, the tool is particularly suited to second-language learners. The workflow (essay - error - quiz - exam) treats mistakes as an o
110 lines (109 loc) • 4.75 kB
JavaScript
(function () {
var cogClass = function () {};
cogClass.prototype.exec = function (params, request, response) {
var oops = this.utils.apiError;
var page = this.page;
var sys = this.sys;
var classID = params.classid;
var quizNumber = params.quizno;
var questionNumber = params.questionno;
var wrongChoice = params.wrongchoice;
var commenter = this.sys.validCommenter(params).name;
var commenterID = this.sys.validCommenter(params).id;
var rules = params.rules;
var rulesCount = 0;
var createRulesCount = 0;
var retObj = {ruleID:null,selections:[],rulesByChoice:{}}
if (rules) {
var rulesList = rules.other.slice();
if (rules.top) {
rulesList.push(rules.top);
retObj.ruleID = true;
}
// Search for each rule.
// When done, iteratively call function to save remaining rules to DB
rulesCount += rulesList.length;
findRules(rulesList,0,rulesList.length);
} else {
returnList();
}
function findRules (rulesList,pos,limit) {
//console.log("findRules()");
var ruleText = rulesList[pos];
var sql = 'SELECT ruleID,ruleStringID FROM rules JOIN ruleStrings USING(ruleStringID) WHERE string=?';
sys.db.get(sql,[ruleText],function(err,row){
if (err) {return oops(response,err,'**quiz/getrule(1)')};
if (!row) {
createRuleString(rulesList[pos],pos);
} else {
if (pos === 0 && retObj.ruleID === true) {
retObj.ruleID = row.ruleID;
attachRule(retObj.ruleID);
}
rulesCount += -1;
if (rulesCount>0) {
findRules(rulesList,pos+1,limit);
} else {
returnList();
}
}
});
};
function createRuleString(ruleString,pos) {
//console.log("createRuleString()");
var sql = 'INSERT INTO ruleStrings VALUES (NULL,?);';
sys.db.run(sql,[ruleString],function(err){
if (err) {return oops(response,err,'**quiz/getrule(2)')};
createRule(this.lastID,pos);
});
};
function createRule(ruleStringID,pos) {
//console.log("createRule()");
var sql = 'INSERT INTO rules (ruleGroupID,ruleStringID,adminID) '
+ 'SELECT ruleGroupID,?,? '
+ 'FROM classes '
+ 'WHERE classID=?;'
sys.db.run(sql,[ruleStringID,commenterID,classID],function(err){
if (err) {return oops(response,err,'**quiz/getrule(3)')};
//console.log("CREATING RULE: "+pos+" "+retObj.ruleID+" "+typeof retObj.ruleID+" "+this.lastID);
if (pos === 0 && retObj.ruleID === true) {
retObj.ruleID = this.lastID;
attachRule(retObj.ruleID);
}
rulesCount += -1;
if (!rulesCount) {
returnList();
}
});
};
function attachRule (ruleID) {
//console.log("attachRule()");
var sql = 'INSERT OR IGNORE INTO rulesToChoices (choiceID,ruleID) '
+ 'SELECT choiceID,? '
+ 'FROM quizzes '
+ 'NATURAL JOIN questions '
+ 'JOIN choices USING(questionID) '
+ 'WHERE classID=? AND quizNumber=? AND questionNumber=? AND choice=?;';
sys.db.run(sql,[ruleID,classID,quizNumber,questionNumber,wrongChoice],function(err){
if (err) {return oops(response,err,'**quiz/getrule(4)')};
// Do nothing.
});
};
function returnList () {
//console.log("returnList();");
// adminID=1 is admin user, with the keys to the fort
var sql = 'SELECT ruleID AS ruleid,string AS ruletext '
+ 'FROM rules '
+ 'JOIN ruleStrings USING(ruleStringID) '
+ 'WHERE adminID IN (1,?) '
+ 'ORDER BY string;';
sys.db.all(sql,[commenterID],function(err,rows){
if (err||!rows) {return oops(response,err,'**quiz/getrule(5)')};
retObj.selections = rows;
response.writeHead(200, {'Content-Type': 'application/json'});
response.end(JSON.stringify(retObj));
});
}
}
exports.cogClass = cogClass;
})();