Votre mission si vous l'acceptez est de créer une API simple de petites annonces avec Nest qui permettra à des utilisateurs de votre site web d'enregitrer les articles qu'ils souhaitent vendre. Cela implique que les utilisateurs doivent pouvoir ajouter des articles, ainsi que retirer leurs articles de votre site. Ils doivent aussi pouvoir consulter les articles mis en ligne par d'autres utilisateurs.
- 1. Créer un projet Nest.
- 2. Inspecter le dossier
srcdu projet Nest pour trouver :- Un controlleur (Controller)
- Un service
- 3. Créer une nouvelle route nommée "sayGoodbye" dans ce controller.
- 4. Créer une méthode nommée "logicToSayGoodbye" dans ce service. Cette méthode doit renvoyer "Goodbye".
- 5. Retourner le résultat de "logicToSayGoodbye" par la route "sayGoodbye".
- 6. Tester votre route avec httpie ou "Postman".
- L'URL par défaut de l'API est la suivante :
http://localhost:3000/(s'y rendre)
- L'URL par défaut de l'API est la suivante :
- 7. Créer un nouveau controller appellé "Product".
- 8. Créer un nouveau service pour ce nouveau controller nommé "Product".
- 9. Créer une nouvelle route dans le controller
Productqui utilise le serviceProductet renvoie un tableau de nom d'article. - 10. Créer un nouveau module nommé
Product. - 11. Déplacer le controller, le service et le module
Productdans un nouveau dossier nomméProduct. - 12. Lier le controller
Productet le serviceProductdans le moduleProduct. - 13. Importer le module
Productdans le moduleApp. - 14. Tester la route du controller
Productavec Postman.
- 15. Installer
prismaen tant que dépendance de développement du projet Nest. - 16. Installer le client prisma (paquet
@prisma/client) en tant que dépendance du projet. - 17. Initialiser
prismadans le projet Nest. - 18. Importer ce schéma dans le projet Nest.
Schéma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DB_URL")
}
model Products {
UUID String @id(map: "products_uuid") @unique() @default(uuid()) @db.VarChar(36) //UUIDv4
Name String @db.VarChar(50)
Price Int
Description String @db.Text()
authorUUID String @db.VarChar(36) // Ref to UUIDv4
Author Users @relation(map: "product_author", fields: [authorUUID], references: [UUID])
}
model Users {
UUID String @id(map: "users_uuid") @unique() @default(uuid()) @db.VarChar(36) //UUIDv4
Pseudo String @unique() @db.VarChar(50)
Mail String @unique() @db.VarChar(75)
Products Products[]
}- 19. Migrer le schéma vers la base de données.
- 20. Créer le service
Prisma. - 21. Vérifier que la structure de la base de données correspond à la définition du schéma Prisma.
- 22. Créer une nouvelle ressource (~=module) nommée
Usersavec "Nest CLI" (Note: Une ressource est un ensemble de : controller, service, module. On appelle aussi cela un module) (Puis laisser les options par défaut). - 23. Ajouter les propriétés :
PseudoetMaildans le DTOcreate-user. - 24. Définir le service Prisma en tant que provider du module
Users. - 25. Implémenter la logique de la route
createdu controllerUserafin de créer un nouvel utilisateur dans la base de données. - 26. Créer une route pour récupérer les informations d'un utilisateur par son UUID.
- 27. Créer une route pour modifier les informations d'un utilisateur.
- 28. Créer une route pour supprimer un utilisateur par son UUID.
- 29. Normaliser toutes les réponses du controller
Userssous le format suivant :- Un champ de message qui doit dire que l'opération à bien été exécutée nommé
message. - Un champ de données qui doit contenir le résultat de l'opération nommé
data.
- Un champ de message qui doit dire que l'opération à bien été exécutée nommé
- 30. Préparer la validation des données envoyées par l'utilisateur en utilisant la
Validation Pipeet ses décorateurs. - 31. Utiliser la
Validation PipecommeGlobal Pipe. - 32. Transformer automatiquement les données envoyées par l'utilisateur dans le type attendu dans le DTO grâce à la
Validation Pipe.
- 33. Installer
Swaggeren tant que dépendance du projet. - 34. Initialiser
Swaggerpour être utilisé par Nest. - 35. Utiliser le décorateur
Swaggerapproprié pour documenter les routes du controllerUsersséparément. - 36. Documenter les champs du DTO de création d'utilisateur en utilisant le décorateur
Swaggerapproprié. - 37. Tester la documentation Swagger en se rendant à l'URL
http://localhost:3000/api(s'y rendre)
- 38. Créer une route et ses besoins annexes pour enregistrer de nouveaux articles.
- 39. Créer une route pour récupérer un article par son UUID.
- 40. Créer une route et ses besoins annexes pour modifier les informations d'un article par son UUID.
- 41. Créer une route pour supprimer un article par son UUID.
- 42. Définir le service
Productsen tant que provider du moduleUsers. - 43. Créer une méthode dans le service
Productspour récupérer tous les articles d'un utilisateur en fonction de l'UUID de l'utilisateur. - 44. Créer une route dans le controller
Usersqui retourne les articles d'un utilisateur. - 45. Faire la même chose pour supprimer les articles d'un utilisateur.
- 46. Modifier le schéma
Prismapour permettre l'authentification des utilisateurs. - 47. Migrer le nouveau schéma
Prismapour mettre à jour la structure de la base de données. - 48. Installer les paquets
@nestjs/passport,passport,@nestjs/passport-jwt,@nestjs/jwtainsi que le paquet@types/passport-jwt(en tant que devDep). - 49. Installer les paquets
bcryptainsi que@types/bcrypt(en tant que devDep)
- 50. Créer un module
Authdédié à l'authentification des utilisateurs. - 51. Modifier la route et ses besoins connexes pour enregister de nouveaux utilisateurs.
- Adapter le
dtopour enregistrer les nouveaux comptes. - Adapter la logique pour cette route :
- Hasher le mot de passe avec
bcryptavant de l'enregistrer en base de données.- Enregistrer le nouvel utilisateur en base de données.
- Adapter le
- 52. Créer une route pour la connexion des utilisateurs.
- Créer une méthode dans le service
Userspour récupérer un utilisateur par le nom d'utilisateur. - Utiliser le
Jwt Serviceet leUsers Servicedans le moduleAuth. - Créer la logique pour authentifier un utilisateur.
- Renvoyer uniquement un objet contenant un champ :
access_tokencontenant le JWT signé avec les informations suivantes :- Le nom d'utilisateur de l'utilisateur.
- L'UUID de l'utilisateur.
- Renvoyer uniquement un objet contenant un champ :
- Créer une méthode dans le service
- 53. Implémenter la stratégie
Jwtpour le module Auth. - 54. Créer un
Guardd'authentification. - 55. Rendre l'authentication globale à l'API (faire que chaque route de l'API nécessite une authentification).
- 56. Permettre à certaines routes de ne pas nécessiter d'authentification grâce à un décorateur personnalisé.
