feat(api): Améliorer la documentation Swagger pour les routes de l'API, ajout de descriptions détaillées et de schémas pour les entités Project, Measurement, Video, Camera, et Error.
All checks were successful
SSH Backend Deploy / ssh-deploy (push) Successful in 10s

This commit is contained in:
2025-04-27 01:20:27 +02:00
parent 1890051a0f
commit 65fa693986
6 changed files with 485 additions and 87 deletions

View File

@@ -29,16 +29,121 @@ module.exports = {
definition: { definition: {
openapi: '3.0.0', openapi: '3.0.0',
info: { info: {
title: 'API Documentation', title: 'API Timelapse',
version: '1.0.0', version: '1.0.0',
description: 'Documentation de l\'API avec Swagger' description: 'Documentation de l\'API Timelapse pour la gestion des projets, mesures et vidéos',
contact: {
name: 'Support Timelapse',
email: 'support@timelapse.kerboul.me'
}
}, },
servers: [ servers: [
{ url: 'https://timelapse.kerboul.me/api' }, { url: 'https://timelapse.kerboul.me/api', description: 'Serveur de production' },
{ url: 'http://localhost:3000/api' } { url: 'http://localhost:3000/api', description: 'Serveur de développement local' }
] ],
components: {
schemas: {
Project: {
type: 'object',
properties: {
id: { type: 'integer' },
name: { type: 'string' },
description: { type: 'string' },
start_date: { type: 'string', format: 'date' },
status: { type: 'integer' }
}
}, },
apis: ['./src/routes/*.js', './src/controllers/*.js'] // Chemins pour la documentation Measurement: {
type: 'object',
properties: {
id: { type: 'integer' },
project_id: { type: 'integer' },
timestamp: { type: 'string', format: 'date-time' },
path: { type: 'string' },
temperature: { type: 'number' },
humidity: { type: 'number' },
order_id: { type: 'integer' }
}
},
Video: {
type: 'object',
properties: {
id: { type: 'integer' },
project_id: { type: 'integer' },
measurement_ids: { type: 'string' },
name: { type: 'string' },
resolution: { type: 'string' },
duration: { type: 'integer' },
status: { type: 'integer' },
progress: { type: 'number' },
video_file: { type: 'string', nullable: true },
started_at: { type: 'string', format: 'date-time', nullable: true },
updated_at: { type: 'string', format: 'date-time', nullable: true },
eta: { type: 'number', nullable: true }
}
},
Camera: {
type: 'object',
properties: {
id: { type: 'integer' },
interval: { type: 'integer', nullable: true },
maintenance: { type: 'integer' },
active: { type: 'integer' }
}
},
Error: {
type: 'object',
properties: {
message: { type: 'string' },
statusCode: { type: 'integer' },
details: { type: 'string', nullable: true },
timestamp: { type: 'string', format: 'date-time' }
}
}
},
responses: {
NotFound: {
description: 'La ressource demandée n\'a pas été trouvée',
content: {
'application/json': {
schema: {
$ref: '#/components/schemas/Error'
}
}
}
},
BadRequest: {
description: 'Requête invalide',
content: {
'application/json': {
schema: {
$ref: '#/components/schemas/Error'
}
}
}
},
ServerError: {
description: 'Erreur serveur',
content: {
'application/json': {
schema: {
$ref: '#/components/schemas/Error'
}
}
}
}
}
},
tags: [
{ name: 'Projets', description: 'Opérations relatives aux projets' },
{ name: 'Mesures', description: 'Opérations relatives aux mesures et images' },
{ name: 'Vidéos', description: 'Opérations relatives aux vidéos' },
{ name: 'Caméra', description: 'Opérations relatives au contrôle de la caméra' },
{ name: 'Images', description: 'Opérations relatives aux images' },
{ name: 'Système', description: 'Opérations relatives au système' }
],
},
apis: ['./src/routes/*.js'] // Chemins pour la documentation
}, },
// Chemins des répertoires // Chemins des répertoires

View File

