From fde6a0454c62f94916ac5016752732d4b7a8c960 Mon Sep 17 00:00:00 2001 From: Kerboul Date: Sun, 27 Apr 2025 11:21:36 +0200 Subject: [PATCH] feat(status): Refactor project and video status management with centralized configuration and update related controllers and routes --- src/config/index.js | 16 +++++++++++----- src/controllers/cameraController.js | 2 +- src/controllers/projectController.js | 2 +- src/controllers/videoController.js | 2 +- src/models/Project.js | 16 ++++++++++++++-- src/models/Video.js | 14 +++++++++++++- src/routes/projectRoutes.js | 3 +++ src/routes/videoRoutes.js | 3 +++ 8 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/config/index.js b/src/config/index.js index a2f29ed..74c469f 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -153,12 +153,18 @@ module.exports = { samples: path.join(process.cwd(), 'sample') }, - // Statuts pour les projets et vidéos - status: { - waiting: 0, + // Statuts pour les projets + projectStatus: { + brouillon: 0, + capturing: 1, + idle: 2, + }, + + // Statuts pour les vidéos + videoStatus: { + rendering: 0, completed: 1, - failed: 2, - inProgress: 3 + error: 2 }, // Paramètres par défaut pour la caméra diff --git a/src/controllers/cameraController.js b/src/controllers/cameraController.js index 5af030c..4119aa2 100644 --- a/src/controllers/cameraController.js +++ b/src/controllers/cameraController.js @@ -56,7 +56,7 @@ class CameraController { await Camera.updateCamera(1, newSettings); // Met à jour le statut du projet - await Project.updateProject(project_id, { status: config.status.inProgress }); + await Project.updateProject(project_id, { status: config.projectStatus.capturing }); console.log(`[CAMERA] Procédure démarrée pour le projet : ${project_id}`); diff --git a/src/controllers/projectController.js b/src/controllers/projectController.js index fd2f74c..1e66d70 100644 --- a/src/controllers/projectController.js +++ b/src/controllers/projectController.js @@ -86,7 +86,7 @@ class ProjectController { } const date = new Date(); - const defaultStatus = config.status.waiting; + const defaultStatus = config.projectStatus.brouillon; const project = await Project.createProject(name, description, date, defaultStatus); await StorageService.project.createProjectDirectory(project.id); diff --git a/src/controllers/videoController.js b/src/controllers/videoController.js index 7aa7058..674e36a 100644 --- a/src/controllers/videoController.js +++ b/src/controllers/videoController.js @@ -156,7 +156,7 @@ class VideoController { return sendError('Vidéo non trouvée', res, null, 404); } - if (video.status === config.status.waiting || video.status === config.status.inProgress) { + if (video.status === config.videoStatus.rendering || video.status === config.videoStatus.rendering) { return sendError('Vidéo pas encore produite', res, null, 400); } diff --git a/src/models/Project.js b/src/models/Project.js index 4da29ba..b7c78f3 100644 --- a/src/models/Project.js +++ b/src/models/Project.js @@ -59,6 +59,18 @@ class Project { return result.rows[0] || null; }); + /** + * Met à jour le statut d'un projet + * @param {number} id - ID du projet + * @param {number} status - Nouveau statut du projet + * @returns {Promise} Projet mis à jour ou null si non trouvé + */ + static updateProjectStatus = wrapDatabaseOperation(async (id, status) => { + const query = `UPDATE projects SET status = $1 WHERE id = $2 RETURNING *;`; + const result = await db.query(query, [status, id]); + return result.rows[0] || null; + }); + /** * Supprime un projet par son ID * @param {number} id - ID du projet @@ -70,11 +82,11 @@ class Project { }); /** - * Trouve le projet en cours de rendu (status = 1) + * Trouve le projet en cours de rendu (status = capturing) * @returns {Promise} Projet en cours de rendu ou null */ static findCurrentRenderingProject = wrapDatabaseOperation(async () => { - const query = `SELECT * FROM projects WHERE status = ${config.status.inProgress};`; + const query = `SELECT * FROM projects WHERE status = ${config.projectStatus.capturing};`; const result = await db.query(query); return result.rows[0] || null; }); diff --git a/src/models/Video.js b/src/models/Video.js index ed0dcca..3915260 100644 --- a/src/models/Video.js +++ b/src/models/Video.js @@ -48,7 +48,7 @@ class Video { * @returns {Promise} Vidéo créée */ static createVideo = wrapDatabaseOperation(async ( - projectId, measurementIds, name, resolution, duration, status = config.status.waiting + projectId, measurementIds, name, resolution, duration, status = config.videoStatus.rendering ) => { const query = ` INSERT INTO videos (project_id, measurement_ids, name, resolution, duration, status) @@ -87,6 +87,18 @@ class Video { return result.rows[0] || null; }); + /** + * Met à jour le statut d'une vidéo + * @param {number} id - ID de la vidéo + * @param {number} status - Nouveau statut de la vidéo + * @returns {Promise} Vidéo mise à jour ou null si non trouvée + */ + static async updateVideoStatus(id, status) { + const query = `UPDATE videos SET status = $1 WHERE id = $2 RETURNING *;`; + const result = await db.query(query, [status, id]); + return result.rows[0] || null; + } + /** * Supprime une vidéo par son ID * @param {number} id - ID de la vidéo diff --git a/src/routes/projectRoutes.js b/src/routes/projectRoutes.js index b1465a6..c471b34 100644 --- a/src/routes/projectRoutes.js +++ b/src/routes/projectRoutes.js @@ -145,6 +145,9 @@ router.get('/projects/:id/measurements', ProjectController.getProjectMeasurement * description: * type: string * description: Description détaillée du projet + * status: + * type: integer + * description: Statut du projet (0: new, 1: configured, 2: capturing, 3: paused, 4: completed, 5: active_with_videos) * required: * - name * - description diff --git a/src/routes/videoRoutes.js b/src/routes/videoRoutes.js index c472787..9a86fc4 100644 --- a/src/routes/videoRoutes.js +++ b/src/routes/videoRoutes.js @@ -223,6 +223,9 @@ router.get('/videos/file/:video_id', VideoController.getVideoFile); * type: string * description: État actuel du rendu * example: En cours + * status: + * type: integer + * description: Statut de la vidéo (0: waiting, 1: in_progress, 2: completed, 3: failed) * 404: * $ref: '#/components/responses/NotFound' * 500: