const express = require('express'); const cors = require('cors'); const sql = require('mssql'); require('dotenv').config(); const app = express(); const PORT = 3002; // Configuration base de données const dbConfig = { server: process.env.DB_SERVER, database: process.env.DB_DATABASE, user: process.env.DB_USER, password: process.env.DB_PASSWORD, options: { encrypt: true, trustServerCertificate: true, enableArithAbort: true } }; // Middleware app.use(cors({ origin: ['http://localhost:5173', 'http://localhost:5174', 'http://localhost:3000', 'http://127.0.0.1:5173', 'http://127.0.0.1:5174'], credentials: true })); app.use(express.json()); // Log de toutes les requêtes app.use((req, res, next) => { console.log(`${new Date().toISOString()} - ${req.method} ${req.path} depuis ${req.get('origin') || 'inconnu'}`); next(); }); // Variable pour stocker la connexion let pool = null; // Fonction pour se connecter à la base async function connectDatabase() { try { pool = await sql.connect(dbConfig); console.log('Base de données connectée'); return true; } catch (error) { console.error('Erreur de connexion :', error.message); return false; } } // Route de test app.get('/api/test', (req, res) => { res.json({ message: 'Le serveur fonctionne !', timestamp: new Date().toISOString() }); }); // Route pour tester la base de données app.get('/api/db-test', async (req, res) => { try { if (!pool) { return res.status(500).json({ error: 'Base non connectée' }); } const result = await pool.request().query('SELECT COUNT(*) as total FROM FormateurSqy'); res.json({ message: 'Base OK', formateurs: result.recordset[0].total }); } catch (error) { res.status(500).json({ error: error.message }); } }); // Route pour mettre à jour le statut d'une déclaration app.put('/api/declarations/:id/status', async (req, res) => { try { const { id } = req.params; const { status } = req.body; await pool.request() .input('id', sql.Int, id) .input('status', sql.VarChar, status) .query('UPDATE declarations SET status = @status WHERE id = @id'); res.json({ success: true, message: 'Statut mis à jour' }); } catch (error) { res.status(500).json({ success: false, error: error.message }); } }); // Modifier votre route existante // Remplacez la route existante par : app.get('/api/get_declarations', async (req, res) => { try { console.log('Récupération des déclarations...'); const result = await pool.request().query(` SELECT d.id, d.formateur_numero as utilisateur_id, td.id as type_demande_id, d.date, d.duree, d.description, d.formateur_numero, 'pending' as status, td.libelle as activityType, f.NOM_ENS as nom, f.PRENOM_ENS as prenom, 'Non défini' as campus FROM declarations d INNER JOIN types_demandes td ON d.type_demande_id = td.id LEFT JOIN FormateurSqy f ON d.formateur_numero = f.NUMERO ORDER BY d.date DESC `); console.log(`${result.recordset.length} déclarations trouvées`); res.json(result.recordset); } catch (error) { console.error('Erreur lors de la récupération:', error); res.status(500).json({ error: error.message }); } }); // Démarrage du serveur async function startServer() { const dbConnected = await connectDatabase(); if (!dbConnected) { console.log('Impossible de démarrer sans base de données'); return; } app.listen(PORT, () => { console.log(`Serveur démarré sur http://localhost:${PORT}`); console.log('Routes disponibles :'); console.log('- GET /api/test'); console.log('- GET /api/db-test'); console.log('- GET /api/get_declarations'); console.log('- PUT /api/declarations/:id/status'); }); } // Arrêt propre process.on('SIGINT', async () => { console.log('Arrêt du serveur...'); if (pool) { await pool.close(); } process.exit(0); }); // Démarrer startServer();