From 8e0d8fbbb0f82f47fbac64a5049b5e3c4dd6e17b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabrice=20PENHO=C3=8BT?= Date: Wed, 21 Oct 2020 17:41:16 +0200 Subject: [PATCH] =?UTF-8?q?Suppression=20des=20attributs=20noticeOk=20et?= =?UTF-8?q?=20newsletterOk=20aux=20diff=C3=A9rents=20niveaux=20MVC=20+=20s?= =?UTF-8?q?cripts=20front-end.=20La=20r=C3=A9ception=20ou=20pas=20d'e-mail?= =?UTF-8?q?=20sera=20g=C3=A9r=C3=A9e=20par=20l'attribut=20receiptDays=20po?= =?UTF-8?q?uvant=20=C3=AAtre=20vide.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/subscription.js | 91 ++++++++++++-------------- controllers/user.js | 14 ++-- front/public/compte.html | 6 -- front/public/gestion-utilisateurs.html | 9 +-- front/src/accountUser.js | 7 -- front/src/manageUsers.js | 7 -- models/Subscription.js | 13 ---- models/User.js | 13 ---- models/wikilerni-crea.sql | 22 +++---- 9 files changed, 62 insertions(+), 120 deletions(-) diff --git a/controllers/subscription.js b/controllers/subscription.js index c035190..8dbacc7 100644 --- a/controllers/subscription.js +++ b/controllers/subscription.js @@ -20,15 +20,14 @@ const answerCtrl = require("./answer"); const questionnaireCtrl = require("./questionnaire"); const userCtrl = require("./user"); -// Clic sur lien de désabonnement aux alertes email +// Clic sur lien de désabonnement aux email exports.unsubscribeLink = async (req, res, next) => { try { const db = require("../models/index"); const userDatas= await userCtrl.checkTokenUser(req.params.token); - await db["User"].update({ newsletterOk: false }, { where: { id : userDatas.User.id }, limit:1 }); - await db["Subscription"].update({ noticeOk: false }, { where: { UserId : userDatas.User.id }, limit:1 }); + await db["Subscription"].update({ receiptDays: "" }, { where: { UserId : userDatas.User.id }, limit:1 }); userCtrl.creaUserJson(userDatas.User.id); res.status(200).json({ message: txt.unsubscriptionOk }); next(); @@ -183,11 +182,11 @@ exports.notifyExpirationAccount= async(req, res, next) => exports.addNewQuestionnaireUsers = async(req, res, next) => { try - { + { /// revoir pour ne plus associer et envoyer de mails qu'aux utilisateurs ayant des jours d'envoi choisis const db = require("../models/index"); // Utilisateurs dont l'abonnement est toujours actif et souhaitant recevoir un nouveau quiz le jour de l'appel de cette méthode. // Le tout en heure locale et en ignorant ceux qui ont déjà été traités ce jour. - const subscriptionsOk = await db.sequelize.query("SELECT `Subscriptions`.`id` as SubscriptionId, `Subscriptions`.`lastProcessingAt`, `UserId`, `name`, `email`, `smtp`, `language`, `noticeOk`, `receiptDays`, ADDDATE(UTC_TIMESTAMP, INTERVAL `timeDifference` MINUTE) AS localDate FROM `Subscriptions` INNER JOIN `Users` ON `Subscriptions`.`UserId`=`Users`.`id` WHERE `status`='user' AND ADDDATE(`Subscriptions`.`createdAt`, `numberOfDays`) > UTC_TIMESTAMP HAVING HOUR(localDate) > "+config.hourGiveNewQuestionnaireBegin+" AND HOUR(localDate) < "+config.hourGiveNewQuestionnaireEnd+" AND LOCATE(DAYOFWEEK(localDate),receiptDays)!=0 AND SubscriptionId NOT IN (SELECT DISTINCT `SubscriptionId` FROM `Pauses` WHERE ADDDATE(`startingAt`, INTERVAL `timeDifference` MINUTE) <= localDate AND ADDDATE(`endingAT`, INTERVAL `timeDifference` MINUTE) > localDate) AND DATEDIFF(NOW(),`Subscriptions`.`lastProcessingAt`) >= 1 LIMIT "+config.numberNewQuestionnaireAtSameTime, { type: QueryTypes.SELECT }); + const subscriptionsOk = await db.sequelize.query("SELECT `Subscriptions`.`id` as SubscriptionId, `Subscriptions`.`lastProcessingAt`, `UserId`, `name`, `email`, `smtp`, `language`, `receiptDays`, ADDDATE(UTC_TIMESTAMP, INTERVAL `timeDifference` MINUTE) AS localDate FROM `Subscriptions` INNER JOIN `Users` ON `Subscriptions`.`UserId`=`Users`.`id` WHERE `status`='user' AND ADDDATE(`Subscriptions`.`createdAt`, `numberOfDays`) > UTC_TIMESTAMP HAVING HOUR(localDate) > "+config.hourGiveNewQuestionnaireBegin+" AND HOUR(localDate) < "+config.hourGiveNewQuestionnaireEnd+" AND LOCATE(DAYOFWEEK(localDate),receiptDays)!=0 AND SubscriptionId NOT IN (SELECT DISTINCT `SubscriptionId` FROM `Pauses` WHERE ADDDATE(`startingAt`, INTERVAL `timeDifference` MINUTE) <= localDate AND ADDDATE(`endingAT`, INTERVAL `timeDifference` MINUTE) > localDate) AND DATEDIFF(NOW(),`Subscriptions`.`lastProcessingAt`) >= 1 LIMIT "+config.numberNewQuestionnaireAtSameTime, { type: QueryTypes.SELECT }); if(subscriptionsOk.length===0) res.status(200).json({ message: txt.allSubscriptionProcessed }); else @@ -202,59 +201,55 @@ exports.addNewQuestionnaireUsers = async(req, res, next) => if(access) { answerCtrl.creaUserQuestionnairesWithoutAnswerJson(subscriptionsOk[i].UserId); - if(subscriptionsOk[i].noticeOk) + token=jwt.sign({ userId: subscriptionsOk[i].UserId }, config.tokenPrivateKey, { expiresIn: config.tokenUnsubscribeLinkTimeInDays }); + const mapMail = { - token=jwt.sign({ userId: subscriptionsOk[i].UserId }, config.tokenPrivateKey, { expiresIn: config.tokenUnsubscribeLinkTimeInDays }); - const mapMail = - { - USER_NAME: subscriptionsOk[i].name, - QUESTIONNAIRE_URL: config.siteUrl+"/"+configQuestionnaires.dirWebQuestionnaire+"/"+newQuestionnaire[0].slug+".html", - UNSUBSCRIBE_URL: config.siteUrl+"/"+configTpl.stopMailPage+token - }; - const mailDatas= - { - mailSubject: newQuestionnaire[0].title, - mailPreheader: newQuestionnaire[0].title, - mailTitle: newQuestionnaire[0].title, - mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.stopMailPage+token, - mailHeaderLinkTxt: txt.mailStopMailLinkTxt, - mailMainContent: newQuestionnaire[0].introduction+"

