const express = require('express'); const router = express.Router(); const db = require('../db'); const serverError = require('../utils/serverError'); /** * @swagger * /videos: * get: * summary: Récupérer toutes les vidéos * description: Récupère toutes les vidéos de la base de données. * responses: * 200: * description: Une liste de vidéos. * content: * application/json: * schema: * type: array * items: * type: object * properties: * id: * type: integer * project_id: * type: integer * measurement_ids: * type: string * video_path: * type: string * start_timestamp: * type: string * end_timestamp: * type: string * image_count: * type: integer * resolution: * type: string * duration: * type: number * fps: * type: number * status: * type: integer * name: * type: string * 500: * description: Erreur serveur. */ router.get('/videos', (req, res) => { const query = 'SELECT * FROM public.videos'; db.query(query, (err, results) => { if (err) { serverError.sendError('Erreur lors de la récupération des vidéos:', res, err); } res.json(results.rows); }); }); /** * @swagger * /videos/{id}: * get: * summary: Récupérer une vidéo par ID * description: Récupère une vidéo spécifique en utilisant son ID. * parameters: * - in: path * name: id * schema: * type: integer * required: true * description: ID de la vidéo * responses: * 200: * description: Une vidéo. * content: * application/json: * schema: * type: object * properties: * id: * type: integer * project_id: * type: integer * measurement_ids: * type: string * video_path: * type: string * start_timestamp: * type: string * end_timestamp: * type: string * image_count: * type: integer * resolution: * type: string * duration: * type: number * fps: * type: number * status: * type: integer * name: * type: string * 400: * description: ID de vidéo invalide. * 500: * description: Erreur serveur. */ router.get('/videos/:id', (req, res) => { const videoId = req.params.id; if (!videoId || isNaN(videoId)) { return res.status(400).json({ error: 'Invalid video ID' }); } const query = 'SELECT * FROM public.videos WHERE id = $1'; db.query(query, [videoId], (err, results) => { if (err) { serverError.sendError('Erreur lors de la récupération de la vidéo:', res, err); } res.json(results.rows); }); }); /** * @swagger * /videos: * post: * summary: Ajouter une nouvelle vidéo * description: Ajoute une nouvelle vidéo à la base de données. * requestBody: * required: true * content: * application/json: * schema: * type: object * properties: * project_id: * type: integer * measurement_ids: * type: string * video_path: * type: string * duration: * type: number * resolution: * type: string * name: * type: string * responses: * 201: * description: Vidéo ajoutée avec succès. * 400: * description: Tous les champs sont requis. * 500: * description: Erreur serveur. */ router.post('/videos', (req, res) => { const { project_id, measurement_ids, video_path, duration, resolution, name } = req.body; if (!project_id || !measurement_ids || !video_path || !duration || !resolution || !name) { return res.status(400).json({ error: 'All fields are required' }); } const list_ids = measurement_ids.split(','); const image_count = list_ids.length; const videoPath = '/videos/' + name + '.mp4'; const query_first = 'SELECT timestamp FROM public.measurements WHERE id = $1'; const query_last = 'SELECT timestamp FROM public.measurements WHERE id = $1'; db.query(query_first, [list_ids[0]], (err, results) => { if (err) { serverError.sendError('Erreur lors de la récupération du timestamp de la première image:', res, err); } const start_timestamp = results.rows[0].timestamp; db.query(query_last, [list_ids[image_count - 1]], (err, results) => { if (err) { serverError.sendError('Erreur lors de la récupération du timestamp de la dernière image:', res, err); } const end_timestamp = results.rows[0].timestamp; const fps = image_count / duration; const query = 'INSERT INTO public.videos (project_id, measurement_ids, video_path, start_timestamp, end_timestamp, image_count, resolution, duration, fps, status, name) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING id'; db.query(query, [project_id, measurement_ids, videoPath, start_timestamp, end_timestamp, image_count, resolution, duration, fps, 0, name], (err, results) => { if (err) { serverError.sendError('Erreur lors de l\'ajout de la vidéo:', res, err); } res.status(201).json({ message: 'Vidéo ajoutée avec succès', id: results.rows[0].id }); }); }); }); }); /** * @swagger * /videos/{id}: * delete: * summary: Supprimer une vidéo par ID * description: Supprime une vidéo spécifique en utilisant son ID. * parameters: * - in: path * name: id * schema: * type: integer * required: true * description: ID de la vidéo * responses: * 200: * description: Vidéo supprimée avec succès. * 400: * description: ID de vidéo invalide. * 404: * description: Aucune vidéo trouvée avec cet ID. * 500: * description: Erreur serveur. */ router.delete('/videos/:id', (req, res) => { const videoId = req.params.id; if (!videoId || isNaN(videoId)) { return res.status(400).json({ error: 'Invalid video ID' }); } const query = 'DELETE FROM public.videos WHERE id = $1 RETURNING id'; db.query(query, [videoId], (err, results) => { if (err) { serverError.sendError('Erreur lors de la suppression de la vidéo:', res, err); } if (results.rowCount === 0) { return res.status(404).json({ error: 'Aucune vidéo trouvée avec cet ID.' }); } res.status(200).json({ message: 'Vidéo supprimée avec succès', id: videoId }); }); }); module.exports = router;