Modification script validation création compte pour permettre de compléter son inscription à cette étape

This commit is contained in:
Fabrice PENHOËT 2020-10-21 13:08:56 +02:00
parent b3312e9cf8
commit e55f9c02bc
6 changed files with 284 additions and 52 deletions

View File

@ -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",

View File

@ -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

View File

@ -29,7 +29,65 @@
<a href="/" title="Page d'accueil WikLerni"><img src="/themes/wikilerni/img/wikilerni-purple-2-512.png" alt="Logo WikiLerni" title="W I K I L E R N I" /></a>
<p>Cultivons notre jardin !</p>
<h1 class="cardboard">Valider la création de votre compte</h1>
<div id="response"><p class="error">Si vous voyez ce message, c'est que votre lien de validation n'est pas valide ou a expiré. Vous pouvez <a href="/connexion.html">en recevoir un nouveau en cliquant ici</a>.</p></div>
<div id="message"></div>
<form class="needJS" id="subscription2" method="POST">
<h3>Personnalisez votre abonnement</h3>
<fieldset>
<label for="name">Choisissez votre nom ou pseudo : </label><input id="name" type="text" name="name" placeholder="Nom de votre choix" class="cardboard" >
</fieldset>
<fieldset>
<label for="newPassword">Choisissez votre mot de passe : </label><input id="newPassword" type="password" name="newPassword" placeholder="Mot de passe de votre choix" class="cardboard">
<div id="passwordMessage"><span class="info">Au moins 8 caractères. <a href="#password" id="getPassword">Générer un mot de passe</a>.</span></div>
</fieldset>
<fieldset>
<label for="codeGodfather">Code ou e-mail de votre "parrain" ?</label><input id="codeGodfather" type="text" name="codeGodfather" placeholder="Code ou email de votre parrain." class="cardboard">
<div id="codeGodfatherMessage"><span class="info">Facultatif.</span></div>
</fieldset>
<div class="framed">
<p>Quels jours de la semaine souhaitez-vous recevoir des e-mails ?</p>
<ul class="checkbox_li">
<li class="checkbox_li">
<label for="d2" class="check"><input type="checkbox" id="d2" name="d2" value="true" /><div class="checkbox_override"></div> Lundi.</label>
</li>
<li class="checkbox_li">
<label for="d3" class="check"><input type="checkbox" id="d3" name="d3" value="true" /><div class="checkbox_override"></div> Mardi.</label>
</li>
<li class="checkbox_li">
<label for="d4" class="check"><input type="checkbox" id="d4" name="d4" value="true" /><div class="checkbox_override"></div> Mercredi.</label>
</li>
<li class="checkbox_li">
<label for="d5" class="check"><input type="checkbox" id="d5" name="d5" value="true" /><div class="checkbox_override"></div> Jeudi.</label>
</li>
<li class="checkbox_li">
<label for="d6" class="check"><input type="checkbox" id="d6" name="d6" value="true" /><div class="checkbox_override"></div> Vendredi.</label>
</li>
<li class="checkbox_li">
<label for="d7" class="check"><input type="checkbox" id="d7" name="d7" value="true" /><div class="checkbox_override"></div> Samedi.</label>
</li>
<li class="checkbox_li">
<label for="d1" class="check"><input type="checkbox" id="d1" name="d1" value="true" /><div class="checkbox_override"></div> Dimanche.</label>
</li>
</ul>
</div>
<div class="input_wrapper">
<input id="submitDatas" type="submit" value="Valider vos choix." class="cardboard" />
</div>
</form>
<div id="response"></div>
<div id="explanations" class="framed engraved">
<h2>Besoin d'aide ?</h2>
<p><b>Votre pseudonyme</b> est complétement libre, mais servira à personnaliser certains affichages.</p>
<p><b>Votre mot de passe doit compter au moins 8 caractères.</b> Si vous manquez d'inspiration, cliquez sur le lien "Générer un mot de passe" pour en obtenir un. <b>Si vous ne choisissez pas de mot de passe</b>, vous ne pourrez vous connecter à votre compte que via des liens de connexion envoyés sur votre adresse e-mail.</p>
<p>Si vous connaissez une personne déjà inscrite à WikiLerni, <b>vous pouvez fournir son code parrain ou encore son adresse e-mail</b>. Dans le cas où vous optez ensuite pour un abonnement prémium, il sera alors allongé de 30 jours grâce à ce parrainage.</p>
<p>Vous pouvez sélectionner <b>les jours de la semaine où vous acceptez de recevoir des mails de WikiLerni</b>.<br>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.</p>
<p><b>Toutes les informations ci-dessus pourront être modifiées par la suite</b> (sauf la désignation de votre éventuel "parrain").</p>
</div>
</div>
<footer class="cardboard">

