App Gestor de Usuarios

Sistema completo de gestión de usuarios y roles desarrollado con Node.js, Express, PostgreSQL y Sequelize ORM. Implementa relaciones complejas de base de datos y transacciones atómicas.

Node.js + Express PostgreSQL + Sequelize Transacciones Relaciones 1:1, 1:N, N:M
App Gestor de Usuarios - Dashboard

Descripción del Proyecto

Este proyecto fue desarrollado como parte del módulo de Aplicaciones Node del Bootcamp de JavaScript. El objetivo era crear una aplicación web completa para gestionar usuarios y roles, implementando operaciones CRUD utilizando un ORM (Sequelize) y manejando relaciones entre entidades a través de asociaciones uno a uno, uno a muchos y muchos a muchos.

Objetivos del Proyecto
  • Conexión a PostgreSQL: Implementar buenas prácticas de conexión a la base de datos
  • Modelado con Sequelize: Crear modelos de datos utilizando un ORM
  • Operaciones CRUD: Implementar crear, leer, actualizar y eliminar sobre usuarios y roles
  • Transacciones: Asegurar integridad y consistencia de los datos
  • Relaciones complejas: Implementar asociaciones 1:1, 1:N y N:M

Diagramas del Sistema

Explora la arquitectura y estructura de la base de datos del sistema a través de estos diagramas interactivos:

Tecnologías Utilizadas

Backend
  • Node.js: Runtime de JavaScript
  • Express.js: Framework web minimalista
  • Sequelize: ORM para manejo de base de datos
  • Joi: Validación de esquemas
  • bcryptjs: Hash de contraseñas
  • UUID: Identificadores únicos universales
Base de Datos
  • PostgreSQL: Base de datos principal
  • SQLite: Base de datos de desarrollo
  • Migraciones: Control de versiones del esquema
  • Seeders: Datos iniciales y de prueba
  • Transacciones: Operaciones atómicas
  • Índices: Optimización de consultas
Frontend
  • HTML5: Estructura semántica
  • CSS3: Estilos personalizados
  • Bootstrap 5: Framework CSS responsivo
  • JavaScript ES6+: Lógica del cliente
  • Fetch API: Comunicación con el backend
  • Modularidad: Código organizado en módulos
Seguridad y Validación
  • Hash de contraseñas: bcryptjs con salt rounds
  • Validación de entrada: Joi para todos los datos
  • Sanitización: Limpieza de datos
  • Manejo de errores: Middleware centralizado
  • Variables de entorno: Configuración segura
  • Cascadas: Eliminación automática de datos relacionados

Relaciones de Base de Datos

El sistema implementa los tres tipos principales de relaciones de base de datos:

1:1 - Usuario ↔ UserProfile
Cada usuario puede tener un perfil personalizado con información adicional como biografía y avatar. Esta relación demuestra cómo manejar datos opcionales de manera eficiente.
1:N - Rol → Usuarios
Un rol puede tener muchos usuarios asignados, pero cada usuario tiene un rol principal. Esta es la relación más común en sistemas de gestión de usuarios.
N:M - Usuarios ↔ Roles
Un usuario puede tener múltiples roles adicionales, y un rol puede ser asignado a varios usuarios. Implementado con una tabla pivote UserRoles que almacena las relaciones.

Transacciones y Operaciones Atómicas

El sistema utiliza transacciones para garantizar que las operaciones complejas se ejecuten de manera atómica:

Operaciones Transaccionales
  • Crear usuario: Crear usuario + perfil + asignar roles múltiples
  • Actualizar usuario: Actualizar datos + sincronizar roles + actualizar perfil
  • Eliminar usuario: Eliminar perfil + limpiar relaciones + eliminar usuario
Ejemplo de Transacción en Sequelize:
Ejemplo de Transacción en Sequelize
Explicación del Código:
¿Qué hace este código?
  • Inicia una transacción: sequelize.transaction() crea un contexto transaccional
  • Crea el usuario: Inserta el registro principal en la tabla usuarios
  • Crea el perfil: Inserta datos adicionales en la tabla user_profiles
  • Asigna roles: Inserta múltiples registros en la tabla pivote user_roles
