‫Instructor: En
‫este video, implementaremos la página de mis reservas.
‫Entonces, básicamente, vamos a generar una bonita página
‫que contenga todos los recorridos que un usuario ha reservado.
‫Y comencemos agregando una nueva ruta a nuestras viewRoutes.
‫Bien, entonces me tenemos a mí y luego vamos
‫a crear los my-tours.
‫Así que estoy duplicando este, my-tours, entonces también esta ruta debe estar
‫protegida para que solo los usuarios
‫que hayan iniciado
‫sesión puedan acceder a esta página, por supuesto.
‫Y luego, en nuestro
‫viewsController, tendremos un controlador llamado getMyTours.
‫MyTours como este, ¿de acuerdo?
‫Y eso es todo por ahora,
‫así que sigamos adelante y creemos este controlador ahora.
‫Bien, tenemos todo esto aquí, haz un
‫recorrido, obtén el formulario de inicio de sesión, obtén una cuenta.
‫Pongamos este aquí también.
‫Y ahora, lo que tenemos que
‫hacer aquí es encontrar todos los tours que el usuario ha reservado.
‫Entonces, básicamente, primero tenemos que encontrar todas las reservas para los
‫usuarios que han iniciado sesión actualmente,
‫que luego nos darán un montón de ID de
‫tour, y luego tenemos que encontrar los tours con esos ID.
‫Entonces, básicamente, busque todas las reservas y luego
‫busque recorridos con las identificaciones devueltas.
‫Entonces, básicamente, los ID de las reservas para el usuario, ¿verdad?
‫Ahora, en cambio, también podríamos
‫hacer un llenado virtual en los recorridos, y
‫sería genial si implementara esto por
‫su cuenta exactamente como lo hemos hecho antes con los recorridos
‫y las reseñas, pero aquí, en
‫esta función, realmente quería para mostrarte cómo podemos hacerlo
‫manualmente porque creo
‫que eso también es algo importante y, en
‫realidad, una población virtual debería
‫funcionar de manera similar a lo que vamos a hacer aquí.
‫Y entonces ves que en realidad necesitamos dos
‫consultas para encontrar realmente los
‫recorridos correspondientes a las reservas del usuario.
‫De todos modos, comencemos ahora,
‫así que creemos una variable para todas las
‫reservas, espere y ahora creo que todavía no tenemos las reservas aquí, no.
‫Así que Bookings aquí y bookingModel.
‫Y aquí, por supuesto, es solo una reserva, de acuerdo.
‫Así que espera Booking. buscar, y ahora recuerde que
‫cada documento de reserva tiene una identificación de usuario, ¿verdad?
‫Entonces, aquí en el esquema, recuerde que
‫tenemos la identificación del recorrido, la identificación del
‫usuario y luego todos estos otros datos, así
‫que lo que vamos
‫a hacer ahora es básicamente consultar por la identificación del usuario, ¿de acuerdo?
‫Y entonces eso nos
‫devolverá todos los tours que pertenecen al usuario actual, ¿de acuerdo?
‫Entonces, este no.
‫Por lo tanto, el recorrido debe ser igual al req. usuario. identificación.
‫Luego, aquí async y, como siempre, también catchAsync.
‫Entonces, estas reservas ahora contienen todos los documentos
‫de reserva para el usuario actual, pero
‫en realidad eso solo nos da los ID del tour.
‫Y ahora queremos encontrar los recorridos con los ID devueltos.
‫Entonces, el siguiente paso es básicamente
‫crear una matriz de todas las ID,
‫y luego, después de esa consulta, para
‫los recorridos que tienen una de estas ID, ¿de acuerdo?
‫Y esto tendrá un poco más de
‫sentido una vez que implementemos lo que acabo de explicar.
‫Entonces, tourIDs es igual a reservas y ahora usaremos un mapa para
‫crear una nueva matriz basada
‫en una función de devolución de llamada que es
‫esta, por lo que
‫el actual el. excursión. identificación.
‫Entonces, ¿qué va a hacer esto?
‫Bueno, básicamente esto recorre toda la matriz de reservas y
‫en cada elemento tomará el. excursión.
‫Y de hecho, ni siquiera necesitamos la identificación
‫aquí porque la gira en sí ya es la identificación de la gira, ¿verdad?
‫Luego, al final, tenemos una buena matriz
‫con todos los ID de recorrido aquí y eso
‫es porque usamos un mapa.
‫De acuerdo, teniendo todas las identificaciones de
‫los recorridos, podemos obtener los recorridos correspondientes a esos identificadores.
‫Así que aguarda Tour. find y realmente queremos buscar por ID, pero
‫no podemos usar el. findbyid porque
‫aquí realmente necesitaremos un nuevo operador.
‫Y se llama a
‫dicho operador, que no estoy seguro si
‫hayamos usado antes.
‫Entonces, en tourIDs.
‫Entonces, básicamente, lo que va
‫a hacer esto es que seleccionará
‫todos los recorridos que tienen una ID que está en la matriz tourIDs, ¿de acuerdo?
‫Así que eso es
‫bastante sencillo, pero es muy bueno
‫saber que podemos usar este operador muy útil aquí, ¿de acuerdo?
‫Y esa es en realidad una de las
‫razones por las que quería hacer
‫esto manualmente en lugar de simplemente hacer un poblado virtual como lo hicimos antes.
‫Pero, de nuevo, sería bueno que siguiera adelante
‫e implementara eso también solo
‫por el gusto de hacerlo, ya sabe.
‫De acuerdo, y con esto
‫ya tenemos nuestros recorridos listos para ser renderizados.
‫Entonces, res. estado como
‫siempre, y luego renderizarlos, ¿de acuerdo?
‫Y de hecho, ni siquiera necesitamos una nueva plantilla para esto.
‫Simplemente vamos a reutilizar la descripción general, ¿de acuerdo?
‫Así que vamos a terminar
‫con una página que se parece mucho a
‫la descripción general, pero solo con los recorridos que el usuario ha reservado.
‫Entonces, aquí arriba y para tener
‫una visión general, pasamos todos los recorridos, ¿de acuerdo?
‫Así que básicamente todos ellos.
‫Y ahora, vamos a tener algo muy
‫similar pero, por supuesto, solo pasaremos en las giras reservadas.
‫Entonces, ¿dónde está eso?
‫Muy bien, entonces el título será Mis recorridos, y
‫de nuevo pasará la variable de recorridos.
‫Está bien y eso debería ser todo.
‫Ahora, por supuesto, también podríamos haber creado
‫una tarjeta completamente nueva para estas librerías con
‫información más relevante sobre
‫cada una de las reservas,
‫pero en este caso eso no es realmente importante.
‫¿Ahora a la derecha?
‫Entonces, estamos listos para
‫probar esto porque ya implementamos la ruta aquí antes.
‫Y así son mis recorridos.
‫Oh, pero en realidad establezcamos este enlace aquí en
‫la página de la cuenta de usuario.
‫Por lo tanto, estos my-tours deberían
‫tener su propio enlace aquí mismo en la cuenta.
‫Entonces, en esa columna
‫de la izquierda, está justo aquí en Mis reservas,
‫así que tenemos esta primera
‫aquí que es para el enlace, recuerde.
‫Y ahora mismo, básicamente, todos apuntan a ninguna parte, pero ahora
‫para las reservas tenemos un enlace.
‫Y así son mis recorridos.
‫Y podríamos haberlo llamado reservas también, pero eso
‫no es realmente importante de todos modos.
‫Entonces, ahora estamos listos para probar esto.
‫De hecho, cierre la sesión de
‫este usuario y luego inicie sesión como nuestro otro usuario, Laura.
‫Muy bien, y veamos qué obtenemos aquí y eso está
‫tomando demasiado tiempo, así que
‫echemos un vistazo a nuestro código, editemos nuestra terminal aquí.
‫De acuerdo, no hay ningún error aquí, pero también
‫parece que no está sucediendo nada aquí.
‫Así que la ruta my-tours aquí ni siquiera aparece, de acuerdo.
‫Ahora, para encontrar este
‫error, tuve que depurar un poco fuera de
‫este video porque era realmente difícil de encontrar, de acuerdo.
‫Primero, hay un pequeño error aquí.
‫Así que aquí debería ser usuario y no recorrido.
‫Entonces lo expliqué correctamente en ese
‫entonces, donde dije que necesitamos filtrar por el
‫usuario, entonces recorridos donde el usuario es
‫igual al usuario que proviene de la solicitud,
‫pero luego, por alguna razón, lo hice mal aquí, ¿de acuerdo?
‫Pero ese no es el error principal en realidad.
‫Así que no es el que impide que la página se cargue realmente.
‫El error que hace que eso
‫suceda está aquí, en realidad, en el modelo de reserva.
‫Y está aquí en este middleware previo a la búsqueda.
‫Y el problema
‫es que nunca llamamos al próximo middleware aquí, ahora, ¿verdad?
‫Entonces, nuevamente, este es un pre-middleware.
‫Y todos los pre-middlewares tienen acceso a la
‫siguiente función y, por lo tanto, al
‫final de estos middlewares, siempre tenemos
‫que llamar a next.
‫De lo contrario, nuestro proceso realmente se atasca, ¿de acuerdo?
‫Así que dale un guardado, realmente puede cerrar este.
‫Y ahora intentemos eso de
‫nuevo y ahora tenemos mis recorridos,
‫pero está vacío ya que este usuario nunca hizo una reserva.
‫Entonces, probemos eso ahora, y reservemos
‫al excursionista del bosque.
‫Así que eso debería seguir funcionando,
‫y de hecho lo hace, muy bien.
‫Tenemos la dirección de correo electrónico preformateada
‫y ahora, como siempre, 4242.
‫Así que hicimos la reserva antes en realidad con este
‫usuario, pero antes implementamos el modelo de reserva y,
‫por lo tanto, nunca
‫creamos realmente una reserva en nuestro sistema.
‫Muy bien, entonces el
‫pago aceptado y ahora veamos y aquí vamos, ¡genial!
‫Entonces, esa lógica que acabamos de implementar realmente funcionó y, por
‫lo tanto, el único problema
‫fue que faltaba el siguiente en el middleware.
‫Y así, completamos otra página de
‫nuestro sitio web dinámico.
‫A continuación, todo lo que queda por hacer en este punto
‫es finalizar la API de reservas.