diff --git a/config/users.js b/config/users.js index 5e207ed..75b4435 100644 --- a/config/users.js +++ b/config/users.js @@ -16,7 +16,8 @@ module.exports = getLoginLinkRoute: "/getloginlink", getPayments: "/payment/getforoneuser/", getUserInfos: "/get/", - searchUserRoute: "/search/", + searchUserRoute: "/search/", + signupCompletionRoute: "/signupcompletion/", subscribeRoute: "/signup", unsubscribeRoute: "/subscription/stop/", updateUserInfos: "/modify/", @@ -30,7 +31,7 @@ module.exports = cguOk: { value: "true", required: true }, search: { minlength: 1, required: true }, timeDifferenceMin: -720, - timeDifferenceMax:840, + timeDifferenceMax: 840, // JSON dir dirCacheUsers : "datas/users", dirCacheUsersAnswers : "datas/users/questionnaires/answers", diff --git a/controllers/user.js b/controllers/user.js index 8c63529..d03d8fa 100644 --- a/controllers/user.js +++ b/controllers/user.js @@ -96,7 +96,7 @@ exports.signup = async (req, res, next) => req.body.GodfatherId=godfather.id; } const user=await db["User"].create({ ...req.body }, { fields: ["name", "email", "password", "newsletterOk", "GodfatherId", "timeDifference"] }); - req.body.UserId=user.id; + req.body.UserId=user.id;/// revoir si noticeOk et newsletterOk toujours utiles ? // si l'utilisateur a répondu à un quiz avant de créer son compte, on enregistre son résultats. if(req.body.QuestionnaireId) { @@ -132,15 +132,15 @@ exports.signupValidation = async (req, res, next) => if(datas) { if(datas.Subscription) - res.status(200).json({ errors: [txt.validationAlreadyMessage] }); + res.status(200).json({ errors: [txt.validationAlreadyMessage.replace("#URL", configTpl.connectionPage)] }); else { const now=new Date(); await Promise.all([ - db["Subscription"].create({ numberOfDays: config.freeAccountTimingInDays, numberOfDays: config.defaultReceiptDays, noticeOk: datas.User.newsletterOk, UserId: datas.User.id }), + db["Subscription"].create({ numberOfDays: config.freeAccountTimingInDays, numberOfDays: config.defaultReceiptDays, noticeOk: datas.User.newsletterOk, UserId: datas.User.id }),/// revoir si noticeOk et newsletterOk toujours utiles ? db["User"].update({ connectedAt: now }, { where: { id : datas.User.id }, limit:1 }) ]); - creaUserJson(datas.User.id); + const newUser=await creaUserJson(datas.User.id); const mapMail = { USER_NAME: datas.User.name, @@ -160,29 +160,9 @@ exports.signupValidation = async (req, res, next) => mailRecipientAddress: datas.User.email } toolMail.sendMail(0, datas.User.email, txt.mailWelcomeSubject, tool.replaceAll(txt.mailWelcomeBodyTxt, mapMail), "", mailDatas); - if(datas.User.GodfatherId!==null) - { - const godfather=await searchUserById(datas.User.GodfatherId); - if(godfather) - { - mapMail.USER_NAME=godfather.User.name; - mapMail.EMAIL=datas.User.email; - const mailDatas2= - { - mailSubject: txt.mailThankGodfatherSubject, - mailPreheader: txt.mailThankGodfatherSubject, - mailTitle: txt.mailThankGodfatherSubject, - mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.connectionPage, - mailHeaderLinkTxt: txt.mailThankGodfatherLinkTxt, - mailMainContent: tool.replaceAll(txt.mailThankGodfatherBodyHTML, mapMail), - mailRecipientAddress: godfather.User.email - } - toolMail.sendMail(godfather.User.smtp, godfather.User.email, txt.mailThankGodfatherSubject, tool.replaceAll(txt.mailThankGodfatherBodyTxt, mapMail), "", mailDatas2); - } - } res.status(200).json( { - userId: datas.User.id, + newUser: newUser, token: jwt.sign({ userId: datas.User.id }, config.tokenPrivateKey, { expiresIn: config.tokenConnexionMinTimeInHours }) }); } @@ -197,6 +177,76 @@ exports.signupValidation = async (req, res, next) => } } +// Contrôleur recevant les données envoyées par l'utilisateur lorsqu'il lui est demandé de complèter ses informations, juste après avoir validé son abonnement +// Il peut fournir ici un pseudo et un mot de passe de son choix ou encore un code parrain +// Il peut asussi choisir les jours de réception de son abonnement au site +exports.signUpCompletion = async (req, res, next) => +{ + try + { + const db = require("../models/index"); + if(!tool.isEmpty(req.body.newPassword) && req.body.newPassword.length < config.passwordMinLength) + res.status(400).json({ errors: txt.needLongPassWord.replace("MIN_LENGTH", config.passwordMinLength) }); + else + { + if(!tool.isEmpty(req.body.newPassword)) + req.body.password=await bcrypt.hash(req.body.newPassword, config.bcryptSaltRounds); + req.body.GodfatherId=null; + if(req.body.codeGodfather !== "") + { + const godfather=await searchIdGodfather(req.body.codeGodfather); + if(godfather) + req.body.GodfatherId=godfather.id; + } + await Promise.all([ + db["User"].update({ ...req.body }, { where: { id : req.connectedUser.User.id } , fields: ["name", "password", "GodfatherId"], limit:1 }), + db["Subscription"].update({ ...req.body }, { where: { UserId : req.connectedUser.User.id }, fields: ["receiptDays"], limit:1 }) + ]); + const user=await creaUserJson(req.connectedUser.User.id); + // si un parrain a été désigné, on prévient l'heureux élu :) : + if(user!==false && req.body.GodfatherId !== null) + { + const godfather=await searchUserById(req.body.GodfatherId); + if(godfather) + { + const mapMail = + { + USER_NAME: godfather.User.name, + NOM_SITE : config.siteName, + EMAIL : user.User.email, + LINK_URL : config.siteUrl+"/"+configTpl.connectionPage + }; + const mailDatas= + { + mailSubject: txt.mailThankGodfatherSubject, + mailPreheader: txt.mailThankGodfatherSubject, + mailTitle: txt.mailThankGodfatherSubject, + mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.connectionPage, + mailHeaderLinkTxt: txt.mailThankGodfatherLinkTxt, + mailMainContent: tool.replaceAll(txt.mailThankGodfatherBodyHTML, mapMail), + mailRecipientAddress: godfather.User.email + } + toolMail.sendMail(godfather.User.smtp, godfather.User.email, txt.mailThankGodfatherSubject, tool.replaceAll(txt.mailThankGodfatherBodyTxt, mapMail), "", mailDatas); + } + } + const messageRetour=[txt.updatedOkMessage]; + res.status(200).json({ message: messageRetour }); + } + next(); + } + catch(e) + { + const returnAPI=toolError.returnSequelize(e); + if(returnAPI.messages) + { + res.status(returnAPI.status).json({ errors : returnAPI.messages }); + next(); + } + else + next(e); + } +} + exports.checkToken = async (req, res, next) => { try diff --git a/front/public/validation.html b/front/public/validation.html index 623dc1b..e3e8a1a 100644 --- a/front/public/validation.html +++ b/front/public/validation.html @@ -29,7 +29,65 @@ Logo WikiLerni

