Exercice 04 - Pokemon API
Dans cet exercice vous devez créer un api de gestion de Pokemons avec Express.js qui couvre toutes les opérations CRUD sur une table MySQL, puis vous devez documenter cette API. Vous trouverez la description des routes à créer plus bas.
Configuration du projet
- Crééz un projet Node.js avec
npm init, et installez les modules express, mysql2, dotenv et nodemon (n'oubliez pas de changer le type pour module). - Les valeurs des paramètres de connexion à la base de données ainsi que le numéro de port doivent être enregistrées dans un fichier .env.
- Vous devez utiliser une structure modèles, routes et contrôleur comme décrite dans la section Structure de projet avec Express.
Note
Faites un nouveau repo git, associez-le à votre exercice et faites des commits de versions fonctionnelles de celui-ci.
Importation de la base de données
- Exécutez le script SQL disponible ici : exercice04_data.sql
Le script va créer la base de données sw_exercices ainsi que la table pokemon.
Routes à créer
Afficher un pokemon selon son id
// Succès avec la route /api/pokemons/1
// Code de statut 200
{
"nom":"Bulbasaur",
"type_primaire":"Grass",
"type_secondaire":"Poison",
"pv":45,
"attaque":49,
"defense":49
}
// Erreur : Le pokemon n'est pas trouvé
// Code de statut 404
{
"erreur":"Pokemon introuvable avec l'id 1245"
}
// Erreur : Il y a eu une erreur lors de la requête SQL
// Code de statut 500
// Inscrivez à la console le code de statut SQL et le message d'erreur généré
{
"erreur":"Echec lors de la récupération du pokemon avec l'id 1245"
}
Afficher une liste paginée de tous les pokemons
Créez une route qui va afficher la liste de tous les pokemons. Cette route sera paginée et n'affichera que 25 pokemons par page. Chaque pokemon a aussi un type primaire. On va pouvoir ajouter un filtre en paramêtre pour n'afficher que les pokemons qui sont du type choisi.
- Le paramètre page est optionnel. S'il n'est pas fourni, on doit retourner la page 1.
- Le paramètre type est aussi optionnel. S'il n'est pas fourni, affichez tous les pokemons. Si le type ne correspond à aucun type primaire dans la table pokemon, on doit retourner un tableau vide avec les valeurs nombrePokemonTotal à 0 et page et totalPage à 1.
// Succès avec la route /api/pokemons/liste?page=2&type=grass
// Code de statut 200
{
"pokemons" : [
{
"nom":"Bulbasaur",
"type_primaire":"Grass",
"type_secondaire":"Poison",
"pv":45,
"attaque":49,
"defense":49
},
{
...
}
],
// La valeur passé du paramêtre, si aucune laissez vide ("type" : "")
"type" : "Grass",
// Le nombre total de pokemons selon le filtre appliqué (ici il y a 94 pokemons de type "Grass").
"nombrePokemonTotal" : 94,
// La valeur du paramètre, sinon inscrire 1.
"page" : 2,
// Le nombre de pages au total, le nombre de pokemons totaux divisés par le
// nombre de pokemons par page (25) arrondis à l'entier supérieur.
"totalPage" : 4
}
// Erreur : Il y a eu une erreur lors de la requête SQL
// Code de statut 500
// Inscrivez à la console le code de statut SQL et le message d'erreur généré
{
"erreur":"Echec lors de la récupération de la liste des pokemons"
}
Ajouter un pokemon
POST /api/pokemons
// Structure des données du corps de la requête, en json. À remplacer par des données valides
{
"nom":"",
"type_primaire":"",
"type_secondaire":"",
"pv":0,
"attaque":0,
"defense":0
}
// Succès
// Code de statut 201
{
"message" : "Le pokemon [nom] a été ajouté avec succès",
// Nouvelle valeur du pokemon
"pokemon" : {
"id": 999, // Le id du nouveau pokemon dans la base de données
"nom":"",
"type_primaire":"",
"type_secondaire":"",
"pv":0,
"attaque":0,
"defense":0
}
}
// Erreur : Le format du JSON dans le corps de la requête est invalide
// Exemple ici il manquait les champs pv et attaque.
// Code de statut 400
{
"erreur":"Le format des données est invalide",
"champ_manquant": [
"pv",
"attaque"
]
}
// Erreur : Il y a eu une erreur lors de la requête SQL
// Code de statut 500
// Inscrivez à la console le code de statut SQL et le message d'erreur généré
{
"erreur":"Echec lors de la création du pokemon [nom_du_pokemon]"
}
Modifier un pokemon
PUT /api/pokemons/:id
// Structure des données du corps de la requête, en json. À remplacer par des données valides
{
"nom":"",
"type_primaire":"",
"type_secondaire":"",
"pv":0,
"attaque":0,
"defense":0
}
// Succès
// Code de statut 200
{
"message" : "Le pokemon id [id] a été modifié avec succès",
// Nouvelle valeur du pokemon
"pokemon" : {
"id": 999,
"nom":"",
"type_primaire":"",
"type_secondaire":"",
"pv":0,
"attaque":0,
"defense":0
}
}
// Erreur : Le id n'existe pas dans la base de données
// Code de statut 404
{
"erreur":"Le pokemon id [id] n'existe pas dans la base de données",
}
// Erreur : Le format du JSON dans le corps de la requête est invalide
// Code de statut 400
// Exemple ici il manquait les champs pv et attaque.
{
"erreur":"Le format des données est invalide",
"champ_manquant": [
"pv",
"attaque"
]
}
// Erreur : Il y a eu une erreur lors de la requête SQL
// Code de statut 500
// Inscrivez à la console le code de statut SQL et le message d'erreur généré
{
"erreur":"Echec lors de la modification du pokemon [nom_du_pokemon]"
}
Supprimer un pokemon
// Succès
// Code de statut 200
{
"message" : "Le pokemon id [id] a été supprimé avec succès",
// Valeur du pokemon supprimé
"pokemon" : {
"id": 999,
"nom":"",
"type_primaire":"",
"type_secondaire":"",
"pv":0,
"attaque":0,
"defense":0
}
}
// Erreur : Le id n'existe pas dans la base de données
// Code de statut 404
{
"erreur":"Le pokemon id [id] n'existe pas dans la base de données",
}
// Erreur : Il y a eu une erreur lors de la requête SQL
// Code de statut 500
// Inscrivez à la console le code de statut SQL et le message d'erreur généré
{
"erreur":"Echec lors de la suppression du pokemon [nom_du_pokemon]"
}
Documentation
Vous devez créer la documentation adéquate pour l'api que vous avez développé.
La méthode pour documenter l'api doit être celle décrite dans les notes de cours à la section Documentation d'un API avec OpenAPI
Détail de la documentation
- Ajoutez la route
/api/docsqui affichera la page de la documentation - Configurez les valeurs de la section serveurs pour vous permettre de tester l'api depuis la documentation
- Les 5 routes doivent être documentées
- Les paramètres doivent bien être détaillés.
- Toutes les réponses doivent être décrites avec un exemple de valeur.
- Utiliser un schema de validation pour le modèle pokemon et utilisez-le lorsque c'est possible dans votre documentation