diff --git a/controllers/projectController.js b/controllers/projectController.js deleted file mode 100644 index 705f57a..0000000 --- a/controllers/projectController.js +++ /dev/null @@ -1,72 +0,0 @@ -const db = require('../db'); -const fileUtils = require('../utils/fileUtils'); - -/** - * Crée un nouveau projet et un dossier associé. - * @param {Object} req - La requête contenant les détails du projet. - * @param {Object} res - La réponse à renvoyer au client. - */ -exports.createProject = (req, res) => { - const { name, description = '' } = req.body; - const startDate = new Date(); - const status = 0; - - // Insérer le projet dans la base de données - (async () => { - try { - const query = 'INSERT INTO public.projects (name, description, start_date, status) VALUES ($1, $2, $3, $4) RETURNING id'; - const result = await db.query(query, [name, description, startDate, status]); - const projectId = result.rows[0].id; - - // Créer un dossier pour le projet avec l'ID du projet - await fileUtils.createProjectDirectory(projectId); - res.status(201).json({ message: 'Projet créé avec succès', id: projectId }); - } catch (err) { - console.error('Erreur lors de la création du projet:', err); - res.status(500).json({ error: 'Erreur serveur' }); - } - })(); -}; - -/** - * Récupère tous les projets. - * @param {Object} req - La requête. - * @param {Object} res - La réponse à renvoyer au client. - */ -exports.getAllProjects = (req, res) => { - const query = 'SELECT * FROM public.projects'; - db.query(query) - .then(result => { - res.json(result.rows); - }) - .catch(err => { - console.error('Erreur lors de la récupération des projets:', err); - res.status(500).json({ error: 'Erreur serveur' }); - }); -}; - -/** - * Supprime un projet et son dossier associé. - * @param {Object} req - La requête contenant l'ID du projet à supprimer. - * @param {Object} res - La réponse à renvoyer au client. - */ -exports.deleteProject = async (req, res) => { - const projectId = req.params.id; - - try { - // Supprimer le projet de la base de données - const deleteProjectQuery = 'DELETE FROM public.projects WHERE id = $1'; - const result = await db.query(deleteProjectQuery, [projectId]); - - if (result.rowCount === 0) { - return res.status(404).json({ error: 'Aucun projet trouvé avec cet ID.' }); - } - - // Supprimer le dossier du projet - await fileUtils.deleteProjectDirectory(projectId); - res.status(200).json({ message: 'Projet supprimé avec succès' }); - } catch (err) { - console.error('Erreur lors de la suppression du projet:', err); - res.status(500).json({ error: 'Erreur serveur' }); - } -}; diff --git a/file_watcher.js b/file_watcher.js deleted file mode 100644 index 0459a9d..0000000 --- a/file_watcher.js +++ /dev/null @@ -1,131 +0,0 @@ -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); \ No newline at end of file diff --git a/models/projectModel.js b/models/projectModel.js deleted file mode 100644 index 64cd312..0000000 --- a/models/projectModel.js +++ /dev/null @@ -1,41 +0,0 @@ -module.exports = { - createProject: async (db, projectData) => { - const query = 'INSERT INTO public.projects (name, description, start_date, status) VALUES ($1, $2, $3, $4) RETURNING id'; - const values = [projectData.name, projectData.description, projectData.start_date, projectData.status]; - try { - const result = await db.query(query, values); - return result.rows[0].id; - } catch (error) { - throw new Error('Erreur lors de la création du projet: ' + error.message); - } - }, - - getProjectById: async (db, projectId) => { - const query = 'SELECT * FROM public.projects WHERE id = $1'; - try { - const result = await db.query(query, [projectId]); - return result.rows[0]; - } catch (error) { - throw new Error('Erreur lors de la récupération du projet: ' + error.message); - } - }, - - updateProject: async (db, projectId, projectData) => { - const query = 'UPDATE public.projects SET name = $1, description = $2, start_date = $3, status = $4 WHERE id = $5'; - const values = [projectData.name, projectData.description, projectData.start_date, projectData.status, projectId]; - try { - await db.query(query, values); - } catch (error) { - throw new Error('Erreur lors de la mise à jour du projet: ' + error.message); - } - }, - - deleteProject: async (db, projectId) => { - const query = 'DELETE FROM public.projects WHERE id = $1'; - try { - await db.query(query, [projectId]); - } catch (error) { - throw new Error('Erreur lors de la suppression du projet: ' + error.message); - } - } - }; \ No newline at end of file diff --git a/routes/api.js b/routes/api.js index 4b8ef41..b139fa2 100644 --- a/routes/api.js +++ b/routes/api.js @@ -8,6 +8,7 @@ const path = require('path'); const fs = require('fs'); const ffmpeg = require('../ffmpeg'); // Assurez-vous d'importer le fichier ffmpeg.js const file_watcher = require('../file_watcher'); // Assurez-vous d'importer le fichier file_watcher.js +const fileUtils = require('../fileUtils'); /** * @swagger @@ -188,7 +189,36 @@ router.get('/projects/:id/measurements', (req, res) => { * 500: * description: Internal server error */ -router.post('/projects', projectController.createProject); +router.post('/projects', async (req, res) => { + const { name, description } = req.body; + if (!name || !description) { + return res.status(400).json({ error: 'Name and description are required' }); + } + + try { + const query = 'INSERT INTO public.projects (name, description) VALUES ($1, $2) RETURNING id'; + const result = await db.query(query, [name, description]); + const projectId = result.rows[0].id; + + fileUtils.createProjectDirectory(projectId); + res.status(201).json({ message: 'Project created successfully', projectId }); + } catch (error) { + console.error('Error creating project:', error); + res.status(500).json({ error: 'Internal server error' }); + } + const { projectId } = req.body; + if (!projectId) { + return res.status(400).json({ error: 'Project ID is required' }); + } + + try { + fileUtils.createProjectDirectory(projectId); + res.status(201).json({ message: 'Project directory created successfully' }); + } catch (error) { + console.error('Error creating project directory:', error); + res.status(500).json({ error: 'Internal server error' }); + } +}); /** * @swagger @@ -210,7 +240,23 @@ router.post('/projects', projectController.createProject); * 500: * description: Internal server error */ -router.delete('/projects/:id', projectController.deleteProject); +router.delete('/projects/:id', async (req, res) => { + const projectId = req.params.id; + const projectDir = path.join(__dirname, `../storage/${projectId}`); + + try { + const result = await db.query('DELETE FROM public.projects WHERE id = $1 RETURNING id', [projectId]); + if (result.rowCount === 0) { + return res.status(404).json({ error: 'No project found with this ID' }); + } + + fs.rmdirSync(projectDir, { recursive: true }); + res.status(200).json({ message: 'Project deleted successfully', id: projectId }); + } catch (error) { + console.error('Error deleting project:', error); + res.status(500).json({ error: 'Internal server error' }); + } +}); /** * @swagger diff --git a/utils/fileUtils.js b/utils/fileUtils.js index 7f350a0..a1c54d6 100644 --- a/utils/fileUtils.js +++ b/utils/fileUtils.js @@ -1,5 +1,6 @@ const fs = require('fs'); const path = require('path'); +const PROJECTS_DIR = path.join(__dirname, '../storage'); /** * Crée un dossier pour un projet donné. @@ -7,7 +8,7 @@ const path = require('path'); * @param {string} baseDir - Le répertoire de base où le dossier du projet sera créé. */ function createProjectDirectory(projectId) { - const projectDir = path.join(__dirname, `storage/${projectId}`); + const projectDir = path.join(PROJECTS_DIR, `${projectId}`); console.log(`Creating directory: ${projectDir}`); if (!fs.existsSync(projectDir)) { fs.mkdirSync(projectDir, { recursive: true }); @@ -20,48 +21,18 @@ function createProjectDirectory(projectId) { /** * Supprime le dossier d'un projet donné. * @param {number} projectId - L'ID du projet. - * @param {string} baseDir - Le répertoire de base où le dossier du projet est situé. */ function deleteProjectDirectory(projectId) { - const projectDir = path.join(__dirname, `storage/${projectId}`); + const projectDir = path.join(PROJECTS_DIR, `${projectId}`); if (fs.existsSync(projectDir)) { - fs.readdirSync(projectDir).forEach(file => { - const filePath = path.join(projectDir, file); - if (fs.lstatSync(filePath).isDirectory()) { - fs.rmdirSync(filePath, { recursive: true }); - } else { - fs.unlinkSync(filePath); - } - }); - fs.rmdirSync(projectDir); + fs.rmSync(projectDir, { recursive: true, force: true }); console.log(`Directory deleted: ${projectDir}`); } else { console.log(`Directory does not exist: ${projectDir}`); } } -/** - * Synchronise les fichiers d'un projet dans son dossier. - * @param {number} projectId - L'ID du projet. - * @param {string} sourceDir - Le répertoire source des fichiers à synchroniser. - * @param {string} baseDir - Le répertoire de base où le dossier du projet est situé. - */ -function syncProjectFiles(projectId, sourceDir) { - const projectDir = path.join(__dirname, `storage/${projectId}`); - if (fs.existsSync(sourceDir)) { - fs.readdirSync(sourceDir).forEach(file => { - const srcFile = path.join(sourceDir, file); - const destFile = path.join(projectDir, file); - fs.copyFileSync(srcFile, destFile); - console.log(`File copied from ${srcFile} to ${destFile}`); - }); - } else { - console.log(`Source directory does not exist: ${sourceDir}`); - } -} - module.exports = { createProjectDirectory, - deleteProjectDirectory, - syncProjectFiles + deleteProjectDirectory }; \ No newline at end of file