UNPKG

ripple-core

Version:

Ripple is an interactive audience response system that allows presenters to survey audience members in real time communication through their mobile devices.

216 lines (182 loc) 5.9 kB
var DB = require('./db-manager.js') , mongo = require('mongodb') , moment = require('moment') , async = require('async') , logger = require('./log') , log = logger.logPair; var util = require('util'); var SM = {}; SM.sets = DB.init.collection('sets'); SM.questions = DB.init.collection('questions'); // Create Routing SM.createSet = function(req, res, o){ // Put Post Params into the session log("Params", util.inspect(req.body) ); // Define data in set initially var data = { name: req.body.name, class: req.body.class, authorID: o._id }; // Create Record DB.insertRec(SM.sets, data, function(err, records){ if (err) { res.send(err, 400); return; } log("Record", util.inspect(records) ); req.session.questionSet = { id: records[0]._id }; res.redirect('admin/set/edit/'+records[0]._id+'~'+records[0].name); }); }; SM.getSetQuestions = function(setID, filter, callback){ log("Set ID", setID); // Get Set Info SM.getSet(setID, function(err, record){ if (err) { return callback({name: "DatabaseError", title: 'Error 404', message: 'Unable to find database:'+err}); } if (!record) { return callback({name: "NoRecord", title: 'No Sets Found', message: 'Currently you have not created a set.'}); } if (!record.question) { return callback(null, []); } log("Record", util.inspect(record) ); SM.getQfromSet(record.question, function(err, qArray){ if (err || !qArray) { return callback({name: "MissingQuestions", title: 'No Questions Found', message: 'Currently there is a problem with the system.'}); } SM.sortQuestions(record.question, qArray, filter, callback); }); }); }; SM.getSet = function(recID, callback){ // Get Record log("Set ID",recID); var BSON = mongo.BSONPure; var o_ID = new BSON.ObjectID(recID); SM.sets.findOne({_id:o_ID}, function(err, record){ log('Found Set', record); callback(err, record); }); }; SM.getQfromSet = function(qNumArray, callback){ log("Question Number Array", qNumArray); //Query for Questions SM.questions.find({ _id:{ $in:qNumArray } }, function(err, cursor){ if (!cursor) { return callback(err); } cursor.toArray( function(err, docArray){ log("Question Records", util.inspect( docArray )); callback(err, docArray); }); }); }; // Sorts an array of questions by the order of the question ids in the set SM.sortQuestions = function(questionIDs, questions, filter, callback) { var qSortedArray = []; // Create a string array of question IDs var stringIDs = []; for (var i = 0; i < questionIDs.length; i++) { stringIDs.push(String(questionIDs[i])); } // Iterate over questions, and if their ID is in questionIDs, put them into the sorted array at // the same position they're found in questionIDs for (var i = 0; i < questions.length; i++) { var idx = stringIDs.indexOf(String(questions[i]._id)); if (idx != -1) { if( filter ){ if( filter.indexOf( questions[i].type ) !== -1) qSortedArray[idx] = questions[i]; } else qSortedArray[idx] = questions[i]; } } // Remove any empty array values for question types that are no longer valid for(var i = 0; i < qSortedArray.length; i++){ if(typeof qSortedArray[i] === 'undefined') qSortedArray.splice(i,1); } log("qSortedArray",qSortedArray); callback(null, qSortedArray); }; SM.createQuestion = function(req, res, o, dbObjID, callback){ // Put Post Params into the session log("Params", util.inspect(req.body) ); // Convert DB Object ID var BSON = mongo.BSONPure; var o_ID = new BSON.ObjectID(dbObjID); // Create Document var data = { type: req.body.qType, authorID: o._id, setID: o_ID } //Create Document DB.insertRec(SM.questions, data, function(err, records){ SM.sets.update({_id: o_ID}, {$push: {question:records[0]._id} }, function(err,results){}); callback(err, records[0]); }); }; SM.updateQuestion = function(qID, updateData, callback){ // Convert DB Object ID var BSON = mongo.BSONPure; var o_ID = new BSON.ObjectID(qID); SM.questions.update({ _id:o_ID }, { $set: updateData}, {safe:true}, function(err, updated){ if( err || !updated ) { log("ERROR",err); } else log("Updated Question Options"); callback(err); }); }; SM.removeQuestion = function(qID, qSetID, callback){ log("Question ID", qID); log("Set ID", qSetID); var o_ID = DB.getObjID(qID); //Remove Question SM.questions.remove({_id: o_ID}, {safe:true}, function(err){ if (err) { return callback(err); } var so_ID = DB.getObjID(qSetID); log("Set ID", so_ID); SM.sets.update({_id: so_ID}, {$pull: {question:o_ID} }, function(err){ callback(err); }); }); }; SM.updateSet = function(setID, updateData, callback){ if(!setID){ logger.error('[SM.updateSet] Set ID not found'); callback('Set ID could not be identified.') } // Convert DB Object ID var o_ID = DB.convertToObjID(setID); // Update Record log("Update Set ", util.inspect(updateData) ); if( !updateData ) callback("No data available to processes.") SM.sets.update({ _id:o_ID }, { $set: updateData}, {safe:true}, function(err, updated){ if( err || !updated ) { log("ERROR",err); } else log("Updated Question Options"); callback(err); }); }; SM.updateOrder = function(qSetID, qOrderArr, callback) { // Turn IDs into ObjectIDs var so_ID = DB.getObjID(qSetID); var qOrderObjArr = []; for (var i = qOrderArr.length - 1; i >= 0; i--) { qOrderObjArr[i] = DB.getObjID( qOrderArr[i] ); }; log("qOrderObjArr", qOrderObjArr); // Set Order in DB SM.sets.update({_id: so_ID}, {$set: { question: qOrderObjArr } }, function(err){ log("Order Updated"); callback(err); }); }; module.exports = SM;