|
|
@@ -0,0 +1,51 @@
|
|
|
+# 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`.
|