‫Instructeur : Dans cette vidéo, je souhaite
‫remanier très rapidement les fonctionnalités de l'API que nous avons implémentées
‫au cours des deux dernières conférences.
‫Maintenant, ce n'est pas seulement pour rendre notre code un peu
‫plus propre, c'est aussi pour le rendre plus modulaire et plus réutilisable
‫à l'avenir.
‫Donc, en ce moment, nous avons tout ce code
‫pour les fonctionnalités que nous avons construites auparavant dans cette fonction getALLTours, n'est-ce pas ?
‫Et ça a l'air un peu brouillon.
‫C'est un peu difficile à comprendre, d'accord ?
‫Et, imaginez aussi que nous voulions utiliser ces mêmes fonctionnalités pour
‫une autre ressource.
‫Par exemple, pour les utilisateurs ou, plus tard, pour les avis.
‫Il ne serait pas très pratique de copier
‫le code à partir d'ici et de l'utiliser,
‫ensuite, dans les autres ressources, d'accord.
‫Et donc, ce que je vais
‫faire, c'est, maintenant, créer une classe dans laquelle je vais
‫ajouter une méthode pour chacune de ces fonctionnalités ou fonctionnalités d'API, comme vous
‫pouvez également les appeler.
‫D'accord?
‫Alors, allons-y et faisons-le ici et je vais
‫le faire ici, pour l'instant, puis, plus tard, je
‫vais en fait l'exporter dans son propre
‫fichier, essentiellement, pour créer un module réutilisable que nous
‫pouvons , plus tard, importer dans d'autres contrôleurs.
‫D'accord?
‫Alors, classe, et je l'appelle APIFeatures.
‫D'accord.
‫Ensuite, nous commençons par notre fonction constructeur et
‫rappelons-nous que c'est la fonction
‫qui est automatiquement appelée dès que nous créons un
‫nouvel objet à partir de cette classe, d'accord.
‫Maintenant, qu'est-ce que je veux réellement dans ces fonctionnalités d'API ?
‫En fait, je vais analyser deux variables ici, d'accord ?
‫Donc la requête mangouste et aussi la queryString que nous
‫obtenons d'express.
‫Donc, en gros, venant de la route, d'accord.
‫C'est donc ce à quoi nous avons
‫généralement accès dans le req. requête, d'accord.
‫Maintenant, encore une fois, je passe la requête ici parce que
‫je ne veux pas interroger à l'intérieur de cette classe car cela renverrait
‫alors cette classe à la ressource de tournée mais, encore une
‫fois, je veux que cela soit aussi réutilisable que possible.
‫D'accord.
‫Donc, ce que nous faisons habituellement dans cette
‫fonction constructeur, c'est de dire ceci. la requête est égale à la requête que nous
‫avons reçue en argument, puis celle-ci. queryString
‫est égal à queryString.
‫D'accord?
‫Donc fonction constructeur très simple et très typique.
‫Et maintenant, comme je l'ai mentionné, je vais
‫créer une méthode pour chacune des fonctionnalités, en commençant par filter.
‫D'accord.
‫Et donc, allons-y maintenant et coupons le code à partir d'ici.
‫Ou, en fait, je vais le copier et
‫les commenter, afin de ne pas causer de dommages accidentels.
‫Alors, copiez et
‫commentez et mettez-le ici.
‫Donc, quelques choses que nous devons changer.
‫Tout d'abord, demande. la requête ne sera pas disponible à
‫l'intérieur de cette classe.
‫Et donc, c'est pourquoi nous avons en fait analysé dans le queryString.
‫Et donc, ceci ici va être remplacé
‫par ceci. chaîne de requête.
‫D'accord?
‫Donc, encore une fois, il ne s'agit que de Javascript de base.
‫N'a en fait rien à voir avec Note ou Express.
‫Alors le reste ici va bien, mais ici ça ne va pas du tout.
‫Donc, je ne veux pas interroger la visite directement ici, rappelez-vous, mais à la
‫place, je veux simplement ajouter maintenant cette recherche
‫à la requête que nous avons déjà.
‫Donc ça. mettre en doute. trouver
‫et ainsi, ce sera alors ceci.
‫D'accord?
‫Débarrassons-nous maintenant de ça.
‫Et avant d'ajouter d'autres méthodes ici, allons de l'avant
‫et utilisons cette classe juste pour que cela
‫ait plus de sens pour vous.
‫D'accord?
‫Alors, comment cela va-t-il réellement fonctionner ?
‫Et je vais tout faire ici à la
‫fin ici sous Execute Query.
‫D'accord?
‫Et donc, ce que je peux faire maintenant, c'est créer
‫une variable appelée Fonctionnalités, par exemple.
‫Et puis à partir de là, je vais créer un nouvel objet de fonctionnalités API.
‫D'accord?
‫Donc, en gros, créer une instance de ces fonctionnalités d'API
‫qui seront ensuite stockées dans Features.
‫Et ceci ici, nous aurons alors accès à toutes
‫les méthodes que nous allons définir dans la définition de classe.
‫D'accord?
‫Alors, rappelez-vous, ici, nous devons passer une requête
‫et le queryString.
‫Alors, la requête, comment en créer une ?
‫Rappelez-vous, c'est Tour. trouve.
‫Donc, il y a un objet de requête et donc, c'est celui
‫que nous avons analysé dans cette classe et ensuite, bien
‫sûr, le queryString qui est req. mettre en doute.
‫Bon, maintenant, sur ces fonctionnalités ici, rappelez-vous, nous
‫n'avons pas accès au filtre.
‫Et donc, mettons-le juste ici après.
‫Donc, . filtre.
‫Donnez-lui une sauvegarde.
‫Et donc, juste comme ça, nous allons
‫exécuter ou coder pour la fonctionnalité de filtrage de l'API.
‫Ensuite, ici, la ligne suivante ne
‫fonctionnera bien sûr pas car cette
‫requête ici n'existe plus.
‫Au lieu de cela, ce que nous avons maintenant, ce sont des fonctionnalités. requête, non?
‫Donc, après tout ce traitement maintenant, en gros.
‫D'accord, donc, maintenant, après ce filtre, ceci. requête aura alors
‫cette nouvelle méthode de recherche dessus.
‫D'accord, et donc, encore une fois, cela est ensuite stocké dans this. mettre en doute.
‫Et, plus tard, nous aurons toutes ces autres méthodes qui,
‫toutes, manipuleront cela. requête de sorte
‫que, à la fin, this. query est la
‫requête que nous voulons exécuter.
‫Alors, comme ici.
‫D'accord, comme ici, nous avons toujours continué à manipuler la
‫variable de requête.
‫Nous avons continué à y ajouter de plus en
‫plus de méthodes jusqu'à ce que nous l'exécutions à la fin.
‫Et donc, ici, nous faisons exactement la même chose.
‫Nous déplaçons simplement le code dans toutes ces méthodes.
‫D'accord?
‫Puis, à la fin, comme je l'ai dit, la requête va être
‫stockée à l'intérieur de cette propriété ici et donc, oui, c'est là
‫que nous, ensuite, faisons l'attente
‫et récupérons les résultats.
‫D'accord?
‫Quoi qu'il en soit, continuons d'avancer ici et implémentons le tri.
‫Donc, je copie et commente.
‫Alors, filtrez et le suivant s'appelle Trier.
‫D'accord.
‫Et donc, là encore, il faut remplacer request. requête avec
‫ceci. queryString, d'accord.
‫Et puis, la requête est maintenant celle-ci. mettre en doute.
‫Mettons-nous donc ces quatre là-dedans. mettre en doute.
‫Bon, maintenant, le but ici est
‫essentiellement d'enchaîner ces méthodes ici l'une après l'autre.
‫Alors laissez-moi vous montrer cela ici.
‫Nous avons donc un filtre puis, après cela, nous
‫voulons enchaîner la méthode de tri.
‫Maintenant, pour le moment, cela ne
‫fonctionnera pas vraiment, car où enchaînons-nous réellement ce genre?
‫Donc, fondamentalement, nous essayons de l'appeler sur le résultat de ceci mais, en
‫ce moment, quel est le résultat de cela ?
‫Eh bien, ce n'est pas vraiment n'importe quoi parce
‫que cette méthode de filtrage ici ne renvoie rien, n'est-ce pas ?
‫Maintenant, ce morceau de code ici, bien
‫sûr, renvoie l'objet qui vient d'être créé et nous pouvons
‫donc chaîner la méthode de filtrage sur celui-ci.
‫Mais la méthode de filtrage, à son tour, ne renvoie rien.
‫Et donc, à ce stade, on ne peut pas vraiment appeler un
‫tri sur l'objet, non ?
‫Et donc, la solution simple
‫à cela, et peut-être l'avez-vous déjà fait plus tôt dans votre
‫code, est que nous devons maintenant renvoyer ceci.
‫Alors, retournez ceci et c'est simplement l'objet entier, d'accord ?
‫Et la même chose, alors, ici-bas.
‫Alors, retourne ça.
‫Afin, encore une fois, de renvoyer l'intégralité de l'objet qui, bien entendu,
‫a alors accès à ces autres méthodes pour qu'on
‫puisse, ensuite, les y appeler.
‫D'accord?
‫Donc, la prochaine étape est la limitation.
‫Et je vais appeler celui-ci limitFields.
‫Et c'est parce que
‫toutes ces méthodes auront ces verbes comme noms.
‫C'est donc filtrer, trier, limiter, et la pagination
‫sera la suivante.
‫Donc, encore une fois, req. requête est maintenant ceci. queryString et requête
‫ici est maintenant ceci. mettre en doute.
‫D'accord?
‫Renvoyez ceci et ce n'est pas correct.
‫Bon, et enfin, la pagination.
‫Copiez, commentez.
‫Alors, paginer.
‫Renvoyez ceci et, bien sûr, nous devons
‫remplacer ces req. interroger ceci.
‫chaîne de requête.
‫Et puis ici, comme avant, ça
‫va être ça. mettre en doute.
‫Et je viens de réaliser que là-haut, juste
‫dans la première méthode, nous ne l'avons pas fait ici.
‫Donc, nous avons simplement dit ceci. requête, puis
‫a ajouté la recherche là-bas.
‫Mais alors, bien sûr, nous
‫devons l'enregistrer dans cette propriété de requête.
‫D'accord, et donc, j'ai oublié ça.
‫Et nous avons une erreur ici.
‫Très bien, cela n'a pas vraiment
‫d'importance ici en ce moment.
‫Ou, en fait, c'est parce que cette ligne de code ici
‫est en fait dans notre méthode de pagination.
‫Alors allons-y.
‫Et, en fait, je voulais vraiment
‫vous en parler ici.
‫Car, à bien y réfléchir, demander la page suivante,
‫qui a un résultat nul, n'est pas vraiment une erreur.
‫Le fait qu'il n'y ait pas de résultats suffit
‫pour que l'utilisateur se rende compte que, fondamentalement, la page qui a été
‫demandée ne contient aucune donnée.
‫Nous n'avons donc pas vraiment besoin d'une erreur dans cette situation.
‫Et donc, je vais juste aller de l'avant et supprimer tout ce code.
‫D'accord?
‫Alors laissez-moi l'enregistrer maintenant ici.
‫Et maintenant, bien sûr, l'erreur a disparu.
‫Et ici, nous devons également continuer à
‫ajouter ces autres méthodes.
‫Ainsi, limitFields et . paginer.
‫Sauvegardez-le et, encore une fois, rappelez-vous que tout ce chaînage ici
‫ne fonctionne que parce qu'après avoir
‫appelé chacune de ces méthodes, nous le retournons toujours.
‫Et c'est l'objet lui-même qui a accès à
‫chacune de ces méthodes ici,
‫permettant de les enchaîner comme nous l'avons ici.
‫Bon, juste pour récapituler :
‫nous créons un nouvel objet de la classe de fonctionnalités de l'API.
‫Là, nous analysons un objet de
‫requête et la chaîne de requête provenant d'express.
‫D'accord?
‫Ensuite, dans chacune de ces quatre méthodes ici
‫que nous appelons l'une après l'autre, nous manipulons essentiellement la requête.
‫Nous continuons d'y ajouter plus de méthodes, comme nous
‫l'avons fait ici avant de procéder à cette refactorisation, n'est-ce pas.
‫Donc, nous continuons à ajouter des éléments à la requête ici jusqu'à la
‫fin, puis, à la fin, nous attendons simplement le résultat de
‫cette requête afin qu'elle puisse revenir avec tous les documents
‫qui ont été sélectionnés, d'accord ?
‫Et cette requête réside maintenant dans les
‫fonctionnalités qui sont cet objet ici.
‫Donc fonctionnalités. mettre en doute.
‫D'accord, j'espère que ça a du sens.
‫Donc, avant de faire quoi que ce soit d'autre, revenons à
‫Postman et essayons réellement.
‫Et nous pouvons l'essayer ici avec cet itinéraire top 5
‫bon marché parce que, en fait,
‫dans les coulisses, utilise toutes ces fonctionnalités d'API, n'est-ce pas.
‫Donc, si je l'envoie, eh bien, ça marche toujours.
‫Alors c'est fantastique.
‫Alors fermons-le et permettez-moi de le sauvegarder ici.
‫Alors, obtenez les cinq meilleurs circuits bon marché.
‫Et oui, je vais en rester là à la fin.
‫Et maintenant, juste ici, faisons quelques tests.
‫Par exemple, supprimez le tri, laissez-moi laisser la limite.
‫Difficulté, durée, prix.
‫Donc, je vais laisser tout cela
‫ici juste pour voir si cela fonctionne toujours.
‫Et il semble que tout fonctionne encore, n'est-ce pas.
‫Ce sont donc exactement les mêmes résultats que
‫nous avons obtenus avant notre refactorisation.
‫Alors, super, parfait.
‫Cela a fonctionné et donc, supprimons maintenant tout
‫ce code d'ici qui rend notre gestionnaire de route
‫tellement plus propre, n'est-ce pas ?
‫Alors, c'est tellement mieux, vraiment, c'est le jour et la nuit.
‫D'accord?
‫Maintenant, la prochaine étape est de
‫prendre tout ce code, de le couper et de le mettre dans
‫un nouveau fichier, donc un nouveau module, en gros.
‫D'accord, et pour cela, je vais créer un nouveau dossier
‫ici que je vais appeler Utils.
‫Donc, cela signifie, fondamentalement, les services publics.
‫Et je vais ajouter quelques trucs ici sur
‫le reste du cours.
‫D'accord?
‫Celui-ci
‫s'appellera donc APIFeatures. js et avec un F majuscule ici.
‫D'accord?
‫Alors, voici notre classe et, à la fin,
‫nous faisons un module. exportations de cette classe.
‫Donc rien de nouveau pour le moment.
‫Sauvegardez-le, fermez-le, et maintenant,
‫ici, nous pouvons en avoir besoin.
‫Les caractéristiques de l'API Const sont alors requises.
‫Ensuite, nous devons déplacer un dossier
‫vers le haut, puis dans Utils et APIFeatures.
‫D'accord?
‫Encore un essai.
‫Et ça prend du temps, et c'est parti.
‫Magnifique, c'est vraiment tout simplement magnifique.
‫Maintenant, si nous créons à nouveau une autre ressource, par
‫exemple, pour les utilisateurs, il sera si
‫facile d'ajouter cette même fonctionnalité.
‫Tout ce que nous allons avoir à faire est de demander ce fichier,
‫puis, en gros, de faire la même chose qu'ici.
‫Ou peut-être, dans ce cas, nous ne voulons même
‫pas avoir cette capacité de tri ou nous ne voulons pas avoir
‫la capacité de filtrage et ensuite, tout ce que nous avons à faire
‫est de simplement retirer cette ligne de code.
‫Et puis, comme par magie, il
‫ne fera que ces
‫trois fonctionnalités ou ces trois fonctionnalités, d'accord.
‫Et donc, c'est vraiment super.
‫J'espère que vous pouvez voir
‫la valeur de cela et, oui, je suis vraiment content de ce résultat.