Suppression des modèles et contrôleurs de projet, refonte de la création et suppression de projet dans les routes API

This commit is contained in:
2025-01-14 17:45:05 +01:00
parent b4ddaf102e
commit efc469597a
5 changed files with 53 additions and 280 deletions

View File

@@ -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' });
}
};

View File

@@ -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);

View File

@@ -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);
}
}
};

View File

@@ -8,6 +8,7 @@ const path = require('path');
const fs = require('fs'); const fs = require('fs');
const ffmpeg = require('../ffmpeg'); // Assurez-vous d'importer le fichier ffmpeg.js 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 file_watcher = require('../file_watcher'); // Assurez-vous d'importer le fichier file_watcher.js
const fileUtils = require('../fileUtils');
/** /**
* @swagger * @swagger
@@ -188,7 +189,36 @@ router.get('/projects/:id/measurements', (req, res) => {
* 500: * 500:
* description: Internal server error * 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 * @swagger
@@ -210,7 +240,23 @@ router.post('/projects', projectController.createProject);
* 500: * 500:
* description: Internal server error * 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 * @swagger

View File

@@ -1,5 +1,6 @@
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const PROJECTS_DIR = path.join(__dirname, '../storage');
/** /**
* Crée un dossier pour un projet donné. * 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éé. * @param {string} baseDir - Le répertoire de base où le dossier du projet sera créé.
*/ */
function createProjectDirectory(projectId) { function createProjectDirectory(projectId) {
const projectDir = path.join(__dirname, `storage/${projectId}`); const projectDir = path.join(PROJECTS_DIR, `${projectId}`);
console.log(`Creating directory: ${projectDir}`); console.log(`Creating directory: ${projectDir}`);
if (!fs.existsSync(projectDir)) { if (!fs.existsSync(projectDir)) {
fs.mkdirSync(projectDir, { recursive: true }); fs.mkdirSync(projectDir, { recursive: true });
@@ -20,48 +21,18 @@ function createProjectDirectory(projectId) {
/** /**
* Supprime le dossier d'un projet donné. * Supprime le dossier d'un projet donné.
* @param {number} projectId - L'ID du projet. * @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) { function deleteProjectDirectory(projectId) {
const projectDir = path.join(__dirname, `storage/${projectId}`); const projectDir = path.join(PROJECTS_DIR, `${projectId}`);
if (fs.existsSync(projectDir)) { if (fs.existsSync(projectDir)) {
fs.readdirSync(projectDir).forEach(file => { fs.rmSync(projectDir, { recursive: true, force: true });
const filePath = path.join(projectDir, file);
if (fs.lstatSync(filePath).isDirectory()) {
fs.rmdirSync(filePath, { recursive: true });
} else {
fs.unlinkSync(filePath);
}
});
fs.rmdirSync(projectDir);
console.log(`Directory deleted: ${projectDir}`); console.log(`Directory deleted: ${projectDir}`);
} else { } else {
console.log(`Directory does not exist: ${projectDir}`); 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 = { module.exports = {
createProjectDirectory, createProjectDirectory,
deleteProjectDirectory, deleteProjectDirectory
syncProjectFiles
}; };