99 lines
5.1 KiB
JavaScript
99 lines
5.1 KiB
JavaScript
|
// -- 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 txt = require("../../lang/"+lang+"/general");
|
||
|
const txtUsers = require("../../lang/"+lang+"/user");
|
||
|
|
||
|
const divResponse = document.getElementById("response");
|
||
|
|
||
|
helloDev();
|
||
|
|
||
|
let config;
|
||
|
const initialise = async () =>
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
config = await getConfig();
|
||
|
if(!config)
|
||
|
addElement(divResponse, "p", txt.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: txtUsers.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", txtUsers.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("<br>");
|
||
|
else
|
||
|
response.errors = txt.serverError;
|
||
|
addElement(divResponse, "p", response.errors, "", ["error"]);
|
||
|
}
|
||
|
else
|
||
|
addElement(divResponse, "p", txtUsers.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", txt.serverError, "", ["error"]);
|
||
|
}
|
||
|
}
|
||
|
initialise();
|