Aller au contenu principal

Laboratoire 15

Bannière du site

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 Zookeeper est responsable de plusieurs Dinosaur.
  • Un Dinosaur est géré par un Zookeeper et est associé à plusieurs Incident.
  • Un Incident est associé à plusieurs Dinosaur.

🥚 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é.

Liste de gardiens

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.

Liste de dinosaures

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.

Liste d'incidents

🔪 Supprimer n'est pas plus facile

4 - 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.

Créez une action Delete dans le ZookeepersController côté serveur et complétez le DinosaurService côté client.

5 - 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.

6 - Modifier la suppression de zookeepers

Un instant ! Supprimer un Zookeeper implique également de supprimer des Dinosaur ! Allez copier-coller un peu de code pour supprimer les Indicent (comme vous avez fait pour DeleteDinosaur dans le DinosaursController) dans le ZookeepersController. (Encore une fois, pour empêcher un Incident associé à aucun Dinosaur de continuer d'exister)

⚙ Rendez-vous service en utilisant les services

7 - 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. C'est plutôt simple.

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 :

  1. GetZookeeper et GetDinosaur

Pour ces deux actions, il suffira de créer une méthode GetAll dans ZookeeperService et DinosaurService. 100% copié-collé des notes de cours.

  1. PostZookeeper

Plutôt simple aussi, il suffira de créer une méthode Create dans ZookeeperService. 100% copié-collé des notes de cours.

  1. PostDinosaur

Vous aurez besoin d'un Create dans DinosaurService, mais aussi d'un Get (Un GetOne) dans ZookeeperService. Ça veut dire que deux services seront injectés dans DinosaursController.

  1. PostIncident

Vous aurez besoin d'un Create dans IncidentService, mais aussi d'un Get (Un GetOne) dans DinosaurService. Ça veut dire que deux services seront injectés dans IncidentsController.

  1. DeleteDinosaur

Pour varier la formulation, au lieu de dire « vous aurez besoin de », cette fois je vais dire qu'il faudra un Delete dans DinosaurService. Cela dit, une fois confronté à la boucle qui supprime des Incident, on a deux choix... soit on encapsule tout dans le Delete de DinosaurService, soit on utilise un Get ET un Delete qui viennent de IncidentService. Les deux sont valides.

Il est possible que vous ayez besoin d'un Get dans DinosaurService.

  1. DeleteZookeeper

Il faudra un Delete dans ZookeeperService. Encore une fois, pour la boucle, soit on fourre tout dans le Delete de ZookeeperService, soit on investit dans un Get et un Delete dans DinosaurService. Dans tous les cas, pour la boucle qui supprime des Incident, vous devriez pouvoir réutiliser le Delete venant de DinosaurService pour répéter moins de code.

Il est possible que vous ayez besoin d'un Get dans ZookeeperService.

info

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. AU PIRE, si jamais, dans un projet, votre découpage est mauvais, vous vous en rendrez rapidement compte car il y aura du code répétitif.