‫Instructor: En este video, quiero refactorizar
‫muy rápidamente las características de la API que hemos
‫implementado en las últimas conferencias.
‫Ahora, esto no es solo para hacer nuestro código un poco
‫más limpio, también es para hacerlo más modular y más reutilizable en
‫el futuro.
‫Entonces, ahora mismo, tenemos todo este código
‫para las características que construimos antes en esta función getALLTours, ¿verdad?
‫Y esto se ve un poco desordenado.
‫Es un poco difícil de entender, ¿de acuerdo?
‫Y también imagine que quisiéramos utilizar estas mismas funciones para
‫otro recurso.
‫Por ejemplo, para los usuarios o, posteriormente, para las reseñas.
‫No sería muy práctico, básicamente, copiar el
‫código de aquí y usarlo, luego,
‫en los otros recursos, ¿no?
‫Entonces, lo que voy a
‫hacer es, ahora, crear una clase en la que agregaré
‫un método para cada una de estas características o funcionalidades de la API,
‫como también podría llamarlas.
‫¿Está bien?
‫Entonces, sigamos adelante y hagamos eso aquí y
‫lo haré aquí, por ahora, luego, más adelante,
‫lo exportaré a su propio archivo,
‫básicamente, para crear un módulo reutilizable que podamos
‫, más tarde, importe a otros controladores.
‫¿Está bien?
‫Entonces, clase, y lo llamo APIFeatures.
‫Está bien.
‫Luego, comenzamos con nuestra función constructora y recordamos
‫que esta es la función
‫que se llama automáticamente tan pronto como creamos un
‫nuevo objeto fuera de esta clase, de acuerdo.
‫Ahora bien, ¿qué es lo que realmente quiero en estas funciones de API?
‫De hecho, voy a analizar dos variables aquí, ¿de acuerdo?
‫Entonces, la consulta de mangosta y también la queryString que obtenemos
‫de express.
‫Entonces, básicamente, viniendo de la ruta, está bien.
‫Así que eso es a lo que normalmente
‫tenemos acceso en el req. consulta, está bien.
‫Ahora, nuevamente, estoy pasando la consulta aquí porque no
‫quiero consultar dentro de esta clase porque luego rebotaría esta
‫clase en el recurso del recorrido pero, nuevamente, quiero
‫que esto sea lo más reutilizable posible.
‫Está bien.
‫Entonces, lo que solemos hacer en esta
‫función constructora es decir esto. consulta es igual a la consulta que obtuvimos
‫como argumento y luego esto. queryString
‫es igual a queryString.
‫¿Okey?
‫Una función constructora muy simple y muy típica.
‫Y ahora, como mencioné, voy a crear un
‫método para cada una de las funciones, comenzando con filter.
‫Está bien.
‫Y entonces, sigamos adelante y cortemos el código desde aquí.
‫O, en realidad, lo voy a copiar
‫y lo comentan, para que no haga ningún daño accidental.
‫Entonces, copie el
‫comentario y colóquelo aquí.
‫Entonces, un par de cosas que debemos cambiar.
‫Primero, solicítelo. La consulta no estará disponible dentro
‫de esta clase.
‫Y entonces, es por eso que en realidad analizamos en queryString.
‫Y entonces, esto de aquí será reemplazado
‫por esto. queryString.
‫¿Okey?
‫Entonces, nuevamente, esto es solo Javascript básico.
‫En realidad, no tiene nada que ver con Note o Express en absoluto.
‫Entonces el resto aquí está bien, pero esto aquí no está bien en absoluto.
‫Por lo tanto, no quiero consultar el recorrido directamente aquí, recuerde, sino
‫que simplemente quiero agregar este hallazgo a
‫la consulta que ya tenemos.
‫Así que esto. consulta. encontrar
‫y entonces, eso será esto.
‫¿Está bien?
‫Ahora, deshagámonos de esto.
‫Y antes de que agreguemos más métodos aquí, sigamos
‫adelante y usemos esta clase solo para que
‫esto tenga más sentido para usted.
‫¿Okey?
‫Entonces, ¿cómo va a funcionar esto realmente?
‫Y lo voy a hacer todo aquí al
‫final aquí en Ejecutar consulta.
‫¿Está bien?
‫Entonces, lo que puedo hacer ahora es crear
‫una variable llamada Características, por ejemplo.
‫Y luego, desde aquí, crearé un nuevo objeto de características de API.
‫¿Okey?
‫Entonces, básicamente, crear una instancia de las características de esta API
‫que luego se almacenarán en Características.
‫Y esto aquí, entonces tendremos acceso a todos los
‫métodos que vamos a definir en la definición de la clase.
‫¿Okey?
‫Entonces, recuerde, aquí, debemos pasar una consulta
‫y la queryString.
‫Entonces, la consulta, ¿cómo creamos una?
‫Recuerda, es Tour. encontrar.
‫Entonces, hay un objeto de consulta y ese es el
‫que analizamos en esta clase y luego, por supuesto,
‫el queryString que es req. consulta.
‫Bien, ahora, en estas características aquí, recuerde,
‫no tenemos acceso al filtro.
‫Entonces, pongámoslo aquí después.
‫Tan, . filtrar.
‫Dale una oportunidad.
‫Y así, así, vamos a ejecutar
‫o codificar la funcionalidad de filtrado de API.
‫Entonces, aquí, la siguiente línea es, por
‫supuesto, no va a funcionar porque esta
‫consulta aquí ya no existe.
‫En cambio, lo que tenemos ahora son características. consulta, ¿verdad?
‫Entonces, después de todo este procesamiento ahora, básicamente.
‫Bien, ahora mismo, después de este filtro, esto. La consulta
‫tendrá este nuevo método de búsqueda.
‫De acuerdo, de nuevo, esto se almacena en este. consulta.
‫Y, más adelante, tendremos todos estos otros métodos que, todos
‫ellos, lo manipularán. consulta para
‫que, al final, este. query es la
‫consulta que queremos ejecutar.
‫Así que, como aquí.
‫Bien, al igual que aquí, siempre seguimos manipulando la
‫variable de consulta.
‫Seguimos agregando más y más métodos
‫hasta que, luego, lo ejecutamos al final.
‫Y aquí, estamos haciendo exactamente lo mismo.
‫Simplemente estamos moviendo el código a todos estos métodos.
‫¿Okey?
‫Luego, al final, como dije, la consulta se almacenará dentro
‫de esta propiedad aquí y, sí, ahí es donde nosotros, entonces,
‫hacemos la espera y
‫recuperamos los resultados.
‫¿Está bien?
‫De todos modos, sigamos moviéndonos aquí e implementemos la clasificación.
‫Entonces, estoy copiando y comentando.
‫Entonces, filtra y el siguiente se llama Ordenar.
‫Está bien.
‫Entonces, aquí nuevamente, necesitamos reemplazar la solicitud. consulta con
‫esto. queryString, está bien.
‫Y luego, la consulta es ahora esto. consulta.
‫Así que pongamos estos cuatro en esto. consulta.
‫Bien, ahora, el objetivo aquí es
‫básicamente encadenar estos métodos aquí uno tras otro.
‫Déjame mostrarte eso aquí.
‫Así que tenemos filtro y luego, después de eso,
‫queremos encadenar el método de clasificación.
‫Ahora, en este momento, eso no va
‫a funcionar realmente porque ¿a dónde estamos encadenando realmente este tipo?
‫Entonces, básicamente, estamos tratando de basarnos en el resultado de esto, pero
‫ahora mismo, ¿cuál es el resultado de esto?
‫Bueno, en realidad no es nada porque
‫este método de filtro aquí no devuelve nada, ¿verdad?
‫Ahora, este fragmento de código aquí, por
‫supuesto, devuelve el objeto que se acaba de crear y, entonces,
‫podemos encadenar el método de filtro en eso.
‫Pero el método de filtro, a su vez, no devuelve nada.
‫Y entonces, en este punto, realmente no podemos llamar a una
‫ordenación en el objeto, ¿verdad?
‫Entonces, la solución simple para eso,
‫y tal vez lo haya hecho antes en algún momento de su
‫código, es que ahora tenemos que devolver esto.
‫Entonces, devuelva esto y esto es simplemente el objeto completo, ¿de acuerdo?
‫Y lo mismo, entonces, aquí abajo.
‫Entonces, devuelve esto.
‫Para, nuevamente, devolver el objeto completo que, por supuesto, luego
‫tiene acceso a estos otros métodos para que
‫podamos, luego, llamarlos allí.
‫¿Está bien?
‫Entonces, el siguiente es el límite.
‫Y voy a llamar a este campo limitFields.
‫Y eso es porque
‫todos estos métodos tendrán estos verbos como nombres.
‫Entonces es filtrar, ordenar, limitar y el paginado
‫será el siguiente.
‫Entonces, nuevamente, req. consulta es ahora esto. queryString y query
‫aquí es ahora esto. consulta.
‫¿Está bien?
‫Devuelve esto y esto no es correcto.
‫De acuerdo, y finalmente, la paginación.
‫Copiar, comentar.
‫Entonces, pagina.
‫Devuelva esto y, por supuesto, debemos
‫reemplazar estos req. consulta esto.
‫queryString.
‫Y luego aquí, como antes, va
‫a ser esto. consulta.
‫Y me acabo de dar cuenta de que
‫allí arriba, en el primer método, no hicimos esto aquí.
‫Entonces, simplemente dijimos esto. consulta y
‫luego agregó el hallazgo allí.
‫Pero luego, por supuesto, necesitamos
‫guardarlo en esta propiedad de consulta.
‫Está bien, y entonces, me olvidé de eso.
‫Y tenemos un error aquí.
‫Muy bien, eso realmente no importa
‫aquí en este momento.
‫O, en realidad, lo hace porque esta línea de código aquí
‫está realmente en nuestro método de paginación.
‫Así que vayamos allí.
‫Y, de hecho, quería hablarte
‫de esto aquí.
‫Porque, si lo piensas bien, solicitar la siguiente
‫página, que tiene resultado cero, no es realmente un error.
‫El hecho de que no existan resultados es suficiente
‫para que el usuario se dé cuenta de que, básicamente, la página
‫solicitada no contiene ningún dato.
‫Entonces, realmente no necesitamos un error en esta situación.
‫Y entonces, continuaré y eliminaré todo este código.
‫¿Okey?
‫Así que déjame guardarlo ahora aquí.
‫Y ahora, por supuesto, el error se ha ido.
‫Y aquí, también tenemos que seguir agregando
‫estos otros métodos.
‫Entonces, limitFields y. paginar.
‫Guárdelo y, nuevamente, recuerde que todo este encadenamiento aquí solo
‫funciona porque después de llamar a
‫cada uno de estos métodos, siempre devolvemos esto.
‫Y este es el objeto en sí que tiene acceso
‫a cada uno de estos métodos aquí,
‫lo que hace posible encadenarlos como lo tenemos aquí.
‫Bien, entonces, solo para recapitular:
‫estamos creando un nuevo objeto de la clase de características API.
‫Allí, estamos analizando un objeto de consulta
‫y la cadena de consulta que proviene de express.
‫¿Okey?
‫Luego, en cada uno de estos cuatro métodos
‫aquí que llamamos uno tras otro, básicamente, manipulamos la consulta.
‫Seguimos agregando más métodos al igual que lo
‫hemos estado haciendo aquí antes de hacer esta refactorización, ¿verdad?
‫Entonces, seguimos agregando cosas a la consulta aquí hasta el final,
‫y luego, al final, simplemente esperamos el resultado de esa
‫consulta para que pueda regresar con todos los documentos
‫que se seleccionaron, ¿de acuerdo?
‫Y esa consulta ahora vive en características
‫que son este objeto aquí.
‫Entonces características. consulta.
‫Está bien, espero que tenga sentido.
‫Entonces, antes de hacer cualquier otra cosa, volvamos a
‫Postman y probémoslo.
‫Y podemos probarlo aquí mismo con esta ruta Top-5-barata
‫porque, en realidad, detrás de
‫escena, usa todas estas características de API, ¿verdad?
‫Entonces, si lo envío, bueno, todavía funciona.
‫Entonces eso es fantástico.
‫Así que ciérrelo y déjeme guardarlo aquí.
‫Entonces, obtenga los cinco mejores tours baratos.
‫Y sí, lo dejaré ahí al final.
‫Y ahora, justo aquí, hagamos algunas pruebas.
‫Por ejemplo, elimine la ordenación, déjeme dejar el límite.
‫Dificultad, duración, precio.
‫Entonces, voy a dejar todo
‫esto aquí solo para ver si todavía funciona.
‫Y parece que todo sigue funcionando, ¿no?
‫Estos son exactamente los mismos resultados que
‫obtuvimos antes de nuestra refactorización.
‫Entonces, genial, perfecto.
‫Eso funcionó y, por lo tanto, eliminemos todo este código
‫de aquí, lo que hace que nuestro controlador de ruta sea
‫mucho más limpio, ¿no es así?
‫Entonces, eso es mucho mejor, de verdad, es de día y de noche.
‫¿Okey?
‫Ahora, el siguiente paso es realmente
‫seguir adelante y tomar todo este código, cortarlo y ponerlo en un
‫nuevo archivo, así que básicamente es un nuevo módulo.
‫De acuerdo, y para eso, voy a crear una nueva carpeta
‫aquí a la que llamaré Utils.
‫Eso significa, básicamente, servicios públicos.
‫Y voy a agregar un par de cosas aquí
‫durante el resto del curso.
‫¿Okey?
‫Entonces este
‫se llamará APIFeatures. js y con una F mayúscula aquí.
‫¿Está bien?
‫Entonces, aquí va nuestra clase y, al
‫final, hacemos un módulo. exportaciones de esta clase.
‫Entonces, nada nuevo en este momento.
‫Guardarlo, cerrarlo y
‫ahora, aquí, podemos solicitarlo.
‫Const APIFeatures luego requieren.
‫Luego, debemos mover una carpeta
‫hacia arriba, luego a Utils y APIFeatures.
‫¿Okey?
‫Una prueba más.
‫Y está tomando algo de tiempo, y aquí vamos.
‫Hermoso, eso es realmente hermoso.
‫Ahora, si volvemos a crear otro recurso, por ejemplo,
‫para los usuarios, será muy fácil
‫incorporar esta misma funcionalidad.
‫Todo lo que tendremos que hacer es solicitar este archivo y
‫luego, básicamente, hacer lo mismo que aquí.
‫O tal vez, en ese caso, ni siquiera
‫queremos tener esta capacidad de clasificación o no queremos tener la
‫capacidad de filtrado y luego, todo lo que tenemos que hacer
‫es simplemente eliminar esta línea de código.
‫Y luego, como por arte de
‫magia, solo hará estas
‫tres funcionalidades o estas tres características, está bien.
‫Y eso es realmente genial.
‫Espero que puedas ver el
‫valor de esto y, sí, estoy muy contento con este resultado.