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;