models_user_model.js

/**
 * @fileoverview Modèle Mongoose pour les utilisateurs
 * @module models/user
 */

const mongoose = require('mongoose')
const sha256 = require('js-sha256')
require('dotenv').config();

/**
 * @constant {string} JWT_SALT - Sel utilisé pour le hachage des mots de passe
 */
const JWT_SALT = process.env.JWT_SALT || 'salt'

/**
 * Schéma Mongoose pour les utilisateurs
 * @typedef {Object} UserSchema
 * @property {string} name - Nom de l'utilisateur
 * @property {string} email - Email de l'utilisateur (unique)
 * @property {string} description - Description de l'utilisateur
 * @property {string} password - Mot de passe hashé de l'utilisateur
 * @property {string} role - Rôle de l'utilisateur ('user' ou 'admin')
 */
const userSchema = new mongoose.Schema({
    name:{
        type: String,
        required: true,
    },
    email:{
        type: String,
        required : true,
        unique: true,
    },
    description:{
        type: String,
        required : true,
        default : 'Aucune description'
    },
    password:{
        type: String,
        required : true,
    },
    createdAt:{
        type: Date,
        default : Date.now,
        required : true,
    },
    role:{
        type: String,
        required : true,
    }
})

userSchema.pre('save', async function (next) {
    try {
        const existingUser = await this.constructor.findOne({ email: this.email });
        if (existingUser) {
            throw new Error('User already exists');
        }

        const secret = JWT_SALT;
        this.password = sha256(this.password + secret);
        next();
    } catch (error) {
        next(error); 
    }
});

const User = mongoose.model('User', userSchema)

module.exports = User