Files
timelapse-backend/routes/cameraRoutes.js

180 lines
6.5 KiB
JavaScript

const express = require('express');
const router = express.Router();
const path = require('path');
const fs = require('fs');
const dbTester = require('../test/tester');
const db = require('../db');
const serverError = require('../utils/serverError');
const minInterval = 3; // Minutes
//const maxInterval = 60; // Minutes
var defaultCaptureInterval = 5; // minutes
var defaultCaptureProjectID = -1; // -1 = pas de projet en cours de capture
var defaultCaptureStatus = 0; // 0 = pas de capture, 1 = capture en cours
var defaultMaintenance = 0;
var captureInterval = defaultCaptureInterval; // intervalle de capture en minutes
var captureProjectID = defaultCaptureProjectID; // ID du projet en cours de capture
var captureStatus = defaultCaptureStatus; // 0 = pas de capture, 1 = capture en cours
var maintenance = defaultMaintenance; // 0 = pas de maintenance, 1 = maintenance
function initCamera() {
const query = 'SELECT * FROM public.camera WHERE id = $1';
const values = [1];
db.query(query, values, (err, result) => {
if (err) {
console.error('Erreur lors de la vérification de l\'entrée caméra:', err);
return;
}
if (result.rows.length === 0) {
const insertQuery = `
INSERT INTO public.camera (id, interval, project_id, capture_status, maintenance)
VALUES ($1, $2, $3, $4, $5)
`;
const insertValues = [1, defaultCaptureInterval, defaultCaptureProjectID, defaultCaptureStatus, defaultMaintenance];
db.query(insertQuery, insertValues, (err) => {
if (err) {
console.error('Erreur lors de l\'initialisation de la caméra:', err);
} else {
console.log('Caméra initialisée avec les valeurs par défaut.');
}
});
} else {
console.log('L\'entrée caméra avec l\'ID 1 existe déjà. Aucune initialisation nécessaire.');
}
});
}
function getCamera() {
// retourner l'état de la caméra
const query = 'SELECT * FROM public.camera WHERE id = $1';
const values = [1];
db.query(query, values, (err, result) => {
if (err) {
console.error('Erreur lors de la récupération de l\'entrée caméra:', err);
return;
}
if (result.rows.length === 0) {
console.log('Aucune entrée caméra trouvée.');
return;
}
const camera = result.rows[0];
captureInterval = camera.interval;
captureProjectID = camera.project_id;
captureStatus = camera.capture_status;
maintenance = camera.maintenance;
console.log('Caméra récupérée avec succès:', camera);
});
return {
captureInterval: captureInterval,
captureProjectID: captureProjectID,
captureStatus: captureStatus,
maintenance: maintenance
};
}
function printCameraStatus() {
let camera = getCamera();
console.log('Statut de la caméra:');
console.log('Intervalle de capture:', camera.captureInterval, 'minutes');
console.log('ID du projet en cours de capture:', camera.captureProjectID);
console.log('Statut de la capture:', camera.captureStatus === 1 ? 'En cours' : 'Arrêté');
console.log('Maintenance:', camera.maintenance === 1 ? 'En cours' : 'Aucune');
console.log('-----------------------------------');
}
function isCameraOccupied() {
return getCamera().captureStatus === 1;
}
initCamera();
printCameraStatus();
router.post('/procedure/start/', async (req, res) => {
const { projectId, interval } = req.body;
try {
const result = startProcedure(projectId, interval);
res.status(200).json(result);
} catch (err) {
serverError.sendError('Erreur lors du démarrage de la procédure de capture:', res, err, 500);
}
});
function startProcedure(projectId, interval) {
if (isCameraOccupied()) {
return { message: 'Caméra Occupée : Le projet ID ' + captureProjectID + ' est déjà en cours de capture.' };
}
console.log('Démarrage de la procédure de capture');
exists = db.query('SELECT * FROM public.projects WHERE id = $1', [projectId]);
if (!exists) {
return { message: 'Le projet ID ' + projectId + ' n\'existe pas.' };
}
if (interval < minInterval) {
return { message: 'L\'intervalle de capture doit être supérieur ou égal à ' + minInterval + ' minutes.' };
}
// if (interval > maxInterval) {
// return { message: 'L\'intervalle de capture doit être inférieur ou égal à ' + maxInterval + ' minutes.' };
// }
// Application des valeurs
captureProjectID = projectId;
captureInterval = interval;
//via la DB changer le status du projet
const query = 'UPDATE public.projects SET status = $2 WHERE id = $1 RETURNING *';
const values = [projectId, 1];
db.query(query, values, (err, res) => {
if (err) {
console.error('Erreur lors de la mise à jour du statut (activation) du projet:', err);
return { message: 'Erreur lors de la mise à jour du statut (activation) du projet.' };
}
});
console.log('Procédure de capture démarrée avec succès, projet ID: ' + projectId + ', interval: ' + interval + ' minutes.');
return { message: 'Procédure de capture démarrée avec succès, projet ID: ' + projectId + ', interval: ' + interval + ' minutes.' };
}
function stopProcedure() {
oldProjectID = captureProjectID;
oldInterval = captureInterval;
console.log('Ancien Projet : ' + oldProjectID + ', Ancien Intervalle : ' + oldInterval);
// Application du reset
captureProjectID = -1;
captureInterval = 0;
console.log('Nouveau Projet : ' + captureProjectID + ', Nouvel Intervalle : ' + captureInterval);
console.log('Arrêt de la procédure de capture');
//via la DB changer le status du projet
const query = 'UPDATE public.projects SET status = $2 WHERE id = $1 RETURNING *';
const values = [oldProjectID, 0];
db.query(query, values, (err, res) => {
if (err) {
console.error('Erreur lors de la mise à jour du statut (désactivation) du projet:', err);
return { message: 'Erreur lors de la mise à jour du statut (désactivation) du projet.' };
}
});
return { message: 'Procédure de capture arrêtée avec succès, projet ID: ' + oldProjectID + ', interval: ' + oldInterval + ' minutes.' };
}
router.post('/procedure/stop/', async (req, res) => {
try {
const result = stopProcedure();
res.status(200).json(result);
} catch (err) {
serverError.sendError('Erreur lors de l\'arrêt de la procédure de capture:', res, err, 500);
}
});
module.exports = router;