¿Por qué usar transacciones?
  • Atomicidad: Todo se ejecuta o nada se ejecuta
  • Consistencia: Los datos siempre quedan en estado válido
  • Aislamiento: Previene conflictos entre operaciones concurrentes
  • Durabilidad: Los cambios se mantienen incluso si hay fallos del sistema

Conceptos Técnicos Clave

Esta sección explica los conceptos técnicos fundamentales implementados en el proyecto:

ORM (Object-Relational Mapping)

Sequelize es un ORM que permite trabajar con bases de datos usando objetos JavaScript en lugar de SQL directo.

Beneficios:
  • Abstracción: No necesitas escribir SQL manualmente
  • Validación: Validación automática de tipos de datos
  • Relaciones: Manejo automático de asociaciones entre tablas
  • Migraciones: Control de versiones del esquema de BD
Hash de Contraseñas

bcryptjs implementa el algoritmo bcrypt para hashear contraseñas de forma segura.

Características:
  • Salt automático: Cada hash es único aunque la contraseña sea igual
  • Coste ajustable: Puedes aumentar la dificultad computacional
  • Irreversible: No se puede obtener la contraseña original
  • Resistente a ataques: Protege contra ataques de fuerza bruta
Validación con Joi

Joi es una librería de validación que permite definir esquemas para validar datos de entrada.

Ventajas:
  • Esquemas declarativos: Define reglas de validación de forma clara
  • Mensajes personalizados: Errores descriptivos para el usuario
  • Sanitización: Limpia y transforma datos automáticamente
  • Reutilización: Los esquemas se pueden usar en múltiples lugares
Relaciones de Base de Datos

El proyecto implementa los tres tipos principales de relaciones entre entidades.

Tipos implementados:
  • 1:1 (Uno a Uno): Usuario ↔ Perfil (cada usuario tiene un perfil)
  • 1:N (Uno a Muchos): Rol → Usuarios (un rol puede tener muchos usuarios)
  • N:M (Muchos a Muchos): Usuarios ↔ Roles (tabla pivote UserRoles)

Estructura del Proyecto

app-gestor-usuario/
├── config/
│   ├── config.js          # Configuración de Sequelize CLI
│   ├── config.json        # Configuración de base de datos
│   └── database.js        # Conexión a la base de datos
├── controllers/
│   ├── RolController.js   # Lógica de negocio para roles
│   └── UsuarioController.js # Lógica de negocio para usuarios
├── middleware/
│   ├── errorHandler.js    # Manejo centralizado de errores
│   └── validations.js     # Validación de requests
├── migrations/            # Migraciones de base de datos
├── models/
│   ├── index.js          # Configuración de modelos y asociaciones
│   ├── Rol.js            # Modelo de roles
│   ├── Usuario.js         # Modelo de usuarios
│   ├── UserProfile.js     # Modelo de perfiles (relación 1:1)
│   └── UserRoles.js       # Tabla pivote (relación N:M)
├── public/                # Frontend estático
│   ├── assets/
│   │   ├── css/
│   │   │   └── styles.css # Estilos personalizados
│   │   └── js/
│   │       ├── api.js     # Funciones para llamadas API
│   │       ├── config.js  # Configuración del frontend
│   │       ├── ui.js      # Utilidades de interfaz
│   │       ├── validators.js # Validaciones del cliente
│   │       ├── users.js   # Lógica de gestión de usuarios
│   │       ├── user-detail.js # Detalle de usuario
│   │       ├── roles.js   # Lógica de gestión de roles
│   │       └── components/
│   │           └── templates.js # Plantillas HTML
│   ├── index.html         # Dashboard principal
│   ├── users.html         # Lista de usuarios
│   ├── user-detail.html   # Detalle de usuario
│   └── roles.html         # Gestión de roles
├── routes/
│   └── api.js             # Rutas de la API
├── schemas/
│   ├── roles.schema.js    # Esquemas de validación para roles
│   └── users.schema.js    # Esquemas de validación para usuarios
├── seeders/               # Datos de ejemplo
├── services/
│   └── TransaccionService.js # Servicios transaccionales
├── utils/
│   └── hash.js            # Utilidades para hash de contraseñas
├── app.js                 # Archivo principal del servidor
├── package.json           # Dependencias y scripts
└── README.md              # Documentación completa

