Contenido del curso
Comenzando con Sails
Setup de Espacio de Trabajo
CRUD
- 10

Entendiendo operaciones CRUD
05:09 min - 11

Crear modelo de rodada
07:43 min - 12

Crear app de Ionic
11:41 min - 13

Obtener todas las Rodadas: preparando la aplicación para mostrar datos
14:51 min - 14

Obtener todas las Rodadas: mostrando los datos
14:25 min - 15

Crear Rodada: recibiendo parámetros desde la URL
12:28 min - 16

Crear Rodada: enviando información desde el formulario
12:41 min - 17

Actualizar Rodada
12:16 min - 18

Eliminar Rodadas
04:54 min
Autenticación y Usuarios
Sistemas Externos
- 26

Uso de JSON Web Token
10:22 min - 27

Policies: verificar si usuario está loggeado
11:53 min - 28

Agregar usuario a Ride
Viendo ahora - 29

Preparando la App para implementar el Login y Sign up
11:01 min - 30

Implementando Login
15:04 min - 31

Implementando Sign up
09:35 min - 32

Agregar puntos de Rodada
15:20 min - 33

Obtener API Keys para Clima y Distancias
00:56 min - 34

Integración Google Geocoding: definiendo la lógica
14:56 min - 35

Integración Google Geocoding: probando la funcionalidad
06:14 min - 36

Integración Weather API
13:04 min - 37

Desplegar clima, distancia y tiempo en cada punto de Rodada
06:08 min
Cierre
Agregar usuario a Ride
Resumen
Cuando trabajamos con aplicaciones que manejan autenticación mediante JSON Web Token, uno de los pasos más importantes es vincular la información del usuario autenticado con los registros que este crea. Esto no solo mejora la trazabilidad de los datos, sino que también aporta seguridad al permitir que otros usuarios sepan exactamente quién generó cada registro antes de interactuar con él.
¿Por qué es importante asignar el usuario creador a cada registro?
En el contexto de una aplicación de rodadas para motociclistas, saber quién creó cada rodada es fundamental. Si el capitán del club publica una rodada, los miembros pueden confiar en la ruta y el punto de encuentro. Pero si un usuario desconocido crea una rodada en un lugar sospechoso a una hora inusual, los demás pueden decidir no asistir [0:30].
Este principio aplica a cualquier aplicación donde los usuarios generan contenido: siempre conviene asociar el creador al registro para dar contexto y confianza.
¿Cómo sobreescribir el método create en el controlador de Sails.js?
Sails.js ofrece el Blueprint API, que genera automáticamente los métodos CRUD sin necesidad de escribir código. Sin embargo, cuando necesitamos agregar lógica adicional, como inyectar el usuario autenticado, debemos definir manualmente el método que queremos personalizar [1:30].
¿Qué estructura tiene el método create personalizado?
El método debe llamarse exactamente create para que Sails sepa cuál de los métodos generados automáticamente debe reemplazar. Los demás métodos como update, delete o get siguen funcionando sin cambios [2:00].
javascript async create(req, res) { try { const params = req.allParams(); const ride = await Ride.create({ title: params.title, start: params.start, end: params.end, waypoints: params.waypoints, user: req.user }).fetch(); return res.ok(ride); } catch (error) { return res.serverError(error); } }
Es importante notar la diferencia entre params y req.user. Todos los atributos propios de la rodada se extraen de req.allParams(), mientras que el usuario se obtiene directamente de req.user [3:45].
¿De dónde viene req.user?
El objeto req.user se establece en el policy de autenticación. Este policy valida el token JWT y, al final del proceso, agrega el ID del usuario al objeto req antes de pasarlo al controlador [4:20]. Es decir, el flujo es:
- El policy verifica el token.
- Extrae la información del usuario.
- Asigna
req.usercon el ID correspondiente. - Llama a
next()para continuar hacia el controlador.
¿Cómo configurar la asociación en el modelo de Sails.js?
Al intentar guardar un campo user en el modelo Ride sin haberlo definido, Sails no lo reconocerá. Es necesario agregar una asociación en el modelo [5:15].
Dentro de Sails, los primitivos son atributos directos del objeto, como title, start, end y waypoints. Son propiedades que pertenecen exclusivamente a ese registro. En cambio, el usuario que crea la rodada puede crear múltiples rodadas, por lo que no es un atributo primitivo sino una asociación [5:40].
javascript // api/models/Ride.js module.exports = { attributes: { title: { type: 'string' }, start: { type: 'string' }, end: { type: 'string' }, waypoints: { type: 'json' }, user: { model: 'user' } } };
La clave está en usar model: 'user' en lugar de type. Sails interpreta esta configuración y automáticamente relaciona cada ride con el modelo User, resolviendo la referencia al consultar los datos [6:10].
¿Qué resultado obtenemos al consultar las rodadas?
Después de reiniciar el servidor con la opción Alter y crear una nueva rodada con el token de un usuario autenticado, al consultar todos los rides, Sails no solo devuelve el ID del usuario sino el objeto completo [7:00]. Esto significa que podemos mostrar el correo electrónico u otros datos del creador directamente en la interfaz.
- El ride incluye todos sus atributos primitivos.
- El campo
usercontiene el objeto completo del usuario asociado. - Se puede mostrar nombre, correo y cualquier dato disponible en el modelo User.
Un buen ejercicio para reforzar este conocimiento es agregar los campos name y lastName al modelo de usuario, de modo que al crear una rodada esa información quede disponible. Comparte cómo lo implementaste en los comentarios.