Browse Source

Ajout contrôleur + route pour obtenir liste paginée des questionnaires des questionnaires auxquels un utilisateur a eu accès.

master
Fabrice PENHOËT 11 months ago
parent
commit
89829c784c
  1. 3
      config/questionnaires.js
  2. 1
      config/users.js
  3. 13
      controllers/answer.js
  4. 50
      controllers/subscription.js
  5. 1
      routes/questionnaire.js
  6. 1
      routes/user.js
  7. 2
      views/wikilerni/includes/listing-questionnaires.pug

3
config/questionnaires.js

@ -4,7 +4,7 @@ module.exports =
questionnaireRoutes: "/questionnaire",// la base à laquelle s'ajoute les routes suivantes
getListNextQuestionnaires: "/getlistnextquestionnaires/",
getQuestionnaireRoutes: "/get",
getRandomQuestionnairesRoute : "/getrandom",
getRandomQuestionnairesRoute : "/getrandom",
getStatsQuestionnaires : "/stats/",
previewQuestionnaireRoutes: "/preview",
publishedQuestionnaireRoutes: "/quiz/",
@ -23,7 +23,6 @@ module.exports =
// -- answers :
getAdminStats: "/getadminstats/",
getPreviousAnswers: "/user/answers/",
/// getQuestionnairesWithoutAnswer: "/withoutanswer/user/", -> ne sert plus ! à remplacer pour liste derniers quizs
getStatsAnswers : "/user/anwswers/stats/",// fonctionne aussi pour les groupes
saveAnswersRoute: "/answer/",// idem
// forms : à compléter avec valeurs par défaut, etc. cf modèle

1
config/users.js

@ -16,6 +16,7 @@ module.exports =
getLoginLinkRoute: "/getloginlink",
getPayments: "/payment/getforoneuser/",
getUserInfos: "/get/",
getUsersQuestionnairesRoute: "/getusersquestionnaires/",// les questionnaires auxquels l'utilisateur a déjà eu accès via son abonnement
searchUserRoute: "/search/",
signupCompletionRoute: "/signupcompletion/",
subscribeRoute: "/signup",

13
controllers/answer.js

