fix: backend dead code + bug destroy + nettoyage legacy

- Suppression forgottenPassword/resetPassword (dead code, routes jamais câblées)
- Suppression nodemailer (plus utilisé)
- Fix destroy() : getById() → read() (bug — méthode inexistante)
- Ajout getByNickname() dans UserManager (appelé mais manquant)
- README rebrandé Clickerz/Tetardtek
- Commentaire legacy WildCoinContext supprimé
- SPRINT1.md : ref Xmass nettoyée
This commit is contained in:
2026-03-20 15:11:26 +01:00
parent 924e919a65
commit 3d69899dbf
5 changed files with 17 additions and 166 deletions

View File

@@ -3,11 +3,9 @@ require("dotenv").config();
const bcrypt = require("bcrypt");
const jwt = require("jsonwebtoken");
const Joi = require("joi");
const nodemailer = require("nodemailer");
const tables = require("../tables");
const secretKey = process.env.APP_SECRET;
const resetTokenSecret = process.env.RESET_TOKEN_SECRET;
const saltRounds = 10;
const passwordSchema = Joi.string()
@@ -36,126 +34,13 @@ const validateEmail = async (email) => {
const validateUniqueNickname = async (nickname) => {
await nicknameSchema.validateAsync(nickname);
const existingUserByNickname = await tables.users.getByNickname(
nickname
);
const existingUserByNickname = await tables.users.getByNickname(nickname);
if (existingUserByNickname) {
throw new Error("Ce pseudo est déjà pris.");
}
};
const transporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: process.env.EMAIL_USER,
pass: process.env.EMAIL_PASS,
},
});
const generateResetToken = (user) => {
const resetToken = jwt.sign({ user: user.id }, resetTokenSecret, {
expiresIn: "1h",
});
const base64Token = Buffer.from(resetToken).toString("base64");
return base64Token;
};
const sendPasswordResetEmail = async (user, resetToken) => {
const resetLink = `${process.env.FRONTEND_URL}/reset-password/${resetToken}`;
const mailOptions = {
from: "INSERT_YOUR_EMAIL_ADDRESS_HERE",
to: user.mail,
subject: "Réinitialisation de mot de passe",
html: `
<p>Bonjour ${user.firstname},</p>
<p>Vous avez demandé une réinitialisation de mot de passe pour votre compte.</p>
<p>Cliquez sur le lien ci-dessous pour réinitialiser votre mot de passe :</p>
<a href="${resetLink}">Réinitialiser le mot de passe</a>
<p>Si vous n'avez pas demandé cette réinitialisation, veuillez ignorer ce message.</p>
<p>Merci,</p>
`,
};
await transporter.sendMail(mailOptions);
};
const forgottenPassword = async (req, res) => {
const { mail } = req.body;
try {
const user = await tables.users.getByMail(mail);
if (!user) {
return res.status(404).json({ message: "Utilisateur non trouvé" });
}
const resetToken = generateResetToken(user);
await sendPasswordResetEmail(user, resetToken);
return res.status(200).json({
message: "Envoi d'un e-mail de réinitialisation du mot de passe",
});
} catch (error) {
console.error(
"Erreur dans l'envoi de l'e-mail de réinitialisation du mot de passe:",
error
);
return res.status(500).json({
message:
"Erreur dans l'envoi de l'e-mail de réinitialisation du mot de passe",
});
}
};
const resetPassword = async (req, res) => {
const { password } = req.body;
const resetToken = decodeURIComponent(req.params.token);
try {
const decodedToken = jwt.verify(resetToken, resetTokenSecret);
const user = await tables.users.read(decodedToken.user);
if (!user) {
return res.status(404).json({ message: "Utilisateur non trouvé" });
}
if (!password) {
return res.status(400).json({ message: "Nouveau mot de passe manquant" });
}
const { error } = Joi.string()
.min(8)
.regex(/[A-Z]/)
.message("Le mot de passe doit contenir au moins une majuscule.")
.regex(/\d/)
.message("Le mot de passe doit contenir au moins un chiffre.")
.regex(/[!@#$%^&*()_+{}[\]:;<>,.?~\\/-]/)
.message("Le mot de passe doit contenir au moins un caractère spécial.")
.validate(password);
if (error) {
return res.status(400).json({ message: error.details[0].message });
}
const hashedPassword = await bcrypt.hash(password, saltRounds);
await tables.users.edit(user.id, { password: hashedPassword });
return res
.status(200)
.json({ message: "Réinitialisation du mot de passe réussie" });
} catch (error) {
console.error("Erreur de réinitialisation du mot de passe:", error);
return res.status(500).json({
message: "Erreur de réinitialisation du mot de passe",
error,
});
}
};
const login = async (req, res) => {
const { mail, password } = req.body;
@@ -378,7 +263,7 @@ const destroy = async (req, res) => {
});
}
const user = await tables.users.getById(userId);
const user = await tables.users.read(userId);
const isCurrentPasswordCorrect = await bcrypt.compare(
currentPassword,
@@ -438,7 +323,5 @@ module.exports = {
add,
destroy,
login,
forgottenPassword,
resetPassword,
updateCoins,
};

View File

@@ -60,6 +60,14 @@ class UserManager extends AbstractManager {
return rows[0];
}
async getByNickname(nickname) {
const [rows] = await this.database.query(
`SELECT * FROM ${this.table} WHERE nickname = ?`,
[nickname]
);
return rows[0] ?? null;
}
async getByMail(mail) {
const [rows] = await this.database.query(
`SELECT * FROM ${this.table} WHERE mail = ?`,