Características Principales

Backend Robusto
  • Servidor Express con rutas dinámicas
  • CRUD completo para usuarios y roles
  • Validación robusta con Joi
  • Hash seguro de contraseñas
  • Manejo centralizado de errores
  • Transacciones para operaciones complejas
Base de Datos Avanzada
  • Modelos Sequelize con asociaciones
  • Migraciones para control de versiones
  • Relaciones 1:1, 1:N y N:M
  • Índices únicos para emails y nombres
  • Cascadas para eliminación automática
  • UUIDs para identificadores únicos
Frontend Moderno
  • Interfaz responsiva con Bootstrap 5
  • Dashboard con estadísticas
  • Gestión completa de usuarios
  • Sistema de roles avanzado
  • Validaciones en tiempo real
  • Feedback visual con toasts
Buenas Prácticas
  • Separación de responsabilidades
  • Código modular y reutilizable
  • Documentación JSDoc completa
  • Convenciones de nombres consistentes
  • Manejo de errores robusto
  • Testing y validación de sistemas

Capturas de Pantalla del Sistema

Explora las diferentes funcionalidades del sistema a través de estas capturas de pantalla:

Dashboard Principal
Dashboard del Sistema

Dashboard principal con estadísticas del sistema, total de usuarios, roles y fecha del último usuario creado.

Lista de Usuarios
Lista de Usuarios

Gestión de usuarios con búsqueda, filtros, paginación y acciones CRUD completas.

Formulario de Usuario
Formulario de Usuario

Formulario completo para crear/editar usuarios con perfil extendido y asignación de roles múltiples.

Gestión de Roles
Gestión de Roles

Interfaz para administrar roles del sistema con descripciones y estado activo/inactivo.

Endpoints de la API

Endpoints de Usuarios
Endpoints de Usuarios
Explicación de las Rutas:

POST /api/users: Crea un nuevo usuario con validación completa y transacciones

GET /api/users: Lista usuarios con paginación y filtros opcionales

GET /api/users/:id: Obtiene un usuario específico con sus relaciones

PUT /api/users/:id: Actualiza usuario, perfil y roles de forma atómica

DELETE /api/users/:id: Elimina usuario y limpia todas las relaciones

Endpoints de Roles
Rutas de Roles
Gestión de Roles:

POST /api/roles: Crea nuevos roles con validación de nombres únicos

GET /api/roles: Lista todos los roles disponibles en el sistema

GET /api/roles/:id: Obtiene un rol específico con usuarios asignados

PUT /api/roles/:id: Actualiza información del rol (nombre, descripción)

DELETE /api/roles/:id: Elimina rol y limpia asignaciones de usuarios

Health Check
Health Check Endpoint
¿Qué es un Health Check?

GET /api/health: Endpoint de monitoreo que verifica el estado del servidor y la conexión a la base de datos.

Propósito: Permite a sistemas externos (load balancers, monitoreo) verificar si la aplicación está funcionando correctamente.

Respuesta: Retorna información sobre el estado del servidor, versión de la aplicación y estado de la base de datos.

Habilidades Desarrolladas

1
Backend Development
  • • Desarrollo con Node.js y Express
  • • Implementación de APIs REST
  • • Manejo de middleware personalizado
  • • Validación de datos con Joi
  • • Hash seguro de contraseñas
2
Base de Datos
  • • Diseño de esquemas relacionales
  • • Uso de ORM (Sequelize)
  • • Implementación de migraciones
  • • Manejo de transacciones
  • • Optimización con índices
3
Frontend
  • • Desarrollo de interfaces responsivas
  • • Comunicación con APIs
  • • Validación en tiempo real
  • • Manejo de estados complejos
  • • UX/UI moderno

Enlaces y Recursos

Repositorio

Accede al código fuente completo del proyecto:

Ver en GitHub
Documentación

Lee la documentación completa del proyecto:

Ver README