Skip to content

skiveldev/TaskFlow-Solutions

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TaskFlow Solutions — API Backend

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.

Ruta rápida

  1. Clonar el repositorio y ejecutar npm install
  2. Configurar variables de entorno: copiar .env.example a .env y completar los valores
  3. Iniciar servidor: npm start (o npm run dev con recarga automática)
  4. Probar: curl http://localhost:3000/api/tasks

Configuración de MongoDB Atlas

  1. Crear una cuenta en MongoDB Atlas (plan gratuito)
  2. Crear un cluster y una base de datos llamada taskflow
  3. En Database Access, crear un usuario con contraseña
  4. En Network Access, agregar la IP actual (0.0.0.0/0 para desarrollo)
  5. Obtener la connection string desde el botón Connect > Drivers

Variables de entorno

Copiar el archivo de ejemplo y editar con los valores reales:

Windows (PowerShell):

Copy-Item .env.example .env

Linux / macOS:

cp .env.example .env

Editar .env y reemplazar los placeholders:

PORT=3000
MONGODB_URI=mongodb+srv://<user>:<password>@<cluster-url>/taskflow?retryWrites=true&w=majority

Importante: Nunca subir .env a GitHub. El archivo .gitignore ya lo excluye.

Arquitectura

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)

Estructura de carpetas

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

Endpoints

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

Filtros en GET /api/tasks

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

Cuerpo de la tarea

{
  "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
description String No ""
priority String No low, medium, high medium
status String No pending, in_progress, completed pending
assignedUser String
  • POST requiere title y assignedUser. Los demás campos usan valores por defecto.
  • PUT permite modificar cualquier combinación de campos.
  • PATCH /:id/status solo acepta { "status": "..." }.
  • Las validaciones de Mongoose (campos requeridos, valores enum) devuelven error 400.

Ejemplos rápidos con curl

# 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>

Comandos sugeridos

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)

Manejo de errores

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

Seguridad

  • El archivo .env contiene credenciales sensibles y nunca debe subirse a GitHub.
  • .gitignore ya excluye .env y node_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.

Pruebas

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 test

Jest configura automáticamente NODE_ENV=test, por lo que server.js no intenta conectarse a la base de datos real durante las pruebas.

Documentación API

La API está documentada con Swagger (OpenAPI 3.0) usando swagger-jsdoc y swagger-ui-express:

La especificación incluye los schemas Task, TaskInput, TaskStatusUpdate y ErrorResponse, junto con todos los endpoints REST del recurso /api/tasks.

Mejora futura: tiempo real

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.

Licencia

ISC — Uso académico.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors