183 lines
5.1 KiB
JavaScript
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();
|
|
}
|
|
}
|
|
};
|