From 89829c784cc333334ce2e5cb3f1828bfa7f17981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabrice=20PENHO=C3=8BT?= Date: Tue, 27 Oct 2020 16:08:48 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20contr=C3=B4leur=20+=20route=20pour=20ob?= =?UTF-8?q?tenir=20liste=20pagin=C3=A9e=20des=20questionnaires=20des=20que?= =?UTF-8?q?stionnaires=20auxquels=20un=20utilisateur=20a=20eu=20acc=C3=A8s?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/questionnaires.js | 3 +- config/users.js | 1 + controllers/answer.js | 13 ++--- controllers/subscription.js | 50 +++++++++++++++++++ routes/questionnaire.js | 1 - routes/user.js | 1 + .../includes/listing-questionnaires.pug | 2 +- 7 files changed, 61 insertions(+), 10 deletions(-) diff --git a/config/questionnaires.js b/config/questionnaires.js index 94796ff..999918e 100644 --- a/config/questionnaires.js +++ b/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 diff --git a/config/users.js b/config/users.js index 75b4435..58ad9c7 100644 --- a/config/users.js +++ b/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", diff --git a/controllers/answer.js b/controllers/answer.js index 894f1b2..b9e8bd4 100644 --- a/controllers/answer.js +++ b/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; diff --git a/controllers/subscription.js b/controllers/subscription.js index 2db28e7..efca851 100644 --- a/controllers/subscription.js +++ b/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 diff --git a/routes/questionnaire.js b/routes/questionnaire.js index 3bf0ef7..6c8ac45 100644 --- a/routes/questionnaire.js +++ b/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; \ No newline at end of file diff --git a/routes/user.js b/routes/user.js index 93f6bdf..6049270 100644 --- a/routes/user.js +++ b/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; \ No newline at end of file diff --git a/views/wikilerni/includes/listing-questionnaires.pug b/views/wikilerni/includes/listing-questionnaires.pug index 26ba8cf..f2563b9 100644 --- a/views/wikilerni/includes/listing-questionnaires.pug +++ b/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++; } }