"+txtQuestionnaire.estimatedTime+" "+txtQuestionnaire.estimatedTimeOption[newQuestionnaire[0].estimatedTime]+".

", - linksCTA: [{ url:newQuestionnaire[0].url, txt:newQuestionnaire[0].anchor }, { url:config.siteUrl+"/"+configQuestionnaires.dirWebQuestionnaire+"/"+newQuestionnaire[0].slug+".html#questionnaire", txt:txtQuestionnaire.btnShowQuestionnaire }], - mailRecipientAddress: subscriptionsOk[i].email - } - toolMail.sendMail(subscriptionsOk[i].smtp, subscriptionsOk[i].email, newQuestionnaire[0].title, tool.replaceAll(txt.mailNewQuestionnaireBodyTxt, mapMail), "", mailDatas); + USER_NAME: subscriptionsOk[i].name, + QUESTIONNAIRE_URL: config.siteUrl+"/"+configQuestionnaires.dirWebQuestionnaire+"/"+newQuestionnaire[0].slug+".html", + UNSUBSCRIBE_URL: config.siteUrl+"/"+configTpl.stopMailPage+token + }; + const mailDatas= + { + mailSubject: newQuestionnaire[0].title, + mailPreheader: newQuestionnaire[0].title, + mailTitle: newQuestionnaire[0].title, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.stopMailPage+token, + mailHeaderLinkTxt: txt.mailStopMailLinkTxt, + mailMainContent: newQuestionnaire[0].introduction+"

"+txtQuestionnaire.estimatedTime+" "+txtQuestionnaire.estimatedTimeOption[newQuestionnaire[0].estimatedTime]+".

