From 3831ba0b7bfd1a46f7218c78206011bbbd0184cf Mon Sep 17 00:00:00 2001 From: Kerboul Date: Wed, 8 Jan 2025 16:09:08 +0100 Subject: [PATCH] Refonte de l'API pour respecter les nouvelles normes --- routes/api.js | 591 +++++++++++++++++++++++--------------------------- 1 file changed, 276 insertions(+), 315 deletions(-) diff --git a/routes/api.js b/routes/api.js index 6289a34..2ab2eae 100644 --- a/routes/api.js +++ b/routes/api.js @@ -6,315 +6,6 @@ const db = require('../db'); // Assurez-vous d'importer le fichier db.js const path = require('path'); const fs = require('fs'); -/** - * @swagger - * /itemsdb: - * get: - * description: Use to request all items from the database - * responses: - * 200: - * description: A successful response - * 500: - * description: Internal server error - */ -router.get('/itemsdb', (req, res) => { - const query = 'SELECT * FROM public.projets'; - res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5500'); - res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); - res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); - db.query(query, (err, results) => { - if (err) { - console.error('Erreur lors de la récupération des projets:', err); - return res.status(500).json({ error: 'Erreur serveur' }); - } - res.json(results.rows); - }); -}); - -/** - * @swagger - * /images/{id}: - * get: - * description: Use to request images by project ID - * parameters: - * - in: path - * name: id - * required: true - * description: Numeric ID of the project to retrieve images for. - * schema: - * type: integer - * responses: - * 200: - * description: A successful response - * 500: - * description: Internal server error - */ -router.get('/images/:id', (req, res) => { - const projectId = req.params.id; - const query = 'SELECT * FROM public.images WHERE id_projet = $1'; - res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5500'); - res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); - res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); - db.query(query, [projectId], (err, results) => { - if (err) { - console.error('Erreur lors de la récupération des images:', err); - return res.status(500).json({ error: 'Erreur serveur' }); - } - res.json(results.rows); - }); -}); - -/** - * @swagger - * /videos/{id}: - * get: - * description: Use to request videos by project ID - * parameters: - * - in: path - * name: id - * required: true - * description: Numeric ID of the project to retrieve videos for. - * schema: - * type: integer - * responses: - * 200: - * description: A successful response - * 500: - * description: Internal server error - */ -router.get('/videos/:id', (req, res) => { - const projectId = req.params.id; - const query = 'SELECT * FROM public.videos WHERE id_projet = $1'; - res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5500'); - res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); - res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); - db.query(query, [projectId], (err, results) => { - if (err) { - console.error('Erreur lors de la récupération des vidéos:', err); - return res.status(500).json({ error: 'Erreur serveur' }); - } - res.json(results.rows); - }); -}); - - -/** - * @swagger - * /metric/{id}: - * get: - * description: Use to request metrics by project ID - * parameters: - * - in: path - * name: id - * required: true - * description: Numeric ID of the project to retrieve metrics for. - * schema: - * type: integer - * responses: - * 200: - * description: A successful response - * 500: - * description: Internal server error - */ -router.get('/metric/:id', (req, res) => { - const projectId = req.params.id; - const query = 'SELECT * FROM public.metrique WHERE id_projet = $1'; - res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5500'); - res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); - res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); - db.query(query, [projectId], (err, results) => { - if (err) { - console.error('Erreur lors de la récupération des métriques:', err); - return res.status(500).json({ error: 'Erreur serveur' }); - } - res.json(results.rows); - }); -}); - -/** - * @swagger - * /items: - * get: - * description: Use to request all items - * responses: - * 200: - * description: A successful response - */ -router.get('/items', (req, res) => { - res.json([{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }]); -}); - -/** - * @swagger - * /items_recever: - * post: - * description: Use to receive items - * responses: - * 200: - * description: A successful response - */ -router.post('/items_recever', (req, res) => { - console.log(req.body); -}); - -/** - * @swagger - * /items/{id}: - * get: - * description: Use to request a specific item by id - * parameters: - * - in: path - * name: id - * required: true - * description: Numeric ID of the item to retrieve. - * schema: - * type: integer - * responses: - * 200: - * description: A successful response - */ -router.get('/items/:id', (req, res) => { - const itemId = req.params.id; - res.json({ id: itemId, name: `Item ${itemId}` }); -}); - -/** - * @swagger - * /items: - * post: - * description: Use to create a new item - * responses: - * 200: - * description: A successful response - */ -router.post('/items', (req, res) => { - const newItem = req.body; - res.json({ message: 'Nouvel élément créé', data: newItem }); -}); - -/** - * @swagger - * /items/{id}: - * put: - * description: Use to update a specific item by id - * parameters: - * - in: path - * name: id - * required: true - * description: Numeric ID of the item to update. - * schema: - * type: integer - * responses: - * 200: - * description: A successful response - */ -router.put('/items/:id', (req, res) => { - const itemId = req.params.id; - const updatedItem = req.body; - res.json({ message: `Élément avec l'ID ${itemId} mis à jour`, data: updatedItem }); -}); - -/** - * @swagger - * /items/{id}: - * delete: - * description: Use to delete a specific item by id - * parameters: - * - in: path - * name: id - * required: true - * description: Numeric ID of the item to delete. - * schema: - * type: integer - * responses: - * 200: - * description: A successful response - */ -router.delete('/items/:id', (req, res) => { - const itemId = req.params.id; - res.json({ message: `Élément avec l'ID ${itemId} supprimé` }); -}); - -/** - * @swagger - * /projets: - * post: - * description: Use to add a new project with a name and id - * responses: - * 201: - * description: Project added successfully - * 500: - * description: Internal server error - */ -router.post('/projets', (req, res) => { - // Requête d'insertion - const query = 'INSERT INTO data.projets (name, id) VALUES ($1, $2) RETURNING id'; - db.query(query, [req.body.name, req.body.id], (err, results) => { - if (err) { - console.error('Erreur lors de l\'ajout du projet:', err); - return res.status(500).json({ error: 'Erreur serveur' }); - } - res.status(201).json({ message: 'Projet ajouté avec succès', id: results.rows[0].id }); - }); -}); - -/** - * @swagger - * /delete: - * post: - * description: Use to delete a project by ID - * responses: - * 200: - * description: Project deleted successfully - * 404: - * description: No project found with this ID - * 500: - * description: Internal server error - */ -router.post('/delete', (req, res) => { - console.log("On entre dans la méthode") - console.log(req.body.id) - const id = req.body.id - // Requête de suppression - const query = 'DELETE FROM data.projets WHERE id = $1 RETURNING id'; - db.query(query, [req.body.id], (err, results) => { - if (err) { - console.error('Erreur lors de la suppression du projet:', err); - return res.status(500).json({ error: 'Erreur serveur' }); - } - if (results.rowCount === 0) { - return res.status(404).json({ error: 'Aucun projet trouvé avec cet ID.' }); - } - - res.status(200).json({ message: 'Projet supprimé avec succès', id }); - }); -}); - -/** - * @swagger - * /smile: - * get: - * description: Use to request the smile image - * responses: - * 200: - * description: A successful response - * 404: - * description: Image not found - */ -router.get('/smile', (req, res) => { - res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5500'); - res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); - res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); - const imagePath = path.join('/storage/smile.jpg'); - fs.access(imagePath, fs.constants.F_OK, (err) => { - if (err) { - console.error('Image not found:', err); - return res.status(404).json({ error: 'Image not found' }); - } - res.sendFile(imagePath); - }); -}); - /** * @swagger * /projects: @@ -340,6 +31,211 @@ router.get('/projects', (req, res) => { }); }); +/** + * @swagger + * /projects/{id}: + * get: + * description: Use to request a specific project by id + * parameters: + * - in: path + * name: id + * required: true + * description: Numeric ID of the project to retrieve. + * schema: + * type: integer + * responses: + * 200: + * description: A successful response + * 500: + * description: Internal server error + */ +router.get('/projects/:id', (req, res) => { + const projectId = req.params.id; + const query = 'SELECT * FROM public.projects WHERE id = $1'; + res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5500'); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + db.query(query, [projectId], (err, results) => { + if (err) { + console.error('Erreur lors de la récupération du projet:', err); + return res.status(500).json({ error: 'Erreur serveur' }); + } + res.json(results.rows); + }); +}); + +/** + * @swagger + * /projects: + * post: + * description: Use to add a new project + * responses: + * 201: + * description: Project added successfully + * 500: + * description: Internal server error + */ +router.post('/projects', (req, res) => { + const query = 'INSERT INTO public.projects (name, description, start_date, status) VALUES ($1, $2, $3, $4) RETURNING id'; + db.query(query, [req.body.name, req.body.description, req.body.start_date, req.body.status], (err, results) => { + if (err) { + console.error('Erreur lors de l\'ajout du projet:', err); + return res.status(500).json({ error: 'Erreur serveur' }); + } + res.status(201).json({ message: 'Projet ajouté avec succès', id: results.rows[0].id }); + }); +}); + +/** + * @swagger + * /projects/{id}: + * delete: + * description: Use to delete a project by ID + * parameters: + * - in: path + * name: id + * required: true + * description: Numeric ID of the project to delete. + * schema: + * type: integer + * responses: + * 200: + * description: Project deleted successfully + * 404: + * description: No project found with this ID + * 500: + * description: Internal server error + */ +router.delete('/projects/:id', (req, res) => { + const projectId = req.params.id; + const query = 'DELETE FROM public.projects WHERE id = $1 RETURNING id'; + db.query(query, [projectId], (err, results) => { + if (err) { + console.error('Erreur lors de la suppression du projet:', err); + return res.status(500).json({ error: 'Erreur serveur' }); + } + if (results.rowCount === 0) { + return res.status(404).json({ error: 'Aucun projet trouvé avec cet ID.' }); + } + res.status(200).json({ message: 'Projet supprimé avec succès', id: projectId }); + }); +}); + +/** + * @swagger + * /measurements: + * get: + * description: Use to request all measurements + * responses: + * 200: + * description: A successful response + * 500: + * description: Internal server error + */ +router.get('/measurements', (req, res) => { + const query = 'SELECT * FROM public.measurements'; + res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5500'); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + db.query(query, (err, results) => { + if (err) { + console.error('Erreur lors de la récupération des mesures:', err); + return res.status(500).json({ error: 'Erreur serveur' }); + } + res.json(results.rows); + }); +}); + +/** + * @swagger + * /measurements/{id}: + * get: + * description: Use to request a specific measurement by id + * parameters: + * - in: path + * name: id + * required: true + * description: Numeric ID of the measurement to retrieve. + * schema: + * type: integer + * responses: + * 200: + * description: A successful response + * 500: + * description: Internal server error + */ +router.get('/measurements/:id', (req, res) => { + const measurementId = req.params.id; + const query = 'SELECT * FROM public.measurements WHERE id = $1'; + res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5500'); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + db.query(query, [measurementId], (err, results) => { + if (err) { + console.error('Erreur lors de la récupération de la mesure:', err); + return res.status(500).json({ error: 'Erreur serveur' }); + } + res.json(results.rows); + }); +}); + +/** + * @swagger + * /measurements: + * post: + * description: Use to add a new measurement + * responses: + * 201: + * description: Measurement added successfully + * 500: + * description: Internal server error + */ +router.post('/measurements', (req, res) => { + const query = 'INSERT INTO public.measurements (project_id, timestamp, image_path, temperature, humidity, completed) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id'; + db.query(query, [req.body.project_id, req.body.timestamp, req.body.image_path, req.body.temperature, req.body.humidity, req.body.completed], (err, results) => { + if (err) { + console.error('Erreur lors de l\'ajout de la mesure:', err); + return res.status(500).json({ error: 'Erreur serveur' }); + } + res.status(201).json({ message: 'Mesure ajoutée avec succès', id: results.rows[0].id }); + }); +}); + +/** + * @swagger + * /measurements/{id}: + * delete: + * description: Use to delete a measurement by ID + * parameters: + * - in: path + * name: id + * required: true + * description: Numeric ID of the measurement to delete. + * schema: + * type: integer + * responses: + * 200: + * description: Measurement deleted successfully + * 404: + * description: No measurement found with this ID + * 500: + * description: Internal server error + */ +router.delete('/measurements/:id', (req, res) => { + const measurementId = req.params.id; + const query = 'DELETE FROM public.measurements WHERE id = $1 RETURNING id'; + db.query(query, [measurementId], (err, results) => { + if (err) { + console.error('Erreur lors de la suppression de la mesure:', err); + return res.status(500).json({ error: 'Erreur serveur' }); + } + if (results.rowCount === 0) { + return res.status(404).json({ error: 'Aucune mesure trouvée avec cet ID.' }); + } + res.status(200).json({ message: 'Mesure supprimée avec succès', id: measurementId }); + }); +}); + /** * @swagger * /videos: @@ -367,27 +263,92 @@ router.get('/videos', (req, res) => { /** * @swagger - * /measurements: + * /videos/{id}: * get: - * description: Use to request all measurements + * description: Use to request a specific video by id + * parameters: + * - in: path + * name: id + * required: true + * description: Numeric ID of the video to retrieve. + * schema: + * type: integer * responses: * 200: * description: A successful response * 500: * description: Internal server error */ -router.get('/measurements', (req, res) => { - const query = 'SELECT * FROM public.measurements'; +router.get('/videos/:id', (req, res) => { + const videoId = req.params.id; + const query = 'SELECT * FROM public.videos WHERE id = $1'; res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5500'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); - db.query(query, (err, results) => { + db.query(query, [videoId], (err, results) => { if (err) { - console.error('Erreur lors de la récupération des mesures:', err); + console.error('Erreur lors de la récupération de la vidéo:', err); return res.status(500).json({ error: 'Erreur serveur' }); } res.json(results.rows); }); }); +/** + * @swagger + * /videos: + * post: + * description: Use to add a new video + * responses: + * 201: + * description: Video added successfully + * 500: + * description: Internal server error + */ +router.post('/videos', (req, res) => { + const query = 'INSERT INTO public.videos (project_id, measurement_ids, video_path, start_timestamp, end_timestamp, image_count, resolution, duration, fps, status) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING id'; + db.query(query, [req.body.project_id, req.body.measurement_ids, req.body.video_path, req.body.start_timestamp, req.body.end_timestamp, req.body.image_count, req.body.resolution, req.body.duration, req.body.fps, req.body.status], (err, results) => { + if (err) { + console.error('Erreur lors de l\'ajout de la vidéo:', err); + return res.status(500).json({ error: 'Erreur serveur' }); + } + res.status(201).json({ message: 'Vidéo ajoutée avec succès', id: results.rows[0].id }); + }); +}); + +/** + * @swagger + * /videos/{id}: + * delete: + * description: Use to delete a video by ID + * parameters: + * - in: path + * name: id + * required: true + * description: Numeric ID of the video to delete. + * schema: + * type: integer + * responses: + * 200: + * description: Video deleted successfully + * 404: + * description: No video found with this ID + * 500: + * description: Internal server error + */ +router.delete('/videos/:id', (req, res) => { + const videoId = req.params.id; + const query = 'DELETE FROM public.videos WHERE id = $1 RETURNING id'; + db.query(query, [videoId], (err, results) => { + if (err) { + console.error('Erreur lors de la suppression de la vidéo:', err); + return res.status(500).json({ error: 'Erreur serveur' }); + } + 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;