# Association d'entités Ajouter la définition d'une nouvelle entité Sequelize `MailAddress`. Celle-ci contient : - un champ `address` qui est une chaîne de caractère contenant l'adresse mail (faire en sorte que Sequelize vérifie la validité de ce champ) - un champ `type` qui peut prendre une valeur dans la liste suivante : 'home', 'work' Associer cette nouvelle entité avec l'entité `Person` de sorte que : - `MailAddress` appartient à `Person` - `Person` dispose de plusieurs `MailAddress` Faire en sorte que les `MailAddress` d'une `Person` soient supprimées lors de la suppression de la `Person`. # Modularisation Créer un module `db.js` qui s'occupe de l'initialisation de la connexion à la base de données (création de l'instance `sequelize`), de la définition des entités, puis qui exporte un objet qui contient les modèles définis : ```js module.exports = { Person, MailAddress }; ``` Créer deux modules `person_ctrl.js` et `mail_address_ctrl.js` qui exportent un objet contenant les middlewares manipulant respectivement les enregistrements des entités `Person` et `MailAddress`. Pour avoir accès aux modèles, ces modules vont charger le module `db.js`. ```js const db = require('./db'); module.exports = { get_all: (req, res, next) => { db.Person.findAll() .then((people) => { ... }) .catch((err) => next(err)); }, ... }; ``` Le programme principal charge les contrôleurs, puis configure l'ensemble des routes. # Routes Ajouter au serveur HTTP la gestion des routes suivantes : - `GET /person/:person_id/mailAddress` : renvoie l'ensemble des addresses mail de la personne d'identifiant `person_id` sous la forme d'un tableau d'objets en JSON - `POST /person/:person_id/mailAddress` : ajoute une nouvelle entité `MailAddress` en base à la personne d'identifiant `person_id` à partir des données fournies en JSON - `GET /person/:person_id/mailAddress/:mail_address_id` : renvoie l'adresse mail d'identifiant `mail_address_id` sous la forme d'un objet en JSON si elle appartient bien à la personne d'identifiant `person_id` - `PUT /person/:person_id/mailAddress/:mail_address_id` : modifie l'adresse mail d'identifiant `mail_address_id` à partir des données fournies en JSON si elle appartient bien à la personne d'identifiant `person_id` - `DELETE /person/:person_id/mailAddress/:mail_address_id` : supprime l'adresse mail d'identifiant `mail_address_id` si elle appartient bien à la personne d'identifiant `person_id` Les fonctions de ce contrôleur agissent toutes sur une entité `MailAddress` appartenant à une `Person` dont on connaît l'identifiant. On ajoutera donc tout d'abord dans le contrôleur de `Person` une fonction qui va charger l'instance de la `Person` concernée au sein de l'objet représentant la requête courante (`req`) sous l'identifiant `person`. Cette fonction `load_by_id` sera alors utilisée en tant que premier middleware dans la déclaration de toutes les routes citées ci-dessus. Les fonctions du contrôleur `mailAddressCtrl` auront donc accès à l'instance de `Person` concernée dans le champ `req.person`. On écrira dans ce contrôleur les fonctions `get_all, create, get_by_id, update_by_id, delete_by_id`.