View File

@ -1,36 +1,46 @@
// -- PAGE PERMETTANT DE VALIDER LA CRÉATION DE SON COMPTE
// -- PAGE PERMETTANT DE VALIDER LA CRÉATION DE SON COMPTE, PUIS DE COMPLÉTER SON INSCRIPTION
/// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps.
/// Si le token n'est pas/plus valide, on redirige l'utilisateur vers la page de connexion pour obtenir un nouveau lien.
/// Si le token est ok, on l'informe que tout est ok et lui propose de se connecter.
/// Si le token est ok, on l'informe que tout est ok et lui propose de se compléter les informations de son compte. Une session lui est également créée.
/// Si l'utilisateur a déjà une session active valide, c'est qu'il a déjà cliqué sur le lien. On le redirige vers sa page d'accueil.
// Fichier de configuration tirés du backend :
import { apiUrl, availableLangs, theme } from "../../config/instance.js";
import { apiUrl, availableLangs, theme, tokenConnexionMinTimeInHours } from "../../config/instance.js";
const lang=availableLangs[0];
import { checkSubscribeTokenRoute, userRoutes } from "../../config/users.js";
const configTemplate = require("../../views/"+theme+"/config/"+lang+".js");
const configUsers = require("../../config/users"); // besoin de tous le fichier pour configurer le formulaire de saisie, etc.
// Importation des fonctions utiles au script :
import { getLocaly, saveLocaly } from "./tools/clientstorage.js";
import { addElement } from "./tools/dom.js";
import { helloDev } from "./tools/everywhere.js";
import { getDatasFromInputs, setAttributesToInputs } from "./tools/forms.js";
import { getPassword } from "../../tools/main";
import { loadMatomo } from "./tools/matomo.js";
import { getUrlParams } from "./tools/url.js";
import { checkSession } from "./tools/users.js";
import { checkSession, setSession } from "./tools/users.js";
// Dictionnaires :
const { serverError } = require("../../lang/"+lang+"/general");
const { alreadyConnected, badLinkValidationMessage, validationMessage } = require("../../lang/"+lang+"/user");
const { notRequired, serverError } = require("../../lang/"+lang+"/general");
const { alreadyConnected, badLinkValidationMessage, godfatherFound, godfatherNotFound, passwordCopied, validationMessage } = require("../../lang/"+lang+"/user");
// Principaux éléments du DOM manipulés :
const codeGodfatherInput=document.getElementById("codeGodfather");
const divExplanations = document.getElementById("explanations");
const divMessage = document.getElementById("message");
const divResponse = document.getElementById("response");
const formAccount = document.getElementById("subscription2");
const passwordInput=document.getElementById("newPassword");
const passwordLink=document.getElementById("getPassword");
const passwordHelp=document.getElementById("passwordMessage");
const initialise = async () =>
{
try
{
// si l'utilisateur est déjà connecté, pas la peine d'aller + loin :
// Explications cachées par défaut :
divExplanations.style.display="none";
const isConnected=await checkSession();
if(isConnected)
{
@ -46,27 +56,139 @@ const initialise = async () =>
if(datas && datas.t!==undefined)
{
const xhr = new XMLHttpRequest();
xhr.open("GET", apiUrl+userRoutes+checkSubscribeTokenRoute+datas.t);
xhr.open("GET", apiUrl+configUsers.userRoutes+configUsers.checkSubscribeTokenRoute+datas.t);
xhr.onreadystatechange = function()
{
if (this.readyState == XMLHttpRequest.DONE)
{
let response=JSON.parse(this.responseText);
if (this.status === 200 && response.userId != undefined && response.token != undefined)
if (this.status === 200 && response.newUser != undefined && response.token != undefined)
{
saveLocaly("message", { message: validationMessage, color:"success" });// pour l'afficher sur la page suivante
window.location.assign("/"+configTemplate.connectionPage);
addElement(divMessage, "p", validationMessage, "", ["success"]);
// Affichage et initialisation du formulaire permettant de compléter les infos :
formAccount.style.display="block";
divExplanations.style.display="block";
setAttributesToInputs(configUsers, formAccount);
// Affichage des infos déjà enregistrées :
for(let data in response.newUser.User)
{
if(formAccount.elements[data]!==undefined)
formAccount.elements[data].value=response.newUser.User[data];
}
// Jours de réception de l'abonnenment :
for(let i in response.newUser.Subscription.receiptDays)
formAccount.elements["d"+response.newUser.Subscription.receiptDays[i]].checked="checked";
// Certains navigateurs remplissent automatiquement les champs password :
passwordInput.value="";
// Création d'une session courte avec le token reçu (nécessaire pour la suite) :
let connexionMaxTime=Date.now()+parseInt(tokenConnexionMinTimeInHours,10)*3600*1000;
setSession(response.newUser.User.id, response.token, connexionMaxTime);
}
else if ((this.status === 200 || this.status === 404) && response.errors != undefined)
{
response.errors = response.errors.join("<br>");
addElement(divResponse, "p", response.errors, "", ["error"]);
if(Array.isArray(response.errors))
response.errors = response.errors.join("<br>");
else
response.errors = serverError;
addElement(divMessage, "p", response.errors, "", ["error"]);
}
else
addElement(divResponse, "p", badLinkValidationMessage.replace("#URL", configTemplate.connectionPage), "", ["error"]);
addElement(divMessage, "p", badLinkValidationMessage.replace("#URL", configTemplate.connectionPage), "", ["error"]);
}
}
xhr.send();
// Génére un mot de passe pseudo-aléatoire :
passwordLink.addEventListener("click", function(e)
{
e.preventDefault();
passwordInput.type="text";
passwordInput.value=getPassword(8, 12);
// Copie du mot de passe généré dans le "presse-papier" de l'ordinateur :
passwordInput.select();
document.execCommand("copy");
addElement(passwordHelp, "div", passwordCopied, "", ["success"]);
});
// Vérifie que le code/e-mail de parrainage saisi est valide :
codeGodfatherInput.addEventListener("blur", function(e)
{
const codeValue=codeGodfatherInput.value.trim();
if(codeValue!=="")
{
const xhr = new XMLHttpRequest();
xhr.open("POST", apiUrl+configUsers.userRoutes+configUsers.getGodfatherRoute);
xhr.onreadystatechange = function()
{
if (this.readyState == XMLHttpRequest.DONE)
{
if (this.status === 204)
addElement(document.getElementById("codeGodfatherMessage"), "div", godfatherNotFound, "", ["error"]);
else
addElement(document.getElementById("codeGodfatherMessage"), "div", godfatherFound, "", ["success"]);
}
}
xhr.setRequestHeader("Content-Type", "application/json");
const datas={ codeTest:codeValue };
xhr.send(JSON.stringify(datas));
}
});
// Efface l'éventuel message déjà injecté si l'utilisateur revient sur ce champ de saisie :
codeGodfatherInput.addEventListener("focus", function(e)
{
addElement(document.getElementById("codeGodfatherMessage"), "i", notRequired);
});
// Traite de l'envoi d'une mise à jour des infos :
formAccount.addEventListener("submit", function(e)
{
e.preventDefault();
divResponse.innerHTML="";
let datas=getDatasFromInputs(formAccount);
// Recomposition des jours d'envoi de l'abonnement
datas.receiptDays="";
for(let i=1; i<=7; i++)
{
if(datas["d"+i] !== undefined)
datas.receiptDays+=""+i;
}
const user=getLocaly("user", true);// on a créé la session + haut
const xhrUserUpdate = new XMLHttpRequest();
xhrUserUpdate.open("PUT", apiUrl+configUsers.userRoutes+configUsers.signupCompletionRoute+user.id);
xhrUserUpdate.onreadystatechange = function()
{
if (this.readyState == XMLHttpRequest.DONE)
{
let response=JSON.parse(this.responseText);
if (this.status === 200 && response.message !== undefined)
{
if(Array.isArray(response.message))
response.message = response.message.join("<br>");
else
response.message = response.message;
saveLocaly("message", { message: response.message, color:"success" });
window.location.assign(configTemplate["userHomePage"]);
}
else if (response.errors)
{
if(Array.isArray(response.errors))
response.errors = response.errors.join("<br>");
else
response.errors = serverError;
addElement(divResponse, "p", response.errors, "", ["error"]);
}
else
addElement(divResponse, "p", serverError, "", ["error"]);
}
}
xhrUserUpdate.setRequestHeader("Content-Type", "application/json");
xhrUserUpdate.setRequestHeader("Authorization", "Bearer "+user.token);
if(datas)
{
xhrUserUpdate.send(JSON.stringify(datas));
}
});
}
}
}

View File

@ -15,8 +15,8 @@ module.exports =
formsEmailPlaceholder: "Votre adresse e-mail",
formsCGUOkLabel: "J'accepte <a href=#link target=\"_blank\" rel=\"noopener\" title=\"À lire :)\">les Conditions Générale d'Utilisation</a> du site (requis).",
formsSubmitTxt: "Je m'abonne !",
godfatherFound: "Votre \"parrain\" a bien été trouvé :)",
godfatherNotFound: "Désolé mais aucun utilisateur n'a été trouvé pour ce code/e-mail parrain :(",
godfatherFound: "Votre \"parrain\" a bien été trouvé. Cette personne sera avertie que vous l'avez désignée.",
godfatherNotFound: "Désolé mais aucun utilisateur n'a été trouvé pour ce code / e-mail de parrainage :(",
infosAdminGodfather: "Cet utilisateur a été parrainé par ",
infosAdminNbGodChilds: "Ses #NB filleuls : ",
infosUserForAdmin: "Cet utilisateur (id: ID_USER) a <b>créé son compte le DATE_CREA</b>, la dernière mise à jour datant du DATE_UPDATE.<br><b>Date de sa dernière connexion : DATE_CONNECTION.</b>",
@ -45,13 +45,13 @@ module.exports =
mailUpdateLoginLinkTxt : "Valider.",
mailUpdateLoginOkMessage: "La mise à jour de vos identifiants a bien été enregistrée.",
mailUpdateLoginSubject : "Merci de valider vos nouveaux identifiants.",
mailValidationLinkSBodyHTML : "<h3>Bonjour USER_NAME,</h3><p>Pour valider votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h.</p>",
mailValidationLinkSBodyTxt : "Bonjour USER_NAME,\n\nPour valider votre inscription, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
mailValidationLinkSBodyHTML : "<h3>Bonjour USER_NAME,</h3><p>Pour valider et compléter votre inscription, merci de cliquer sur le lien ci-dessous dans les 24h.</p>",
mailValidationLinkSBodyTxt : "Bonjour USER_NAME,\n\nPour valider et compléter votre inscription, merci de cliquer sur le lien suivant dans les 24h :\nLINK_URL",
mailValidationLinkSubject : "Merci de valider votre inscription",
mailValidationLinkTxt : "Valider mon compte.",
mailValidationMessage: "Votre inscription est bien enregistrée.\nPour la finaliser, merci de cliquer dans les 24 H sur le lien de confirmation qui vient de vous être envoyé par e-mail.",
mailWelcomeBodyHTML : "<h3>Bonjour USER_NAME,</h3><p>Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !<br><br>Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à <b>EMAIL</b>.<br><br>Je vous conseille d'ailleurs d'ajouter <b>EMAIL</b> à votre carnet d'adresses pour éviter que les prochains envois du site n'arrivent en <i>spam</i>.<br><br>Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi les quizs du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.<br><br>Pour ce faire, utilisez le lien ci-dessous.<br><br>À bientôt sur NOM_SITE.",
mailWelcomeBodyTxt : "Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois du site n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi les quizs du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",
mailWelcomeBodyHTML : "<h3>Bonjour USER_NAME,</h3><p>Vous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !<br><br>Si vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à <b>EMAIL</b>.<br><br>Je vous conseille d'ailleurs d'ajouter <b>EMAIL</b> à votre carnet d'adresses <b>pour éviter que les prochains envois de NOM_SITE n'arrivent en <i>spam</i></b>.<br><br>Par ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.<br><br>Pour ce faire, utilisez le lien ci-dessous.<br><br>À bientôt sur NOM_SITE.",
mailWelcomeBodyTxt : "Bonjour USER_NAME,\n\nVous venez de valider votre inscription à NOM_SITE. Merci et bienvenue !\n\nSi vous avez la moindre question ou suggestion concernant NOM_SITE, n'hésitez pas à me contacter en écrivant à EMAIL.\n\nJe vous conseille d'ailleurs d'ajouter EMAIL à votre carnet d'adresses pour éviter que les prochains envois de NOM_SITE n'arrivent en \"spam\".\n\nPar ailleurs, pour gérer votre abonnement, accéder à vos informations ou encore chercher plus facilement parmi le contenu du site, vous pouvez à tout moment vous connecter à votre compte utilisateur.\n\nPour ce faire, utilisez le lien suivant : LINK_URL\n\nÀ bientôt sur NOM_SITE.",
mailWelcomeLinkTxt : "Me connecter à mon compte.",
mailWelcomeSubject : "Bienvenue !",
needBeConnected: "Vous devez être connecté pour accéder à cette page.",
@ -83,9 +83,9 @@ module.exports =
updatedNeedUniqueEmail : "Mais la nouvelle adresse e-mail saisie (NEW_EMAIL) n'a pu être enregistrée, car elle est déjà utilisée pour un autre compte.",
updatedNeedValidatedUser: "L'utilisateur que vous souhaitez modifier n'existe pas/plus ou n'a pas encore validé son compte.",
updatedOkMessage: "Vos informations ont bien été mises à jour.",
validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte.",
validationAlreadyMessage: "Il semble que vous ayez déjà validé votre compte. Vous pouvez vous y connecter <a href='#URL'>en cliquant ici</a>.",
validationAlreadyMessageAdmin: "Ce compte a déjà été validé.",
validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !<br>Vous pouvez sans tarder vous connecter ci-dessous pour accéder à votre espace WikiLerni.",
validationMessage: "Votre compte vient bien d'être validé. Merci et bienvenue !<br>Vous pouvez compléter les informations de votre abonnement ci-dessous.",
validationMessageAdmin: "Le compte a bien été validé.",
welcomeMessage: "Bienvenue #NAME !"
};

View File

@ -23,6 +23,7 @@ router.get("/subscription/stop/:token", subscriptionCtrl.unsubscribeLink);
// routes nécessitant d'être connecté :
router.put("/modify/:id", auth, userCtrl.modify);
router.put("/signupcompletion/:id", auth, userCtrl.signUpCompletion);
router.post("/create", authAdmin, userCtrl.create);
router.post("/validate/:id", authAdmin, userCtrl.validate);// validation d'un user par un admin
router.get("/confirmnewlogin/:token", auth, userCtrl.checkNewLoginLink);