‫Instructeur :
‫Dans cette vidéo, nous allons créer une fonction de fabrique
‫de gestionnaires afin de supprimer les documents
‫de révision, mais aussi les documents de toutes les autres
‫collections, le tout avec une fonction simple.
‫Donc, comme je l'ai mentionné juste au début de cette section,
‫l'ajout de gestionnaires très similaires à tous nos contrôleurs créera
‫beaucoup de code en double, n'est-ce pas ?
‫Parce que tous ces gestionnaires de
‫mise à jour, ou tous
‫ces gestionnaires de suppression, ou tous
‫ces gestionnaires de création, se ressemblent vraiment tous, n'est-ce pas ?
‫Aussi, imaginez que nous voulions
‫changer comme un code d'état https ou un message d'état.
‫Ensuite, nous devions entrer dans chaque contrôleur, puis changer
‫tous les gestionnaires qui s'y trouvent.
‫Et donc, au lieu d'écrire manuellement tous ces gestionnaires, pourquoi
‫ne pas simplement créer une fonction d'usine qui
‫nous renverra ces gestionnaires ?
‫Donc, une fonction d'usine est exactement cela.
‫C'est une fonction qui renvoie une autre fonction, et dans
‫ce cas notre fonction de gestionnaire.
‫Donc, pour la suppression, pour la création, pour la mise à
‫jour, et aussi pour la lecture des ressources.
‫D'accord et je sais que tout ce concept peut être un peu complexe à
‫comprendre, et c'est la
‫raison pour laquelle j'ai laissé cela
‫pour la dernière partie de ce cours.
‫Mais maintenant, je crois que vous êtes réellement
‫prêt à mettre en œuvre ce genre de choses.
‫Donc, ce genre de logique est ce que
‫tout développeur JavaScript avancé devrait être capable de mettre en
‫œuvre, et encore une fois, je pense qu'à ce stade
‫du cours, vous êtes vraiment prêt à commencer à utiliser un
‫concept avancé comme celui-ci, d'accord.
‫Mais assez parlé, permettez-moi maintenant de vous montrer comment
‫cela fonctionne réellement en utilisant le gestionnaire de suppression comme premier exemple.
‫Et donc en fait, nous en avons un dans le contrôleur de tournée, et
‫donc allons de l'avant et copions celui-ci, donc
‫supprimez la tournée.
‫D'accord, donc je l'ai copié essentiellement comme
‫modèle à suivre.
‫Créons donc un nouveau fichier, et je vais le faire
‫dans les contrôleurs.
‫Très
‫bien, donc gestionnaire...
‫usine. js.
‫Et je fais ceci est le dossier des contrôleurs,
‫eh bien parce que les fonctions que nous allons
‫écrire ici retourneront essentiellement des contrôleurs.
‫Et donc pour moi, il est tout à fait logique
‫que vous les mettiez ici.
‫Alors copions simplement cette partie
‫ici, juste pour la garder comme référence.
‫Donc, encore une fois, le but ici est de créer une
‫fonction, qui renverra ensuite
‫une fonction qui ressemble à celle-ci ici.
‫Mais bien sûr, pas seulement pour la
‫tournée, mais pour chaque modèle que nous avons dans notre
‫application et que nous pourrions avoir à l'avenir.
‫Donc, cette fonction doit être préparée
‫pour cela, et donc cela signifie qu'à l'intérieur de la fonction
‫d'usine, nous allons passer dans le modèle, d'accord.
‫Appelons donc celui-ci deleteOne.
‫Et ça s'appelle comme ça, encore une
‫fois, parce que cette fonction ne
‫fonctionnera pas seulement pour supprimer des
‫visites, mais aussi pour supprimer des critiques et des utilisateurs
‫et à l'avenir d'autres documents que nous
‫pourrions également avoir.
‫Donc comme je le disais au
‫début, on va passer le modèle dans cette fonction.
‫Nous passons donc le modèle, puis nous créons une nouvelle fonction, et cette fonction
‫renverra tout de suite notre fonction
‫asynchrone, donc fondamentalement tout cela ou la fonction de
‫gestionnaire asynchrone.
‫D'accord, et maintenant tout ce que nous avons à
‫faire est de passer du modèle d'outil spécifique au modèle plus générique.
‫Ensuite, nous allons également changer cela de la tournée au document car, encore une fois,
‫nous ne saurons pas de quel type de document il s'agit.
‫Cette fonction ne saura donc pas vraiment s'il s'agit d'une visite,
‫ou s'il s'agit d'un avis, ou d'un utilisateur.
‫Et donc nous devons faire le tour de tout cela, et
‫c'est en fait tout.
‫Il s'agit donc essentiellement de la généralisation
‫de cette fonction spécifique, qui ne fonctionnait que pour les tournées, et
‫maintenant cette nouvelle fonction fonctionne pour chaque modèle.
‫Ce que nous devons également faire ici, c'est importer ce catchAsync et
‫également cette AppError.
‫Alors catchAsync...
‫et je crois que c'est dans le dossier des utilitaires.
‫Et puis, pas AppError mais catchAsync.
‫Ensuite, dupliquez-le
‫ici, AppError, et c'est ici en majuscule.
‫Faites une sauvegarde et nous sommes maintenant
‫prêts à tester cela.
‫Voici donc comment cela va fonctionner,
‫tout d'abord, nous devons importer cette usine de gestionnaires.
‫Et donc disons,
‫et je vais simplement l'appeler usine ici.
‫Donc exigez, et c'est dans le même dossier, donc usine
‫de gestionnaire.
‫Très bien et commentons celui-ci ici, ou en fait pas
‫tout cela.
‫Ouais ou en fait, nous pouvons le commenter,
‫et donc les nouvelles exportations. supprime la tournée sera...
‫usine. deleteOne puis passez le modèle,
‫qui est tour.
‫Et c'est tout, c'est tout ce que nous devons faire.
‫Donc, pour récapituler très rapidement ici, nous
‫appelons cette fonction deleteOne, puis nous passons le
‫modèle, et ce qui va
‫se passer, c'est que cette fonction renverra alors
‫tout de suite cette fonction de gestionnaire que
‫nous avions auparavant.
‫Simplement le modèle spécifique, qui était auparavant la tournée, va maintenant
‫être remplacé par celui que nous avons
‫passé à la fonction.
‫Et au fait, cela fonctionne à cause des fermetures JavaScript,
‫ce qui est juste une façon élégante
‫de dire que cette fonction interne ici aura accès
‫aux variables de la fonction
‫externe même après que l'externe soit déjà revenu.
‫Donc, appeler cette fonction ici renverra
‫alors une autre fonction, qui
‫s'installera alors ici et attendra jusqu'à ce qu'elle soit
‫finalement appelée dès que nous atteignons la route correspondante.
‫Et donc essayons maintenant exactement cela.
‫Alors supprimez la tournée,
‫d'accord, et choisissons une tournée dont
‫nous n'avons pas vraiment besoin ici pour le moment.
‫Alors disons...
‫maintenant disons ici The Snow Adventurer
‫car il n'a pas non plus de critiques.
‫Alors envoyons ça, oh et maintenant
‫nous n'avons pas la permission de préformer l'action, et c'est
‫parce que nous ne sommes pas connectés en tant qu'administrateur.
‫Essayons donc cela,
‫et c'est donc l'administrateur auquel nous devons être connectés.
‫Bon, alors c'est fait.
‫Et maintenant, cela devrait fonctionner, et en effet cela a fonctionné.
‫Et c'est donc la preuve que notre fonction usine
‫fait vraiment son travail.
‫D'accord parce que si vous revenez maintenant ici,
‫nous avons eu 10 résultats et maintenant nous ne devrions en obtenir que neuf,
‫donc parfait.
‫Et maintenant, l'objectif est de pouvoir
‫l'utiliser dans chaque contrôleur.
‫Alors copions ceci ici et
‫passons aux critiques.
‫Oh et bien
‫sûr, nous en avons besoin ici, dès le
‫début, maintenant, et maintenant, exportons. deleteReview est égal
‫à factory. deleteOne avec
‫le modèle d'examen.
‫Et c'est tout, c'est tout ce
‫que nous devons faire pour implémenter le gestionnaire de suppression.
‫Maintenant, bien sûr, nous devons également spécifier le gestionnaire de route.
‫Maintenant, bien sûr, nous devons spécifier la route elle-même,
‫et faisons-le donc ici également.
‫Donc routeur. route car ici nous
‫avons en fait besoin du paramètre ID.
‫Et maintenant, delete est simplement reviewController. deleteReview, et je ne joue pas avec
‫l'autorisation ici, ni avec l'authentification, car pour l'instant, je
‫veux juste que cela fonctionne
‫et m'inquiéter de ce genre de
‫choses un peu plus tard dans cette section.
‫D'accord, alors fermons ce truc ici.
‫Alors, obtenez tous
‫les
‫avis, d'accord, gardons celui-ci et celui-ci également.
‫Pour que nous puissions maintenant commencer avec une feuille vierge
‫ici et commençons par obtenir tous les avis, afin
‫que nous puissions maintenant en supprimer un.
‫Et donc supprimons, eh bien juste celui-ci.
‫D'accord, maintenant nous avons aussi bien sûr besoin
‫de cela, puis de la méthode de suppression http.
‫Nous n'avons besoin d'aucune autorisation à
‫ce stade, alors envoyons-la simplement.
‫Et effectivement aucun contenu, donc 204.
‫Et si nous obtenons maintenant toutes les
‫critiques, alors nous devrions en avoir seulement trois.
‫Oui, cela fonctionne et passons donc au suivant.
‫Bon alors avis, avis.
‫Récupérons cette ligne de code ici et ajoutons-la
‫enfin au contrôleur utilisateur.
‫Très bien, et bien sûr tout cela, je comprends que c'est un peu
‫déroutant maintenant de jouer avec tous ces différents fichiers,
‫mais nous avons juste besoin de
‫le faire une fois et ensuite nous en avons fini
‫avec toute cette confusion.
‫Donc ici nous avions déjà l'export. deleteUser,
‫il ne nous reste plus qu'à appeler notre fonction
‫d'usine, donc deleteOne, puis l'utilisateur.
‫Désormais, seul l'administrateur devrait pouvoir supprimer
‫des utilisateurs plus tard, car rappelez-vous que lorsque
‫l'utilisateur se supprime,
‫ils ne seront pas réellement supprimés, mais
‫seuls actifs seront définis sur false.
‫Mais l'administrateur, d'un autre côté,
‫sera vraiment capable de supprimer efficacement l'utilisateur de la
‫base de données.
‫Mais encore une fois, nous
‫allons nous inquiéter de cette autorisation un peu plus tard.
‫Pour l'instant, vérifions dans les userRoutes si la
‫route est réellement
‫implémentée, et oui c'est ici.
‫Et donc puisque nous
‫avons maintenant implémenté cela, testons-le également ici aussi sur Postman.
‫Alors sauvegardons d'abord celui-ci.
‫Donc...
‫delete review, et
‫maintenant, copions simplement ceci dans un
‫autre itinéraire.
‫Alors supprimez puis un utilisateur, mais
‫je ne vais pas vraiment le faire maintenant.
‫Tout ce que je veux, c'est juste obtenir un identifiant aléatoire.
‫Ou en fait, créons simplement un
‫nouvel utilisateur, alors inscrivez-vous, puis supprimez-le immédiatement.
‫Alors bonjour, comme ça.
‫Obtenez tous les utilisateurs, et puis c'est ce type là.
‫Et donc supprimons-le tout de suite, donc nous
‫envoyons, nous obtenons 204 sans contenu.
‫Et bien sûr, maintenant il devrait être parti.
‫Maintenant, si nous essayons de la
‫revoir, donc en essayant de supprimer un
‫utilisateur qui n'est plus là, nous devrions obtenir une erreur.
‫Jetons donc un coup d'œil, et en effet aucun document trouvé
‫avec cette pièce d'identité.
‫Et donc cela signifie que dans notre
‫fonction d'usine, donc ici, tout cela l'AppError et le catchAsync, tout cela
‫est toujours intact.
‫Donc, tout fonctionne toujours comme avant.
‫Il était donc également important de tester ici.
‫Enregistrons simplement cela ici aussi, de
‫sorte que chaque point de terminaison que nous implémentons, je
‫l'ajoute également ici dans
‫Postman car un peu plus tard, nous serons alors
‫en mesure de créer une documentation API
‫basée sur l'ensemble de ce que nous avons enregistré ici dans Postman.
‫C'est donc une autre fonctionnalité pratique de cette application.
‫Nous avons donc supprimé l'utilisateur
‫actuel, et encore une fois, c'est différent de
‫simplement supprimer l'utilisateur car celui-ci ici est
‫pour l'administration et celui-ci est pour l'utilisateur actuellement connecté,
‫donc très différent.
‫D'accord, c'était donc notre première fonction d'usine uniquement pour
‫la suppression et uniquement pour que vous compreniez
‫le concept lui-même.
‫Ensuite, nous allons implémenter des fonctions d'usine pour
‫la mise à jour et la création de documents.