Skip to main content

TP SQL MicroService – Pokémon

Objectif du TP

L’objectif de ce TP est de concevoir un microservice REST en Express.js capable de retourner des données au format JSON à partir d’une base de données MySQL.

Ce microservice sera destiné à être consommé par un client (Postman, front-end, autre service, etc.).

Contexte

Vous travaillez dans un environnement Node.js / Express.js, avec une base de données MySQL contenant des informations liées à l’univers Pokémon.

Le microservice devra exposer plusieurs routes HTTP permettant de consulter ces données.

Exemple de requete dans le js

const [pokemons] = await db.query(`
SELECT *
FROM Pokemon
`);

Exemple avec Postman

Un exemple de requête et de réponse est fourni ci-dessous :

Screenshot

Organisation du TP

Le TP peut être réalisé selon deux niveaux de difficulté :

Niveau 1 – Création complète du microservice

  • Initialiser un projet Node.js
  • Installer et configurer Express.js
  • Configurer la connexion à la base de données MySQL
  • Créer l’ensemble des routes REST
  • Tester les endpoints avec Postman

Prérequis

  • Avoir nodeJS d'installé
  • Etre à l'aise en JS/TS et avec les framework JS/TS

Ce niveau est recommandé pour les étudiants souhaitant s’entraîner davantage et mieux comprendre l’architecture d’un microservice.

Niveau 2 – Complétion d’un microservice existant

  • Un microservice Express.js est déjà fourni
  • La structure du projet est en place
  • La connexion à la base de données est déjà configurée
  • Votre travail consiste à compléter le fichier routes.js

Installation

  • Avoir nodeJS d'installé
  • Récupérer le zip api_pkm et dezipper
  • Utiliser la commande npm install dans le projet pour installer les dépendances
  • Lancer le projet avec la commande node main.js

Ce niveau permet de se concentrer sur la logique métier et les requêtes SQL.

Contraintes techniques

  • Langage : JavaScript
  • Runtime : Node.js
  • Framework : Express.js
  • Base de données : MySQL
  • Librairie MySQL : mysql2
  • Format des réponses : JSON
  • Test des endpoints : Postman

En gros il faut completer le fichier routes.js :

const express = require('express');
const router = express.Router();
const { httpApiResponse } = require('./http-library');
const db = require ('./mysql.js');

/**
* GET /pokemons
* Retrieve all pokemon species
*/
router.get('/pokemons', async (req, res) => {

const [pokemons] = // TODO commence par db.query

return httpApiResponse(res, 200, 'Pokemons retrieved successfully', pokemons);
});

/**
* GET /players/:playerId
* Retrieve basic player information
*/
router.get('/players/:playerId', async (req, res) => {
const { playerId } = req.params;

const [[player]] = // TODO commence par db.query

if (!player) {
return httpApiResponse(res, 404, 'Player not found', null);
}

return httpApiResponse(res, 200, 'Player retrieved successfully', player);
});

/**
* GET /players/:playerId/inventory
* Retrieve inventory and items of a player
*/
router.get('/players/:playerId/inventory', async (req, res) => {
const { playerId } = req.params;

const [inventory] = // TODO commence par db.query

return httpApiResponse(res, 200, 'Inventory retrieved successfully', inventory);
});

/**
* GET /players/:playerId/pokemons
* Retrieve all pokemons owned by a player
*/
router.get('/players/:playerId/pokemons', async (req, res) => {
const { playerId } = req.params;

const [pokemons] = // TODO commence par db.query
return httpApiResponse(res, 200, 'Player pokemons retrieved successfully', pokemons);
});

/**
* GET /players/:playerId/pokemons/:pokemonPlayerId
* Retrieve full details of a specific pokemon owned by a player
*/
router.get('/players/:playerId/pokemons/:pokemonPlayerId', async (req, res) => {
const { playerId, pokemonPlayerId } = req.params;

const [[pokemon]] = await // TODO commence par db.query

if (!pokemon) {
return httpApiResponse(res, 404, 'Pokemon not found', null);
}

return httpApiResponse(res, 200, 'Pokemon retrieved successfully', pokemon);
});

/**
* GET /pokemons/:pokemonId/abilities
* Retrieve abilities available for a pokemon species
*/
router.get('/pokemons/:pokemonId/abilities', async (req, res) => {
const { pokemonId } = req.params;

const [abilities] = await // TODO commence par db.query

return httpApiResponse(res, 200, 'Pokemon abilities retrieved successfully', abilities);
});

/**
* GET /pokemon-players/:pokemonPlayerId/abilities
* Retrieve abilities of a pokemon owned by a player
*/
router.get('/pokemon-players/:pokemonPlayerId/abilities', async (req, res) => {
const { pokemonPlayerId } = req.params;

const [abilities] = await // TODO commence par db.query

return httpApiResponse(res, 200, 'Pokemon player abilities retrieved successfully', abilities);
});


// Exporter le router
module.exports = router;