- 1

Desarrollo de APIs REST con ExpressJS y Node.js
06:11 - 2

Gestión de Versiones y Configuración de Node.js con NVM
12:20 - 3

Configuración y uso de variables de entorno en Node.js
05:45 - 4

Configuración de Body Parser en Express para APIs RESTful
10:34 - 5

Procesamiento de Formularios y JSON con Body Parser
08:28 - 6

Creación y Configuración de Workspaces en Postman para API Testing
06:29
Administración de Bloques de Tiempo en Aplicaciones Web
Clase 24 de 30 • Curso de Backend con ExpressJS
Contenido del curso
- 7

Construcción de una API RESTful con Express.js y métodos HTTP
05:20 - 8

Lectura y Escritura de Archivos en Node.js con FS y Path
08:25 - 9

Creación de Usuarios con Método POST en Node.js
08:16 - 10

Actualización de Usuarios con Node.js y Express
10:52 - 11

Validaciones en POST y PUT para Datos de Usuario en APIs
06:51 - 12

Eliminar Usuarios en un CRUD usando Node.js y Express
07:39
- 21

Organización y estructuración de aplicaciones Node.js con Express
15:16 - 22

Separación de controladores y servicios en Node.js
22:58 - 23

Modelado de Citas Médicas con Prisma y PostgreSQL
10:17 - 24

Administración de Bloques de Tiempo en Aplicaciones Web
11:56 - 25

"Implementación de Servicios Administrativos con Prisma"
10:16 - 26

Gestión de Reservas: Creación, Actualización y Eliminación
09:12 - 27

Servicios y Controladores para Gestión de Reservas en Node.js
12:17 - 28

Gestión de Citas con Node.js y Express
09:14
La gestión de permisos y roles es un componente fundamental en el desarrollo de aplicaciones web modernas. En este contenido, exploraremos cómo implementar un sistema de administración para una aplicación de reserva de citas, donde solo los usuarios con rol de administrador pueden crear bloques de tiempo disponibles para las citas. Esta estructura no solo mejora la seguridad de nuestra aplicación, sino que también establece un flujo de trabajo organizado y eficiente.
¿Cómo estructurar la lógica de administración en una API de reservas?
Antes de sumergirnos en el código, es importante entender la lógica de negocio detrás de nuestra aplicación. Solo un administrador puede agregar bloques de tiempo en los que los usuarios pueden registrar sus citas. Esta restricción requiere implementar una estructura de control de acceso basada en roles.
Para lograr esto, necesitamos crear:
- Rutas específicas para administradores
- Controladores que manejen las solicitudes
- Servicios que implementen la lógica de negocio
- Validaciones de permisos basadas en roles
Configuración de las rutas de administrador
El primer paso es establecer las rutas que solo serán accesibles para los administradores. Comenzamos modificando nuestro archivo de rutas principal:
// routes/index.js
router.use('/admin', adminRoutes);
const adminRouter = require('./admin');
Luego, creamos un archivo específico para las rutas de administración:
// routes/admin.js
const router = require('express').Router();
const adminController = require('../controllers/adminController');
// Ruta para crear bloques de tiempo
router.post('/timeblocks', adminController.createTimeBlock);
// Ruta para listar todas las reservaciones
router.get('/reservations', adminController.listReservations);
module.exports = router;
Estas rutas definen dos funcionalidades principales para los administradores:
- Crear nuevos bloques de tiempo disponibles para citas
- Ver todas las reservaciones realizadas por los usuarios
Implementación del controlador de administración
El controlador es responsable de recibir las solicitudes HTTP, validar los permisos del usuario y coordinar con los servicios correspondientes:
// controllers/adminController.js
const createTimeBlockService = require('../services/adminService').createTimeBlockService;
const listReservationsService = require('../services/adminService').listReservationsService;
const createTimeBlock = async (req, res) => {
// Verificar si el usuario tiene rol de administrador
if (req.user.role !== 'admin') {
return res.status(403).json({ error: 'Access Denied' });
}
// Obtener datos del cuerpo de la solicitud
const { startTime, endTime } = req.body;
try {
// Llamar al servicio para crear el bloque de tiempo
const newTimeBlock = await createTimeBlockService(startTime, endTime);
res.status(201).json(newTimeBlock);
} catch (error) {
res.status(500).json({ error: 'Error creating time block' });
}
};
const listReservations = async (req, res) => {
// Verificar si el usuario tiene rol de administrador
if (req.user.role !== 'admin') {
return res.status(403).json({ error: 'Access Denied' });
}
try {
// Obtener todas las reservaciones
const reservations = await listReservationsService();
res.json(reservations);
} catch (error) {
res.status(500).json({ error: 'Error obteniendo las reservaciones' });
}
};
module.exports = {
createTimeBlock,
listReservations
};
Validación de permisos de administrador
Un aspecto crucial de nuestra implementación es la validación de permisos. Observa cómo en cada función del controlador verificamos si el usuario tiene el rol de administrador:
if (req.user.role !== 'admin') {
return res.status(403).json({ error: 'Access Denied' });
}
Esta simple verificación garantiza que solo los usuarios con el rol adecuado puedan acceder a estas funcionalidades. Si un usuario sin permisos intenta acceder, recibirá un error 403 (Forbidden).
¿Qué información necesitamos para crear bloques de tiempo?
Para crear un bloque de tiempo, necesitamos dos piezas esenciales de información:
- startTime: La hora de inicio del bloque
- endTime: La hora de finalización del bloque
Estos datos se extraen del cuerpo de la solicitud:
const { startTime, endTime } = req.body;
Luego, estos valores se pasan al servicio correspondiente, que se encargará de la lógica de negocio y la interacción con la base de datos.
Estructura de servicios para la lógica de negocio
Aunque no se muestra la implementación completa de los servicios en el código proporcionado, es importante entender que estos serán responsables de:
- Validar los datos recibidos
- Interactuar con la base de datos (probablemente usando Prisma, según se menciona)
- Manejar cualquier lógica de negocio específica
- Devolver los resultados al controlador
Esta separación de responsabilidades sigue el principio de responsabilidad única y hace que nuestro código sea más mantenible y testeable.
¿Por qué es importante la separación de responsabilidades?
La estructura que estamos implementando sigue un patrón común en el desarrollo de aplicaciones:
- Rutas: Definen los puntos de entrada a nuestra API
- Controladores: Manejan las solicitudes HTTP y coordinan con los servicios
- Servicios: Implementan la lógica de negocio y la interacción con la base de datos
Esta separación ofrece múltiples beneficios:
- Mantenibilidad: Cada componente tiene una responsabilidad clara
- Testabilidad: Es más fácil escribir pruebas unitarias para componentes aislados
- Escalabilidad: Podemos modificar o extender un componente sin afectar a los demás
- Legibilidad: El código es más fácil de entender y seguir
La implementación de esta estructura puede parecer más trabajo inicialmente, pero a largo plazo facilita enormemente el mantenimiento y la evolución de la aplicación.
La gestión adecuada de roles y permisos es fundamental para garantizar la seguridad y el funcionamiento correcto de cualquier aplicación con diferentes tipos de usuarios. ¿Has implementado sistemas similares en tus proyectos? Comparte tu experiencia en los comentarios y cuéntanos qué estrategias has utilizado para manejar la autorización en tus aplicaciones.