UNPKG

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

180 lines (157 loc) 7.15 kB
(function () { var cogClass = function () {}; cogClass.prototype.exec = function (params, request, response) { var oops = this.utils.apiError; var classID = params.classid; var sys = this.sys; // Simple classID deletes: memberships, showing // Chained deletes: // answers [each questionID] // choices [each questionID] // quizAnswers [each quizID] // questions [each quizID] // quizzes [for the classID] // Purges: // students (dependencies): // memberships // showing // quizAnswers // answers // ruleTranslationEdits // strings (dependencies): // questions // choices // comments sys.db.run('BEGIN TRANSACTION',function(err){ if (err) {return oops(response,err,'**classes/deleteoneclass(1)')}; deleteOne(0); }); var deleteTables = ["memberships","showing"]; function deleteOne (pos) { if (pos == deleteTables.length) { deleteAnswers(); return; } var table = deleteTables[pos]; var sql = "DELETE FROM " + table + " WHERE classID=?;" sys.db.run(sql,[classID],function (err) { if (err) {return oops(response,err,'classes/deleteoneclass [deleteOne] (' + pos + ')')}; deleteOne(pos+1); }); } function deleteAnswers() { var sql = "DELETE FROM answers WHERE questionID IN (SELECT questionID " + "FROM questions WHERE quizID IN (SELECT quizID " + "FROM quizzes WHERE classID=?));" sys.db.run(sql,[classID],function (err) { if (err) {return oops(response,err,'classes/deleteoneclass [deleteAnswers]')}; deleteComments(); }); } function deleteComments() { var sql = "DELETE FROM comments WHERE choiceID IN (SELECT choiceID " + "FROM choices WHERE questionID IN (SELECT questionID " + "FROM questions WHERE quizID IN (SELECT quizID " + "FROM quizzes WHERE classID=?)));" sys.db.run(sql,[classID],function (err) { if (err) {return oops(response,err,'classes/deleteoneclass [deleteComments]')}; deleteRulesToChoices(); }); } function deleteRulesToChoices() { var sql = "DELETE FROM rulesToChoices WHERE choiceID IN (SELECT choiceID " + "FROM choices WHERE questionID IN (SELECT questionID " + "FROM questions WHERE quizID IN (SELECT quizID " + "FROM quizzes WHERE classID=?)));" sys.db.run(sql,[classID],function (err) { if (err) {return oops(response,err,'classes/deleteoneclass [deleteComments]')}; deleteChoices(); }); } function deleteChoices() { var sql = "DELETE FROM choices WHERE questionID IN (SELECT questionID " + "FROM questions WHERE quizID IN (SELECT quizID " + "FROM quizzes WHERE classID=?));" sys.db.run(sql,[classID],function (err) { if (err) {return oops(response,err,'classes/deleteoneclass [deleteChoices]')}; deleteQuizAnswers(); }); } function deleteQuizAnswers() { var sql = "DELETE FROM quizAnswers WHERE quizID IN (SELECT quizID " + "FROM quizzes WHERE classID=?);" sys.db.run(sql,[classID],function (err) { if (err) {return oops(response,err,'classes/deleteoneclass [deleteQuizAnswers]')}; deleteQuestions(); }); } function deleteQuestions() { var sql = "DELETE FROM questions WHERE quizID IN (SELECT quizID " + "FROM quizzes WHERE classID=?);" sys.db.run(sql,[classID],function (err) { if (err) {return oops(response,err,'classes/deleteoneclass [deleteQuestions]')}; deleteQuizzes(); }); } function deleteQuizzes() { var sql = "DELETE FROM quizzes WHERE classID=?;" sys.db.run(sql,[classID],function (err) { if (err) {return oops(response,err,'classes/deleteoneclass [deleteQuizzes]')}; deleteClasses(); }); } function deleteClasses() { var sql = "DELETE FROM classes WHERE classID=?;" sys.db.run(sql,[classID],function (err) { if (err) {return oops(response,err,'classes/deleteoneclass [deleteClasses]')}; purgeStudents(); }); } function purgeStudents () { var sql = "DELETE FROM students WHERE studentID IN " + "(SELECT S.studentID FROM students S " + " LEFT JOIN memberships M ON M.studentID=S.studentID " + " LEFT JOIN showing Sh ON Sh.studentID=S.studentID " + " LEFT JOIN quizAnswers QA ON QA.studentID=S.studentID " + " LEFT JOIN answers A ON A.studentID=S.studentID " + " LEFT JOIN ruleTranslationEdits RTE ON RTE.studentID=S.studentID " + "WHERE M.studentID IS NULL " + " AND Sh.studentID IS NULL " + " AND QA.studentID IS NULL " + " AND A.studentID IS NULL " + " AND RTE.studentID IS NULL);"; sys.db.run(sql,function(err){ if (err) {return oops(response,err,'classes/deleteoneclass [purgeStudents]')}; purgeStrings(); }); } function purgeStrings () { var sql = "DELETE FROM strings WHERE stringID IN " + "(SELECT S.stringID FROM strings S " + " LEFT JOIN questions Q ON Q.stringID=S.stringID " + " LEFT JOIN choices Ch ON Ch.stringID=S.stringID " + " LEFT JOIN comments Co ON Co.stringID=S.stringID " + "WHERE Q.stringID IS NULL " + " AND Ch.stringID IS NULL " + " AND Co.stringID IS NULL);"; sys.db.run(sql,function(err){ if (err) {return oops(response,err,'classes/deleteoneclass [purgeStrings]')}; endTransaction(); }); } function endTransaction() { sys.db.run('END TRANSACTION',function(err){ if (err) {return oops(response,err,'classes/deleteoneclass(3)')}; vacuumGarbage(); }); }; function vacuumGarbage() { sys.db.run('VACUUM',function(err){ if (err) {return oops(response,err,'classes/deleteoneclass(2)')}; response.writeHead(200, {'Content-Type': 'application/json'}); response.end('["success"]'); }); }; } exports.cogClass = cogClass; })();