Cultivons notre jardin !

Valider la création de votre compte

-

Si vous voyez ce message, c'est que votre lien de validation n'est pas valide ou a expiré. Vous pouvez en recevoir un nouveau en cliquant ici.

+
+ +
+

Personnalisez votre abonnement

+
+ +
+ +
+ +
Au moins 8 caractères. Générer un mot de passe.
+
+ +
+ +
Facultatif.
+
+ +
+

Quels jours de la semaine souhaitez-vous recevoir des e-mails ?

+ +
+
+ +
+
+
+ +
+

Besoin d'aide ?

+

Votre pseudonyme est complétement libre, mais servira à personnaliser certains affichages.

+

Votre mot de passe doit compter au moins 8 caractères. Si vous manquez d'inspiration, cliquez sur le lien "Générer un mot de passe" pour en obtenir un. Si vous ne choisissez pas de mot de passe, vous ne pourrez vous connecter à votre compte que via des liens de connexion envoyés sur votre adresse e-mail.

+

Si vous connaissez une personne déjà inscrite à WikiLerni, vous pouvez fournir son code parrain ou encore son adresse e-mail. Dans le cas où vous optez ensuite pour un abonnement prémium, il sera alors allongé de 30 jours grâce à ce parrainage.

+

Vous pouvez sélectionner les jours de la semaine où vous acceptez de recevoir des mails de WikiLerni.
Chaque jour sélectionné, vous recevrez soit une "graine de savoir" WikiLerni, soit un quiz permettant de tester ce que vous avez retenu des envois des jours précédents.

+

Toutes les informations ci-dessus pourront être modifiées par la suite (sauf la désignation de votre éventuel "parrain").

+
+