Gestión de Citas con Node.js y Express
Clase 28 de 30 • Curso de Backend con ExpressJS
Resumen
La creación de APIs robustas requiere una cuidadosa planificación de los puntos de acceso, especialmente cuando se trata de información sensible como citas médicas. En este artículo, exploraremos cómo implementar un endpoint que permita a los usuarios autenticados ver su historial de citas, garantizando la seguridad y privacidad de los datos mediante tokens de autenticación.
¿Cómo implementar un endpoint para listar citas de usuarios autenticados?
Cuando desarrollamos una API para gestionar citas, es fundamental considerar que un usuario podría tener múltiples citas en el sistema. Por lo tanto, necesitamos crear un punto de entrada específico que permita a cada usuario ver únicamente sus propias citas, manteniendo la información protegida mediante autenticación.
Para implementar esta funcionalidad, seguiremos estos pasos:
- Configurar la ruta en el router principal
- Crear el router específico para appointments
- Implementar el controlador
- Desarrollar el servicio que interactúa con la base de datos
- Probar la funcionalidad con Postman
Configuración de rutas para el acceso a citas
El primer paso es modificar nuestro archivo de rutas principal para incluir el nuevo recurso. Necesitamos agregar el router de appointments y vincularlo con la ruta de usuarios:
// En el archivo de rutas principal (index.js)
const appointmentsRouter = require('./appointments');
// Configuramos la ruta para que los usuarios puedan acceder a sus citas
router.use('/users', appointmentsRouter);
Ahora, debemos crear el archivo de rutas específico para las citas. Este archivo definirá los endpoints disponibles para gestionar las citas:
// En el archivo appointments.js
const router = require('express').Router();
const appointmentController = require('../controllers/appointmentController');
const authenticateToken = require('../middlewares/authenticate');
// Ruta para obtener las citas de un usuario específico
// Protegida con middleware de autenticación
router.get('/:id/appointments', authenticateToken, appointmentController.getUserAppointments);
module.exports = router;
Es crucial notar que hemos incluido el middleware de autenticación para garantizar que solo los usuarios autenticados puedan acceder a esta información. Esto protege la privacidad de los datos y evita accesos no autorizados.
Implementación del controlador para gestionar citas
El controlador actúa como intermediario entre las rutas y los servicios. Su función es recibir la solicitud, procesarla y devolver una respuesta adecuada:
// En appointmentController.js
const appointmentService = require('../services/appointmentService');
exports.getUserAppointments = async (req, res) => {
try {
const userId = req.params.id;
const appointments = await appointmentService.getUserAppointments(userId);
res.json(appointments);
} catch (error) {
res.status(500).json({ message: 'Error al obtener el historial de citas' });
}
};
El controlador extrae el ID del usuario de los parámetros de la solicitud, llama al servicio correspondiente y devuelve los resultados en formato JSON. En caso de error, responde con un código de estado 500 y un mensaje descriptivo.
Desarrollo del servicio para interactuar con la base de datos
El servicio contiene la lógica de negocio y se comunica directamente con la base de datos. Para nuestro caso, utilizaremos Prisma como ORM:
// En appointmentService.js
const prisma = require('../config/prisma');
exports.getUserAppointments = async (userId) => {
try {
const appointments = await prisma.appointment.findMany({
where: {
userId: parseInt(userId)
},
include: {
timeBlock: true
}
});
return appointments;
} catch (error) {
throw new Error('Error al obtener el historial de citas');
}
};
En este servicio:
- Utilizamos el método
findMany
de Prisma para buscar todas las citas asociadas al usuario - Convertimos el userId a entero con
parseInt
- Incluimos la relación
timeBlock
para obtener información adicional sobre cada cita - Devolvemos los resultados o lanzamos un error si algo falla
Pruebas con Postman
Para verificar que nuestro endpoint funciona correctamente, podemos utilizar Postman:
- Importar la colección de pruebas (disponible en la sección de recursos)
- Asegurarnos de tener un token válido de autenticación
- Configurar la solicitud GET a la ruta
/users/:id/appointments
- Incluir el token en el header de autorización
- Enviar la solicitud y verificar la respuesta
Si todo está configurado correctamente, deberíamos recibir un JSON con la lista de citas del usuario especificado.
¿Qué consideraciones de seguridad debemos tener en cuenta?
La seguridad es un aspecto fundamental cuando desarrollamos APIs que manejan información personal. Algunas consideraciones importantes son:
- Autenticación obligatoria: Como hemos implementado, es esencial que solo los usuarios autenticados puedan acceder a sus propias citas.
- Validación de permisos: Aunque no lo implementamos en este ejemplo, sería recomendable verificar que el usuario autenticado solo pueda ver sus propias citas, no las de otros usuarios.
- Sanitización de datos: Siempre debemos validar y sanitizar los datos de entrada para prevenir ataques como SQL Injection.
- Manejo de errores: Es importante proporcionar mensajes de error genéricos al cliente para no revelar detalles internos del sistema.
¿Cómo podemos extender esta funcionalidad?
Una vez implementado el endpoint básico para listar citas, podemos considerar varias mejoras:
- Agregar paginación para manejar grandes volúmenes de citas
- Implementar filtros por fecha, estado o tipo de cita
- Crear endpoints adicionales para crear, actualizar o cancelar citas
- Añadir notificaciones automáticas para recordatorios de citas
La implementación de un sistema de citas robusto requiere atención a estos detalles para proporcionar una experiencia completa y segura a los usuarios.
La creación de APIs bien estructuradas y seguras es fundamental para el desarrollo de aplicaciones modernas. Siguiendo los principios de diseño REST y aplicando buenas prácticas de seguridad, podemos construir sistemas confiables que protejan la información de nuestros usuarios mientras ofrecen funcionalidades completas. ¿Qué otras características consideras importantes para una API de gestión de citas? Comparte tus ideas en los comentarios.