Aller au contenu principal

Laboratoire 16

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

attention

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.

info

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 :

  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 de deux méthodes dans les services :

  • Get() (ou GetOne) dans ZookeeperService pour obtenir le Zookeeper responsable du Dinosaur.
  • Create() dans DinosaurService.

Ça veut dire que deux services seront injectés dans DinosaursController.


  1. PostIncident

Vous aurez besoin de deux méthodes dans les services :

  • Get() (Un GetOne) dans DinosaurService pour obtenir chaque Dinosaur dont l'id a été reçu.
  • Create() dans IncidentService.

Ça veut dire que deux services seront injectés dans IncidentsController.


  1. DeleteDinosaur

Vous aurez besoin d'une à trois méthodes dans les services :

  • Delete() dans DinosaurService. Comme il y aura une boucle qui supprime des Incident, on a deux choix... :
    • Soit on encapsule cette boucle dans la méthode Delete() de DinosaurService() (Plus simple)
    • Soit on crée un Get() ET un Delete() dans IncidentService. (Plus complexe)

  1. DeleteZookeeper

Vous aurez besoin d'une à quatre méthodes dans les services :

  • Delete() dans ZookeeperService. Encore une fois, pour la boucle, on a deux choix... :
    • On la met dans le Delete() de ZookeeperService (Moins bien... ⛔)
    • On utilise Get() et Delete() dans DinosaurService. (Mieux ! ✅) Si vous faites ceci, vous aurez aussi besoin d'un Get() dans ZookeeperService pour commencer par obtenir le Zookeeper avant la boucle.
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 ET d'éviter la répétition de code dans les contrôleurs.