diff --git a/tps/sem6/README.md b/tps/sem6/README.md index 35b6e1f..234a6f9 100644 --- a/tps/sem6/README.md +++ b/tps/sem6/README.md @@ -85,7 +85,7 @@ Voici la vue de la page, prenez le temps de lire le code et comprendre quels att * Créez ou générez un contrôleur `Leaderboard` avec une action index et la route correspondante. -* Copiez le template du layout comme indiqué ci-dessus +* Copiez le template du layout comme indiqué ci-dessus si vous ne l'avez pas encore fait. * Copiez le code fourni ci-dessus dans la vue correspondant à l'action index (`app/views/leaderboard/index.html.erb`) @@ -93,13 +93,13 @@ Voici la vue de la page, prenez le temps de lire le code et comprendre quels att * Faites fonctionner la recherche présente dans la top bar pour filter les combats en fonction de leur nom (comme on l'a déjà fait dans l'API) -* Améliorez cette recherche pour chercher également dans le nom des créatures combatantes. +* Améliorez cette recherche pour chercher également dans le nom chercher également dans le nom de la créature victorieuse. + * Vous pouvez appeler `#or` sur la première query et repasser une nouvelle query qui fait la recherche souhaitée. + * Petite note : La jointure nécessaire devra se faire sur les deux queries, même sur la première qui ne l'utilise pas sinon elles seront structurellement différentes et ActiveRecord n'appréciera pas. - * OPTION 2 : plus facile : Améliorez cette recherche pour chercher également dans le nom de la créature victorieuse. +* Eager loader les données pour limiter le nombre de requêtes -* Eager loader les données pour limiter le nombre de requètes - - * Vous pouvez constater dans les logs la différence de réponse de la requète : + * Vous pouvez constater dans les logs la différence de réponse de la requête : Avant : @@ -121,9 +121,9 @@ Nous devons stocker ce mot de passe de manière sécurisée dans la base de donn Pour cela on va utiliser la méthode `has_secure_password` du module `ActiveModel::SecurePassword`. -* Créez ou générez un modèle `User`possédant un `username` de type `string` +* Créez ou générez un modèle `User` possédant UNIQUEMENT un `username` de type `string`. On ajoute le mot de passe dans une étape suivante. -* Faites en sorte qu'il ne puisse pas y avoir deux utilisateur créatures avec le même `username`. (Rappelez vous commment on a fait pour les créatures) +* Faites en sorte qu'il ne puisse pas y avoir deux utilisateur créatures avec le même `username`. (Rappelez vous commment on a fait pour les créatures, deux choses à faire) * Lisez attentivement la documentation https://api.rubyonrails.org/v7.0.4/classes/ActiveModel/SecurePassword/ClassMethods.html, et adaptez votre code : * Vous devez ajouter une gem spécifique à votre bundle (`bundle add xxx`) @@ -178,10 +178,15 @@ Pour ça, on vous fourni la vue de l'écran de connexion : * Met l'utilisateur en session * Redirige vers le leaderboard : `redirect_to controller: :leaderboard, action: :index` * Si non, rend la vue `new` pour afficher de nouveau le formulaire : `render :new` - * La vue peut mème afficher un message d'erreur si vous définnissez le bon attribut dans l'action + * La vue peut même afficher un message d'erreur si vous définnissez le bon attribut dans l'action ### Protégez l'application -* Modifier le leaderboard pour brider son accès aux utilisateurs connectés +* Modifier le leaderboard pour brider son accès aux utilisateurs connectés : + * Si un utilisateur est connecté, le laisser accéder à la page + * Sinon redirigez le vers le formulaire de login. (indice: `UserSessions#new`) + +* Modifier les contrôleurs d'API pour brider leurs accès aux utilisateurs présents en base de données, en forçant l'envoi de l'username et mot de passe en basic auth : + * Ajouter un contrôleur APIController (pour l'instant vide) qui hérite de ApplicationController et dont les CreaturesController et CombatsController hériteront. + * Ajouter une before action qui vérifie l'authentification sur l'APIController. Si le client n'est pas authentifié, retourner une 403 (comme la 404). -* Modifier les controleurs d'API pour brider leurs accès aux utilisateur présents en base de donnée, en forçant l'envoi de l'username et mot de passe en basic auth