Files
ENI-Angular/backend/controllers/authController.js
2025-03-11 12:05:07 +01:00

183 lines
5.1 KiB
JavaScript

import pool from "../config/db.js";
import jwt from "jsonwebtoken";
import bcrypt from 'bcryptjs';
// Création d'un utilisateur
export const register = async (req, res) => {
let conn;
try {
conn = await pool.getConnection();
const { email, firstname, lastname, password_hash } = req.body;
if (!email || !firstname || !lastname || !password_hash) {
return res.status(400).json({
message: 'Tout les champs sont requis !',
status: false
});
}
const existingUsers = await conn.query(
'SELECT * FROM users WHERE email = ?',
[email]
);
if (existingUsers.length > 0) {
return res.status(409).json({
message: 'L\'utilisateur existe déjà !',
status: false
});
}
// Hash du mot de passe
const hashedPassword = await bcrypt.hash(password_hash, 10);
const result = await conn.query(
'INSERT INTO users (email, firstname, lastname, password_hash) VALUES (?, ?, ?, ?)',
[email, firstname, lastname, hashedPassword]
);
res.status(201).json({
message: 'L\'utilisateur à bien été enregistré !',
status: true
});
} catch (err) {
console.error('Erreur interne :', err);
return res.status(500).json({
message: 'Erreur interne du serveur.',
status: false
});
} finally {
if (conn) await conn.release();
}
};
// Connexion
export const login = async (req, res) => {
let conn;
try {
conn = await pool.getConnection();
const { email, password } = req.body;
// Chercher l'utilisateur
const users = await conn.query(
'SELECT * FROM users WHERE email = ?',
[email]
);
if (users.length === 0) {
return res.status(401).json({
message: 'Identifiant incorrect',
status: false
});
}
const user = users[0];
// Verify password
const isPasswordValid = await bcrypt.compare(password, user.password_hash);
if (!isPasswordValid) {
return res.status(401).json({
message: 'Identifiant incorrect',
status: false
});
}
// Generate JWT token
const token = jwt.sign(
{
id: user.id,
},
process.env.JWT_SECRET || 'fallback_secret',
{ expiresIn: '12h' }
);
await conn.query(
'UPDATE users SET updated_at = CURRENT_TIMESTAMP WHERE id = ?',
[user.id]
);
res.cookie('jwt', token, {
httpOnly: true,
secure: true,
sameSite: 'Strict',
maxAge: 12 * 60 * 60 * 1000
});
res.json({
message: 'Connexion réussie',
status: true
});
} catch (err) {
console.error('Erreur interne :', err);
return res.status(500).json({
message: 'Erreur interne du serveur.',
status: false
});
} finally {
if (conn) await conn.release();
}
};
// Déconnecter l'utilisateur
export const logout = (req, res) => {
res.clearCookie('jwt', {
httpOnly: true,
secure: true,
sameSite: 'Strict',
});
res.status(200).json({
message: 'Successfully logged out',
status: true
});
};
// Vérification de la connexion sur la page pour guard angular
export const checkAuth = (req, res) => {
const token = req.cookies.jwt;
if (!token) {
return res.status(401).json({
message: 'Non identifié',
status: false
});
}
try {
req.user = jwt.verify(token, process.env.JWT_SECRET);
res.status(200).json({
message: 'identifié',
status: true
});
} catch (err) {
console.error('Erreur interne :', err);
return res.status(500).json({
message: 'Erreur interne du serveur.',
status: false
});
}
};
export const getprofile = async (req, res) => {
const token = req.cookies.jwt;
let conn;
try {
conn = await pool.getConnection();
req.user = jwt.verify(token, process.env.JWT_SECRET);
// Requête pour récupérer les informations de l'utilisateur sauf le mot de passe
const query = `
SELECT id, email, firstname, lastname, updated_at, created_at
FROM users
WHERE id = ?`;
const results = await conn.query(query, [req.user.id]);
// Vérifie si l'utilisateur existe
if (results.length === 0) {
return res.status(404).json({
message: 'Utilisateur non trouvé.',
status: false
});
}
return res.status(200).json({
results
});
} catch (error) {
console.error('Erreur lors de la récupération de l\'utilisateur :', error);
return res.status(500).json({
message: 'Erreur lors de la récupération de l\'utilisateur.',
status: false
});
} finally {
if (conn) {
await conn.release();
}
}
};