@@ -7,26 +7,19 @@ const CameraController = require('../controllers/cameraController');
* @swagger * @swagger
* /camera/status: * /camera/status:
* get: * get:
* tags:
* - Caméra
* summary: Récupère le statut actuel de la caméra * summary: Récupère le statut actuel de la caméra
* description: Retourne les paramètres et l'état actuel du système de caméra
* responses: * responses:
* 200: * 200:
* description: Statut de la caméra * description: Statut de la caméra
* content: * content:
* application/json: * application/json:
* schema: * schema:
* type: object * $ref: '#/components/schemas/Camera'
* properties:
* id:
* type: integer
* interval:
* type: integer
* nullable: true
* maintenance:
* type: integer
* active:
* type: integer
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/camera/status', CameraController.getCameraStatus); router.get('/camera/status', CameraController.getCameraStatus);
@@ -34,7 +27,10 @@ router.get('/camera/status', CameraController.getCameraStatus);
* @swagger * @swagger
* /procedure/start: * /procedure/start:
* post: * post:
* tags:
* - Caméra
* summary: Démarre une procédure de capture * summary: Démarre une procédure de capture
* description: Démarre une nouvelle procédure de capture d'images à intervalle régulier
* requestBody: * requestBody:
* required: true * required: true
* content: * content:
@@ -44,10 +40,15 @@ router.get('/camera/status', CameraController.getCameraStatus);
* properties: * properties:
* project_id: * project_id:
* type: integer * type: integer
* description: ID du projet pour lequel les images seront capturées
* interval: * interval:
* type: integer * type: integer
* description: Intervalle entre deux captures (en secondes)
* example: 30
* nb_images: * nb_images:
* type: integer * type: integer
* description: Nombre total d'images à capturer
* example: 48
* required: * required:
* - project_id * - project_id
* - interval * - interval
@@ -55,10 +56,27 @@ router.get('/camera/status', CameraController.getCameraStatus);
* responses: * responses:
* 200: * 200:
* description: Procédure démarrée avec succès * description: Procédure démarrée avec succès
* content:
* application/json:
* schema:
* type: object
* properties:
* message:
* type: string
* example: Procédure de capture démarrée avec succès
* settings:
* type: object
* properties:
* interval:
* type: integer
* example: 30
* nb_images:
* type: integer
* example: 48
* 400: * 400:
* description: Paramètres invalides ou procédure déjà en cours * $ref: '#/components/responses/BadRequest'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.post('/procedure/start', CameraController.startProcedure); router.post('/procedure/start', CameraController.startProcedure);
@@ -66,12 +84,23 @@ router.post('/procedure/start', CameraController.startProcedure);
* @swagger * @swagger
* /procedure/stop: * /procedure/stop:
* post: * post:
* tags:
* - Caméra
* summary: Initie l'arrêt d'une procédure de capture * summary: Initie l'arrêt d'une procédure de capture
* description: Indique au système de caméra d'arrêter la procédure de capture en cours dès que possible
* responses: * responses:
* 200: * 200:
* description: Procédure d'arrêt initiée * description: Procédure d'arrêt initiée
* content:
* application/json:
* schema:
* type: object
* properties:
* message:
* type: string
* example: Procédure d'arrêt de la caméra initiée avec succès
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.post('/procedure/stop', CameraController.stopProcedure); router.post('/procedure/stop', CameraController.stopProcedure);
@@ -79,12 +108,23 @@ router.post('/procedure/stop', CameraController.stopProcedure);
* @swagger * @swagger
* /camera/stop: * /camera/stop:
* post: * post:
* tags:
* - Caméra
* summary: Confirme l'arrêt de la caméra * summary: Confirme l'arrêt de la caméra
* description: Confirme que la caméra a bien été arrêtée (appelé par la caméra)
* responses: * responses:
* 200: * 200:
* description: Caméra arrêtée avec succès * description: Caméra arrêtée avec succès
* content:
* application/json:
* schema:
* type: object
* properties:
* message:
* type: string
* example: Caméra arrêtée avec succès
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.post('/camera/stop', CameraController.confirmStopProcedure); router.post('/camera/stop', CameraController.confirmStopProcedure);
@@ -92,12 +132,23 @@ router.post('/camera/stop', CameraController.confirmStopProcedure);
* @swagger * @swagger
* /camera/maintenance: * /camera/maintenance:
* post: * post:
* tags:
* - Caméra
* summary: Active le mode maintenance * summary: Active le mode maintenance
* description: Place la caméra en mode maintenance pour empêcher les captures programmées
* responses: * responses:
* 200: * 200:
* description: Mode maintenance activé * description: Mode maintenance activé
* content:
* application/json:
* schema:
* type: object
* properties:
* message:
* type: string
* example: Caméra en mode maintenance
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.post('/camera/maintenance', CameraController.activateMaintenance); router.post('/camera/maintenance', CameraController.activateMaintenance);
@@ -105,12 +156,23 @@ router.post('/camera/maintenance', CameraController.activateMaintenance);
* @swagger * @swagger
* /camera/maintenance/deactivate: * /camera/maintenance/deactivate:
* post: * post:
* tags:
* - Caméra
* summary: Désactive le mode maintenance * summary: Désactive le mode maintenance
* description: Désactive le mode maintenance et permet à la caméra de reprendre les captures programmées
* responses: * responses:
* 200: * 200:
* description: Mode maintenance désactivé * description: Mode maintenance désactivé
* content:
* application/json:
* schema:
* type: object
* properties:
* message:
* type: string
* example: Caméra sortie du mode maintenance
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.post('/camera/maintenance/deactivate', CameraController.deactivateMaintenance); router.post('/camera/maintenance/deactivate', CameraController.deactivateMaintenance);

