Handmade Bags Store

Sistema completo de gestión de usuarios y pedidos para tienda de handmade bags artesanales. Desarrollado con Node.js, Express, PostgreSQL y Sequelize ORM.

Node.js PostgreSQL Sequelize Express Transacciones bcryptjs
Handmade Bags Store - Página Principal

Contexto del Proyecto

Evaluación de Portafolio

Este proyecto fue desarrollado como parte de una evaluación de portafolio que requería implementar un sistema de gestión de usuarios y pedidos para una tienda en línea utilizando PostgreSQL y buenas prácticas en Node.js.

Objetivo: Implementar conexión a PostgreSQL con Sequelize ORM, diseñar relaciones entre entidades de manera eficiente y escalable, y gestionar transacciones para garantizar consistencia de datos.
Características Implementadas
  • CRUD completo para usuarios y pedidos
  • Base de datos PostgreSQL con Sequelize ORM
  • Transacciones para garantizar consistencia
  • Interfaz web responsive con Bootstrap 5
  • API REST completa con documentación
  • Validaciones robustas en frontend y backend
  • Seguridad con hash de contraseñas bcrypt

Capturas de Pantalla del Frontend

Página Principal
Página Principal

Página de inicio con productos destacados y diseño artesanal

Catálogo de Productos
Catálogo de Productos

Catálogo completo con búsqueda en tiempo real

Gestión de Usuarios
Gestión de Usuarios

Interfaz para gestionar usuarios del sistema

Gestión de Pedidos
Gestión de Pedidos

Sistema de gestión de pedidos con transacciones

Implementación Técnica

Modelos de Base de Datos
Modelo Usuario
  • id - INTEGER, PK, autoincrement
  • nombre - STRING(60), validación 2-60 caracteres
  • email - STRING(100), único, formato válido
  • password - STRING(255), hash bcrypt, min 8 caracteres
Modelo Pedido
  • id - INTEGER, PK, autoincrement
  • usuario_id - INTEGER, FK -> User.id
  • producto - STRING(100), 1-100 caracteres
  • cantidad - INTEGER, mayor a 0
  • fecha_pedido - DATEONLY, default NOW()
Asociaciones Sequelize
// Relación uno a muchos User.hasMany(Order, { foreignKey: 'usuario_id', onDelete: 'CASCADE' }); Order.belongsTo(User, { foreignKey: 'usuario_id' });
Validaciones Implementadas
  • Email único: Validación a nivel de base de datos
  • Contraseña segura: Mínimo 8 caracteres + número
  • Hash bcrypt: 12 rounds de seguridad
  • Transacciones: Rollback automático en errores

API REST - Endpoints Implementados

Endpoints de Usuarios
POST /api/usuarios
Crear nuevo usuario
GET /api/usuarios
Obtener todos los usuarios
GET /api/usuarios/:id
Obtener usuario por ID
PUT /api/usuarios/:id
Actualizar usuario
DELETE /api/usuarios/:id
Eliminar usuario
Endpoints de Pedidos
POST /api/pedidos
Crear nuevo pedido (con transacción)
GET /api/pedidos
Obtener todos los pedidos
GET /api/pedidos/usuario/:id
Obtener pedidos de usuario específico
Ejemplo de Uso
# Crear usuario curl -X POST http://localhost:3001/api/usuarios \ -H "Content-Type: application/json" \ -d '{ "nombre": "María García", "email": "maria@example.com", "password": "MiPassword123" }'

Cumplimiento de Requisitos de Evaluación

1
Instalación y Configuración
  • Node.js configurado correctamente
  • Sequelize como ORM instalado
  • Variables de entorno configuradas (.env)
  • Base de datos PostgreSQL configurada
  • Docker Compose para facilitar despliegue
2
Definición de Modelos
  • Modelo Usuario con campos requeridos
  • Modelo Pedido con campos requeridos
  • Asociaciones correctas implementadas
  • Validaciones robustas aplicadas
3
Operaciones CRUD
  • POST /usuarios - Crear usuario
  • GET /usuarios - Obtener todos los usuarios
  • PUT /usuarios/:id - Actualizar usuario
  • DELETE /usuarios/:id - Eliminar usuario
  • POST /pedidos - Crear pedido
  • GET /usuarios/:id/pedidos - Obtener pedidos
4
Transacciones
  • Transacción al crear pedido
  • Rollback automático si falla
  • Verificación de existencia del usuario
  • Uso correcto de sequelize.transaction()

Lo que Aprendí en este Proyecto

