// -- PAGE PERMETTANT DE TESTER UN LIEN DE CONNEXION REÇU PAR E-MAIL /// Un token est transmis en paramètre de l'Url. Il a une validité limité dans le temps. /// Dans ce cas, on peut rediriger l'utilisateur vers la page de connexion pour obtenir un nouveau lien de validation /// Si le token est ok, on crée une session suivant la durée retournée par l'API et redirige l'utilisateur vers sa page d'accueil /// Un résultat de quiz peut aussi avoir été enregistré côté client et est alors à transmettre à l'API. /// Si l'utilisateur a déjà une session active valide, c'est qu'il a déjà cliqué sur le lien. On le redirige également vers sa page d'accueil. // Fichier de configuration côté client : import { apiUrl, availableLangs, theme } from "../../config/instance.js"; const lang=availableLangs[0]; const configFrontEnd = require("../../views/"+theme+"/config/"+lang+".js"); // Importation des fonctions utile au script : import { getLocaly, removeLocaly, saveLocaly } from "./tools/clientstorage.js"; import { addElement } from "./tools/dom.js"; import { helloDev } from "./tools/everywhere.js"; import { isEmpty } from "../../tools/main"; import { getUrlParams } from "./tools/url.js"; import { checkAnswerDatas, checkSession, getConfig, getTimeDifference, setSession } from "./tools/users.js"; // Dictionnaires : const { serverError } = require("../../lang/"+lang+"/general"); const { alreadyConnected, badLinkValidationMessage, validationMessage } = require("../../lang/"+lang+"/user"); const divResponse = document.getElementById("response"); helloDev(); let config; const initialise = async () => { try { config = await getConfig(); if(!config) addElement(divResponse, "p", serverError, "", ["error"]); else { // si l'utilisateur est déjà connecté, pas la peine d'aller + loin : const isConnected=await checkSession(); if(isConnected) { saveLocaly("message", { message: alreadyConnected, color:"information" });// pour l'afficher sur la page suivante const user=getLocaly("user", true); const homePage=user.status+"HomePage"; window.location.assign("/"+configFrontEnd[homePage]); } else { let datas=getUrlParams(); if(datas && datas.t!==undefined) { const xhr = new XMLHttpRequest(); xhr.open("POST", apiUrl+config.userRoutes+config.connectionWithLinkRoute); xhr.onreadystatechange = function() { if (this.readyState == XMLHttpRequest.DONE) { let response=JSON.parse(this.responseText); if (this.status === 200 && !isEmpty(response.userId) && !isEmpty(response.connexionTime) && !isEmpty(response.token)) { let connexionMaxTime=Date.now(); if(response.connexionTime.endsWith("days")) connexionMaxTime+=parseInt(response.connexionTime,10)*24*3600*1000; else connexionMaxTime+=parseInt(response.connexionTime,10)*3600*1000; setSession(response.userId, response.token, connexionMaxTime); removeLocaly("lastAnswer");// ! important pour ne pas enregister plusieurs fois le résultat addElement(divResponse, "p", validationMessage, "", ["success"]);// au cas où blocage redirection window.location.assign("/"+configFrontEnd.userHomePage);// connexion par lien ne concerne que les simples "user" } else if ((this.status === 401 || this.status === 403) && response.errors != undefined) { if(Array.isArray(response.errors)) response.errors = response.errors.join("
"); else response.errors = serverError; addElement(divResponse, "p", response.errors, "", ["error"]); } else addElement(divResponse, "p", badLinkValidationMessage.replace("#URL", configFrontEnd.connectionPage), "", ["error"]); } } datas.timeDifference=getTimeDifference(config); // si l'utilisateur a précédement répondu à un quiz, j'ajoute les infos de son résultat : datas=checkAnswerDatas(datas); xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(JSON.stringify(datas)); } } } } catch(e) { addElement(divResponse, "p", serverError, "", ["error"]); } } initialise();