Skip to content
Snippets Groups Projects
app.js 5.10 KiB
const path = require('path');
const express = require('express');
const app = express();
const db = require('./db/Database.js');
const auth = require('./controller/AuthController.js');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const { createHash, randomBytes } = require('crypto');




//Configuration
const viewsPath = path.join(__dirname, 'views');
app.set("views", viewsPath);
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser());

// Pour analyser les corps des requêtes POST en format URL-encoded
app.use(express.urlencoded({ extended: true }));


// Ajoute ceci pour les fichiers statiques depuis le dossier public
app.use(express.static(path.join(__dirname, 'public')));



app.use(auth.authenticate);
//chemin d'accès
app.get("/", defaut).get("/accueil",defaut);
app.get("/db/:collection", collection).get("/db", dbAdmin);
app.get("/login", (req, res) => res.render("login")).post("/login", postLogin);



//route pour creation compte
app.get("/signup" , (req ,res)=>{
    res.render("signup", { title: 'Inscription' });
    
});
function generateRandomSalt() {
    return randomBytes(16).toString('hex');
}

app.post('/signup', async (req, res) => {
    try {
        const { username, email, password } = req.body;

        // Générer un sel aléatoire
        const salt = generateRandomSalt();

        // Concaténer le mot de passe avec le sel et hacher le tout
        const passwordToHash = salt + password;
        const hashedPassword = createHash('sha256').update(passwordToHash).digest('hex');

        // Insérer les données dans la base de données avec le sel et le mot de passe haché
        await db.insert('users', { username, email, salt, password: hashedPassword });

        // Rediriger vers la page de connexion après l'inscription
        res.redirect('/login');
    } catch (error) {
        console.error(error);
        res.status(500).send("Erreur lors de l'inscription");
    }
});


// route pour logout
app.post('/logout', function(req, res) {
    res.clearCookie('accessToken'); // Assurez-vous que le nom du cookie est correct
    res.redirect('/accueil');
});


//route pour document
app.get("/document", (req, res) => {
    if (!res.locals.user) {
        return res.redirect("/login"); // Redirige vers la page de connexion si l'utilisateur n'est pas connecté
    }
    res.render("document", { title: 'Créer un Document' });
});

app.get("/mydocuments", (req, res) => {
    if (!res.locals.user) {
        return res.redirect("/login"); // Redirige vers la page de connexion si l'utilisateur n'est pas connecté
    }
    res.render("mydocuments", { title: 'Mes Documents' });
});



//  route pour la sauvegarde de documents 
app.post('/document/save', async (req, res) => {
    try {
        const documentData = req.body;
        const savedDocumentId = await db.saveDocument(documentData);

        res.status(200).json({ message: 'Document sauvegardé avec succès', documentId: savedDocumentId });
    } catch (error) {
        console.error('Erreur lors de la sauvegarde du document:', error);
        res.status(500).json({ message: 'Erreur lors de la sauvegarde du document' });
    }
});



// route pour affichier mes docs
app.get("/mes-documents", async (req, res) => {
    if (!res.locals.user) {
        return res.redirect("/login"); // Redirige vers la page de connexion si l'utilisateur n'est pas connecté
    }
    try {
        // la fonction db.getDocumentsByUserId(userId) renvoie tous les documents pour cet utilisateur
        const documents = await db.getDocumentsByUserId(res.locals.user._id);
        res.render("index", { documents: documents }); // Passezles documents au template EJS
    } catch (error) {
        console.error('Erreur lors de la récupération des documents:', error);
        res.status(500).send('Erreur lors de la récupération des documents');
    }
});





app.all("*", (req, res) => res.status(404).send("<h1>Il semblerait que cette page n'existe pas.</h1>"));









function defaut(req, res){
    const ind = {method : req.method, url : req.url}
    res.render("index",ind);
}

async function collection(req, res){
    const nomCollection = req.params.collection;
    const data = await db.find(nomCollection, {});
    res.render("db/collection", {nomCollection, data});
}

async function dbAdmin(req, res){
    const collections = await db.listCollections();
    res.render("db/admin", {collections});
}

async function postLogin(req, res){
    const { username, password } = req.body;

    try {
        let token = await auth.checkLogin(username, password);
        if (token == -1) {
            // Si l'authentification échoue
            res.render("login", { error: "Il semblerait que le nom d'utilisateur ou le mot de passe soit incorrect." });
        } else {
            // Si l'authentification réussit
            res.cookie("accessToken", token, { httpOnly: true });
            res.redirect("/accueil");
        }
    } catch (error) {
        console.error(error);
        res.status(500).send('Erreur lors de la connexion');
    }
}




module.exports = app;