Jobs API es una API RESTful para la gestión de ofertas de trabajo, diseñada con buenas prácticas de backend, seguridad y DevOps profesional.
El proyecto incluye autenticación JWT, documentación con Swagger, despliegue automatizado con Docker y GitHub Actions, y versionado automático basado en Git tags.
- Registro y login de usuarios con validación
- Hashing de contraseñas con bcrypt
- Autenticación con JWT (JSON Web Tokens)
- Protección de rutas privadas con middleware
- Rate limiting contra ataques de fuerza bruta
- Headers de seguridad configurados con Helmet
- Protección contra XSS con xss-clean
- CORS configurado para orígenes específicos
- Crear ofertas de trabajo con validaciones
- Listar trabajos con filtros y paginación
- Actualizar trabajos (solo propietario)
- Eliminar trabajos (solo propietario)
- Validaciones de datos con express-validator
- Control de ownership (usuario solo modifica sus trabajos)
- Middleware de manejo de errores centralizado
- Errores personalizados por tipo (NotFoundError, BadRequestError, etc.)
- Logging estructurado en producción
- Variables de entorno para configuración sensible
- Validación de entrada en todos los endpoints
- Dockerización completa con multi-stage builds
- Docker Compose v2 para orquestación local
- Nginx como reverse proxy con configuración optimizada
- GitHub Actions para CI/CD automatizado
- Despliegue en AWS EC2 con Ubuntu
- Healthchecks automáticos para validación de despliegues
- Versionado semántico automatizado con npm version
jobs-api/
├── src/
│ ├── controllers/ # Lógica de negocio
│ ├── routes/ # Endpoints de la API
│ ├── models/ # Modelos de Mongoose
│ ├── middleware/ # Auth y manejo de errores
│ ├── errors/ # Errores personalizados
│ └── db/ # Conexión a MongoDB
├── nginx/
│ └── nginx.conf # Configuración de Nginx
├── docker/
│ └── nginx.conf # Config para Docker
├── .github/
│ └── workflows/ # GitHub Actions
├── swagger.yaml # Documentación Swagger
├── app.js # Entrada principal
├── server.js # Configuración del servidor
├── docker-compose.yml # Orquestación de servicios
├── Dockerfile # Configuración Docker
├── package.json
└── .env.example # Variables de entorno ejemplo
git clone https://github.com/tu-usuario/jobs-api.git
cd jobs-apicp .env.example .envEditar el archivo .env con tus valores:
MONGO_URI=mongodb+srv://<user>:<password>@cluster.mongodb.net/jobs-api
JWT_SECRET=super_secret_key_cambiar_en_produccion
JWT_LIFETIME=30d
PORT=3000
NODE_ENV=development
npm installnpm run devEl servidor se iniciará en http://localhost:3000
docker compose up -d- API Node.js - Puerto 3000
- Nginx (reverse proxy) - Puerto 80
- MongoDB - Puerto 27017 (si usas MongoDB local)
# Ver logs
docker compose logs -f
# Detener servicios
docker compose down
# Reconstruir imágenes
docker compose up -d --build
# Ver estado de contenedores
docker compose psLa documentación interactiva está disponible en:
http://localhost:3000/api/v1/docs
http://<tu-dominio-o-ip>/api/v1/docs
La documentación incluye:
- Todos los endpoints disponibles
- Esquemas de request/response
- Ejemplos de uso
- Posibilidad de probar endpoints directamente
# Incrementar versión
npm version patch # 1.0.0 → 1.0.1
npm version minor # 1.0.1 → 1.1.0
npm version major # 1.1.0 → 2.0.0
# Subir cambios y tags
git push origin main
git push origin --tags- Push a main o nuevo tag dispara el pipeline
- Tests - Ejecuta suite de pruebas
- Build - Construye imagen Docker
- Push to Registry - Sube a Docker Hub
- Deploy - Conecta via SSH a AWS EC2
- Health Check - Valida que la API responde
- Rollback - Si falla, revierte al estado anterior
GET /health{
"status": "ok",
"timestamp": "2024-01-15T10:30:00Z",
"version": "1.0.0",
"uptime": "5 days",
"database": "connected"
}curl http://localhost:3000/healthEl health check previene despliegues defectuosos en producción.
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/v1/auth/register |
Registro de nuevo usuario |
| POST | /api/v1/auth/login |
Inicio de sesión (obtiene JWT) |
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/v1/jobs |
Listar todos los trabajos del usuario |
| GET | /api/v1/jobs/:id |
Obtener trabajo específico |
| POST | /api/v1/jobs |
Crear nuevo trabajo |
| PATCH | /api/v1/jobs/:id |
Actualizar trabajo existente |
| DELETE | /api/v1/jobs/:id |
Eliminar trabajo |
# Obtener trabajos (con JWT)
curl -X GET http://localhost:3000/api/v1/jobs \
-H "Authorization: Bearer tu_token_jwt_aqui"
# Crear trabajo
curl -X POST http://localhost:3000/api/v1/jobs \
-H "Authorization: Bearer tu_token_jwt_aqui" \
-H "Content-Type: application/json" \
-d '{
"company": "Tech Corp",
"position": "Backend Developer",
"status": "pending",
"jobType": "full-time",
"jobLocation": "Remote"
}'# Ver contenedores en ejecución
docker ps
# Inspeccionar imagen específica
docker inspect <container_id> | grep -A2 "Image"
# Ver logs de despliegue
docker logs <container_id># Listar todas las imágenes disponibles
docker images
# Ver historial de una imagen
docker history <image_name>
# Limpiar recursos no usados
docker system prune -a# Si necesitas revertir a versión anterior
docker pull tu-usuario/jobs-api:<version_anterior>
docker stop jobs-api-container
docker run -d --name jobs-api-container \
-p 3000:3000 \
tu-usuario/jobs-api:<version_anterior># Ejecutar tests
npm test
# Tests con cobertura
npm run test:coverage
# Tests en watch mode
npm run test:watch| Variable | Descripción | Ejemplo |
|---|---|---|
MONGO_URI |
URI de conexión a MongoDB | mongodb+srv://user:pass@cluster.mongodb.net/db |
JWT_SECRET |
Secreto para firmar JWT | mi_secreto_super_seguro |
JWT_LIFETIME |
Duración del token JWT | 30d |
PORT |
Puerto de la aplicación | 3000 |
NODE_ENV |
Entorno de ejecución | production |
- Fork del proyecto
- Crear rama de feature (
git checkout -b feature/amazing-feature) - Commit de cambios (
git commit -m 'Add amazing feature') - Push a la rama (
git push origin feature/amazing-feature) - Abrir Pull Request
- Usar ESLint y Prettier configurados
- Escribir tests para nuevas funcionalidades
- Actualizar documentación (README y Swagger)
- Seguir commits convencionales
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
Papopapota - @papopapota
Última actualización: Enero 2025