‫Instructor: En
‫este video, crearemos una función de fábrica de
‫controladores para eliminar documentos de revisión,
‫pero también documentos de todas las demás colecciones,
‫todo con una función simple.
‫Entonces, como mencioné al principio de esta sección, agregar
‫controladores muy similares a todos nuestros controladores creará
‫una gran cantidad de código duplicado, ¿verdad?
‫Debido a que todos estos controladores
‫de actualización, o todos
‫estos controladores de eliminación, o todos
‫estos controladores de creación, realmente todos se ven básicamente iguales, ¿verdad?
‫Además, imagine que quisiéramos cambiar como
‫un código de estado https o un mensaje de estado.
‫Luego tendríamos que ir a todos y cada uno de los
‫controladores y luego cambiar todos los controladores allí.
‫Entonces, en lugar de escribir manualmente todos estos controladores, ¿por
‫qué no simplemente crear una función de fábrica
‫que nos devolverá estos controladores?
‫Entonces, una función de fábrica es exactamente eso.
‫Es una función que devuelve otra función, y en
‫este caso nuestra función de controlador.
‫Entonces, para borrar, para crear, para actualizar
‫y también para leer recursos.
‫Está bien, y sé que todo este concepto puede ser un poco complejo de
‫entender, y esa es
‫la razón por la que dejé
‫esto para la última parte de este curso.
‫Pero ahora, creo que estás
‫listo para implementar este tipo de cosas.
‫Entonces, este tipo de lógica es lo
‫que todo desarrollador avanzado de JavaScript debería poder implementar,
‫y nuevamente creo que en este punto del curso
‫estás realmente listo para comenzar a usar un concepto avanzado
‫como este, de acuerdo.
‫Pero ya hablemos, déjame mostrarte cómo funciona
‫realmente usando el controlador de eliminación como primer ejemplo.
‫Entonces, en realidad, tenemos uno en el controlador de recorrido, así que
‫sigamos y copiemos ese, así que
‫elimine el recorrido.
‫Bien, lo copié básicamente como una
‫plantilla a seguir.
‫Así que creemos un nuevo archivo, y lo haré
‫en los controladores.
‫Muy
‫bien, manejador ...
‫fábrica. js.
‫Y estoy haciendo esto en la carpeta de
‫controladores, bueno porque las funciones que vamos a
‫escribir aquí básicamente devolverán controladores.
‫Entonces, para mí, tiene mucho sentido que
‫los pongas aquí.
‫Así que copiemos esta
‫parte aquí, solo para mantenerla como referencia.
‫Entonces, nuevamente, el objetivo aquí es básicamente crear una función,
‫que luego devolverá una
‫función que se parece a esta aquí.
‫Pero, por supuesto, no solo para
‫el recorrido, sino para cada modelo que tenemos en nuestra
‫aplicación y que podríamos tener en el futuro.
‫Entonces, esta función debe estar preparada
‫para eso, y lo que eso significa es que dentro de la
‫función de fábrica, pasaremos el modelo, de acuerdo.
‫Así que llamemos a este deleteOne.
‫Y se llama así, nuevamente, porque
‫esta función no solo va
‫a funcionar para eliminar recorridos,
‫sino también para eliminar reseñas y usuarios y en
‫el futuro algunos otros documentos que
‫también podamos tener.
‫Entonces, como decía al
‫principio, pasaremos el modelo a esta función.
‫Entonces pasamos el modelo y luego creamos una nueva función, y esa función de
‫inmediato devolverá nuestra función asíncrona,
‫así que básicamente todo esto o la función de
‫controlador asíncrono.
‫Bien, y ahora todo lo que tenemos que hacer
‫es cambiar realmente del modelo de herramienta específico al modelo más genérico.
‫Entonces aquí también cambiaremos esto de tour al documento porque, nuevamente,
‫no sabremos qué tipo de documento es este.
‫Por lo que esta función no sabrá realmente si se trata de un recorrido,
‫si se trata de una reseña o de un usuario.
‫Así que tenemos que sacar la gira de todo esto,
‫y eso es todo.
‫Así que esta es básicamente la
‫generalización de esta función específica, que solo funcionaba para recorridos, y ahora
‫esta nueva funciona para todos los modelos.
‫Lo que también debemos hacer aquí es importar este catchAsync y
‫también este AppError.
‫Así que catchAsync ...
‫y creo que está en la carpeta de utilidades.
‫Y luego, no AppError sino catchAsync.
‫Luego, duplique esto
‫aquí, AppError, y esto aquí está en mayúsculas.
‫Déjelo guardar, y ahora estamos listos
‫para probarlo.
‫Así es como va a funcionar, en
‫primer lugar tenemos que importar esa fábrica de manipuladores.
‫Y digamos,
‫y simplemente lo llamaré fábrica aquí.
‫Así que require, y está en la misma carpeta, así que
‫handler factory.
‫Muy bien y comentemos esto aquí, o en realidad no
‫todo esto.
‫Sí, o en realidad podemos comentarlo,
‫y las nuevas exportaciones. elimina el recorrido será ...
‫fábrica. deleteOne y luego pase el modelo,
‫que es tour.
‫Y eso es todo, eso es todo lo que tenemos que hacer.
‫Entonces, para recapitular muy rápidamente aquí,
‫llamamos a esta función deleteOne, luego
‫pasamos el modelo, y lo
‫que sucederá es que esta función devolverá
‫de inmediato esta función de controlador que
‫teníamos antes.
‫Simplemente el modelo específico, que antes era el tour,
‫ahora será reemplazado por el que
‫pasamos a la función.
‫Y, por cierto, esto funciona debido a los cierres de
‫JavaScript, que es solo una forma elegante de
‫decir que esta función interna aquí tendrá acceso a las
‫variables de la función externa
‫incluso después de que la externa ya haya regresado.
‫Entonces, llamar a esta función aquí
‫devolverá otra función, que luego
‫se sentará aquí y esperará hasta que finalmente se
‫llame tan pronto como lleguemos a la ruta correspondiente.
‫Y ahora intentemos exactamente eso.
‫Así que elimine el
‫recorrido, está bien, y elijamos un
‫recorrido que realmente no necesitemos aquí por ahora.
‫Así que digamos ...
‫ahora digamos aquí The
‫Snow Adventurer porque tampoco tiene reseñas.
‫Así que enviemos eso, oh,
‫y ahora no tenemos permiso para realizar la acción,
‫y eso es porque no estamos conectados como administradores.
‫Intentémoslo, y este
‫es el administrador al que debemos iniciar sesión.
‫Bien, eso está hecho.
‫Y ahora esto debería funcionar, y de hecho funcionó.
‫Y eso es una prueba de que nuestra función de fábrica
‫realmente está haciendo su trabajo.
‫Está bien, porque si ahora regresa
‫aquí, obtuvimos 10 resultados y ahora solo obtendríamos nueve, tan
‫perfecto.
‫Y ahora el objetivo es poder usar esto en todos
‫y cada uno de los controladores.
‫Copiemos esto aquí y vayamos
‫a las reseñas.
‫Ah, y por
‫supuesto que lo necesitamos aquí, al principio,
‫ahora bien, y ahora exportar. deleteReview es igual a
‫la fábrica. deleteOne con
‫el modelo de revisión.
‫Y eso es todo, eso es
‫todo lo que necesitamos hacer para implementar el controlador de eliminación.
‫Ahora, por supuesto, también necesitamos especificar el controlador de ruta.
‫Ahora, por supuesto, necesitamos especificar la ruta en sí,
‫así que hagámoslo aquí también.
‫Entonces enrutador. route porque aquí
‫realmente necesitamos el parámetro ID.
‫Y ahora eliminar es simplemente reviewController. deleteReview, y no estoy jugando con el
‫permiso aquí, ni con la autenticación porque por ahora
‫solo quiero hacer que
‫esto funcione y preocuparme por esas
‫cosas un poco más adelante en esta sección.
‫Bien, cerremos esto de aquí.
‫Así que obtenga todas
‫las
‫reseñas, de acuerdo, guardemos esta y esta también.
‫De modo que ahora podemos comenzar con una hoja en
‫blanco aquí y comencemos por obtener todas las revisiones,
‫de modo que ahora podamos eliminar una.
‫Y entonces eliminemos, bueno, solo este.
‫Bien, ahora también necesitamos, por supuesto,
‫esto, y luego el método de eliminación http.
‫No necesitamos autorización en este
‫momento, así que enviémosla.
‫Y de hecho no hay contenido, así que 204.
‫Y si ahora obtenemos todas las
‫revisiones, entonces deberíamos volver a tener solo tres.
‫Sí, eso funciona, así que pasemos al siguiente.
‫De acuerdo, reseñas, reseñas.
‫Consigamos esta línea de código aquí y ahora finalmente agréguela
‫también al controlador de usuario.
‫Está bien, y por supuesto todo esto, entiendo que ahora
‫es un poco confuso jugar con todos estos
‫archivos diferentes, pero solo
‫tenemos que hacerlo una vez y luego terminamos con
‫toda esa confusión.
‫Entonces aquí ya teníamos la exportación. deleteUser, ahora
‫todo lo que tenemos que hacer es llamar a nuestra función de fábrica,
‫así que deleteOne y luego el usuario.
‫Ahora, solo el administrador debería poder eliminar
‫usuarios más adelante porque recuerde que cuando el usuario
‫se elimina a sí
‫mismo, en realidad no se eliminarán, sino que
‫solo los activos se establecerán en falso.
‫Pero el administrador, por otro lado,
‫realmente podrá eliminar al usuario de manera efectiva de la
‫base de datos.
‫Pero, de nuevo, nos vamos a
‫preocupar por el tema de los permisos un poco más tarde.
‫Por ahora, verifiquemos en userRoutes si la ruta
‫está realmente implementada,
‫y sí, está aquí abajo.
‫Y como ahora implementamos
‫esto, también probémoslo aquí nuevamente también en Postman.
‫Así que primero salvemos este.
‫Entonces...
‫elimine la revisión,
‫y ahora simplemente copiemos esto en
‫otra ruta.
‫Así que elimine y luego un usuario,
‫pero en realidad no lo voy a hacer ahora.
‫Todo lo que quiero es obtener una identificación aleatoria.
‫O en realidad, simplemente creemos un nuevo usuario,
‫así que básicamente regístrese y luego elimine ese de inmediato.
‫Así que hola, así.
‫Obtenga todos los usuarios, y luego está este tipo aquí.
‫Y entonces eliminémoslo de inmediato, entonces
‫enviamos, obtenemos 204 sin contenido.
‫Y, por supuesto, ahora debería irse.
‫Ahora, si intentamos volver a
‫verla, básicamente tratando de eliminar un
‫usuario que ya no está, deberíamos obtener un error.
‫Así que echemos un vistazo, y de hecho no se encontró
‫ningún documento con esa identificación.
‫Y esto significa que en nuestra
‫función de fábrica, aquí mismo, todo esto, AppError y catchAsync, todo
‫eso sigue intacto.
‫Así que todo sigue funcionando igual que antes.
‫Ahora, eso también fue importante para probar aquí.
‫Guardemos esto rápidamente aquí también, de
‫modo que todos y cada uno de los puntos finales
‫que estamos implementando, también
‫los agregaré aquí en Postman porque un poco
‫más tarde podremos crear realmente documentación de
‫API basada en todos los esto que hemos guardado aquí en Postman.
‫Esa es otra característica útil de esta aplicación.
‫Así que hemos eliminado el
‫usuario actual, y nuevamente eso es diferente de simplemente
‫eliminar el usuario porque este aquí es para
‫administración y este es para el usuario que está conectado
‫actualmente, muy diferente.
‫De acuerdo, esta fue nuestra primera función de fábrica solo
‫para eliminar y solo para que usted comprenda
‫el concepto en sí.
‫A continuación, implementaremos funciones de
‫fábrica para actualizar y crear documentos.