", + linksCTA: [{ url:newQuestionnaire[0].url, txt:newQuestionnaire[0].anchor }, { url:config.siteUrl+"/"+configQuestionnaires.dirWebQuestionnaire+"/"+newQuestionnaire[0].slug+".html#questionnaire", txt:txtQuestionnaire.btnShowQuestionnaire }], + mailRecipientAddress: subscriptionsOk[i].email } + toolMail.sendMail(subscriptionsOk[i].smtp, subscriptionsOk[i].email, newQuestionnaire[0].title, tool.replaceAll(txt.mailNewQuestionnaireBodyTxt, mapMail), "", mailDatas); + } db["Subscription"].update({ lastProcessingAt: now }, { where: { id : subscriptionsOk[i].SubscriptionId }, limit:1 }); } else { // L'utilisateur a déjà accès à tous les quizs enregistés. - // Si il est abonné par email, on en tire un au hasard pour le lui envoyer, sinon on ne fait rien - if(subscriptionsOk[i].noticeOk) + // Si il est abonné par email, on en tire un au hasard pour le lui envoyer, sinon on ne fait rien + getRandomQuestionnaire=await db.sequelize.query("SELECT `Questionnaires`.`id`, `title`, `slug`, `introduction`, `url`, `anchor`, `estimatedTime` FROM `Questionnaires` INNER JOIN `Links` ON `Links`.`QuestionnaireId`=`Questionnaires`.`id` WHERE `isPublished`=1 AND `language`='"+subscriptionsOk[i].language+"' ORDER BY RAND() LIMIT 1", { type: QueryTypes.SELECT }); + token=jwt.sign({ userId: subscriptionsOk[i].UserId }, config.tokenPrivateKey, { expiresIn: config.tokenUnsubscribeLinkTimeInDays }); + const mapMail = { - getRandomQuestionnaire=await db.sequelize.query("SELECT `Questionnaires`.`id`, `title`, `slug`, `introduction`, `url`, `anchor`, `estimatedTime` FROM `Questionnaires` INNER JOIN `Links` ON `Links`.`QuestionnaireId`=`Questionnaires`.`id` WHERE `isPublished`=1 AND `language`='"+subscriptionsOk[i].language+"' ORDER BY RAND() LIMIT 1", { type: QueryTypes.SELECT }); - token=jwt.sign({ userId: subscriptionsOk[i].UserId }, config.tokenPrivateKey, { expiresIn: config.tokenUnsubscribeLinkTimeInDays }); - const mapMail = - { - USER_NAME: subscriptionsOk[i].name, - QUESTIONNAIRE_URL: config.siteUrl+"/"+configQuestionnaires.dirWebQuestionnaire+"/"+getRandomQuestionnaire[0].slug+".html", - UNSUBSCRIBE_URL: config.siteUrl+"/"+configTpl.stopMailPage+token - }; - const mailDatas= - { - mailSubject: getRandomQuestionnaire[0].title, - mailPreheader: getRandomQuestionnaire[0].title, - mailTitle: getRandomQuestionnaire[0].title, - mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.stopMailPage+token, - mailHeaderLinkTxt: txt.mailStopMailLinkTxt, - mailMainContent: "

"+txtQuestionnaireAccess.questionnaireRetryInfo+"

"+getRandomQuestionnaire[0].introduction+"

"+txtQuestionnaire.estimatedTime+" "+txtQuestionnaire.estimatedTimeOption[getRandomQuestionnaire[0].estimatedTime]+".

", - linksCTA: [{ url:getRandomQuestionnaire[0].url, txt:getRandomQuestionnaire[0].anchor }, { url:config.siteUrl+"/"+configQuestionnaires.dirWebQuestionnaire+"/"+getRandomQuestionnaire[0].slug+".html#questionnaire", txt:txtQuestionnaire.btnShowQuestionnaire }], - mailRecipientAddress: subscriptionsOk[i].email - } - toolMail.sendMail(subscriptionsOk[i].smtp, subscriptionsOk[i].email, getRandomQuestionnaire[0].title, tool.replaceAll(txtQuestionnaireAccess.questionnaireRetryInfoTxt, mapMail), "", mailDatas); - db["Subscription"].update({ lastProcessingAt: now }, { where: { id : subscriptionsOk[i].SubscriptionId }, limit:1 }); + USER_NAME: subscriptionsOk[i].name, + QUESTIONNAIRE_URL: config.siteUrl+"/"+configQuestionnaires.dirWebQuestionnaire+"/"+getRandomQuestionnaire[0].slug+".html", + UNSUBSCRIBE_URL: config.siteUrl+"/"+configTpl.stopMailPage+token + }; + const mailDatas= + { + mailSubject: getRandomQuestionnaire[0].title, + mailPreheader: getRandomQuestionnaire[0].title, + mailTitle: getRandomQuestionnaire[0].title, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.stopMailPage+token, + mailHeaderLinkTxt: txt.mailStopMailLinkTxt, + mailMainContent: "