@ -21,7 +21,7 @@ exports.create = async (req, res, next) =>
const db = require("../models/index");
req.body.UserId=req.connectedUser.User.id;
await saveAnswerToQuestionnaire(req.body);
// J'en profite pour remettre les pendules à l'heure !
// J'en profite pour remettre les pendules à l'heure ! (revoir pour appeler un contrôleur des users)
db["User"].update({ timeDifference: req.body.timeDifference }, { where: { id : req.connectedUser.User.id }, limit:1 });
res.status(201).json({ message: txtAnswers.responseSavedMessage });
next();
@ -101,12 +101,12 @@ exports.getStatsByUser = async(req, res, next) =>
// FONCTIONS UTILITAIRES
// Enregistre la réponse à un questionnaire
// Enregistre la réponse à un questionnaire autonome
const saveAnswerToQuestionnaire = async (req) =>
{
const db = require("../models/index");
const checkQuestionnaireAccess=await subscriptionCtrl.checkQuestionnaireAccess(req.UserId, req.QuestionnaireId);
if(checkQuestionnaireAccess) // L'utilisateur a déjà accès à ce questionnaire, j'enregistre juste sa réponse
if(checkQuestionnaireAccess) // Si l'utilisateur a déjà accès à ce questionnaire, j'enregistre juste sa réponse
await db["Answer"].create({ ...req }, { fields: ["nbQuestions", "nbCorrectAnswers", "duration", "QuestionnaireId", "UserId"] });
else
{
@ -126,6 +126,7 @@ const saveAnswerToGroup = async (req) =>
{
const db = require("../models/index");
const answer = await db["Answer"].create({ ...req }, { fields: ["nbQuestions", "nbCorrectAnswers", "duration", "GroupId", "UserId"] });
// Si il a répondu à un quiz groupé, l'utilisateur est considéré comme ayant lu tous les éléments du groupe
const group = await groupCtrl.searchGroupById(req.GroupId);
for(let i in group.Questionnaires)
{
@ -142,7 +143,7 @@ const saveAnswerToGroup = async (req) =>
exports.saveAnswerToGroup = saveAnswerToGroup;
// Créer la liste des réponses d'un utilisateur
// !! à surveiller car fichier pouvant devenir gros ! mais utile pour future SVG côté client
// !! à surveiller car fichier pouvant devenir gros ! mais utile pour future SVG côté client ?
const creaUserAnswersJson = async (UserId) =>
{
const db = require("../models/index");
@ -170,7 +171,7 @@ const getUserAnswersByQuestionnaire = async (UserId, QuestionnaireId) =>
{
if(userAnswers[i].QuestionnaireId == QuestionnaireId) // pas "===", car type de données pouvant être différents
answers.push(userAnswers[i]);
else if(answers.length !== 0) // les réponses étant classées par QuestionnaireId, je peux sortir de la boucle
else if(answers.length !== 0) // les réponses étant groupées par QuestionnaireId, je peux sortir de la boucle
break;
}
return answers;
@ -189,7 +190,7 @@ const getUserAnswersByGroup = async (UserId, GroupId) =>
{
if(userAnswers[i].GroupId == GroupId)// pas "===" car type de données pouvant être différents
answers.push(userAnswers[i]);
else if(answers.length !== 0) // les réponses étant classées par GroupId, je peux sortir de la boucle
else if(answers.length !== 0) // les réponses étant groupées par GroupId, je peux sortir de la boucle
break;
}
return answers;

50
controllers/subscription.js

@ -39,6 +39,56 @@ exports.unsubscribeLink = async (req, res, next) =>
}
}
// Retourne la liste des questionnaires auxquels un utilisateur a eu accès, listés par ordre de fraîcheur.
// Un questionnaire de début et un nombre de questionnaires à retourner doivent être fournis (pagination).
exports.getQuestionnairesForUser = async(req, res, next) =>
{
try
{
if(req.params.id === undefined || req.params.begin === undefined || req.params.nb === undefined)
{
const err=new Error;
err.message=txtGeneral.neededParams;
throw err;
}
const questionnaires = await db.sequelize.query("SELECT `Questionnaires`.`id` FROM `Questionnaires` INNER JOIN `QuestionnaireAccesses` ON `QuestionnaireAccesses`.`QuestionnaireId`=`Questionnaires`.`id` AND `QuestionnaireAccesses`.`UserId`=:id ORDER BY `QuestionnaireAccesses`.`createdAt` DESC LIMIT :begin,:nb", { replacements: { id:req.params.id, begin:req.params.begin, nb:req.params.nb }, type: QueryTypes.SELECT });
// je vais chercher les infos dans les json car ma vue a besoin des infos présentées de cette manière
const datas=[];
for(let i in questionnaires)
datas.push(await questionnaireCtrl.searchQuestionnaireById(questionnaires[i].id, true));
if(req.params.output !== undefined && req.params.output == "html")
{
if(datas.length !== 0)
{
const pug = require("pug");
const striptags = require("striptags");
const txtIllustration= require("../lang/"+config.adminLang+"/illustration");
const compiledFunction = pug.compileFile("./views/"+config.theme+"/includes/listing-questionnaires.pug");
const pageDatas=
{
tool: tool,
striptags: striptags,
txtGeneral: txtGeneral,
txtIllustration: txtIllustration,
questionnaires: datas,
nbQuestionnairesList:configTpl.nbQuestionnairesUserHomePage
}
datas.html=await compiledFunction(pageDatas);
}
else
datas.html="";
res.status(200).json(datas);
}
else// on retourne seulement les données
res.status(200).json(datas);
next();
}
catch(e)
{
next(e);
}
}
// CRONS

1
routes/questionnaire.js

@ -25,6 +25,5 @@ router.get("/preview/:id/:token", questionnaireCtrl.showOneQuestionnaireById);//
router.post("/answer/", auth, answerCtrl.create);
router.get("/user/anwswers/stats/:userId", auth, answerCtrl.getStatsByUser);
router.get("/user/answers/:userId/:questionnaireId", auth, answerCtrl.getAnswersByQuestionnaire);
//router.get("/withoutanswer/user/:id/:begin/:nb/:output", auth, answerCtrl.getQuestionnairesWithouAnswerByUser);
module.exports = router;

1
routes/user.js

@ -34,5 +34,6 @@ router.get("/getgodchilds/:id", authAdmin, userCtrl.getOneUserGodChilds);
router.get("/get/:id", auth, userCtrl.getOneUserById);
router.post("/search", authAdmin, userCtrl.searchUsers);
router.get("/getadminstats", authAdmin, userCtrl.getStats);
router.get("/getusersquestionnaires/:id/:begin/:nb/:output", auth, subscriptionCtrl.getQuestionnairesForUser);
module.exports = router;

2
views/wikilerni/includes/listing-questionnaires.pug

@ -15,7 +15,7 @@ div(id="triple-column")
{
questionnaires_col[col].push(questionnaires[i]);
tot++;
if((col===0 && tot >= (nbMaxQuestionnairesCol/3)) || (col===1 && tot >= (nbMaxQuestionnairesCol/3*2)))
if((col === 0 && tot >= (nbMaxQuestionnairesCol/3)) || (col === 1 && tot >= (nbMaxQuestionnairesCol/3*2)))
col++;
}
}

Loading…
Cancel
Save