"Implementación de Servicios Administrativos con Prisma"

Clase 25 de 30Curso de Backend con ExpressJS

Resumen

La administración de citas y bloques de tiempo es un componente esencial en cualquier sistema de reservas. Implementar correctamente la parte administrativa de tu aplicación no solo mejora la experiencia del usuario, sino que también proporciona un control eficiente sobre la disponibilidad y las reservaciones. En este contenido, exploraremos cómo crear servicios administrativos para gestionar bloques de tiempo y listar reservaciones, todo ello con un enfoque en la seguridad y los roles de usuario.

¿Cómo implementar servicios administrativos en tu aplicación?

Para implementar la parte administrativa de nuestra aplicación, necesitamos crear un servicio específico que maneje la lógica de negocio relacionada con la gestión de bloques de tiempo y reservaciones. Este servicio actuará como intermediario entre nuestros controladores y la base de datos.

Primero, creamos un nuevo archivo llamado admin.service.js donde implementaremos toda la lógica necesaria. Lo primero que necesitamos es importar Prisma para comunicarnos con nuestra base de datos:

const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();

¿Qué servicios necesitamos para la gestión administrativa?

Necesitamos implementar dos servicios principales:

  1. Servicio para crear bloques de tiempo: Este servicio permitirá a los administradores definir períodos de disponibilidad.
const createTimeBlockService = async (startTime, endTime) => {
  const newTimeBlock = await prisma.timeBlock.create({
    data: {
      startTime: new Date(startTime),
      endTime: new Date(endTime)
    }
  });
  
  return newTimeBlock;
};
  1. Servicio para listar reservaciones: Este servicio permitirá a los administradores ver todas las citas programadas.
const listReservationService = async () => {
  const reservations = await prisma.appointments.findMany({
    include: {
      user: true,
      timeBlock: true
    }
  });
  
  return reservations;
};

module.exports = {
  createTimeBlockService,
  listReservationService
};

Es importante destacar que el servicio de listado de reservaciones incluye información tanto del usuario como del bloque de tiempo asociado, lo que proporciona una visión completa de cada reserva.

¿Cómo proteger las rutas administrativas con autenticación?

La seguridad es un aspecto crucial en cualquier aplicación, especialmente cuando se trata de funcionalidades administrativas. Para proteger nuestras rutas, implementamos un middleware de autenticación que verifica tanto la validez del token como el rol del usuario.

En nuestro controlador administrativo, necesitamos importar este middleware:

const authenticateToken = require('../middlewares/authorization');

Luego, aplicamos este middleware a nuestras rutas administrativas:

router.get('/reservations', authenticateToken, async (req, res) => {
  // Lógica para listar reservaciones
});

router.post('/time-blocks', authenticateToken, async (req, res) => {
  // Lógica para crear bloques de tiempo
});

¿Cómo funciona la validación de roles?

El middleware de autenticación no solo verifica que el token sea válido, sino que también comprueba si el usuario tiene el rol de administrador. Esto garantiza que solo los usuarios con permisos adecuados puedan acceder a estas funcionalidades.

Si un usuario sin rol de administrador intenta acceder a estas rutas, recibirá un mensaje de "Acceso denegado", incluso si su token es válido. Esto proporciona una capa adicional de seguridad para proteger información sensible.

¿Cómo probar nuestros servicios administrativos?

Para probar nuestros servicios administrativos, podemos utilizar herramientas como Postman. Aquí hay algunos escenarios de prueba importantes:

  1. Listar reservaciones con un usuario administrador: Debería devolver todas las reservaciones con información detallada.
  2. Listar reservaciones con un token inválido: Debería devolver un error de autenticación.
  3. Listar reservaciones con un usuario no administrador: Debería devolver un mensaje de "Acceso denegado".
  4. Crear un bloque de tiempo con un usuario administrador: Debería crear exitosamente un nuevo bloque de tiempo.

Es fundamental verificar que las rutas estén correctamente definidas. Un error común es usar nombres de ruta incorrectos, lo que resultará en errores 404 (Not Found).

La implementación de servicios administrativos robustos mejora significativamente la gestión de tu aplicación, permitiendo un control eficiente sobre la disponibilidad y las reservaciones. Recuerda siempre priorizar la seguridad mediante la validación adecuada de tokens y roles de usuario. ¿Has implementado alguna vez un sistema similar en tus proyectos? Comparte tu experiencia en los comentarios y cuéntanos qué desafíos encontraste durante el proceso.