Cours Node.js Cours Node.js - Projet en groupe - API de gestion de notes personnelles

L’objectif est d’écrire et de mettre en production une API HTTP de gestion de notes personnelles. Cette API sera le back-end d’une application mobile et d’une application web. (ces deux applications ne sont pas à rendre)

Ce travail est à effectuer en groupe, et sera évalué à la fois de manière collective et individuelle.

Afin de vérifier son bon fonctionnement, ainsi que le respect du cahier des charges et des critères d’évaluation fournis ci-dessous, le code source rendu sera exécuté et vérifié par une suite de tests automatisés écrits par l’enseignant.

Critères d’évaluation

Chaque groupe devra rendre trois URLs:

Le travail du groupe et de chacune des personnes du groupe sera évalué selon les critères suivants:

Cahier des charges

Dans cette section, nous décrivons les fonctionnalités attendues dans l’API à produire.

Attention: Sachant que ces fonctionnalités seront vérifiés par des tests automatisés, merci de respecter ces spécifications à la lettre. Ceci inclut notamment: le nom des routes, la structure des objets JSON à produire, les chaines de caractères fournies… (liste non exhaustive)

Le saviez-vous: Le cahier des charges est un document habituellement produit par le client (ou co-écrit avec lui) pour exprimer ses besoins de la manière la plus précise possible. En effet, lors de la recette, le client vérifiera le produit livré remplit bien les attentes listées dans ce document.

Spécifications fonctionnelles

Lors de son utilisation par une application cliente, l’API à fournir devra permettre à chaque utilisateur de l’application de:

Les notes seront à stocker en tant que texte brut (c.a.d. non HTML) et doivent pouvoir contenir des sauts de ligne, ainsi que n’importe quel caractère Unicode. (accents, emoji…)

Spécifications techniques

Environnement d’exécution

Le serveur API doit pouvoir s’exécuter dans un environnement de type Linux, doté de Node.js version 10 et de MongoDB version 4.

Les variables d’environnement suivantes devront permettre de paramétrer le serveur:

Modèle de données

Toutes les données manipulées par l’API doivent être stockées dans une base de données MongoDB accessible via la variable d’environnement MONGODB_URI.

La base de données doit être nommée notes-api.

À minima, cette base de données doit être constituée des deux collections suivantes:

Schéma de la collection notes

Les documents stockés dans la collection notes doivent contenir les propriétés suivantes:

Schéma de la collection users

Les documents stockés dans la collection users doivent contenir les propriétés suivantes:

Authentification des utilisateurs

L’API doit être state-less. C’est à dire qu’elle ne nécessite pas l’usage de sessions.

Au lieu de cela, l’identification des utilisateurs sera assurée par l’usage de jetons JWT (JSON Web Tokens).

Afin de vérifier l’identité de l’utilisateur derrière chaque appel à l’API, celle-ci devra:

Pour des raisons de sécurité, les tokens JWT:

Interfaces

Les routes doivent être capables d’extraire les paramètres passés dans le corps de chaque requête au format application/json.

La réponse envoyée par chacune de ces routes doit aussi être au format JSON. Elle doit systématiquement contenir la propriété suivante:

Les autres propriétés de la réponse JSON sont spécifiées dans chaque route à implémenter, tel que décrites ci-dessous.

Route POST /signup

Cette route permet de créer un compte utilisateur, à partir d’un identifiant et mot de passe choisis par l’utilisateur.

Une fois le compte créé, un jeton JWT est généré et retourné pour effectuer d’autre requêtes au nom de cet utilisateur.

Propriétés JSON attendues dans le corps de la requête:

Propriétés JSON en réponse de chaque requête:

Cas d’erreurs (avec valeur correspondante pour la propriété error):

Route POST /signin

Cette route permet à un utilisateur de se connecter à son compte, en fournissant son identifiant et son mot de passe.

Une fois les identifiants vérifiés, un jeton JWT est généré et retourné pour effectuer d’autre requêtes au nom de cet utilisateur.

Propriétés JSON attendues dans le corps de la requête:

Propriétés JSON en réponse de chaque requête:

Cas d’erreurs (avec valeur correspondante pour la propriété error):

Route GET /notes

Cette route permet à un utilisateur connecté de lister ses notes, dans l’ordre anti-chronologique de création.

Le jeton JWT de l’utilisateur connecté doit être fourni en base 64 dans le header HTTP x-access-token.

Propriétés JSON en réponse de chaque requête:

Cas d’erreurs (avec valeur correspondante pour la propriété error):

Route PUT /notes

Cette route permet à un utilisateur connecté d’ajouter une note.

Le jeton JWT de l’utilisateur connecté doit être fourni en base 64 dans le header HTTP x-access-token.

Propriétés JSON attendues dans le corps de la requête:

Propriétés JSON en réponse de chaque requête:

Cas d’erreurs (avec valeur correspondante pour la propriété error):

Route PATCH /notes/:id

Cette route permet à un utilisateur connecté de modifier une note existante.

Le jeton JWT de l’utilisateur connecté doit être fourni en base 64 dans le header HTTP x-access-token.

Paramètres attendus dans l’URL de la requête:

Propriétés JSON attendues dans le corps de la requête:

Propriétés JSON en réponse de chaque requête:

Cas d’erreurs (avec valeur correspondante pour la propriété error):

Route DELETE /notes/:id

Cette route permet à un utilisateur connecté de supprimer une de ses notes.

Le jeton JWT de l’utilisateur connecté doit être fourni en base 64 dans le header HTTP x-access-token.

Paramètres attendus dans l’URL de la requête:

Propriétés JSON en réponse de chaque requête:

Cas d’erreurs (avec valeur correspondante pour la propriété error):