From 91fc6f07a90c62da1f1cd98f0795ff6463f4c1a1 Mon Sep 17 00:00:00 2001 From: Karim Bogtob Date: Wed, 22 Mar 2023 23:36:49 +0100 Subject: [PATCH 1/4] Add tp5 --- tps/sem4/README.md | 4 +- tps/sem5/README.md | 95 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 tps/sem5/README.md diff --git a/tps/sem4/README.md b/tps/sem4/README.md index 5cda049..267ea6f 100644 --- a/tps/sem4/README.md +++ b/tps/sem4/README.md @@ -330,7 +330,7 @@ Winner pointera donc sur Colère Jeanluk vu qu'il est en vie. ### 3.1 Créer un combat -Pour créer une bagarre, vous devrez ajouter une nouvelle route pour créer un combat entre deux créatures. +Pour créer une bagarre, vous devrez ajouter une nouvelle route pour créer un combat entre deux créatures **VIVANTES**. Le body du post ressemblera à la requête ci-dessous vu que les autres champs seront générés : @@ -346,6 +346,8 @@ Pensez à ajouter vos relations sur le modèle `Combat` et le modèle `Creature` On peut implémenter l'algorithme de combat dans la classe Combat pour que le modèle enrichisse les autres champs (winner et result) automatiquement. +Vous ajouterez donc une méthode `baston!` qui fait les changements sur les créatures liées et les fait combattre. + ### 3.2 Lister les combats On ajoutera aussi une route pour lister les combats et on modifiera le `CombatsController`. diff --git a/tps/sem5/README.md b/tps/sem5/README.md new file mode 100644 index 0000000..c1bd1cc --- /dev/null +++ b/tps/sem5/README.md @@ -0,0 +1,95 @@ +# Gladiator API V2 + +Ce TP a pour but de vous faire continuer l'API JSON Rails du TP4 et de vous familiariser avec : + +* Comment écrire une API avec Rails +* Utiliser des validations +* Utiliser des transactions +* Gérer les erreurs + +Ce TP est une extension du précédent et peut se réaliser très vite, même s'il vous reste 30 minutes. + +## Repartir du TP précédent ? + +Pas le choix, il faut finir le TP précédent. + +## 1. Validations + +On va ajouter des validations aux modèles et changer les méthodes de création/mise à jour/suppression des records pour utiliser celles qui lèvent des erreurs si une validation apparait. (indice : `!`) + +### 1.1 Faire une créature qui soit logique + +* Ajoutez une validation qui force que le nom d'une créature soit présent. + +* Ajoutez une validation qui s'assure que les points d'une vie d'une créature soients toujours `>= 0`. + +* Il vous faudra peut être retaper la méthode `baston` du combat pour que les PVs soient toujours `>= 0`. + +* Testez dans une console rails (`rails console`). + +* Vérifier dans votre API que cela fonctionne. + +> N.B. : Si vous avez déjà créé des créatures non valides, libre à vous de les trouver et les détruire. (Ou réécrire la base) + +### 1.2 Unicité des créatures + +* Faites en sorte qu'il ne puisse pas y avoir deux créatures avec le même nom. + +* Pensez à la race condition et à l'index nécessaire. + +* Testez dans une console rails (`rails console`). + +* Vérifier dans votre API que cela fonctionne. + +### 1.3 Faire des combats réalistes + +* S'assurer que nous faisons bien combattre deux créatures vivantes au moment du combat. + +* S'assurer que nous faisons combattre deux créatures de même taille lorsque le combat est déclaré. + +* Testez dans une console rails (`rails console`). + +* Vérifier dans votre API que cela fonctionne. + +## 2. Gérer les erreurs de façon générique + +* Ajoutez des `rescue_from` pour éviter de devoir gérer l'absence des créatures et bien renvoyer une 404 avec body vide. Laissez une 404 si on essaie de créer un combat entre créatures absentes (ça devrait être le comportement après votre modification). + +## 2. Petit test de callback de contrôleurs + +* Ajoutez une `before_action` pour que si quelqu'un créé un combat entre créatures `big`, un message s'affiche dans les logs de rails (avec `puts`) avec le message "Laissez passer les costauds !". + +* Ajoutez une `before_action` pour que lorsque l'on crée une créature qui devrait avoir plus de 60 points de vie, son nom soit préfixé par "Big ". + +## 4. Renvoyer de meilleures erreurs + +### 4.1 Retourner des erreurs + +* Maintenant que les modèles ont des validations, on va catcher les erreurs de validation avec un `rescue_from` pour renvoyer une 422 avec un body qui décrit les erreurs, comme ci-dessous : + +Je POST une créature comme ceci : + +```json +{ + "name": " ", + "health_points": -20 +} +``` + +Je devrais recevoir une 422 avec le body suivant : + +```json +{ + "errors": [ + "Name can't be blank", + "Health points must be greater than 0" + ] +} +``` + +### 4.2 Les combats aussi retournent de belles erreurs + +* Faire en sorte que les combats renvoient un message correcte si une des créatures est absente. + + * Pour cela, on va changer la méthode utilisée lorsqu'on récupère les créatures dans la création de combat pour `find_by(id: params[:id])` 🎉🎉🎉 + * Avec la gestion d'erreur de l'exercice 4.1, ça devrait faire l'affaire ! From 40274c535df962d3099eedfe589a9884557a505c Mon Sep 17 00:00:00 2001 From: Vincent Chabredier Date: Thu, 23 Mar 2023 19:46:20 +0100 Subject: [PATCH 2/4] fixes --- tps/sem5/README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tps/sem5/README.md b/tps/sem5/README.md index c1bd1cc..064e034 100644 --- a/tps/sem5/README.md +++ b/tps/sem5/README.md @@ -21,11 +21,11 @@ On va ajouter des validations aux modèles et changer les méthodes de création * Ajoutez une validation qui force que le nom d'une créature soit présent. -* Ajoutez une validation qui s'assure que les points d'une vie d'une créature soients toujours `>= 0`. +* Ajoutez une validation qui s'assure que les points de vie d'une créature soient toujours `>= 0`. * Il vous faudra peut être retaper la méthode `baston` du combat pour que les PVs soient toujours `>= 0`. -* Testez dans une console rails (`rails console`). +* Testez dans une console rails (`bin/rails console`). * Vérifier dans votre API que cela fonctionne. @@ -37,7 +37,7 @@ On va ajouter des validations aux modèles et changer les méthodes de création * Pensez à la race condition et à l'index nécessaire. -* Testez dans une console rails (`rails console`). +* Testez dans une console rails (`bin/rails console`). * Vérifier dans votre API que cela fonctionne. @@ -47,7 +47,7 @@ On va ajouter des validations aux modèles et changer les méthodes de création * S'assurer que nous faisons combattre deux créatures de même taille lorsque le combat est déclaré. -* Testez dans une console rails (`rails console`). +* Testez dans une console rails (`bin/rails console`). * Vérifier dans votre API que cela fonctionne. @@ -57,7 +57,9 @@ On va ajouter des validations aux modèles et changer les méthodes de création ## 2. Petit test de callback de contrôleurs -* Ajoutez une `before_action` pour que si quelqu'un créé un combat entre créatures `big`, un message s'affiche dans les logs de rails (avec `puts`) avec le message "Laissez passer les costauds !". +* Ajoutez une `before_action` pour que si quelqu'un créé un combat entre créatures `big`, le message "Laissez passer les costauds !" s'affiche (avec `puts`) dans le terminal depuis lequel le serveur à été lancé. + + * Vous pouvez aussi écrire dans les logs du serveur (c'est mieux), avec `logger.debug`, voir : https://guides.rubyonrails.org/debugging_rails_applications.html#sending-messages * Ajoutez une `before_action` pour que lorsque l'on crée une créature qui devrait avoir plus de 60 points de vie, son nom soit préfixé par "Big ". From bc92a596493d2b870f35e02c3e911b8162e4610e Mon Sep 17 00:00:00 2001 From: Karim Bogtob Date: Fri, 24 Mar 2023 08:28:48 +0100 Subject: [PATCH 3/4] Add precision --- tps/sem5/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tps/sem5/README.md b/tps/sem5/README.md index 064e034..6a34e96 100644 --- a/tps/sem5/README.md +++ b/tps/sem5/README.md @@ -61,7 +61,7 @@ On va ajouter des validations aux modèles et changer les méthodes de création * Vous pouvez aussi écrire dans les logs du serveur (c'est mieux), avec `logger.debug`, voir : https://guides.rubyonrails.org/debugging_rails_applications.html#sending-messages -* Ajoutez une `before_action` pour que lorsque l'on crée une créature qui devrait avoir plus de 60 points de vie, son nom soit préfixé par "Big ". +* Ajoutez une `before_action` pour que lorsque l'on crée une créature qui devrait avoir plus de 60 points de vie, son nom soit préfixé par "Big ". Il faudra donc aussi supporter qu'une créature puisse être créée avec le paramètre optionnel `health_points`. Jusqu'à présent, cet attribut était tiré aléatoirement et maintenant il le sera maintenant uniquement lorsque le paramètre optionnel n'est pas fourni. ## 4. Renvoyer de meilleures erreurs From 77e956f99d30b29abbf8f306b4d78fa79fa5f73f Mon Sep 17 00:00:00 2001 From: Karim Bogtob Date: Fri, 24 Mar 2023 08:44:33 +0100 Subject: [PATCH 4/4] Add missing self --- tps/sem4/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tps/sem4/README.md b/tps/sem4/README.md index 267ea6f..aa8cae1 100644 --- a/tps/sem4/README.md +++ b/tps/sem4/README.md @@ -291,7 +291,7 @@ Ajoutez cette méthode à vote classe Creature : ``` before_create do - size = case health_points + self.size = case health_points when 0..10 :small when 11..30