Continuamos. Esta parte va a ser ya el cierre de lo que es la creación del usuario y la verificación del mismo. Después le vamos a agregar algún otro método extra como recuperación de "password" o reenvÃo de "token". Pero ahora vamos a terminar con esta creación. Hay bastante código asà que, lo que preferirÃa hacer, para no hacer tan largo el tutorial, ya lo escribà prácticamente todo y vamos a ir comentando las partes que sean relevantes. Hay otras que te voy a dejar como recurso adjunto para que te lo descargues, ya que no tiene mucho sentido que te pongas a hacerlo vos. No es tanto parte del aprendizaje que me interesa que tengan ahora. Para comenzar, en la carpeta de "views" agregué una carpeta que es "usuarios". FÃjate que tiene tres vistas: "create", "index" y "update". La parte del "create" tiene la tÃpica página de creación, similar a lo que era la "bicicletas", con un formulario que pide nombre, "email", "password", confirmar "password". Esto lo vas a ver vos después y, en todo caso, podés hacer pruebas y revisar lo que está. Quizás, como nota de color, cuando recibimos al usuario, que le ponemos el valor en el campo, acá accedemos también al objeto "errors", ahora te voy a mostrar cómo se llama, que este objeto es el que nos devuelve Mongoose en el caso de haber un error en la operación. Entonces, el objeto de "errors" va a tener una propiedad por cada uno de los campos que obtiene un error, a su vez da el mensaje de error, también. Y entonces, si aparece la propiedad "nombre", vamos a agregarle la clase "is-invalid", y si no, no le ponemos nada. Esto es para que lo marque en rojito y te pone algunos estilos identificando que hay un error. Entonces, acá de vuelta preguntamos, si "nombre" aparece en la lista de errores, que escriba el mensaje de error de esa propiedad. Lo mismo para el "email", lo mismo para "password". Acá, aparece confirmar "password", que éste, si bien no es parte del modelo, lo usamos para verificar que la persona haya ingresado el "password" correcto, o sea, que las dos veces que haya tipeado sea lo que quiso tipear, el tÃpico formulario. El "index" no tiene mucho para revisar y el "update" es similar al "create", solamente que le dejamos la parte de nombre para cambiar. PodrÃamos haberle agregado "password" y algún otro valor más, pero, para simplificar, dejamos solamente "nombre". Entonces, tenemos los usuarios, vamos a ver las rutas de usuarios. Acá, lo que le agregamos es..., trajimos el "controller", que ahora lo vamos a repasar, listar usuarios, el "create", "update" y "delete". No hay mucha ciencia en esto y vamos a ver, ahora sÃ, el "controller". Entonces, el "controller" es bastante simple, excepto un único método que nos vamos a detener ahÃ, en breve. El listado, traemos toda la lista de usuarios. El "update_get", traemos al usuario por el "Id" que nos pasan, "rendereamos" la vista y pasamos el objeto de "errors", en este caso, sin nada. Lo pasamos, más que nada, como la vista requiere que esté este objeto, se lo pasamos vacÃo, ya que no hay errores, o sea, un objeto sin propiedades. Le pasamos el usuario. Y fijate acá, cuando hacemos el "update", directamente aprovechamos y usamos este método de Mongo que es "findByIdAndUpdate", es decir, "busca y actualiza". Recibe, por primer parámetro, el "Id" del objeto. Luego, le pasamos un objeto con clave valor, o sea, propiedad de valor del modelo "usuario", que se va actualizar. En este caso, va a ser solamente "nombre". Acá podrÃamos pasarle todos los valores que nos interesen. Si hay un error, lo mostramos en la consola y después "rendereamos" la misma vista con el objeto de "errors". E inicializamos. Fijate que no lo persistimos, pero inicializamos usuario. ¿Para qué? Para que ya aparezcan precargados los datos del formulario. Fue eso que pusimos con "value" en cada uno de los componentes HTML. Si está todo bien, redirigimos a la lista de usuarios. "Create_get" es similar a lo que era antes el "password", solamente que, al "update", perdón; solamente que aquà vamos a verificar, si el "password" y el "confirm password" son distintos, no hacemos nada, cortamos ahà el flujo y mostramos la misma vista, pasándole el objeto "errors" que acá lo armamos nosotros. Especificamos el "Id" del modelo en HTML, que es "confirm_password" y el mensaje esperado. No nos coincide con el "password" ingresado y lo pasamos de vuelta al usuario que nos envió. Si esto está todo bien, hacemos el "create" directamente. Y el "delete" es un "delete". Acá fijate esto, esto es lo que le incorporamos de distinto. En caso que el "create" sea exitoso, vamos a enviarle un "email" de bienvenida a nuestro usuario. Veamos qué hace este "email" de bienvenida. Vamos a ir a modelo. Aquà sÃ, ya le agregamos este nuevo método, "enviar email de bienvenida". ¿Qué es lo que vamos a hacer? Apenas empezamos aquÃ, vamos a crear un "token". Fijate que le especificamos el "user Id", y el "token", usamos una librerÃa que es "crypto", que la incorporamos arriba, "crypto", con el "require". No hace falta instalarla porque viene en el "node_modules". Creamos, con una "crypto", una "string" en "hexa" de este tamaño, y esto es lo que vamos a definir como "token". Hasta aquÃ, creamos el "token" en memoria, todavÃa no lo persistimos. Creamos una constante, un literal, "email_destination", con el "email" que corresponde al usuario. Ahora sÃ, vamos a persistir, hacemos "token.save". Este "save", le pasamos como "callback" una función que recibirÃa el error, en caso de que exista, y es lo que consultamos aquà y lo vamos a loguear en consola. Enseguida, lo que vamos a hacer es configurar las opciones del "mail" para mandarle, justamente esto que veÃamos antes, un "email" al usuario con las instrucciones de verificación de su cuenta. Entonces, le ponemos en el "from", acá le podés poner lo que vos quieras, no hace falta que exista esta cuenta, "no-reply", el tÃpico "mail" de contacto, "@redbicicletas.com". El "to", ponemos el "email" del usuario. El "subject", "verificación de cuenta". Y en el texto le ponemos un texto que sea representativo: "Hola, por favor, para verificar su cuenta haga clic en este "link". Le ponemos aquà el "host", es decir, dónde es la URL base del proyecto. En este caso, "local host", lo estamos probando local. Acá ponemos una ruta que, ésta la creamos nueva, ahora la vemos, "/token/confirmation", y objeto "token", "punto", valor "token", que es este "crypto" que generamos aquÃ. ¿Por qué se genera un "crypto" y no un "Id" o algo por el estilo? Para no brindar una información que le facilite después a un posible intruso o atacante. Por ejemplo, si hubiéramos hecho el "token", en vez de estar encriptados, serÃan todos números enteros consecutivos, alguien podrÃa probar confirmar cuentas generando posteos a esta URL con una sucesión de números. Entonces, al usar una clave cifrada no está implÃcita una correlación entre los números o una consecución entre números, sino que realmente es una clave que es muy difÃcil de duplicar o de robar, o de tratarla sin conocerla. Finalmente, con "mailer", fijate que "mailer" es el objeto que traemos con el "require" al "mail", el que configuramos recién, en el video anterior. Lo que hacemos directamente es enviar el "mail", ponemos en las opciones el objeto que configuramos antes. Acordate que esto es asincrónico, asà que, si hay un error, se va a loguear por consola y el método va a finalizar. Si no, directamente por consola, a modo de referencia, vamos a ponerlo en español: "Se ha enviado un email de bienvenida a:", y el "email" de nuestro usuario. Nos quedaba revisar solamente el "controller" de "token". FÃjate que estamos configurando acá lo que es el "callback" de la confirmación del "token". Lo que hacemos básicamente es usar el "findOne", buscame el primero que encuentres que tenga como valor de "token", el "token" de parámetro. Si no hay ningún "token", devolvemos "status(400)". No se pudo verificar la cuenta y un mensaje: "No encontramos un usuario con este "token", quizás haya expirado, solicÃtelo nuevamente". Si lo encontramos, hacemos un usuario "findById", y acá accedemos al valor del "userId" que está adentro de "token". Nos traemos al usuario y, en el caso de que el usuario no exista, "400", "no encontramos un usuario con este token". Si el usuario está verificado, le hacemos un "redirect" a la lista de usuarios directamente. En cualquier otro caso, ponemos en "true" la variable de usuario verificada, la propiedad de verificado, y guardamos al usuario y lo redirigimos a la "home". Vamos, si te parece, a repasarlo. Perdón, por último me queda mostrarte el "router" de "token", "confirmation", parámetro "token", y vamos al "controller" de "token". En el "app", lo que hicimos fue agregar la ruta de "token", la ruta de usuarios que la tenÃamos previamente, le cambiamos el nombre nomás, y listo. Acá está "usuarios" y "tokenRouter". Ahora sÃ, repasamos todo. Vamos a probarlo. El servidor está corriendo. Vamos a ir a "usuarios", estos son los usuarios, vamos a crear uno nuevo. Ponerle "test10@gmail.com", es cualquier "email" de prueba. "Password, "okey". No, que no nos grabe la clave. Ya el usuario está creado, no está verificado. Este es el "Id". Lo siguiente que vamos a hacer es ir a "ethereal.email". Yo ya me logueé, voy a loguearme de vuelta para que veas cómo lo hacemos. Fijate que tenemos acá el "Login". Lo que vamos a hacer es ir a la configuración del "mail" que acá lo tenÃamos. Nos logueamos con el "email" y clave que definimos cuando creamos la cuenta, que nos genera automáticamente. Que nos recuerde, "Log in". "Not now". Vamos a mensajes, acá hay varios que estuve probando antes. Fijate que acá aparece el "email" que se envió recién. "Verificación de cuenta". Fijate que podés ver directamente cómo queda el "email". Esto está bueno para practicar bastante. Después, podés hacer público esta URL de este mensaje, por si querés compartir con otro cómo estás definiendo un "email" de bienvenida o un "email" de "newsletter" o de notificaciones, y demás. Muy práctico porque acá esto es muy simple, pero después podés trabajarlo como si fuera una página "web" y definir un diseño, un formato lindo, y quizás te interese compartirlo para validarlo. Aquà tenemos el "link" de confirmación, fijate que acá está el "token". "Click" ahÃ, y ya nos mandó a la "home". Vamos a ver cómo quedó la parte de usuarios. Fijate que recargamos la página y ya apareció como verificado. Con esto hicimos, ya, un flujo entero de registración de usuario, de creación de usuario, mejor dicho, y de verificación vÃa "mail". Con lo cual, ya tenemos certeza de que el usuario "test10" puede tener acceso a su cuenta. Por supuesto que esto es un entorno local. Al resto de los pasos los iremos viendo en próximos tutoriales. Vamos a continuar ahora con el "Login". Ya tenemos usuarios, tenemos la verificación. Ahora falta autorizarlos para que accedan y poner ciertas restricciones a nuestro sitio para que sólo accedan usuarios registrados.