"+txtQuestionnaireAccess.questionnaireRetryInfo+"

"+getRandomQuestionnaire[0].introduction+"

"+txtQuestionnaire.estimatedTime+" "+txtQuestionnaire.estimatedTimeOption[getRandomQuestionnaire[0].estimatedTime]+".

", + linksCTA: [{ url:getRandomQuestionnaire[0].url, txt:getRandomQuestionnaire[0].anchor }, { url:config.siteUrl+"/"+configQuestionnaires.dirWebQuestionnaire+"/"+getRandomQuestionnaire[0].slug+".html#questionnaire", txt:txtQuestionnaire.btnShowQuestionnaire }], + mailRecipientAddress: subscriptionsOk[i].email } + toolMail.sendMail(subscriptionsOk[i].smtp, subscriptionsOk[i].email, getRandomQuestionnaire[0].title, tool.replaceAll(txtQuestionnaireAccess.questionnaireRetryInfoTxt, mapMail), "", mailDatas); + db["Subscription"].update({ lastProcessingAt: now }, { where: { id : subscriptionsOk[i].SubscriptionId }, limit:1 }); + } } res.status(200).json(subscriptionsOk); diff --git a/controllers/user.js b/controllers/user.js index 83bd518..26bd2b9 100644 --- a/controllers/user.js +++ b/controllers/user.js @@ -460,8 +460,8 @@ exports.modify = async (req, res, next) => if(req.connectedUser.User.status==="user") { await Promise.all([ - db["User"].update({ ...req.body }, { where: { id : req.connectedUser.User.id } , fields: ["name", "language", "newsletterOk", "timeDifference"], limit:1 }), - db["Subscription"].update({ ...req.body }, { where: { UserId : req.connectedUser.User.id }, fields: ["receiptDays", "noticeOk"], limit:1 }) + db["User"].update({ ...req.body }, { where: { id : req.connectedUser.User.id } , fields: ["name", "language", "timeDifference"], limit:1 }), + db["Subscription"].update({ ...req.body }, { where: { UserId : req.connectedUser.User.id }, fields: ["receiptDays"], limit:1 }) ]); creaUserJson(req.connectedUser.User.id); const messageRetour=[txt.updatedOkMessage]; @@ -537,8 +537,8 @@ exports.modify = async (req, res, next) => break; case "manager": await Promise.all([ - db["User"].update({ ...req.body }, { where: { id : req.params.id }, fields: ["name", "email", "password", "language", "adminComments", "smtp", "newsletterOk", "GodfatherId"], limit:1 }), - db["Subscription"].update({ ...req.body }, { where: { UserId : req.params.id }, fields: ["numberOfDays", "receiptDays", "noticeOk"], limit:1 }) + db["User"].update({ ...req.body }, { where: { id : req.params.id }, fields: ["name", "email", "password", "language", "adminComments", "smtp", "GodfatherId"], limit:1 }), + db["Subscription"].update({ ...req.body }, { where: { UserId : req.params.id }, fields: ["numberOfDays", "receiptDays"], limit:1 }) ]); break; case "creator": @@ -623,9 +623,9 @@ exports.create = async (req, res, next) => await db["Subscription"].create({ ...req.body }); break; case "manager": - user=await db["User"].create({ ...req.body }, { fields: ["name", "email", "password", "language", "adminComments", "smtp", "newsletterOk", "GodfatherId"] }); + user=await db["User"].create({ ...req.body }, { fields: ["name", "email", "password", "language", "adminComments", "smtp", "GodfatherId"] }); req.body.UserId=user.id; - await db["Subscription"].create({ ...req.body }, { fields: ["numberOfDays", "receiptDays", "noticeOk", "UserId"] }); + await db["Subscription"].create({ ...req.body }, { fields: ["numberOfDays", "receiptDays", "UserId"] }); break; case "creator": user=await db["User"].create({ ...req.body }, { fields: ["name", "email", "password", "language", "adminComments"] }); @@ -1129,4 +1129,4 @@ const getStatsUsers = async () => else return false; } -exports.getStatsUsers = getStatsUsers; +exports.getStatsUsers = getStatsUsers; \ No newline at end of file diff --git a/front/public/compte.html b/front/public/compte.html index d403cd4..5a1e4c3 100644 --- a/front/public/compte.html +++ b/front/public/compte.html @@ -73,12 +73,6 @@

Vous recevrez chaque jour sélectionné un des quizs restants parmi ceux qui ne vous ont pas encore été proposés. Ensuite, un au hasard parmi tous les quizs.