zkt26/z1/webapp/index.js
2026-03-31 19:33:15 +02:00

206 lines
6.1 KiB
JavaScript

const express = require('express');
const session = require('express-session');
const path = require('path');
const bcrypt = require('bcrypt');
const db = require('./config/db');
const app = express();
const PORT = 3000;
// --------------------
// Middleware
// --------------------
app.use(express.static('public'));
app.use('/img', express.static('img'));
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
app.use(session({
secret: 'votre-secret',
resave: false,
saveUninitialized: false
}));
app.use((req, res, next) => {
res.locals.session = req.session;
res.locals.currentRoute = req.path;
next();
});
// --------------------
// Middleware admin
// --------------------
function requireAdmin(req, res, next) {
if (!req.session.utilisateur || req.session.utilisateur.statut !== 'administrateur') {
return res.redirect('/non-admin');
}
next();
}
// --------------------
// Importation des routes
// --------------------
const profilRouter = require('./routes/profil');
const inscriptionRouter = require('./routes/inscription');
const connexionRouter = require('./routes/connexion');
const objetsRoutes = require('./routes/api/objet');
const utilisateursRoutes = require('./routes/api/utilisateur');
const ressourceRoutes = require('./routes/api/ressource');
const complexeRoutes = require('./routes/complexe');
const adminRoutes = require('./routes/admin');
// --------------------
// Utilisation des routes
// --------------------
app.use('/profil', profilRouter);
app.use('/inscription', inscriptionRouter);
app.use('/connexion', connexionRouter);
app.use('/api/objets', objetsRoutes);
app.use('/api/utilisateurs', utilisateursRoutes);
app.use('/api/ressources', ressourceRoutes);
app.use('/complexe', complexeRoutes);
app.use('/admin', adminRoutes);
// --------------------
// Pages de vue
// --------------------
app.get('/', (req, res) => res.render('accueil'));
app.get('/objets', (req, res) => res.render('objets'));
app.get('/ressources', (req, res) => res.render('ressources'));
app.get('/description', (req, res) => res.render('description'));
app.get('/contact', (req, res) => res.render('contact'));
app.get('/membres', (req, res) => {
db.query('SELECT * FROM utilisateur', (err, membres) => {
if (err) return res.status(500).send('Erreur BDD');
res.render('membres', { membres });
});
});
app.get('/membres/:id', (req, res) => {
const id = req.params.id;
db.query('SELECT * FROM utilisateur WHERE id = ?', [id], (err, results) => {
if (err || results.length === 0) return res.status(404).send('Utilisateur non trouvé');
res.render('membre', { membre: results[0] });
});
});
app.get('/dashboard-complexe', (req, res) => {
if (!req.session.utilisateur || req.session.utilisateur.statut !== 'complexe') {
return res.send(`
<script>
alert("Tu n'es pas connecté en tant que complexe ;)");
window.location.href = '/connexion';
</script>
`);
}
db.query('SELECT * FROM objet', (err, objets) => {
if (err) return res.status(500).send("Erreur objets");
res.render('dashboard-complexe', { objets });
});
});
app.get('/dashboard-simple', (req, res) => {
if (!req.session.utilisateur || req.session.utilisateur.statut !== 'simple') {
return res.redirect('/non-admin');
}
res.redirect('/objets');
});
app.get('/non-admin', (req, res) => {
res.send(`
<script>
alert("Tu n'es pas connecté en tant qu'admin ;)");
window.location.href = '/connexion';
</script>
`);
});
// --------------------
// Inscription utilisateur
// --------------------
app.post('/admin/ajouter-utilisateur', async (req, res) => {
const {
nom, prenom, sexe, age, date_naissance,
identifiant, email, mot_de_passe, situation, statut
} = req.body;
try {
const checkSql = 'SELECT * FROM utilisateur WHERE email = ? OR identifiant = ?';
db.query(checkSql, [email, identifiant], async (err, results) => {
if (err) return res.status(500).send("Erreur serveur");
if (results.length > 0) {
return res.send(`
<script>
alert("⚠️ L'adresse e-mail ou l'identifiant est déjà utilisé !");
window.location.href = '/admin';
</script>
`);
}
const hashed = await bcrypt.hash(mot_de_passe, 10);
const insertSql = `
INSERT INTO utilisateur
(nom, prenom, sexe, age, date_naissance, identifiant, email, mot_de_passe, situation, statut, etat)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'en attente')
`;
db.query(insertSql, [
nom, prenom, sexe, age, date_naissance,
identifiant, email, hashed, situation, statut
], (err) => {
if (err) return res.status(500).send("Erreur lors de l'ajout de l'utilisateur");
res.redirect('/admin');
});
});
} catch (error) {
res.status(500).send('Erreur serveur');
}
});
// --------------------
// Ajout objet (admin)
// --------------------
app.post('/admin/ajouter-objet', (req, res) => {
const { denomination, adresse_ip, type, niveau, etat } = req.body;
const sql = `
INSERT INTO objet (denomination, adresse_ip, type, niveau, etat)
VALUES (?, ?, ?, ?, ?)`;
db.query(sql, [denomination, adresse_ip, type, niveau, etat], (err) => {
if (err) return res.status(500).send("Erreur lors de l'ajout de l'objet");
res.redirect('/admin');
});
});
// --------------------
// Envoi de message contact
// --------------------
app.post('/contact', (req, res) => {
const { nom, email, message } = req.body;
const sql = 'INSERT INTO contact (nom, email, message) VALUES (?, ?, ?)';
db.query(sql, [nom, email, message], (err) => {
if (err) return res.status(500).send("Erreur lors de l'envoi du message");
res.redirect('/');
});
});
// --------------------
// Déconnexion
// --------------------
app.get('/deconnexion', (req, res) => {
req.session.destroy(() => {
res.redirect('/');
});
});
// --------------------
// Lancement du serveur
// --------------------
app.listen(PORT, () => {
console.log(`✅ Serveur lancé sur http://localhost:${PORT}`);
});