Skip to content
Snippets Groups Projects
userController.js 6.06 KiB
Newer Older
Bastien's avatar
Bastien committed
const bcrypt = require('bcryptjs');
const db = require('../models/db');

exports.signup = (req, res, next) => {

    let { username, lastname, firstname, birthdate, password } = req.body;
Bastien's avatar
Bastien committed
    const hash = bcrypt.hash(password, 10);

    hash.then(
        hash => {
            //enregistrer les infos de l'utilisateur et le hash du mdp en base de données
            db.query('INSERT INTO Utilisateur VALUES(?,?,?,?,?)',
                [username, lastname, firstname, hash, birthdate],
Bastien's avatar
Bastien committed
                function (error, results, fields) {
                    if (error == null) {
                        res.status(201).json({ message: 'Utilisateur ajouté' });
                    }
                    else {
                        res.status(500).json({ error });
                    }
                })
        }
    )
        .catch(error => res.status(500).json({ error }))

};

exports.login = (req, res, next) => {

    let { username, password } = req.body;
Bastien's avatar
Bastien committed

    db.query('SELECT COUNT(*) c, mdp FROM Utilisateur WHERE login=?', [username], function (error, results, fields) {
        
        if (!error) {
Bastien's avatar
Bastien committed
            if (results[0].c == 1) {
                bcrypt.compare(password, results[0].mdp).then(
Bastien's avatar
Bastien committed
                    valid => {
                        if (!valid) {
                            return res.status(401).json({ message: 'Identifiant ou mot de passe incorrect' });
                            // Le mot de passe donné ne corresponds pas à celui dans la bdd
                        }
                        else {
                            req.session.username = username;
Bastien's avatar
Bastien committed
                            res.status(200).json({ message: 'Connecté !' });
                        }
                    }
                )
                    .catch(error => {
                        res.status(500).json({ error })
                    });

            }
            else {
                //pas d'utilisateur trouvé avec ce username
                res.status(401).json({ message: 'Identifiant ou mot de passe incorrect' });
Bastien's avatar
Bastien committed
            }

        }
        else {
            res.status(500).json({ error });
        }


    });

};

exports.logout = (req,res,next) => {
    req.session.username = null;
    res.status(200).json({ message: 'Déconnecté !' });
};

Bastien's avatar
Bastien committed

exports.getUserInformations = (req,res,next) => {
    let username = req.session.username;
    //renvoyer login, nom, prenom, dateNais
Bastien's avatar
Bastien committed

    db.query('SELECT login,nom,prenom,dateNais FROM Utilisateur WHERE login = ?',
    [username],function (error,results,fields) {

        if (error) {
            res.status(500).json({error});
        } else {
            let infos = {
                username : results[0].login,
                lastname : results[0].nom,
                firstname : results[0].prenom,
                birthdate : results[0].dateNais
            };
            res.status(200).json(infos);
        }
    })
Bastien's avatar
Bastien committed
};
Bastien's avatar
Bastien committed



exports.changeUserInfos = async (req, res, next) => {
    try {
        const { newUsername, newPassword } = req.params;
        const currentUsername = req.session.username; // Supposant que le nom d'utilisateur actuel est stocké dans la session

        console.log(req.params);
        console.log(req.body);
        console.log(newUsername );
        if (!newUsername && !newPassword) {
            return res.status(400).json({ message: 'Aucune information à mettre à jour' });
        }

        // Vérification si le nouvel utilisateur existe déjà
        if (newUsername) {
            const userExists = await checkUserExists(newUsername);
            if (userExists) {
                return res.status(409).json({ message: 'Le nouvel utilisateur existe déjà' });
            }
        }

        // Mise à jour du nom d'utilisateur et/ou du mot de passe dans la base de données
        const updateResult = await updateUserInfo(currentUsername, newUsername, newPassword);

        // Vérification si la mise à jour a réussi
        if (updateResult) {
            req.session.username = newUsername || currentUsername; // Mettre à jour le nom d'utilisateur dans la session si applicable
            res.status(200).json({ message: 'Informations utilisateur mises à jour avec succès' });
        } else {
            res.status(500).json({ message: 'Échec de la mise à jour des informations utilisateur' });
        }
    } catch (error) {
        console.error('Erreur lors de la mise à jour des informations utilisateur :', error);
        res.status(500).json({ error });
    }
};

// Fonction pour vérifier si un utilisateur existe déjà dans la base de données
async function checkUserExists(username) {
    const queryResult = await new Promise((resolve, reject) => {
        db.query('SELECT COUNT(*) c FROM Utilisateur WHERE login=?', [username], (error, results, fields) => {
            if (error) {
                reject(error);
            } else {
                resolve(results[0].c > 0);
            }
        });
    });
    return queryResult;
}

// Fonction pour mettre à jour le nom d'utilisateur et/ou le mot de passe dans la base de données
async function updateUserInfo(currentUsername, newUsername, newPassword) {
    const updateResult = await new Promise((resolve, reject) => {
        let updateQuery = 'UPDATE Utilisateur SET';
        const updateParams = [];

        if (newUsername) {
            updateQuery += ' login=?,';
            updateParams.push(newUsername);
        }

        if (newPassword) {
            updateQuery += ' mdp=?,';
            const hash = bcrypt.hashSync(newPassword, 10);
            updateParams.push(hash);
        }

        // Supprimer la virgule finale de la requête
        updateQuery = updateQuery.replace(/,$/, '');

        // Ajouter la clause WHERE pour le nom d'utilisateur actuel
        updateQuery += ' WHERE login=?';
        updateParams.push(currentUsername);

        // Exécution de la mise à jour
        db.query(updateQuery, updateParams, (error, results, fields) => {
            if (error) {
                reject(error);
            } else {
                resolve(true);
            }
        });
    });
    return updateResult;
}