TD3 : Une API "express" pour la BBI !

1. Introduction : Les contrôleurs

Dans ce TD, l'objectif sera de lier les URL d'une API "express" aux fonctions de service que vous avez développées dans le TD2.

Dans une architecture RCS (Router - Controller - Service), cette partie correspond au contrôleur. Il est responsable de la gestion des requêtes entrantes, de l'extraction des paramètres nécessaires, pour enfin, appeler les services appropriés et traiter la demande. Une fois les données récupérées, le contrôleur les renvoie au client ou retourne un code d'erreur si nécessaire.

2. Mise en place

Installez la bibliothèque javascript "express" : npm install express.

Nous aurons également besoin de la bibliothèque "cors" : npm install cors

Créez un dossier controllers/ à la racine de votre projet. Dans ce dossier, créez les fichiers : planet_controller.js, plant_controller.js et scientist_controller.js qui contiendront les fonctions permettant de traiter les requètes liés aux tables planets, plants et scientists.

Exemple de fonction de contrôleur pour la récupération de la liste des planètes

let planet_service = require("../services/planet_service");

async function get_planets(req, res){
	try {
		let planets = await planet_service.get_planets();
		res.status(200).json({data: planets});
	} catch (err) {
		console.error(err);
		res.status(500).json({error: err.message, data: []});
	}
}

module.exports = {
	get_planets,
};

Remarquez que la réponse est envoyée au format JSON avec le code HTTP 200 en cas de succès. Le corps de la réponse est toujours formulé de la même manière avec un champ data contenant les données demandées. En cas d'erreur, un champ error est ajouté au corps de la réponse avec un message d'erreur approprié. Ce message d'erreur est très important pour le débogage et la compréhension des erreurs côté client. Le code d'erreur HTTP est à définir en fonction de l'erreur rencontrée:

Les paramètes de la requête sont accessibles via :

Enfin, créez un fichier express.js à la racine de votre projet. Ce fichier sera le routeur de notre API "express".

const express = require("express")
var cors = require('cors')
const app = express()
app.use(cors())

const PORT = 3210
const router = express.Router()

const plant_controller = require("./controllers/plant_controller")
const scientist_controller = require("./controllers/scientist_controller")
const planet_controller = require("./controllers/planet_controller")

var bodyParser = require("body-parser")
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
	extended: true
}))

router.get("/planets", planet_controller.get_planets)

// Exemples pour les requêtes POST, PUT, DELETE
// router.post("/exemple/requete/post", exemple_controller.fonction_post)
// router.put("/exemple/requete/put", exemple_controller.fonction_put)
// router.delete("/exemple/requete/delete", exemple_controller.fonction_delete)

app.use(router)
app.listen(PORT, function (err){
	if (err) console.log(err);
	console.log("Server is listening on port: "+PORT);
})

Vous pouvez lancer le serveur "express" avec la commande : node express.js. L'API sera accessible à l'adresse http://localhost:3210/.

Pour tester vos routes, vous pouvez utiliser des outils comme Postman ou curl. Mais verfifiez bien que toutes les possibilités d'erreurs soit couverte avec l'aide de l'interface client fournie ici : https://home.pirotech.fr/sqlAndProg/client/home.html

3. À vous de jouer !

Implémentez les fonctions des contrôleurs pour répondre aux besoins suivants :

Vous utiliserez les fonctions de service développées dans le TD2 pour interagir avec la base de données.

Q1 - Retourner la liste des planètes du laboratoire.

Q2 - Récupérer les informations d’un scientifique à partir de son identifiant.

Q3 - Récupérer les informations d’une planète à partir de son identifiant.

Q4 - Lister les plantes du laboratoire.

Q5 - Lister les plantes étudiées par un scientifique donné.

UPDATE :

Q6 - Mettre à jour le niveau du scientifique.

INSERT :

Q7 - Ajouter une nouvelle plante dans la base de données.

DELETE :

Q8 - Suppression d’une plante à partir de son identifiant.

REQUÊTES AVANCÉES :

Q9 - Modifier la requête Q4 pour trier les plantes.

Q10 - Modifier la requête Q4 pour filtrer les plantes. Ajoutez les paramètres optionnels suivants :

Q11 - Éditer les informations d’une plante à partir de son identifiant.

Q12 - Permettez à un scientifique d’étudier une nouvelle plante.

Q13 - Permettez à un scientifique d’arrêter d’étudier une plante.

Q14 - Listez tous les scientifiques qui étudient des plantes avec un niveau d’autorisation supérieur au leur.

- Préparation Q15 - Q16 : VOIR TD2

Q15 - Authentification d’un scientifique.

Q16 - Modifiez le mot de passe d’un scientifique.