View File

@@ -11,14 +11,23 @@ const upload = multer({ storage: multer.memoryStorage() });
* @swagger * @swagger
* /smile: * /smile:
* get: * get:
* tags:
* - Images
* - Système
* summary: Récupère une image de test (smile) * summary: Récupère une image de test (smile)
* description: Endpoint de test qui retourne une image statique
* responses: * responses:
* 200: * 200:
* description: Image de test * description: Image de test
* content:
* image/png:
* schema:
* type: string
* format: binary
* 404: * 404:
* description: Image non trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/smile', ImageController.getSmileImage); router.get('/smile', ImageController.getSmileImage);
@@ -26,7 +35,10 @@ router.get('/smile', ImageController.getSmileImage);
* @swagger * @swagger
* /images/{projectId}/{orderId}: * /images/{projectId}/{orderId}:
* get: * get:
* tags:
* - Images
* summary: Récupère une image par projet ID et ordre ID * summary: Récupère une image par projet ID et ordre ID
* description: Télécharge l'image associée à un projet et un numéro d'ordre spécifique
* parameters: * parameters:
* - in: path * - in: path
* name: projectId * name: projectId
@@ -39,16 +51,21 @@ router.get('/smile', ImageController.getSmileImage);
* required: true * required: true
* schema: * schema:
* type: integer * type: integer
* description: ID d'ordre * description: ID d'ordre séquentiel de l'image
* responses: * responses:
* 200: * 200:
* description: Image * description: Image (fichier)
* content:
* image/jpeg:
* schema:
* type: string
* format: binary
* 400: * 400:
* description: IDs invalides * $ref: '#/components/responses/BadRequest'
* 404: * 404:
* description: Image non trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/images/:projectId/:orderId', ImageController.getImageByProjectAndOrderId); router.get('/images/:projectId/:orderId', ImageController.getImageByProjectAndOrderId);
@@ -56,7 +73,10 @@ router.get('/images/:projectId/:orderId', ImageController.getImageByProjectAndOr
* @swagger * @swagger
* /images/{measurementId}: * /images/{measurementId}:
* get: * get:
* tags:
* - Images
* summary: Récupère une image par ID de mesure * summary: Récupère une image par ID de mesure
* description: Télécharge l'image associée à une mesure spécifique
* parameters: * parameters:
* - in: path * - in: path
* name: measurementId * name: measurementId
@@ -66,13 +86,18 @@ router.get('/images/:projectId/:orderId', ImageController.getImageByProjectAndOr
* description: ID de la mesure * description: ID de la mesure
* responses: * responses:
* 200: * 200:
* description: Image * description: Image (fichier)
* content:
* image/jpeg:
* schema:
* type: string
* format: binary
* 400: * 400:
* description: ID invalide * $ref: '#/components/responses/BadRequest'
* 404: * 404:
* description: Image non trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/images/:measurementId', ImageController.getImageByMeasurementId); router.get('/images/:measurementId', ImageController.getImageByMeasurementId);
@@ -80,7 +105,10 @@ router.get('/images/:measurementId', ImageController.getImageByMeasurementId);
* @swagger * @swagger
* /preview/{projectId}/{orderId}: * /preview/{projectId}/{orderId}:
* get: * get:
* tags:
* - Images
* summary: Récupère un aperçu d'une image * summary: Récupère un aperçu d'une image
* description: Retourne une version redimensionnée (miniature) d'une image
* parameters: * parameters:
* - in: path * - in: path
* name: projectId * name: projectId
@@ -93,16 +121,21 @@ router.get('/images/:measurementId', ImageController.getImageByMeasurementId);
* required: true * required: true
* schema: * schema:
* type: integer * type: integer
* description: ID d'ordre * description: ID d'ordre séquentiel de l'image
* responses: * responses:
* 200: * 200:
* description: Aperçu d'image redimensionné * description: Aperçu d'image redimensionné
* content:
* image/jpeg:
* schema:
* type: string
* format: binary
* 400: * 400:
* description: IDs invalides * $ref: '#/components/responses/BadRequest'
* 404: * 404:
* description: Image non trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/preview/:projectId/:orderId', ImageController.getImagePreview); router.get('/preview/:projectId/:orderId', ImageController.getImagePreview);
@@ -110,7 +143,11 @@ router.get('/preview/:projectId/:orderId', ImageController.getImagePreview);
* @swagger * @swagger
* /camera/upload: * /camera/upload:
* post: * post:
* tags:
* - Images
* - Caméra
* summary: Télécharge une image avec données de mesure * summary: Télécharge une image avec données de mesure
* description: Enregistre une nouvelle image capturée avec les données de mesure associées
* requestBody: * requestBody:
* required: true * required: true
* content: * content:
@@ -121,22 +158,49 @@ router.get('/preview/:projectId/:orderId', ImageController.getImagePreview);
* image: * image:
* type: string * type: string
* format: binary * format: binary
* description: Fichier image à télécharger
* projectId: * projectId:
* type: integer * type: integer
* description: ID du projet associé
* timestamp: * timestamp:
* type: string * type: string
* format: date-time * format: date-time
* description: Horodatage de la capture
* temperature: * temperature:
* type: number * type: number
* description: Température mesurée
* example: 22.5
* humidity: * humidity:
* type: number * type: number
* description: Humidité mesurée
* example: 45.2
* required:
* - image
* - projectId
* - timestamp
* - temperature
* - humidity
* responses: * responses:
* 200: * 200:
* description: Image téléchargée avec succès * description: Image téléchargée avec succès
* content:
* application/json:
* schema:
* type: object
* properties:
* message:
* type: string
* example: Mesure téléchargée avec succès
* path:
* type: string
* example: /storage/1/images/42.jpg
* id:
* type: integer
* example: 123
* 400: * 400:
* description: Paramètres invalides * $ref: '#/components/responses/BadRequest'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.post('/camera/upload', upload.single('image'), ImageController.uploadImage); router.post('/camera/upload', upload.single('image'), ImageController.uploadImage);

View File

@@ -7,14 +7,23 @@ const MeasurementController = require('../controllers/measurementController');
* @swagger * @swagger
* /measurements: * /measurements:
* get: * get:
* tags:
* - Mesures
* summary: Récupère toutes les mesures * summary: Récupère toutes les mesures
* description: Retourne la liste complète des mesures de tous les projets
* responses: * responses:
* 200: * 200:
* description: Liste de toutes les mesures * description: Liste de toutes les mesures
* content:
* application/json:
* schema:
* type: array
* items:
* $ref: '#/components/schemas/Measurement'
* 404: * 404:
* description: Aucune mesure trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/measurements', MeasurementController.getAllMeasurements); router.get('/measurements', MeasurementController.getAllMeasurements);
@@ -22,7 +31,10 @@ router.get('/measurements', MeasurementController.getAllMeasurements);
* @swagger * @swagger
* /measurements/{id}: * /measurements/{id}:
* get: * get:
* tags:
* - Mesures
* summary: Récupère une mesure par ID * summary: Récupère une mesure par ID
* description: Retourne les détails d'une mesure spécifique
* parameters: * parameters:
* - in: path * - in: path
* name: id * name: id
@@ -33,12 +45,16 @@ router.get('/measurements', MeasurementController.getAllMeasurements);
* responses: * responses:
* 200: * 200:
* description: Détails de la mesure * description: Détails de la mesure
* content:
* application/json:
* schema:
* $ref: '#/components/schemas/Measurement'
* 400: * 400:
* description: ID de mesure invalide * $ref: '#/components/responses/BadRequest'
* 404: * 404:
* description: Mesure non trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/measurements/:id', MeasurementController.getMeasurementById); router.get('/measurements/:id', MeasurementController.getMeasurementById);
@@ -46,7 +62,10 @@ router.get('/measurements/:id', MeasurementController.getMeasurementById);
* @swagger * @swagger
* /measurements/{projectId}/{orderId}: * /measurements/{projectId}/{orderId}:
* get: * get:
* tags:
* - Mesures
* summary: Récupère une mesure par projet ID et ordre ID * summary: Récupère une mesure par projet ID et ordre ID
* description: Retourne les détails d'une mesure en fonction du projet et de son numéro d'ordre
* parameters: * parameters:
* - in: path * - in: path
* name: projectId * name: projectId
@@ -59,16 +78,20 @@ router.get('/measurements/:id', MeasurementController.getMeasurementById);
* required: true * required: true
* schema: * schema:
* type: integer * type: integer
* description: ID d'ordre * description: ID d'ordre séquentiel de la mesure dans le projet
* responses: * responses:
* 200: * 200:
* description: Détails de la mesure * description: Détails de la mesure
* content:
* application/json:
* schema:
* $ref: '#/components/schemas/Measurement'
* 400: * 400:
* description: IDs invalides * $ref: '#/components/responses/BadRequest'
* 404: * 404:
* description: Mesure non trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/measurements/:projectId/:orderId', MeasurementController.getMeasurementByProjectAndOrderId); router.get('/measurements/:projectId/:orderId', MeasurementController.getMeasurementByProjectAndOrderId);
@@ -76,23 +99,37 @@ router.get('/measurements/:projectId/:orderId', MeasurementController.getMeasure
* @swagger * @swagger
* /measurements/{id}: * /measurements/{id}:
* delete: * delete:
* tags:
* - Mesures
* summary: Supprime une mesure * summary: Supprime une mesure
* description: Supprime une mesure et l'image associée
* parameters: * parameters:
* - in: path * - in: path
* name: id * name: id
* required: true * required: true
* schema: * schema:
* type: integer * type: integer
* description: ID de la mesure * description: ID de la mesure à supprimer
* responses: * responses:
* 200: * 200:
* description: Mesure supprimée avec succès * description: Mesure supprimée avec succès
* content:
* application/json:
* schema:
* type: object
* properties:
* message:
* type: string
* example: Mesure supprimée avec succès
* id:
* type: integer
* example: 123
* 400: * 400:
* description: ID de mesure invalide * $ref: '#/components/responses/BadRequest'
* 404: * 404:
* description: Mesure non trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.delete('/measurements/:id', MeasurementController.deleteMeasurement); router.delete('/measurements/:id', MeasurementController.deleteMeasurement);

View File

@@ -7,12 +7,21 @@ const ProjectController = require('../controllers/projectController');
* @swagger * @swagger
* /projects: * /projects:
* get: * get:
* tags:
* - Projets
* summary: Récupère tous les projets * summary: Récupère tous les projets
* description: Retourne la liste complète des projets de timelapse
* responses: * responses:
* 200: * 200:
* description: Liste de tous les projets * description: Liste de tous les projets
* content:
* application/json:
* schema:
* type: array
* items:
* $ref: '#/components/schemas/Project'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/projects', ProjectController.getAllProjects); router.get('/projects', ProjectController.getAllProjects);
@@ -20,7 +29,10 @@ router.get('/projects', ProjectController.getAllProjects);
* @swagger * @swagger
* /projects/{id}: * /projects/{id}:
* get: * get:
* tags:
* - Projets
* summary: Récupère un projet par ID * summary: Récupère un projet par ID
* description: Retourne les détails d'un projet spécifique
* parameters: * parameters:
* - in: path * - in: path
* name: id * name: id
@@ -31,12 +43,16 @@ router.get('/projects', ProjectController.getAllProjects);
* responses: * responses:
* 200: * 200:
* description: Détails du projet * description: Détails du projet
* content:
* application/json:
* schema:
* $ref: '#/components/schemas/Project'
* 400: * 400:
* description: ID de projet invalide * $ref: '#/components/responses/BadRequest'
* 404: * 404:
* description: Projet non trouvé * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/projects/:id', ProjectController.getProjectById); router.get('/projects/:id', ProjectController.getProjectById);
@@ -44,7 +60,11 @@ router.get('/projects/:id', ProjectController.getProjectById);
* @swagger * @swagger
* /projects/{id}/videos: * /projects/{id}/videos:
* get: * get:
* tags:
* - Projets
* - Vidéos
* summary: Récupère les vidéos d'un projet * summary: Récupère les vidéos d'un projet
* description: Retourne toutes les vidéos associées à un projet spécifique
* parameters: * parameters:
* - in: path * - in: path
* name: id * name: id
@@ -55,12 +75,18 @@ router.get('/projects/:id', ProjectController.getProjectById);
* responses: * responses:
* 200: * 200:
* description: Liste des vidéos du projet * description: Liste des vidéos du projet
* content:
* application/json:
* schema:
* type: array
* items:
* $ref: '#/components/schemas/Video'
* 400: * 400:
* description: ID de projet invalide * $ref: '#/components/responses/BadRequest'
* 404: * 404:
* description: Aucune vidéo trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/projects/:id/videos', ProjectController.getProjectVideos); router.get('/projects/:id/videos', ProjectController.getProjectVideos);
@@ -68,7 +94,11 @@ router.get('/projects/:id/videos', ProjectController.getProjectVideos);
* @swagger * @swagger
* /projects/{id}/measurements: * /projects/{id}/measurements:
* get: * get:
* tags:
* - Projets
* - Mesures
* summary: Récupère les mesures d'un projet * summary: Récupère les mesures d'un projet
* description: Retourne toutes les mesures associées à un projet spécifique
* parameters: * parameters:
* - in: path * - in: path
* name: id * name: id
@@ -79,12 +109,18 @@ router.get('/projects/:id/videos', ProjectController.getProjectVideos);
* responses: * responses:
* 200: * 200:
* description: Liste des mesures du projet * description: Liste des mesures du projet
* content:
* application/json:
* schema:
* type: array
* items:
* $ref: '#/components/schemas/Measurement'
* 400: * 400:
* description: ID de projet invalide * $ref: '#/components/responses/BadRequest'
* 404: * 404:
* description: Aucune mesure trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/projects/:id/measurements', ProjectController.getProjectMeasurements); router.get('/projects/:id/measurements', ProjectController.getProjectMeasurements);
@@ -92,7 +128,10 @@ router.get('/projects/:id/measurements', ProjectController.getProjectMeasurement
* @swagger * @swagger
* /projects: * /projects:
* post: * post:
* tags:
* - Projets
* summary: Crée un nouveau projet * summary: Crée un nouveau projet
* description: Crée un nouveau projet de timelapse et son répertoire de stockage
* requestBody: * requestBody:
* required: true * required: true
* content: * content:
@@ -102,18 +141,31 @@ router.get('/projects/:id/measurements', ProjectController.getProjectMeasurement
* properties: * properties:
* name: * name:
* type: string * type: string
* description: Nom du projet
* description: * description:
* type: string * type: string
* description: Description détaillée du projet
* required: * required:
* - name * - name
* - description * - description
* responses: * responses:
* 201: * 201:
* description: Projet créé avec succès * description: Projet créé avec succès
* content:
* application/json:
* schema:
* type: object
* properties:
* message:
* type: string
* example: Projet ajouté avec succès
* id:
* type: integer
* example: 42
* 400: * 400:
* description: Paramètres invalides * $ref: '#/components/responses/BadRequest'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.post('/projects', ProjectController.createProject); router.post('/projects', ProjectController.createProject);
@@ -121,21 +173,35 @@ router.post('/projects', ProjectController.createProject);
* @swagger * @swagger
* /projects/{id}: * /projects/{id}:
* delete: * delete:
* tags:
* - Projets
* summary: Supprime un projet * summary: Supprime un projet
* description: Supprime un projet, toutes ses mesures, images et vidéos associées
* parameters: * parameters:
* - in: path * - in: path
* name: id * name: id
* required: true * required: true
* schema: * schema:
* type: integer * type: integer
* description: ID du projet * description: ID du projet à supprimer
* responses: * responses:
* 200: * 200:
* description: Projet supprimé avec succès * description: Projet supprimé avec succès
* content:
* application/json:
* schema:
* type: object
* properties:
* message:
* type: string
* example: Projet supprimé avec succès
* id:
* type: integer
* example: 42
* 400: * 400:
* description: ID de projet invalide * $ref: '#/components/responses/BadRequest'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.delete('/projects/:id', ProjectController.deleteProject); router.delete('/projects/:id', ProjectController.deleteProject);

View File

@@ -7,12 +7,21 @@ const VideoController = require('../controllers/videoController');
* @swagger * @swagger
* /videos: * /videos:
* get: * get:
* tags:
* - Vidéos
* summary: Récupère toutes les vidéos * summary: Récupère toutes les vidéos
* description: Retourne la liste complète des vidéos de tous les projets
* responses: * responses:
* 200: * 200:
* description: Liste de toutes les vidéos * description: Liste de toutes les vidéos
* content:
* application/json:
* schema:
* type: array
* items:
* $ref: '#/components/schemas/Video'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/videos', VideoController.getAllVideos); router.get('/videos', VideoController.getAllVideos);
@@ -20,7 +29,10 @@ router.get('/videos', VideoController.getAllVideos);
* @swagger * @swagger
* /videos/{id}: * /videos/{id}:
* get: * get:
* tags:
* - Vidéos
* summary: Récupère une vidéo par ID * summary: Récupère une vidéo par ID
* description: Retourne les détails d'une vidéo spécifique
* parameters: * parameters:
* - in: path * - in: path
* name: id * name: id
@@ -31,12 +43,16 @@ router.get('/videos', VideoController.getAllVideos);
* responses: * responses:
* 200: * 200:
* description: Détails de la vidéo * description: Détails de la vidéo
* content:
* application/json:
* schema:
* $ref: '#/components/schemas/Video'
* 400: * 400:
* description: ID de vidéo invalide * $ref: '#/components/responses/BadRequest'
* 404: * 404:
* description: Vidéo non trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/videos/:id', VideoController.getVideoById); router.get('/videos/:id', VideoController.getVideoById);
@@ -44,7 +60,10 @@ router.get('/videos/:id', VideoController.getVideoById);
* @swagger * @swagger
* /videos: * /videos:
* post: * post:
* tags:
* - Vidéos
* summary: Crée une nouvelle vidéo * summary: Crée une nouvelle vidéo
* description: Crée une nouvelle vidéo à partir d'une liste de mesures et démarre le processus de rendu
* requestBody: * requestBody:
* required: true * required: true
* content: * content:
@@ -54,17 +73,21 @@ router.get('/videos/:id', VideoController.getVideoById);
* properties: * properties:
* project_id: * project_id:
* type: integer * type: integer
* description: ID du projet
* measurement_ids: * measurement_ids:
* type: string * type: string
* description: JSON array of measurement IDs * description: Tableau JSON d'IDs de mesures
* example: "[1,2,3,4,5]"
* name: * name:
* type: string * type: string
* description: Nom de la vidéo
* resolution: * resolution:
* type: string * type: string
* description: Résolution de la vidéo (format LARGEURxHAUTEUR)
* example: "1920x1080" * example: "1920x1080"
* duration: * duration:
* type: integer * type: integer
* description: Duration in seconds * description: Durée souhaitée en secondes
* required: * required:
* - project_id * - project_id
* - measurement_ids * - measurement_ids
@@ -73,11 +96,22 @@ router.get('/videos/:id', VideoController.getVideoById);
* - duration * - duration
* responses: * responses:
* 200: * 200:
* description: Vidéo créée avec succès * description: Vidéo créée avec succès et rendu démarré
* content:
* application/json:
* schema:
* type: object
* properties:
* message:
* type: string
* example: Vidéo créée avec succès et le rendu a démarré
* id:
* type: integer
* example: 42
* 400: * 400:
* description: Paramètres invalides * $ref: '#/components/responses/BadRequest'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.post('/videos', VideoController.createVideo); router.post('/videos', VideoController.createVideo);
@@ -85,23 +119,34 @@ router.post('/videos', VideoController.createVideo);
* @swagger * @swagger
* /videos/{id}: * /videos/{id}:
* delete: * delete:
* tags:
* - Vidéos
* summary: Supprime une vidéo * summary: Supprime une vidéo
* description: Supprime une vidéo et le fichier vidéo associé
* parameters: * parameters:
* - in: path * - in: path
* name: id * name: id
* required: true * required: true
* schema: * schema:
* type: integer * type: integer
* description: ID de la vidéo * description: ID de la vidéo à supprimer
* responses: * responses:
* 200: * 200:
* description: Vidéo supprimée avec succès * description: Vidéo supprimée avec succès
* content:
* application/json:
* schema:
* type: object
* properties:
* message:
* type: string
* example: Vidéo supprimée avec succès
* 400: * 400:
* description: ID de vidéo invalide * $ref: '#/components/responses/BadRequest'
* 404: * 404:
* description: Vidéo non trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.delete('/videos/:id', VideoController.deleteVideo); router.delete('/videos/:id', VideoController.deleteVideo);
@@ -109,7 +154,10 @@ router.delete('/videos/:id', VideoController.deleteVideo);
* @swagger * @swagger
* /videos/file/{video_id}: * /videos/file/{video_id}:
* get: * get:
* tags:
* - Vidéos
* summary: Récupère le fichier vidéo * summary: Récupère le fichier vidéo
* description: Télécharge ou diffuse le fichier vidéo avec support du streaming HTTP
* parameters: * parameters:
* - in: path * - in: path
* name: video_id * name: video_id
@@ -120,14 +168,19 @@ router.delete('/videos/:id', VideoController.deleteVideo);
* responses: * responses:
* 200: * 200:
* description: Fichier vidéo (stream) * description: Fichier vidéo (stream)
* content:
* video/mp4:
* schema:
* type: string
* format: binary
* 206: * 206:
* description: Fichier vidéo partiel (range request) * description: Fichier vidéo partiel (range request)
* 400: * 400:
* description: Vidéo pas encore produite * $ref: '#/components/responses/BadRequest'
* 404: * 404:
* description: Vidéo non trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/videos/file/:video_id', VideoController.getVideoFile); router.get('/videos/file/:video_id', VideoController.getVideoFile);
@@ -135,7 +188,10 @@ router.get('/videos/file/:video_id', VideoController.getVideoFile);
* @swagger * @swagger
* /videos/progress/{video_id}: * /videos/progress/{video_id}:
* get: * get:
* tags:
* - Vidéos
* summary: Récupère la progression du rendu d'une vidéo * summary: Récupère la progression du rendu d'une vidéo
* description: Donne des informations sur l'état actuel du rendu d'une vidéo
* parameters: * parameters:
* - in: path * - in: path
* name: video_id * name: video_id
@@ -153,16 +209,24 @@ router.get('/videos/file/:video_id', VideoController.getVideoFile);
* properties: * properties:
* progress: * progress:
* type: number * type: number
* description: Pourcentage de progression (0-100)
* example: 45.2
* elapsed: * elapsed:
* type: number * type: number
* description: Temps écoulé depuis le début du rendu (secondes)
* example: 120
* eta: * eta:
* type: number * type: number
* description: Temps estimé restant (secondes)
* example: 150
* status: * status:
* type: string * type: string
* description: État actuel du rendu
* example: En cours
* 404: * 404:
* description: Vidéo non trouvée * $ref: '#/components/responses/NotFound'
* 500: * 500:
* description: Erreur serveur * $ref: '#/components/responses/ServerError'
*/ */
router.get('/videos/progress/:video_id', VideoController.getVideoProgress); router.get('/videos/progress/:video_id', VideoController.getVideoProgress);