Habilidades Técnicas Desarrolladas
  • Sequelize ORM: Configuración de modelos, asociaciones y validaciones
  • Transacciones: Manejo de operaciones atómicas con rollback
  • PostgreSQL: Configuración y uso de base de datos relacional
  • API REST: Diseño de endpoints siguiendo convenciones
  • Seguridad: Hash de contraseñas con bcrypt
  • Validaciones: Validación robusta en frontend y backend
Conceptos de Base de Datos
  • Relaciones: Implementación de relaciones 1:N entre entidades
  • Integridad: Uso de llaves foráneas y cascadas
  • Consistencia: Transacciones para mantener datos consistentes
  • Validaciones: Validaciones a nivel de modelo y base de datos
  • Hooks: Uso de hooks de Sequelize para operaciones automáticas
  • Seeds: Población de base de datos con datos de ejemplo

Desafíos Técnicos y Soluciones

Desafío: Manejo de Transacciones

Problema: Garantizar que la creación de pedidos sea atómica y que si falla cualquier parte, se reviertan todos los cambios.

Solución: Implementé transacciones de Sequelize con manejo de errores y rollback automático.

const transaction = await sequelize.transaction();
try {
  const user = await User.findByPk(userId, { transaction });
  const order = await Order.create(orderData, { transaction });
  await transaction.commit();
} catch (error) {
  await transaction.rollback();
  throw error;
}
Desafío: Validaciones Robustas

Problema: Asegurar que los datos sean válidos tanto en frontend como backend, con mensajes de error claros.

Solución: Validaciones en múltiples capas: modelo Sequelize, middleware Express y frontend JavaScript.

Desafío: Asociaciones de Base de Datos

Problema: Implementar correctamente la relación 1:N entre usuarios y pedidos con integridad referencial.

Solución: Configuré asociaciones Sequelize con foreign keys y cascadas para mantener consistencia.

User.hasMany(Order, {
  foreignKey: 'usuario_id',
  onDelete: 'CASCADE'
});
Order.belongsTo(User, {
  foreignKey: 'usuario_id'
});
Desafío: Seguridad de Contraseñas

Problema: Almacenar contraseñas de forma segura sin exponer información sensible.

Solución: Hash con bcrypt y salt rounds configurables, hooks de Sequelize para automatizar el proceso.

Arquitectura del Sistema

Diagrama de Base de Datos
USUARIOS
id (PK)
nombre
email (UNIQUE)
password (HASHED)
created_at
updated_at
1:N
PEDIDOS
id (PK)
usuario_id (FK)
producto
cantidad
fecha_pedido
created_at
updated_at
Flujo de la Aplicación
Cliente Web (Frontend)
Servidor Express (Backend)
Sequelize ORM
PostgreSQL Database

Ejemplos de Código Detallados

Implementación de Transacciones
Creación de Pedido con Transacción - Parte 1
Creación de Pedido con Transacción - Parte 1
Creación de Pedido con Transacción - Parte 2
Creación de Pedido con Transacción - Parte 2
Modelo con Validaciones
Modelo Usuario - Parte 1
Modelo Usuario - Parte 1
Modelo Usuario - Parte 2
Modelo Usuario - Parte 2
Modelo Usuario - Parte 3
Modelo Usuario - Parte 3

Buenas Prácticas Implementadas

Seguridad
  • Hash de contraseñas con bcrypt y salt rounds configurables
  • Validación de entrada en múltiples capas
  • Sanitización de datos antes de almacenar
  • Variables de entorno para configuración sensible
  • Manejo seguro de errores sin exposición de información
Arquitectura
  • Separación clara de responsabilidades (MVC)
  • Uso de ORM para abstracción de base de datos
  • Middleware para funcionalidades transversales
  • Estructura modular y escalable
  • Configuración centralizada
Base de Datos
  • Uso de transacciones para operaciones atómicas
  • Índices únicos para campos críticos
  • Relaciones bien definidas con integridad referencial
  • Validaciones a nivel de modelo y base de datos
  • Hooks para operaciones automáticas
Código Limpio
  • Nomenclatura consistente y descriptiva
  • Comentarios explicativos en código complejo
  • Manejo centralizado de errores
  • Funciones pequeñas y con responsabilidad única
  • Validaciones reutilizables

Métricas y Resultados del Proyecto

3 días

Tiempo de desarrollo

100%

Requisitos cumplidos

6

Endpoints API

2

Modelos de datos

Funcionalidades Implementadas
CRUD Usuarios
CRUD Pedidos
Transacciones
Validaciones
API REST
Tecnologías Utilizadas
Node.js Express.js Sequelize PostgreSQL bcryptjs EJS Bootstrap 5 Docker

Enlaces del Proyecto