TD2 : Node.js et postgreSQL pour la BBI !

1. Introduction : Les services

Ce TD a pour but de vous familiariser avec l'utilisation de la librarie pg de Node.js pour interagir avec une base de données PostgreSQL.

L'objectif final du projet est de créer toute la partie backend d'un site permettant de gérer les informations du laboratoire de recherche botanique intergalactique. Mais pour l'instant, nous allons nous concentrer sur la création de la partie services.

Les services sont des fonctions qui permettent d'interagir directement avec la base de données. Ces fonctions seront ensuite utilisées par le controleur de notre API mais gardons cette étape pour le TD3.

2. Mise en place

Créez un nouveau répertoire pour ce projet que vous pouvez nommer td-psql-bbi.
Initialisez un nouveau projet Node.js avec la commande npm init.
Installez les bibliothèques javascript suivantes :

Créez un fichier .env à la racine de votre projet pour stocker les informations de connexion à la base de données PostgreSQL. Voici un exemple de contenu pour ce fichier :

DB_USERNAME=melvyn
DB_PORT=5432
DB_HOST=localhost
DB_DATABASE=td
DB_PASSWORD=postgres

Créez un dossier database/ à la racine de votre projet. Dans ce dossier, créez un fichier db.js permettant de se connecter à la base de données PostgreSQL en utilisant les informations de connexion stockées dans le fichier .env.

const {Pool} = require("pg");
require('dotenv').config();

const credentials = {
    user: process.env.DB_USERNAME,
    host: process.env.DB_HOST,
    database: process.env.DB_DATABASE,
    password: process.env.DB_PASSWORD,
    port: process.env.DB_PORT,
};
const pool =  new Pool(credentials)
module.exports = pool;

Vous pouvez aussi déposer dans ce répertoire vos scripts SQL de création et d'initialisation de la base de données.

Créez un dossier services/ à la racine de votre projet. Dans ce dossier, créez les fichiers : planet_service.js, plant_service.js et scientist_service.js qui contiendront les fonctions permettant d'interagir avec les tables planets, plants et scientists respectivement.

Exemple de fonction de service dans le fichier planet_service.js :

const pool = require("../database/db");

/* Q1 - Retourner la liste des planètes du laboratoire. */
async function get_planets(){
    let client = await pool.connect();
    res = (await client.query("SELECT * FROM planet;")).rows;
    client.release();
    return res;
}

module.exports = {
    get_planets
};

Pour tester vos services créez un fichier test_service.js à la racine de votre projet. Dans ce fichier, importez les services et appelez-les pour vérifier qu'ils fonctionnent correctement.

Par exemple :

let planet_service = require("./services/planet_service");
            
async function test_Q1(){
    try {
        let planets = await planet_service.get_planets();
        console.log("All planets:", planets);
    } catch (err) {
        console.error("Error during test_Q1:", err);
    }
}

// Execute the test :
test_Q1();

3. À vous de jouer !

Implémentez les fonctions de services suivantes en respectant bien les consignes données par la BBI. Faites attention : réaliser les bonnes requêtes est une chose, mais la plus grande difficulté c’est de correctement gérer TOUTES les erreurs. Pour cela, veillez à envisager tous les cas particuliers !

SELECT :

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 :

Q15 - Authentification d’un scientifique.

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