Laboratoire 16

Un projet de départ Angular et ASP.NET Core vous sont fournis.
Mise en situation dont personne n'avait besoin : M. Robidoux gère un zoo de dinosaures, mais il a besoin d'un système pour répertorier tous les incidents qui surviennent pour simplifier la collaboration avec ses assureurs.
Vous devrez compléter le système existant, essentiellement en implémentant la création (Post) de zookeeper, de dinosaur et d'incident ainsi que la suppression (Delete) de zookeeper et de dinosaur. Comme ces entités ont des relations, ça pourrait être délicat.
😵 Qu'est-ce qui se passe ici
Commencez par jeter un coup d'oeil aux deux projets. Portez principalement attention aux classes Zookeeper, Dinosaur et Incident. Assurez-vous de bien comprendre le type de relation entre chacune de ses classes.
En résumé :
- Un
Zookeeperest responsable de plusieursDinosaur. - Un
Dinosaurest géré par unZookeeperet est associé à plusieursIncident. - Un
Incidentest associé à plusieursDinosaur.
🥚 Donner naissance est difficile
1 - Créer des zookeepers
Créez une action Post dans ZookeepersController permettant de créer des nouveaux gardiens.
Il faudra aussi compléter une requête dans le DinosaurService côté client.
Bien que Zookeeper ait une relation avec Dinosaur, comme un Zookeper peut exister sans Dinosaur,
ça devrait être ultra simple et ressembler à un Post auto-généré.

2 - Créer des dinosaures
Créez une action Post dans DinosaursController permettant de créer des nouveaux dinosaures.
Il faudra aussi compléter une requête dans le DinosaurService côté client.
💡 Comme un Dinosaur doit absolument être associé à un Zookeeper dès sa création, il faudra aussi transmettre l'id du Zookeeper associé.
💡 Vous aurez besoin d'un DTO pour y arriver.

3 - Créer des incidents
Créez une action Post dans IncidentsController permettant de créer des nouveaux incidents.
Il faudra aussi compléter une requête dans le DinosaurService côté client.
💡 Lors de la création d'un Incident, nous voudrons immédiatement indiquer à quels Dinosaur cet Incident est associé. Il faudra donc envoyer la liste des ids des Dinosaur associés au serveur.
💡 Vous aurez besoin d'un DTO pour y arriver.

🔪 Supprimer n'est pas plus facile
4 - Supprimer des dinosaures
💡 Lorsqu'on supprime un Dinosaur, on doit aussi supprimer tous ses Incident associés SI CE DINOSAURE ÉTAIT LE DERNIER ÉTANT ASSOCIÉ À L'INCIDENT (Il faudra un petit if avec maListe.Count == 1 par exemple !), sinon on laisse dans la base de données un Indicent un peu inutile.
Créez une action Delete dans le DinosaursController côté serveur et complétez le DinosaurService côté client.
5 - Supprimer des zookeepers
💡 Lorsqu'on supprime un Zookeeper, on doit aussi supprimer tous ses Dinosaur associés, sinon il y aura une erreur en lien avec une clé étrangère dans la base de données.
Comme pour la question précédente, il faudra encore supprimer certains Incident si un Dinosaur associé qu'on s'apprête à supprimer était le dernier associé à l'incident.
Créez une action Delete dans le ZookeepersController côté serveur et complétez le DinosaurService côté client.
⚙ Rendez-vous service en utilisant les services
C'est important de se pratiquer à utiliser des services, mais pour alléger le code, il y aura seulement des services dans le TP3 et dans le TP4. (Les prochains labos et l'examen final n'auront pas de services)
6 - Compléter trois services
💡 Pour chacune des trois entités qui existent, complétez un service. L'objectif est de retirer le DbContext des trois contrôleurs.
Vous risquez d'avoir environ 9+ méthodes à créer dans vos 3 services. (Au total) Ça peut sembler long, mais il s'agit principalement de déplacer du code et de découper des méthodes. Vous pouvez vous inspirer des services dans les notes de cours, mais il y aura quelques différences.
Gardez à l'esprit que le plus important est de débarrasser toutes les lignes de code impliquant _context des contrôleurs.
Ci-dessous, quelques pistes pour chacune des 7 actions existantes dans vos contrôleurs :
GetZookeeperetGetDinosaur
Pour ces deux actions, il suffira de créer une méthode GetAll() dans ZookeeperService et DinosaurService. 100% copié-collé des notes de cours.
PostZookeeper
Plutôt simple aussi, il suffira de créer une méthode Create() dans ZookeeperService. 100% copié-collé des notes de cours.
PostDinosaur
Vous aurez besoin de deux méthodes dans les services :
Get()(ou GetOne) dansZookeeperServicepour obtenir leZookeeperresponsable duDinosaur.Create()dansDinosaurService.
Ça veut dire que deux services seront injectés dans DinosaursController.
PostIncident
Vous aurez besoin de deux méthodes dans les services :
Get()(Un GetOne) dansDinosaurServicepour obtenir chaqueDinosaurdont l'ida été reçu.Create()dansIncidentService.
Ça veut dire que deux services seront injectés dans IncidentsController.
DeleteDinosaur
Vous aurez besoin d'une à trois méthodes dans les services :
Delete()dansDinosaurService. Comme il y aura une boucle qui supprime desIncident, on a deux choix... :- Soit on encapsule cette boucle dans la méthode
Delete()deDinosaurService()(Plus simple) - Soit on crée un
Get()ET unDelete()dansIncidentService. (Plus complexe)
- Soit on encapsule cette boucle dans la méthode
DeleteZookeeper
Vous aurez besoin d'une à quatre méthodes dans les services :
Delete()dansZookeeperService. Encore une fois, pour la boucle, on a deux choix... :- On la met dans le
Delete()deZookeeperService(Moins bien... ⛔) - On utilise
Get()etDelete()dansDinosaurService. (Mieux ! ✅) Si vous faites ceci, vous aurez aussi besoin d'unGet()dansZookeeperServicepour commencer par obtenir leZookeeperavant la boucle.
- On la met dans le
Gardez à l'esprit qu'il y a plusieurs manières de découper les fonctionnalités dans les services... L'important est de débarrasser le DbContext des contrôleurs ET d'éviter la répétition de code dans les contrôleurs.