Sistema completo de gestión de usuarios y pedidos para tienda de handmade bags artesanales. Desarrollado con Node.js, Express, PostgreSQL y Sequelize ORM.
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.
Página de inicio con productos destacados y diseño artesanal
Catálogo completo con búsqueda en tiempo real
Interfaz para gestionar usuarios del sistema
Sistema de gestión de pedidos con transacciones
id - INTEGER, PK, autoincrementnombre - STRING(60), validación 2-60 caracteresemail - STRING(100), único, formato válidopassword - STRING(255), hash bcrypt, min 8 caracteresid - INTEGER, PK, autoincrementusuario_id - INTEGER, FK -> User.idproducto - STRING(100), 1-100 caracterescantidad - INTEGER, mayor a 0fecha_pedido - DATEONLY, default NOW()/api/usuarios
/api/usuarios
/api/usuarios/:id
/api/usuarios/:id
/api/usuarios/:id
/api/pedidos
/api/pedidos
/api/pedidos/usuario/:id
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;
}
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.
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'
});
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.
Tiempo de desarrollo
Requisitos cumplidos
Endpoints API
Modelos de datos