summaryrefslogtreecommitdiff
path: root/modules/zelfoverhoor/zelfoverhoor.js
diff options
context:
space:
mode:
Diffstat (limited to 'modules/zelfoverhoor/zelfoverhoor.js')
-rw-r--r--modules/zelfoverhoor/zelfoverhoor.js189
1 files changed, 189 insertions, 0 deletions
diff --git a/modules/zelfoverhoor/zelfoverhoor.js b/modules/zelfoverhoor/zelfoverhoor.js
new file mode 100644
index 0000000..c55f0e0
--- /dev/null
+++ b/modules/zelfoverhoor/zelfoverhoor.js
@@ -0,0 +1,189 @@
+var cmn=require("../$common.js"),
+ fs=require("fs");
+
+var moddir;
+
+var accounts=require("./accounts.json");
+
+// {<id>: {q: "question", a: "answer"}}
+var questiondb={};
+// {<id>: {id, name, description, questions: [<question_id>]}}
+var questionsets={};
+// {<username>: [<set_id>]}
+var userlists={};
+
+function uniqidstr(validp){
+ for(var len=6;;len++){
+ var str="";
+ for(var i=0;i<len;i++)str+=String.fromCharCode(97+Math.random()*26|0);
+ if(validp(str))return str;
+ }
+}
+
+var persistDB=(function(){
+ var qdbCache=null,qsetsCache=null,ulCache=null;
+ return function persistDB(){
+ var s=JSON.stringify(questiondb);
+ if(s!=qdbCache){
+ qdbCache=s;
+ fs.writeFile(moddir+"/questiondb.json",JSON.stringify(questiondb),function(err){
+ if(err)console.log("write questiondb.json:",err);
+ });
+ }
+ s=JSON.stringify(questionsets);
+ if(s!=qsetsCache){
+ qsetsCache=s;
+ fs.writeFile(moddir+"/questionsets.json",JSON.stringify(questionsets),function(err){
+ if(err)console.log("write questionsets.json:",err);
+ });
+ }
+ s=JSON.stringify(userlists);
+ if(s!=ulCache){
+ ulCache=s;
+ fs.writeFile(moddir+"/userlists.json",JSON.stringify(userlists),function(err){
+ if(err)console.log("write userlists.json:",err);
+ });
+ }
+ };
+})();
+
+function shuffle(a){
+ var j,v,i;
+ for(var i=a.length-1;i>0;i--){
+ j=Math.floor(Math.random()*(i+1));
+ v=a[i]; a[i]=a[j]; a[j]=v;
+ }
+}
+
+module.exports=function(app,io,_moddir){
+ moddir=_moddir;
+
+ try {
+ questiondb=JSON.parse(fs.readFileSync(moddir+"/questiondb.json"));
+ questionsets=JSON.parse(fs.readFileSync(moddir+"/questionsets.json"));
+ userlists=JSON.parse(fs.readFileSync(moddir+"/userlists.json"));
+ } catch(e){
+ console.log("error on reading zelfoverhoor db");
+ questiondb={};
+ questionsets={};
+ userlists={};
+ persistDB();
+ }
+
+ app.get("/zelfoverhoor",function(req,res){
+ res.sendFile(moddir+"/index.html");
+ });
+
+ app.get("/zelfoverhoor/qs/:id",function(req,res){
+ var qset=questionsets[req.params.id];
+ if(qset==null){
+ res.status(404).sendFile(moddir+"/notfound.html");
+ return;
+ }
+ var list=[];
+ for(var i=0;i<qset.questions.length;i++){
+ list.push(questiondb[qset.questions[i]]);
+ }
+ var resset={"id": qset.id, "name": qset.name, "description": qset.description, "questions": list};
+ shuffle(resset.questions);
+ fs.readFile(moddir+"/qs.html",function(err,data){
+ if(err)throw err;
+ res.send(String(data)
+ .replace("<!--###ID###-->",req.params.id)
+ .replace("/*###QUESTIONSET###*/",JSON.stringify(resset)));
+ });
+ });
+
+ app.use(["/zelfoverhoor/docent","/zelfoverhoor/docent/*"],cmn.authgen(accounts));
+ app.get("/zelfoverhoor/docent",function(req,res){
+ fs.readFile(moddir+"/docent.html",function(err,data){
+ if(err)throw err;
+ res.send(String(data)
+ .replace(/<!--###NAME###-->/g,req.authuser));
+ });
+ });
+ app.get("/zelfoverhoor/docent/sets",function(req,res){
+ if(userlists[req.authuser]==null){
+ userlists[req.authuser]=[];
+ }
+ var ul=userlists[req.authuser];
+ var list=[];
+ for(var i=0;i<ul.length;i++){
+ list.push(questionsets[ul[i]]);
+ }
+ res.send(JSON.stringify(list));
+ });
+ app.post("/zelfoverhoor/docent/addset",function(req,res){
+ var qset;
+ try {
+ qset=JSON.parse(req.body);
+ } catch(e){
+ res.status(400).send("Invalid json received");
+ return;
+ }
+ if(!qset.name||typeof qset.name!="string"||
+ !qset.description||typeof qset.description!="string"||
+ !qset.questions||!Array.isArray(qset.questions)){
+ res.status(400).send("Invalid data received");
+ return;
+ }
+ var i;
+ for(i=0;i<qset.questions.length;i++){
+ if(!qset.questions[i].q||typeof qset.questions[i].q!="string"||
+ !qset.questions[i].a||typeof qset.questions[i].a!="string"){
+ res.status(400).send("Invalid question data received");
+ return;
+ }
+ }
+ var ids=[],id;
+ for(i=0;i<qset.questions.length;i++){
+ id=uniqidstr(function(s){return questiondb[s]==null;});
+ questiondb[id]={"q": qset.questions[i].q, "a": qset.questions[i].a};
+ ids.push(id);
+ }
+ var setid=uniqidstr(function(s){return questionsets[s]==null;});
+ questionsets[setid]={"id": setid, "name": qset.name, "description": qset.description, "questions": ids};
+ if(userlists[req.authuser]==null){
+ userlists[req.authuser]=[];
+ }
+ userlists[req.authuser].push(setid);
+ persistDB();
+ res.send(setid);
+ });
+ app.post("/zelfoverhoor/docent/deleteset",function(req,res){
+ var setid=req.body;
+ if(!setid||typeof setid!="string"){
+ res.status(400).send("Invalid id received");
+ return;
+ }
+ if(!userlists[req.authuser]){
+ userlists[req.authuser]=[];
+ }
+ var ul=userlists[req.authuser];
+ var found=false;
+ for(var i=0;i<ul.length;i++){
+ if(ul[i]==setid){
+ ul.splice(i,1);
+ found=true;
+ break;
+ }
+ }
+ if(!found){
+ res.status(404).send("ID not found");
+ return;
+ }
+ persistDB();
+ res.send();
+ });
+
+ app.get("/zelfoverhoor/docent/docent.js",function(req,res){
+ res.sendFile(moddir+"/docent.js");
+ });
+
+ app.get("/zelfoverhoor/qs.js",function(req,res){
+ res.sendFile(moddir+"/qs.js");
+ });
+ app.get("/zelfoverhoor/style.css",function(req,res){
+ res.sendFile(moddir+"/style.css");
+ });
+};