Skip to main content

TP NoSQL MicroService – Pokémon (Mongoose)

Objectif du TP

L’objectif de ce TP est de concevoir un microservice REST en Express.js capable de retourner des données JSON à partir d’une base MongoDB, en utilisant l’ODM Mongoose.

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 MongoDB contenant des informations liées à l’univers Pokémon.

L’accès aux données se fait via Mongoose, à l’aide de modèles représentant les collections MongoDB.

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

Exemple de requête avec Mongoose

const pokemons = await Pokemon.find();

Exemple avec Postman

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
  • Installer et configurer MongoDB + Mongoose
  • Créer les schémas et modèles Mongoose
  • Créer l’ensemble des routes REST
  • Tester les endpoints avec Postman

Prérequis

  • Node.js installé
  • Être à l’aise en JavaScript
  • Comprendre les bases de MongoDB et du NoSQL

Niveau 2 – Complétion d’un microservice existant

  • Un microservice Express.js est déjà fourni
  • La connexion à MongoDB est déjà configurée
  • Les modèles Mongoose sont déjà définis
  • Votre travail consiste à compléter le fichier routes.js

Installation

  • Avoir Node.js installé
  • Récupérer le zip api_pkm_mongoose et le dézipper
  • Lancer npm install
  • Démarrer le projet avec node main.js

Contraintes techniques

  • Langage : JavaScript
  • Runtime : Node.js
  • Framework : Express.js
  • Base de données : MongoDB
  • ODM : Mongoose
  • Format des réponses : JSON
  • Test des endpoints : Postman

Travail demandé

En gros, il faut compléter le fichier routes.js en utilisant les modèles Mongoose fournis.

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

// Modèles Mongoose
const Pokemon = require('./models/Pokemon');
const Player = require('./models/Player');
const Ability = require('./models/Ability');

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

const pokemons = // TODO

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

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

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

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 = // TODO

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 = // TODO

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 = // TODO

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

module.exports = router;