Una API REST completa desarrollada con Express.js y TypeScript que incluye gestión de usuarios, productos, autenticación y documentación interactiva con Swagger UI.
- Express.js con TypeScript: Framework web robusto con tipado estático
- PostgreSQL: Base de datos relacional para producción con persistencia completa
- Autenticación Bearer Token: Sistema de autenticación seguro para todas las rutas protegidas
- Gestión de Usuarios: CRUD completo de usuarios con protección de autenticación
- Gestión de Productos: Sistema completo de productos con 12 categorías, búsqueda y filtros
- Swagger UI: Documentación interactiva completa con pruebas en vivo
- OpenAPI 3.0: Especificación estándar para APIs REST
- Sistema de Logging Completo: Registro de todos los eventos con winston
- 📄 Logs en archivos (
logs/combined.log,logs/error.log,logs/access.log) - 🖥️ Logs en consola con colores (desarrollo)
- 📊 Logging de requests HTTP, autenticación, errores y operaciones CRUD
- 📄 Logs en archivos (
- TypeScript: Desarrollo con tipado fuerte y mejor experiencia de desarrollo
- Modular: Arquitectura organizada con separación de responsabilidades
Tabla users:
id- SERIAL PRIMARY KEYname- VARCHAR(255) NOT NULLemail- VARCHAR(255) UNIQUE NOT NULLpassword- VARCHAR(255) NOT NULLcreated_at- TIMESTAMP DEFAULT CURRENT_TIMESTAMP
Tabla products:
id- SERIAL PRIMARY KEYname- VARCHAR(255) NOT NULLdescription- TEXTprice- DECIMAL(10,2) NOT NULLstock- INTEGER NOT NULL DEFAULT 0category- VARCHAR(100) NOT NULLactive- BOOLEAN DEFAULT truecreated_at- TIMESTAMP DEFAULT CURRENT_TIMESTAMPupdated_at- TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- Escalabilidad: Mejor rendimiento para aplicaciones grandes
- ACID Compliance: Transacciones confiables
- Tipos de Datos Avanzados: Soporte para JSON, arrays, etc.
- Conexiones Concurrentes: Manejo eficiente de múltiples usuarios
- Índices Automáticos: Optimización de consultas
Al iniciar por primera vez, se crean automáticamente estos usuarios:
- Email: juan@example.com, Password: 123456
- Email: maria@example.com, Password: 654321
Al iniciar por primera vez, se crean automáticamente estos productos:
- Laptop Dell XPS 13 - $1,299.99 (Tecnología) - Stock: 10
- iPhone 15 Pro - $999.99 (Tecnología) - Stock: 25
- Auriculares Sony WH-1000XM5 - $349.99 (Audio) - Stock: 15
- Mesa de Oficina - $299.99 (Muebles) - Stock: 5
- Silla Gaming - $199.99 (Muebles) - Stock: 8
academia2025-challenge/
├── src/
│ ├── config/
│ │ ├── swagger.ts # Configuración completa de Swagger/OpenAPI 3.0
│ │ └── logger.ts # Configuración del sistema de logging con winston
│ ├── database/
│ │ └── database.ts # Configuración y métodos de PostgreSQL
│ ├── middleware/
│ │ ├── auth.ts # Middleware de autenticación Bearer Token
│ │ └── logging.ts # Middleware de logging para HTTP requests
│ ├── routes/
│ │ ├── userRoutes.ts # Rutas para gestión de usuarios (🔒 protegidas)
│ │ ├── authRoutes.ts # Rutas para autenticación (públicas)
│ │ └── productRoutes.ts # Rutas para gestión de productos (🔒 protegidas)
│ ├── types/
│ │ ├── user.ts # Interfaces y tipos TypeScript para usuarios
│ │ └── product.ts # Interfaces y tipos TypeScript para productos
│ └── app.ts # Archivo principal de la aplicación
├── logs/ # Directorio de archivos de log (auto-creado)
│ ├── access.log # Logs de requests HTTP
│ ├── error.log # Solo logs de errores
│ └── combined.log # Todos los logs combinados
├── dist/ # Código compilado TypeScript -> JavaScript
├── node_modules/ # Dependencias del proyecto
├── .env # Variables de entorno (configuración de DB)
├── .gitignore # Archivos excluidos del control de versiones
├── package.json # Configuración del proyecto y dependencias
├── package-lock.json # Versiones exactas de dependencias
├── README.md # Documentación principal del proyecto
├── LOGGING_README.md # Documentación completa del sistema de logging
└── tsconfig.json # Configuración del compilador TypeScript
- Node.js (v14 o superior)
- npm
- Docker Desktop
Iniciar PostgreSQL (levanta la base de datos con datos precargados):
docker run --name academia2025-challenge -d ghcr.io/jonathanvgms/academia2025-challenge# Instalar dependencias
npm install
# Desarrollo con recarga automática
npm run dev
# Compilar para producción
npm run build
# Ejecutar en producción
npm start- Swagger UI:
http://localhost:3000/api-docs - Swagger JSON:
http://localhost:3000/api-docs.json
🎯 Usa Swagger UI para:
- Explorar todos los endpoints disponibles
- Probar la API directamente desde el navegador
- Ver esquemas de datos y ejemplos
- Autenticarte con Bearer tokens
- Generar código cliente automáticamente
- GET / - Información de la API y endpoints disponibles
- GET /api/users - Obtener todos los usuarios
- GET /api/users/:id - Obtener usuario específico por ID
- POST /api/users - Crear nuevo usuario
- PUT /api/users/:id - Actualizar usuario existente
- DELETE /api/users/:id - Eliminar usuario
Authorization: Bearer <token> obtenido del login.
- POST /api/auth/login - Iniciar sesión
- POST /api/auth/logout - Cerrar sesión
- GET /api/auth/me - Obtener información del usuario actual
- GET /api/products - Obtener todos los productos (🔒 requiere auth)
- Query params:
?category=Tecnología,?search=laptop,?active=true
- Query params:
- GET /api/products/:id - Obtener producto específico por ID (🔒 requiere auth)
- POST /api/products - Crear nuevo producto (🔒 requiere auth)
- PUT /api/products/:id - Actualizar producto existente (🔒 requiere auth)
- PATCH /api/products/:id/stock - Actualizar solo el stock (🔒 requiere auth)
- DELETE /api/products/:id - Eliminar producto (🔒 requiere auth)
Authorization: Bearer <token> obtenido del login.
- Tecnología - Laptops, smartphones, tablets
- Audio - Auriculares, altavoces, sistemas de sonido
- Muebles - Mesas, sillas, escritorios
- Deportes - Equipamiento deportivo y fitness
- Libros - Literatura, técnicos, educativos
- Ropa - Vestimenta y accesorios
- Cocina - Electrodomésticos y utensilios
- Juguetes - Entretenimiento infantil
- Jardín - Plantas y herramientas de jardinería
- Electrónicos - Gadgets y dispositivos electrónicos
- Hogar - Decoración y artículos para el hogar
- Automotriz - Accesorios y repuestos para vehículos
# Configuración de PostgreSQL
DB_HOST=localhost
DB_PORT=5432
DB_NAME=challege_api
DB_USER=postgres
DB_PASSWORD=postgres
# Configuración del Servidor
PORT=3000
# Configuración de Autenticación
TOKEN_EXPIRY_HOURS=24- Login:
POST /api/auth/logincon email y password - Obtener Token: La respuesta incluye un token temporal
- Usar Token: Incluir
Authorization: Bearer <token>en las peticiones a/api/users - Expiración: Los tokens expiran después de 24 horas
- Validación de Token: Verificación automática en rutas protegidas
- Formato de Token:
token_userId_timestamp - Expiración: Tokens válidos por 24 horas
- Verificación de Usuario: Validación de existencia del usuario
El proyecto incluye un sistema de logging completo que registra todos los eventos de la API:
logs/combined.log- Todos los logslogs/error.log- Solo erroreslogs/access.log- Requests HTTP
- ✅ HTTP Requests/Responses - Método, URL, IP, usuario, tiempo de respuesta
- ✅ Autenticación - Login exitoso, intentos fallidos, tokens generados
- ✅ Operaciones CRUD - Creación, actualización, eliminación de productos/usuarios
- ✅ Errores - Errores de aplicación, validación, base de datos
- ✅ Eventos del Servidor - Inicio, conexión DB, rutas no encontradas
- Consola (desarrollo): Logs con colores en tiempo real
- Archivos (producción): Logs estructurados en JSON
- Formato: Timestamp, nivel, mensaje, metadata contextual
- 📖 SWAGGER_README.md - Guía completa de Swagger UI y OpenAPI 3.0
- 📊 LOGGING_README.md - Sistema completo de logging con winston
- ⚙️ tsconfig.json - Configuración del compilador TypeScript
- 🔒 .env - Variables de entorno (no incluir en repositorio)
- 📋 .gitignore - Archivos excluidos del control de versiones