API REST profesional para gestión de productos con autenticación JWT y Firebase Firestore
Esta API permite administrar un catálogo de productos con funcionalidades CRUD completas, autenticación mediante JWT Bearer tokens y almacenamiento en Firebase Firestore en la nube.
- 🔐 Autenticación JWT con Bearer tokens
- 🔥 Firebase Firestore como base de datos
- 🌐 CORS configurado para frontend
- 🛡️ Manejo de errores (400, 401, 403, 404, 500)
- 🏗️ Arquitectura en capas (Routes → Controllers → Services → Models)
- Node.js
- Express.js 4.18
- Firebase/Firestore
- JSON Web Tokens
Autentica un usuario y devuelve un Bearer token.
Request:
curl -X POST https://techlab-products-api.vercel.app/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "admin123"}'
Response (200):
{
"success": true,
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"type": "Bearer"
}
}
Credenciales de prueba:
- 👤 Admin:
username: admin
,password: admin123
- 👤 User:
username: techlab
,password: techlab2025
Nota: Todos los endpoints de productos requieren el header
Authorization: Bearer <token>
Obtiene todos los productos del catálogo.
Request:
curl -X GET https://techlab-products-api.vercel.app/api/products \
-H "Authorization: Bearer <tu-token>"
Response (200):
{
"success": true,
"data": [
{
"id": "3nooTjywME19TrCiD2KE",
"nombre": "Producto Ejemplo",
"precio": 350
}
]
}
Obtiene un producto específico por su ID.
Request:
curl -X GET https://techlab-products-api.vercel.app/api/products/3nooTjywME19TrCiD2KE \
-H "Authorization: Bearer <tu-token>"
Response (200):
{
"success": true,
"data": {
"id": "3nooTjywME19TrCiD2KE",
"nombre": "Producto Ejemplo",
"precio": 350
}
}
Crea un nuevo producto en el catálogo.
Request:
curl -X POST https://techlab-products-api.vercel.app/api/products/create \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <tu-token>" \
-d '{"nombre": "Producto Nuevo", "precio": 500}'
Response (201):
{
"success": true,
"data": {
"id": "6QoKKUiqbPadsSun2VjF",
"nombre": "Producto Nuevo",
"precio": 500
}
}
Actualiza un producto existente en el catálogo.
Request:
curl -X PUT https://techlab-products-api.vercel.app/api/products/6QoKKUiqbPadsSun2VjF \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <tu-token>" \
-d '{"nombre": "Producto Actualizado", "precio": 750}'
Response (200):
{
"success": true,
"data": {
"id": "6QoKKUiqbPadsSun2VjF",
"nombre": "Producto Actualizado",
"precio": 750
}
}
Elimina un producto del catálogo.
Request:
curl -X DELETE https://techlab-products-api.vercel.app/api/products/6QoKKUiqbPadsSun2VjF \
-H "Authorization: Bearer <tu-token>"
Response (204):
No content (eliminación exitosa)
Código | Significado | Descripción |
---|---|---|
200 | ✅ OK | Operación exitosa |
201 | ✅ Created | Recurso creado correctamente |
204 | ✅ No Content | Eliminación exitosa |
400 | ❌ Bad Request | Datos faltantes o inválidos |
401 | 🚫 Unauthorized | Token requerido o inválido |
403 | 🚫 Forbidden | Token expirado |
404 | 🔍 Not Found | Ruta o recurso no encontrado |
500 | 💥 Internal Error | Error del servidor |
Los productos deben tener la siguiente estructura:
{
"nombre": "string",
"precio": "number"
}
Ejemplo:
{
"nombre": "Laptop Gaming",
"precio": 1299.99
}
git clone <repo-url>
cd techlab-products-api
npm install
Crear archivo .env
:
PORT=3000
JWT_SECRET=tu_jwt_secret_super_seguro
JWT_EXPIRATION=1h
FIREBASE_API_KEY=tu_api_key
FIREBASE_AUTH_DOMAIN=tu-proyecto.firebaseapp.com
FIREBASE_PROJECT_ID=tu-proyecto-id
FIREBASE_STORAGE_BUCKET=tu-proyecto.appspot.com
FIREBASE_MESSAGING_SENDER_ID=123456789
FIREBASE_APP_ID=1:123456789:web:abcdef123456
FIREBASE_MEASUREMENT_ID=G-ABCD123456
npm start
El servidor estará disponible en http://localhost:3000
src/
├── 📄 index.js # Punto de entrada
├── ⚙️ config/
│ ├── envs.js # Variables de entorno centralizadas
│ └── firebase.config.js # Configuración Firebase
├── 🎮 controllers/ # Lógica de controladores
├── 🛡️ middlewares/ # Middleware de autenticación
├── 📊 models/ # Modelos de datos (Firestore)
├── 🛣️ routes/ # Definición de rutas
├── ⚡ services/ # Lógica de negocio
└── 🔧 utils/ # Utilidades JWT
# 1. Obtener token
TOKEN=$(curl -s -X POST https://techlab-products-api.vercel.app/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123"}' | \
grep -o '"token":"[^"]*' | cut -d'"' -f4)
# 2. Listar productos
curl -X GET https://techlab-products-api.vercel.app/api/products \
-H "Authorization: Bearer $TOKEN"
# 3. Crear producto
curl -X POST https://techlab-products-api.vercel.app/api/products/create \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"nombre":"Mi Producto","precio":199.99}'
# 4. Actualizar producto
curl -X PUT https://techlab-products-api.vercel.app/api/products/ID_DEL_PRODUCTO \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"nombre":"Producto Actualizado","precio":299.99}'
# 5. Obtener producto por ID
curl -X GET https://techlab-products-api.vercel.app/api/products/ID_DEL_PRODUCTO \
-H "Authorization: Bearer $TOKEN"
# 6. Eliminar producto
curl -X DELETE https://techlab-products-api.vercel.app/api/products/ID_DEL_PRODUCTO \
-H "Authorization: Bearer $TOKEN"