‫-: Está bien.
‫Así que ahora creemos un nuevo documento de reserva en nuestra base de datos
‫cada vez que un usuario compre con éxito un tour.
‫Así que estamos de vuelta aquí en el
‫controlador de reservas y en
‫la licitación sin procesar, que crea las sesiones de pago, ¿verdad?
‫Y recuerde que aquí tenemos esta URL de éxito y
‫esta URL es la base de la funcionalidad que
‫vamos a implementar en esta lección.
‫Entonces, cada vez que un pago
‫se realiza correctamente, el navegador irá automáticamente a esta
‫URL, que en este momento es básicamente nuestra página de inicio, ¿verdad?
‫También es en este momento, por
‫lo que cuando un pago se realiza correctamente, queremos crear
‫una nueva reserva, ¿verdad?
‫Básicamente, queremos crear una nueva reserva
‫cada vez que se accede a esta URL.
‫Ahora podríamos crear una nueva ruta para este éxito, pero luego
‫tendríamos que crear una página completamente nueva y eso
‫no vale la pena en este caso.
‫Y eso es porque lo que vamos a hacer en
‫esta conferencia es solo una solución temporal
‫de todos modos porque no es realmente seguro, ¿de acuerdo?
‫Así que recuerde cómo dijimos hace algunas
‫conferencias y ese bonito diagrama de que más adelante,
‫cuando un sitio web se implemente en un servidor, obtendremos
‫acceso al objeto de sesión una vez que se
‫complete la compra utilizando Stripe Webhooks.
‫Entonces, estos webhooks serán perfectos para
‫que creemos una nueva reserva.
‫¿Okey?
‫Pero por ahora, dado que todavía no
‫podemos hacer eso, usemos una
‫solución alternativa, que es simplemente poner los datos que necesitamos
‫para crear una nueva reserva directamente en esta URL como una cadena de consulta.
‫¿Okey?
‫Y necesitamos crear una cadena de consulta porque Stripe
‫solo hará una solicitud de obtención a esta URL aquí, por lo
‫que realmente no podemos enviar un cuerpo o cualquier dato con
‫ella, excepto la cadena de consulta.
‫¿Está bien?
‫Así que hagámoslo y lo que necesitamos aquí son básicamente los
‫tres campos obligatorios en nuestro modelo de reserva.
‫Tour,
‫usuario y precio.
‫Entonces el
‫tour
‫es igual a req.
‫params.
‫tourid ¿verdad?
‫Entonces, ¿qué hice aquí?
‫Entonces eso es correcto.
‫A continuación, necesitamos al usuario.
‫Entonces usuario, que está a
‫pedido. usuario. identificación.
‫Y finalmente necesitamos el precio,
‫que
‫está en gira. precio.
‫Está bien.
‫Ahora, como dije antes, esto,
‫por supuesto, no es seguro
‫en absoluto porque en este
‫momento cualquiera que conozca esta estructura de URL aquí
‫podría simplemente llamarla sin pasar por el proceso de pago, ¿verdad?
‫Entonces, cualquiera podría
‫reservar un recorrido sin tener que pagar.
‫Todo lo que tendrían que hacer es abrir esta URL
‫con el tour, el usuario y
‫el precio y luego crearían automáticamente una nueva reserva
‫sin siquiera pagar, ¿de acuerdo?
‫De nuevo, no es realmente seguro, pero
‫por ahora funciona bien
‫porque no mucha gente sabrá, por supuesto, que
‫esta es nuestra URL de éxito.
‫¿Okey?
‫Porque en realidad vamos a ocultar ese hecho
‫un poquito en un segundo, ¿de acuerdo?
‫Así que ahora creemos la función que realmente creará la nueva reserva en
‫la base de datos.
‫Así que eso va a exportar
‫dot create booking checkout
‫y se llama crear checkout de reserva porque más
‫adelante también tendremos crear
‫reserva, que luego será accesible
‫desde nuestra API
‫de
‫reservas.
‫Está bien.
‫De todas formas.
‫Aquí como siempre.
‫Y comencemos obteniendo nuestros datos de la cadena de consulta.
‫Y para eso voy a usar la estructuración.
‫Por
‫lo tanto, el tour,
‫el usuario y el precio están disponibles a pedido. consulta.
‫Así que recuerde que es la cadena de consulta.
‫Entonces, en realidad, solo queremos crear
‫una nueva reserva si se especifican todos estos aquí.
‫Básicamente, decimos que si no existen, pasamos al
‫siguiente middleware.
‫Entonces ese es nuestro procedimiento muy estándar, ¿verdad?
‫Por eso decimos
‫que si
‫no hay tour ni
‫usuario ni precio.
‫Entonces, básicamente, requerimos que existan todos en ellos.
‫Y entonces, en ese caso, pasamos al
‫siguiente middleware.
‫Ahora bien, ¿qué es exactamente el próximo middleware en realidad?
‫Bueno, recuerde que
‫queremos crear una nueva reserva en esta URL de inicio.
‫Así que este de aquí.
‫Porque, de nuevo, esa es la URL
‫a la que se llama cada vez que se realiza una compra con Stripe.
‫Entonces, lo que tenemos que hacer es agregar esta función de middleware que estamos
‫creando ahora en la pila de middleware de
‫este controlador de ruta.
‫Entonces, ¿qué controlador de ruta es ese?
‫Bueno, está en las rutas de la
‫vista y es esta, ¿verdad?
‫Así que probablemente suene un poco confuso.
‫Pero nuevamente, esta es la ruta
‫que se tomará cuando se cargue con éxito una tarjeta de crédito.
‫Y este es también el momento en el que queremos crear una
‫nueva reserva.
‫Y aquí es donde necesitamos agregar
‫esa función de middleware, así que hagámoslo
‫y solicitemos nuestro controlador
‫y ahora lo duplicaremos aquí.
‫Entonces, el controlador de
‫reservas y ahora editaré aquí desde el principio porque realmente no importa
‫si estamos conectados o no para esto.
‫Así que bookingcontroller. get, o en
‫realidad dot create
‫bookingcheckout.
‫Dale una oportunidad y
‫está bien.
‫Y nuevamente, esto es algo temporal
‫hasta que realmente tengamos nuestros sitios
‫web implementados en
‫un servidor donde podamos crear una mejor solución para esto.
‫¿Okey?
‫Así que aquí, en el controlador de
‫reservas, es el momento de crear esa nueva reserva.
‫Entonces, en realidad, ahora necesitamos importar ese modelo.
‫Así que hagámoslo aquí.
‫Modelo de
‫reserva y reserva aquí también.
‫Y por alguna razón aquí tengo estos extraños caminos.
‫Entonces estos no tienen ningún sentido en absoluto.
‫No estoy seguro de por qué los escribí así en ese entonces.
‫Entonces, lo que tenemos allí es exactamente lo mismo que esto.
‫Pero, por supuesto, esto es más legible.
‫De todas formas.
‫Creemos ahora esa reserva.
‫Y para eso tendremos que
‫esperar a la reserva. crear con un
‫objeto
‫de recorrido, usuario y precio.
‫Y eso es.
‫Ahora también debemos marcar este
‫aquí como asíncrono y, como
‫siempre, catchasync.
‫¿Okey?
‫Y no estamos guardando bien
‫esto en ninguna variable porque realmente no lo necesitamos.
‫No vamos a devolver esto como una respuesta de la API.
‫En este punto, todo lo que queremos hacer aquí es
‫crear ese nuevo documento, ¿de acuerdo?
‫A
‫continuación, podríamos decir siguiente, así.
‫Y entonces iría al
‫siguiente middleware, pero eso no es realmente ideal.
‫De nuevo, tenga en cuenta que el siguiente middleware en
‫la pila es, por supuesto, este y
‫la descripción general de get.
‫Básicamente, la función
‫que va a representar nuestra página.
‫Pero recuerda que esta URL es todo esto.
‫Entonces todo esto con todos estos datos aquí.
‫Y, de nuevo, eso no es seguro en absoluto.
‫Así que al menos hagámoslo
‫un poco más seguro, ¿de acuerdo?
‫Entonces, lo
‫que podemos hacer aquí es básicamente redirigir la
‫aplicación ahora solo a esta URL.
‫Básicamente, está eliminando la
‫cadena de consulta de la URL original.
‫Y, de hecho,
‫ahora vamos a usar algo que nunca usamos antes.
‫Entonces eso es genial, ¿verdad?
‫Entonces usaremos redireccionamiento.
‫¿Está bien?
‫Entonces, ahora lo que
‫queremos es la URL completa, pero sin la cadena de consulta.
‫Entonces, lo que podríamos hacer
‫es hacer una
‫especie de trampa y copiar esto aquí.
‫Pero hagámoslo un poco más elegante.
‫Entonces, lo que estamos haciendo es una solicitud. theoriginalurl, que ya usamos
‫antes.
‫Y esa es la URL completa
‫básicamente de la que proviene la solicitud.
‫Y ahora lo que
‫tenemos que hacer es dividirlo por el signo de interrogación.
‫¿Derecha?
‫Porque ese es el divisor entre la parte que realmente
‫queremos y la cadena de consulta.
‫Entonces, si dividimos esto por el signo de interrogación,
‫entonces tendremos una matriz donde el primer
‫elemento es este y el segundo elemento es todo el resto.
‫Entonces, la propia cadena de consulta.
‫Y aquí
‫tomamos el primer elemento y esa es nuestra página de inicio.
‫Entonces nuestra URL de ruta.
‫Y lo que hace la redirección aquí es básicamente crear una nueva
‫solicitud pero a esta nueva URL que pasamos allí.
‫¿Está bien?
‫Así que esto ahora creará
‫otra solicitud a nuestra URL de ruta.
‫Así que volveremos a tomar esta ruta.
‫Y así, una vez más, llegaremos a este middleware aquí.
‫Entonces el que estamos creando.
‫Entonces, por segunda vez, vamos a lograr eso, pero ahora el recorrido, el usuario y el precio
‫ya no están definidos.
‫Y entonces iremos al siguiente middleware, que finalmente es la función
‫del controlador de
‫obtención de información general, que luego representaremos la página de inicio, ¿de acuerdo?
‫¿Tuvo sentido?
‫Entonces esto es algo circular.
‫Así que básicamente al
‫principio vamos a tomar esta ruta aquí.
‫Luego, se crea una nueva
‫reserva aquí y redirigimos la aplicación nuevamente a
‫esta ruta, esta vez sin la cadena de consulta.
‫Y así,
‫sin la cadena de consulta y este
‫middleware, pasamos directamente al siguiente.
‫Y solo entonces llegamos
‫a iniciar sesión y obtener una descripción general.
‫¿Está bien?
‫Y eso es todo, ¿de acuerdo?
‫Bueno, eso es justo aquí
‫que esto es solo temporal
‫porque no es seguro.
‫Todo el mundo puede hacer reservas
‫sin pagar.
‫De nuevo, eso sería terrible para el negocio.
‫Bien, ahora es el momento de probar esto.
‫Y, en realidad, quiero hacerlo con ese otro usuario que creamos que es
‫jonas @ mailsac.
‫Y eso es
‫porque quiero ver si realmente recibimos ese recibo por correo electrónico de Stripe.
‫Así que
‫iniciemos sesión con ese usuario en nuestro sitio web.
‫Así
‫que cierre la sesión.
‫Bueno, eso no está funcionando.
‫Eso es raro.
‫Recarguemos.
‫Y eso debería estar funcionando, así que veamos si tenemos algún error
‫en nuestro javascript.
‫Porque eso es realmente de cara al cliente y obtenemos
‫que Stripe no está definido.
‫Veamos si tenemos el mismo error aquí en
‫esta página, que no deberíamos, ¿verdad?
‫Y en
‫realidad no está allí, sino en todas las giras.
‫Sí, está ahí.
‫Entonces, la solución es moverlo
‫del recorrido básicamente a todas las páginas.
‫¿Está bien?
‫Entonces, por alguna razón, el empaquetador de paquetes
‫lo hace, por lo que debe estar aquí en el alcance
‫principal para todos ellos.
‫Entonces, para todas las páginas, ¿de acuerdo?
‫De hecho, pongámoslo en la parte inferior, justo aquí,
‫antes de nuestro paquete.
‫¿Está bien?
‫Inténtelo de nuevo y ya estamos listos para comenzar.
‫Así
‫que cierre la sesión y funcionó.
‫Ahora inicie sesión.
‫Por supuesto, ahora nuestra copia se ha ido.
‫Uno dos tres CUATRO.
‫No, eso no es correcto.
‫Prueba uno dos tres cuatro.
‫Así que supongo que cambié la contraseña en algún momento, así
‫que intentemos una
‫nueva contraseña, que tampoco funciona.
‫Intentemos pasar uno, dos, tres, cuatro
‫y funcionó.
‫Así que no es la prueba uno, dos,
‫tres, cuatro, sino que pasa una, dos, tres, cuatro.
‫Al menos aquí en mi caso.
‫Así que intentemos reservar el, digamos, el amante
‫de los deportes.
‫Está bien.
‫Aquí abajo.
‫Reserve tour y eso
‫todavía funciona y ese es
‫el caro.
‫(risas) Entonces cuatro dos cuatro dos y
‫luego cuatro dos hasta
‫el final.
‫Entonces aquí hay un mes y aquí hay un número.
‫Digamos mi nombre completo
‫aquí y ahora hagamos clic en pagar.
‫Y echaré un vistazo a la barra de URL.
‫Y, de hecho, obtenemos nuestra página
‫de inicio, por lo que nuestra URL de ruta sin ninguna de las cadenas de consulta que especificamos antes.
‫Eso significa que algo está funcionando.
‫Así que echemos un vistazo a la brújula y haga clic aquí
‫para recargar y obtendremos nuestra colección de reservas.
‫Y esa es una buena señal.
‫Y de hecho aquí vamos.
‫Se crea nuestro primer documento.
‫Así que recuerda que ese era ese precio.
‫También echemos un vistazo a la identificación
‫del usuario, que es esta que termina en ocho E tres B.
‫Entonces ocho E tres B, eso es correcto.
‫Y supongo que la gira también será correcta.
‫Tan perfecto.
‫Eso también funcionó y, por lo tanto, ahora realmente tenemos
‫una forma de crear reservas cada
‫vez que ocurre una reserva con Stripe.
‫También revisemos rápidamente nuestros paneles aquí nuevamente.
‫Eso es muy divertido.
‫Y supongo que solo tengo que recargar aquí.
‫Así que veamos.
‫Aquí está jonas en lo que sea que nombramos.
‫Tenemos al amante
‫de
‫los deportes y perfecto.
‫Eso está funcionando ahora.
‫Y la tarea final.
‫Veamos ahora mailsac.
‫Saco de correo.
‫com y ver si recibí
‫mi correo electrónico allí.
‫Y bueno, en realidad no lo hice, pero
‫eso no es gran cosa.
‫No estoy seguro de que tal vez simplemente no funcione con datos de prueba.
‫Y por ahora eso es todo lo
‫que tengo que mostrarte sobre la integración de Stripe.
‫Ahora, nuevamente,
‫una vez que se implemente un sitio web, usaremos
‫Stripe Webhooks para
‫crear reservas de una manera más segura y mucho mejor.
‫¿Está bien?
‫Así que, de nuevo, tomemos un minuto para recapitular lo que hicimos aquí.
‫Básicamente, agregamos todas las
‫variables que necesitamos para crear una
‫nueva reserva a la URL de éxito.
‫Luego agregamos una nueva función de middleware
‫aquí a la pila de esa ruta exacta.
‫Así que este de aquí.
‫Y así,
‫siempre que se acceda a esta URL, intentaremos crear una nueva reserva.
‫¿Está bien?
‫Pero esa nueva reserva, por supuesto, solo se crea cuando el tour, el usuario y el
‫precio se especifican en la consulta.
‫Y así, en esta función de middleware, si se especifican
‫bien en la consulta, creamos una
‫nueva reserva aquí.
‫Luego, una vez hecho esto, eliminamos la cadena de consulta de la
‫URL para que todo el proceso sea un poco menos transparente para
‫el usuario.
‫Básicamente para que toda la cadena de
‫consulta no aparezca en la barra de URL de nuestro navegador.
‫Y luego aquí abajo redirigimos
‫nuestra aplicación a esta nueva URL de ruta aquí, ¿de acuerdo?
‫De esta manera, este middleware aquí se
‫omitirá y luego nuestra página de inicio normal simplemente se renderizará.
‫¿Está bien?
‫Eliminemos este error de la aplicación aquí
‫y la fábrica que realmente necesitaremos en la próxima conferencia.
‫Así que en la próxima conferencia
‫nos encargaremos de implementar una última pieza de nuestro sitio
‫web, que básicamente es esta página para mis reservas.
‫Y lo que hará esta página es básicamente mostrar una tarjeta de
‫tour para cada uno de los tours que hemos reservado.
‫Así que
‫parece bastante similar a esta página de inicio, pero solo con los
‫recorridos que el usuario que ha iniciado sesión actualmente ha reservado, ¿de acuerdo?
‫Entonces esa es una buena característica para un sitio web, ¿verdad?
‫Así que ocupémonos de eso en el próximo.