diff options
author | tomsmeding <tom.smeding@gmail.com> | 2017-11-22 21:23:14 +0100 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2017-11-22 22:23:51 +0100 |
commit | 32523cdcd9eaa4ad9363d79ebe82d5de4b852676 (patch) | |
tree | 88b27b82007047e6923c608cc44ca38dcd0e125a /modules/zelfoverhoor/zelfoverhoor.js | |
parent | 58d635e0c88ea5428072f7901417908f455b93ec (diff) |
Add module 'zelfoverhoor'
Beta stage
Diffstat (limited to 'modules/zelfoverhoor/zelfoverhoor.js')
-rw-r--r-- | modules/zelfoverhoor/zelfoverhoor.js | 189 |
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"); + }); +}; |