const fs = require('fs'); const path = require('path'); const db = require('./db'); // Assurez-vous d'importer le fichier db.js const PROJECTS_DIR = path.join(__dirname, '../storage'); // Fonction pour créer un dossier pour un projet function createProjectDirectory(projectId) { const projectPath = path.join(PROJECTS_DIR, projectId.toString()); console.log(`Tentative de création du dossier pour le projet ${projectId} à ${projectPath}`); fs.mkdir(projectPath, { recursive: true }, (err) => { if (err) { console.error(`Erreur lors de la création du dossier du projet ${projectId}:`, err); return; } console.log(`Dossier créé pour le projet ${projectId} à ${projectPath}`); }); } // Fonction pour récupérer la liste des projets existants et générer leurs dossiers s'ils n'existent pas function initializeProjectDirectories() { console.log('Initialisation des dossiers de projets existants...'); db.query('SELECT id FROM public.projects', (err, result) => { if (err) { console.error('Erreur lors de la récupération des projets existants:', err); return; } console.log('Projets existants récupérés:', result.rows); result.rows.forEach(row => { const projectId = row.id; const projectPath = path.join(PROJECTS_DIR, projectId.toString()); if (!fs.existsSync(projectPath)) { console.log(`Le dossier pour le projet ${projectId} n'existe pas. Création en cours...`); createProjectDirectory(projectId); } else { console.log(`Le dossier pour le projet ${projectId} existe déjà.`); } }); }); } // Fonction pour supprimer les dossiers qui ne font pas partie de la base de données function cleanUpProjectDirectories() { console.log('Nettoyage des dossiers de projets...'); fs.readdir(PROJECTS_DIR, (err, files) => { if (err) { console.error('Erreur lors de la lecture du dossier des projets:', err); return; } console.log('Dossiers de projets trouvés:', files); db.query('SELECT id FROM public.projects', (err, result) => { if (err) { console.error('Erreur lors de la récupération des projets existants:', err); return; } const projectIds = result.rows.map(row => row.id.toString()); console.log('Projets dans la base de données:', projectIds); files.forEach(file => { const projectPath = path.join(PROJECTS_DIR, file); if (fs.statSync(projectPath).isDirectory() && !projectIds.includes(file)) { console.log(`Le dossier ${file} ne correspond à aucun projet dans la base de données. Suppression en cours...`); fs.rmdir(projectPath, { recursive: true }, (err) => { if (err) { console.error(`Erreur lors de la suppression du dossier du projet ${file}:`, err); return; } console.log(`Dossier supprimé pour le projet ${file} à ${projectPath}`); }); } }); }); }); } // Nettoyer les dossiers des projets qui ne sont pas dans la base de données cleanUpProjectDirectories(); // Fonction pour surveiller les changements dans le dossier de projets function watchProjects() { console.log('Surveillance des changements dans le dossier de projets...'); fs.watch(PROJECTS_DIR, (eventType, filename) => { console.log(`Changement détecté: ${eventType} sur ${filename}`); if (eventType === 'rename') { const projectId = path.basename(filename); if (fs.existsSync(path.join(PROJECTS_DIR, filename))) { // Un nouveau projet a été créé console.log(`Nouveau projet détecté: ${projectId}`); createProjectDirectory(projectId); // Ajouter une entrée dans la base de données db.query('INSERT INTO public.projects (id, name, status) VALUES ($1, $2, $3)', [projectId, projectId, 0], (err) => { if (err) { console.error('Erreur lors de l\'ajout du projet à la base de données:', err); } else { console.log(`Projet ${projectId} ajouté à la base de données.`); } }); } else { // Un projet a été supprimé console.log(`Projet supprimé: ${projectId}`); // Supprimer les mesures associées au projet db.query('DELETE FROM public.measurements WHERE project_id = $1', [projectId], (err) => { if (err) { console.error('Erreur lors de la suppression des mesures du projet de la base de données:', err); return; } // Supprimer l'entrée de la base de données db.query('DELETE FROM public.projects WHERE id = $1', [projectId], (err) => { if (err) { console.error('Erreur lors de la suppression du projet de la base de données:', err); } else { console.log(`Projet ${projectId} supprimé de la base de données.`); } }); }); } } }); } // Initialiser les dossiers des projets existants initializeProjectDirectories(); // Démarrer la surveillance des projets watchProjects(); // Toutes les 20 secondes, initialiser les dossiers des projets existants et nettoyer les dossiers inutiles setInterval(() => { initializeProjectDirectories(); cleanUpProjectDirectories(); }, 20000);