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