feat(status): Refactor project and video status management with centralized configuration and update related controllers and routes
All checks were successful
SSH Backend Deploy / ssh-deploy (push) Successful in 9s

This commit is contained in:
2025-04-27 11:21:36 +02:00
parent 65fa693986
commit fde6a0454c
8 changed files with 47 additions and 11 deletions

View File

@@ -153,12 +153,18 @@ module.exports = {
samples: path.join(process.cwd(), 'sample') samples: path.join(process.cwd(), 'sample')
}, },
// Statuts pour les projets et vidéos // Statuts pour les projets
status: { projectStatus: {
waiting: 0, brouillon: 0,
capturing: 1,
idle: 2,
},
// Statuts pour les vidéos
videoStatus: {
rendering: 0,
completed: 1, completed: 1,
failed: 2, error: 2
inProgress: 3
}, },
// Paramètres par défaut pour la caméra // Paramètres par défaut pour la caméra

View File

@@ -56,7 +56,7 @@ class CameraController {
await Camera.updateCamera(1, newSettings); await Camera.updateCamera(1, newSettings);
// Met à jour le statut du projet // 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}`); console.log(`[CAMERA] Procédure démarrée pour le projet : ${project_id}`);

View File

@@ -86,7 +86,7 @@ class ProjectController {
} }
const date = new Date(); const date = new Date();
const defaultStatus = config.status.waiting; const defaultStatus = config.projectStatus.brouillon;
const project = await Project.createProject(name, description, date, defaultStatus); const project = await Project.createProject(name, description, date, defaultStatus);
await StorageService.project.createProjectDirectory(project.id); await StorageService.project.createProjectDirectory(project.id);

View File

@@ -156,7 +156,7 @@ class VideoController {
return sendError('Vidéo non trouvée', res, null, 404); 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); return sendError('Vidéo pas encore produite', res, null, 400);
} }

View File

@@ -59,6 +59,18 @@ class Project {
return result.rows[0] || null; 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<Object|null>} 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 * Supprime un projet par son ID
* @param {number} id - ID du projet * @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<Object|null>} Projet en cours de rendu ou null * @returns {Promise<Object|null>} Projet en cours de rendu ou null
*/ */
static findCurrentRenderingProject = wrapDatabaseOperation(async () => { 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); const result = await db.query(query);
return result.rows[0] || null; return result.rows[0] || null;
}); });

View File

@@ -48,7 +48,7 @@ class Video {
* @returns {Promise<Object>} Vidéo créée * @returns {Promise<Object>} Vidéo créée
*/ */
static createVideo = wrapDatabaseOperation(async ( static createVideo = wrapDatabaseOperation(async (
projectId, measurementIds, name, resolution, duration, status = config.status.waiting projectId, measurementIds, name, resolution, duration, status = config.videoStatus.rendering
) => { ) => {
const query = ` const query = `
INSERT INTO videos (project_id, measurement_ids, name, resolution, duration, status) INSERT INTO videos (project_id, measurement_ids, name, resolution, duration, status)
@@ -87,6 +87,18 @@ class Video {
return result.rows[0] || null; 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<Object|null>} 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 * Supprime une vidéo par son ID
* @param {number} id - ID de la vidéo * @param {number} id - ID de la vidéo

View File

@@ -145,6 +145,9 @@ router.get('/projects/:id/measurements', ProjectController.getProjectMeasurement
* description: * description:
* type: string * type: string
* description: Description détaillée du projet * 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: * required:
* - name * - name
* - description * - description

View File

@@ -223,6 +223,9 @@ router.get('/videos/file/:video_id', VideoController.getVideoFile);
* type: string * type: string
* description: État actuel du rendu * description: État actuel du rendu
* example: En cours * example: En cours
* status:
* type: integer
* description: Statut de la vidéo (0: waiting, 1: in_progress, 2: completed, 3: failed)
* 404: * 404:
* $ref: '#/components/responses/NotFound' * $ref: '#/components/responses/NotFound'
* 500: * 500: