API REST para la gestión de tareas del caso académico TaskFlow Solutions. Permite crear, consultar, actualizar y eliminar tareas mediante endpoints HTTP, con persistencia en MongoDB Atlas a través de Mongoose.
- Clonar el repositorio y ejecutar
npm install - Configurar variables de entorno: copiar
.env.examplea.envy completar los valores - Iniciar servidor:
npm start(onpm run devcon recarga automática) - Probar:
curl http://localhost:3000/api/tasks
- Crear una cuenta en MongoDB Atlas (plan gratuito)
- Crear un cluster y una base de datos llamada
taskflow - En Database Access, crear un usuario con contraseña
- En Network Access, agregar la IP actual (
0.0.0.0/0para desarrollo) - Obtener la connection string desde el botón Connect > Drivers
Copiar el archivo de ejemplo y editar con los valores reales:
Windows (PowerShell):
Copy-Item .env.example .envLinux / macOS:
cp .env.example .envEditar .env y reemplazar los placeholders:
PORT=3000
MONGODB_URI=mongodb+srv://<user>:<password>@<cluster-url>/taskflow?retryWrites=true&w=majorityImportante: Nunca subir
.enva GitHub. El archivo.gitignoreya lo excluye.
El proyecto sigue una arquitectura por capas que separa responsabilidades y facilita el reemplazo de cada componente sin afectar al resto:
| Capa | Carpeta | Responsabilidad |
|---|---|---|
| Routes | src/routes/ |
Define los endpoints HTTP y conecta con los controladores |
| Controller | src/controllers/ |
Recibe la request, extrae parámetros y envía la respuesta |
| Service | src/services/ |
Contiene la lógica de negocio y validaciones |
| Repository | src/repositories/ |
Accede a los datos mediante Mongoose (MongoDB) |
| Model | src/models/ |
Define el esquema Mongoose con validaciones |
| Config | src/config/ |
Configuración de conexión a base de datos |
| Middleware | src/middlewares/ |
Manejo global de errores (incluye errores de Mongoose) |
Request → Routes → Controller → Service → Repository → MongoDB Atlas
↓
Response ← Routes ← Controller ← Service ← Model (validation)
PA3/
├── package.json
├── .env.example
├── .gitignore
├── README.md
└── src/
├── server.js # Punto de entrada, conecta DB y arranca Express
├── config/
│ └── database.js # Conexión a MongoDB Atlas
├── routes/
│ └── task.routes.js # Endpoints de tareas
├── controllers/
│ └── task.controller.js # Manejo de request/response (async)
├── services/
│ └── task.service.js # Lógica de negocio (async)
├── repositories/
│ └── task.repository.js # Operaciones con Mongoose (async)
├── models/
│ └── task.model.js # Esquema y modelo Mongoose
└── middlewares/
└── error.middleware.js # Manejador global de errores + Mongoose
| Método | Ruta | Descripción |
|---|---|---|
GET |
/api/tasks |
Listar tareas (con filtros opcionales) |
GET |
/api/tasks/:id |
Obtener una tarea por ID |
POST |
/api/tasks |
Crear una tarea |
PUT |
/api/tasks/:id |
Actualizar una tarea completa |
PATCH |
/api/tasks/:id/status |
Cambiar solo el estado |
DELETE |
/api/tasks/:id |
Eliminar una tarea |
Se pueden combinar uno o más query params:
GET /api/tasks?assignedUser=ana
GET /api/tasks?status=pending
GET /api/tasks?priority=high
GET /api/tasks?assignedUser=ana&status=pending&priority=high
{
"title": "Diseñar prototipo",
"description": "Crear wireframes en Figma",
"priority": "high",
"status": "pending",
"assignedUser": "ana"
}Campos:
| Campo | Tipo | Requerido | Valores válidos | Por defecto |
|---|---|---|---|---|
title |
String | Sí | — | — |
description |
String | No | — | "" |
priority |
String | No | low, medium, high |
medium |
status |
String | No | pending, in_progress, completed |
pending |
assignedUser |
String | Sí | — | — |
POSTrequieretitleyassignedUser. Los demás campos usan valores por defecto.PUTpermite modificar cualquier combinación de campos.PATCH /:id/statussolo acepta{ "status": "..." }.- Las validaciones de Mongoose (campos requeridos, valores enum) devuelven error
400.
# Crear tarea
curl -X POST http://localhost:3000/api/tasks \
-H "Content-Type: application/json" \
-d '{"title":"Prototipo","assignedUser":"ana","priority":"high"}'
# Listar con filtros
curl "http://localhost:3000/api/tasks?assignedUser=ana&status=pending"
# Listar todas
curl http://localhost:3000/api/tasks
# Cambiar estado
curl -X PATCH http://localhost:3000/api/tasks/<id>/status \
-H "Content-Type: application/json" \
-d '{"status":"completed"}'
# Eliminar
curl -X DELETE http://localhost:3000/api/tasks/<id>npm install # Instalar dependencias (express, cors, dotenv, mongoose)
npm start # Iniciar en producción (conexión a MongoDB Atlas requerida)
npm run dev # Iniciar con nodemon (recarga automática)
npm test # Ejecutar pruebas unitarias y de integración
npm run test:watch # Ejecutar pruebas en modo watch (recarga automática)| Error | Código HTTP | Descripción |
|---|---|---|
| Campo requerido faltante | 400 |
Validation error con lista de detalles |
| Valor de enum inválido | 400 |
Validation error con mensaje del campo |
| ID con formato inválido | 400 |
Invalid value for _id |
| Tarea no encontrada | 404 |
Task not found |
| Ruta no existente | 404 |
Route not found |
| Error interno | 500 |
Internal Server Error |
- El archivo
.envcontiene credenciales sensibles y nunca debe subirse a GitHub. .gitignoreya excluye.envynode_modules.- La conexión a MongoDB Atlas usa TLS/SSL (incluido en
mongodb+srv://). - MongoDB Atlas permite restringir el acceso por IP desde Network Access.
El proyecto incluye pruebas unitarias y de integración con Jest y Supertest:
- Pruebas unitarias (
tests/task.service.test.js): validan la lógica de negocio del servicio (TaskService) con el repositorio mockeado. Cubren creación, filtros, actualización, cambio de estado y eliminación, incluyendo casos de error (404, validaciones). - Pruebas de integración (
tests/app.test.js): verifican la aplicación Express con Supertest. Testean el endpoint raíz, la documentación Swagger y el manejo de rutas no existentes. No requieren conexión real a MongoDB.
npm testJest configura automáticamente NODE_ENV=test, por lo que server.js no intenta conectarse a la base de datos real durante las pruebas.
La API está documentada con Swagger (OpenAPI 3.0) usando swagger-jsdoc y swagger-ui-express:
- Swagger UI: http://localhost:3000/api-docs — interfaz interactiva para explorar y probar los endpoints.
- Especificación raw: http://localhost:3000/api-docs.json — documento JSON OpenAPI 3.0 completo.
La especificación incluye los schemas Task, TaskInput, TaskStatusUpdate y ErrorResponse, junto con todos los endpoints REST del recurso /api/tasks.
Para agregar notificaciones en tiempo real (asignación de tareas, cambios de estado), la mejora natural sería incorporar Socket.IO o WebSockets. La arquitectura por capas actual facilita esta evolución: el service layer puede emitir eventos sin que controllers ni routes necesiten cambios estructurales.
ISC — Uso académico.