Files
timelapse-backend/src/controllers/cameraController.js
Kerboul aa7f901442
All checks were successful
SSH Backend Deploy / ssh-deploy (push) Successful in 11s
feat(camera): Ajouter un log pour afficher l'identifiant du projet lors du démarrage de la procédure
2025-04-27 12:41:34 +02:00

187 lines
6.2 KiB
JavaScript

// src/controllers/cameraController.js
const Camera = require('../models/Camera');
const Project = require('../models/Project');
const { sendError, asyncHandler } = require('../utils/errorHandler');
const config = require('../config');
/**
* Contrôleur pour les opérations liées à la caméra
*/
class CameraController {
/**
* Récupère le statut actuel de la caméra
*/
static getCameraStatus = asyncHandler(async (req, res) => {
try {
const settings = await Camera.getCamera();
if (!settings) {
// Initialise la caméra si elle n'existe pas
const cameraSettings = await Camera.initializeCamera();
return res.json(cameraSettings);
}
res.json(settings);
} catch (error) {
sendError('Erreur lors de la récupération du statut de la caméra', res, error, 500);
}
});
/**
* Démarre une procédure de capture
*/
static startProcedure = asyncHandler(async (req, res) => {
const { project_id, interval, nb_images } = req.body;
console.log('project_id:', project_id);
if (!interval || !nb_images) {
return sendError('L\'intervalle et le nombre d\'images sont requis', res, null, 400);
}
try {
// Vérifie qu'aucune procédure n'est déjà en cours
const existingProject = await Project.findCurrentRenderingProject();
if (existingProject) {
return sendError('Un projet est déjà en cours de capture. Veuillez l\'arrêter avant d\'en démarrer un nouveau.', res, null, 400);
}
// Met à jour les paramètres de la caméra
const newSettings = {
interval: interval,
nb_images: nb_images,
stop_flag: false,
idle: false // idle = 1 (idle = 0)
};
await Camera.updateCamera(1, newSettings);
// Met à jour le statut du projet
await Project.updateProject(project_id, { status: config.projectStatus.capturing });
console.log(`[CAMERA] Procédure démarrée pour le projet : ${project_id}`);
res.json({
message: 'Procédure de capture démarrée avec succès',
settings: { interval, nb_images }
});
} catch (error) {
sendError('Erreur lors du démarrage de la procédure de capture', res, error, 500);
}
});
/**
* Initie l'arrêt de la procédure de capture
*/
static stopProcedure = asyncHandler(async (req, res) => {
try {
// Trouve le projet actuellement en cours de capture
const currentProject = await Project.findCurrentRenderingProject();
if (!currentProject) {
return sendError('Aucun projet en cours de capture trouvé', res, null, 404);
}
// Met à jour le statut du projet en cours d'arrêt
await Project.updateProjectStatus(currentProject.id, config.projectStatus.stopping);
// Marque le drapeau d'arrêt
await Camera.updateCamera(1, { stop_flag: true });
console.log(`[CAMERA] Arrêt de la caméra demandé pour le projet ${currentProject.id}, en attente de confirmation...`);
res.json({
message: 'Procédure d\'arrêt de la caméra initiée avec succès',
project_id: currentProject.id
});
} catch (error) {
sendError('Erreur lors de l\'arrêt de la procédure de capture', res, error, 500);
}
});
/**
* Confirme l'arrêt de la caméra (appelé par la caméra)
*/
static confirmStopProcedure = asyncHandler(async (req, res) => {
try {
// Réinitialise les paramètres de la caméra
const newSettings = {
interval: null,
nb_images: null,
stop_flag: false,
idle: true // idle = true
};
await Camera.updateCamera(1, newSettings);
// Recherche le projet en cours d'arrêt
const stoppingProject = await Project.findStoppingProject();
if (stoppingProject) {
// Mettre à jour le statut du projet en cours d'arrêt vers idle
await Project.updateProjectStatus(stoppingProject.id, config.projectStatus.idle);
console.log(`[CAMERA] Projet : ${stoppingProject.id} arrêté avec succès.`);
res.json({
message: 'Caméra arrêtée avec succès',
project_id: stoppingProject.id,
status: config.projectStatus.idle
});
} else {
// Vérifier s'il y a un projet en cours de capture qui n'aurait pas été marqué comme stopping
const currentProject = await Project.findCurrentRenderingProject();
if (currentProject) {
await Project.updateProjectStatus(currentProject.id, config.projectStatus.idle);
console.log(`[CAMERA] Projet : ${currentProject.id} arrêté (était en capture).`);
res.json({
message: 'Caméra arrêtée avec succès (projet était en capture)',
project_id: currentProject.id,
status: config.projectStatus.idle
});
} else {
console.log('[CAMERA] Aucun projet en cours d\'arrêt ou de capture trouvé.');
res.json({ message: 'Caméra arrêtée avec succès mais aucun projet à mettre à jour' });
}
}
console.log('[CAMERA] Caméra arrêtée.');
} catch (error) {
sendError('Erreur lors de la confirmation de l\'arrêt de la caméra', res, error, 500);
}
});
/**
* Active le mode maintenance
*/
static activateMaintenance = asyncHandler(async (req, res) => {
try {
await Camera.updateCamera(1, { maintenance: 1 });
console.log('[CAMERA] Mode maintenance activé.');
res.json({ message: 'Caméra en mode maintenance' });
} catch (error) {
sendError('Erreur lors de l\'activation du mode maintenance', res, error, 500);
}
});
/**
* Désactive le mode maintenance
*/
static deactivateMaintenance = asyncHandler(async (req, res) => {
try {
await Camera.updateCamera(1, { maintenance: 0 });
console.log('[CAMERA] Mode maintenance désactivé.');
res.json({ message: 'Caméra sortie du mode maintenance' });
} catch (error) {
sendError('Erreur lors de la désactivation du mode maintenance', res, error, 500);
}
});
}
module.exports = CameraController;