Cada una de estas acciones puede emparejarse con una URL como ésta:
router.get('/some_url', yourAction);
Pero no vamos a centrarnos en las URL sino sólo en las acciones, aquí está el índice:
Siempre debemos empezar con validaciones, la mejor forma de notificar un error de validación al usuario es lanzando excepciones como esta:
1if(something_wrong) throw new Exception("Message to the user")
Este es el ejemplo de creación de un usuario:
1export const createUser = async (req: Request, res:Response): Promise<Response> =>{ 2 3// validaciones importantes para evitar errores ambiguos, el cliente necesita entender qué ha fallado 4if(!req.body.first_name) throw new Exception("Please provide a first_name") 5if(!req.body.last_name) throw new Exception("Please provide a last_name") 6if(!req.body.email) throw new Exception("Please provide an email") 7if(!req.body.password) throw new Exception("Please provide a password") 8 9const userRepo = getRepository(Users)// para manipular usuarios necesito el repositorio de usuarios 10// buscar cualquier usuario con este email 11const user = await userRepo.findOne({ where: {email: req.body.email }}) 12if(user) throw new Exception("User already exists with this email") 13 14const newUser = getRepository(Users).create(req.body); //Crear el nuevo usuario basado en el cuerpo json entrante 15const results = await getRepository(Users).save(newUser); //confirmar en la base de datos 16return res.json(results); 17}
De forma muy similar a la creación de usuarios, necesitamos empezar con las validaciones y luego proceder a actualizar el usuario:
1export const updateUser = async (req: Request, res:Response): Promise<Response> =>{ 2 const userRepo = getRepository(Users) // Necesito el userRepo para gestionar usuarios 3 4 // encontrar usuario por id 5 const user = await userRepo.findOne(req.params.id); 6 if(!user) throw new Exception("Not User found"); 7 8 // mejor fusionar, asi podemos hacer actualizacion parcial (solo un par de propiedades) 9 userRepo.merge(user, req.body); 10 const results = await userRepo.save(user); // commit to DB 11 return res.json(results); 12}
1export const deleteUser = async (req: Request, res: Response): Promise<Response> =>{ 2 const users = await getRepository(Users).delete(req.params.id); 3 return res.json(users); 4}
Obtener un único usuario es sencillo utilizando findOne, pero lo bueno es que también puedes recuperar los planets de usuarios pasando un segundo parámetro a la función findOne. { relations: ["planets"] }
Nota: hay otras formas de buscar, puedes leer más sobre buscar aquí.
1export const getUser = async (req: Request, res: Response): Promise<Response> =>{ 2 3 // podemos pasar un segundo parámetro al findOne con las relaciones extra que necesitamos 4 const user = await getRepository(Users).findOne(req.params.id, { relations: ["planets"] }); 5 if(!user) throw new Exception("User not found", 404) 6 7 return res.json(user); 8}
Similar a la búsqueda de un solo usuario, pero usamos la función find
en lugar de findOne
.
1export const getUsers = async (req: Request, res: Response): Promise<Response> =>{ 2 const users = await getRepository(Users).find(); 3 return res.json(users); 4}
Es muy similar a actualizar cualquier otro usuario, la diferencia es que podemos obtener el ID del usuario actual usando req.user.id
.
1export const updateCurrentUser = async (req: Request, res:Response): Promise<Response> =>{ 2 const userRepo = getRepository(Users) // I need the userRepo to manage users 3 4 /** 5 * Podemos adivinar el usuario actual a partir de la autenticación, más información sobre esto aquí: 6 * get-the-authenticated-user 7 */ 8 if(!req.user) throw new Exception("No user was found on the session token") 9 const user_id = (req.user as ObjectLiteral).id 10 const user = await userRepo.findOne(user_id); 11 if(!user) throw new Exception("User not found"); 12 13 // mejor que merge, así podemos hacer actualización parcial (sólo un par de propiedades) 14 userRepo.merge(user, req.body); 15 const results = await userRepo.save(user); // commit to DB 16 return res.json(results); 17}