emi-challenge-be/README.md

86 lines
2.6 KiB
Markdown

# Task Challenge API
Backend para gestión de tareas con máquina de estados y persistencia en PostgreSQL.
## Stack
- **Runtime:** Node.js + TypeScript
- **Framework:** Hono
- **ORM:** Prisma (PostgreSQL)
- **Testing:** Jest
- **Package Manager:** pnpm
## Arquitectura
Se optó por **Clean Architecture** con separación en capas:
```
src/
├── domain/ # Entidades, interfaces de repositorio
├── application/ # Casos de uso, lógica de negocio
├── infrastructure/ # Implementaciones concretas (Prisma)
├── presentation/ # Controllers, rutas, middleware
└── shared/ # DTOs, errores, utilidades
```
**Por qué esta arquitectura:**
- El dominio no depende de frameworks ni librerías externas. Si mañana cambiamos Prisma por Drizzle o Hono por Express, solo tocamos `infrastructure` y `presentation`.
- Los tests unitarios mockean los repositorios sin necesidad de levantar una base de datos.
- Cada capa tiene una responsabilidad clara, lo que facilita el onboarding y el mantenimiento a largo plazo.
## Modelo de datos
La entidad central es `Task` con una máquina de estados:
```
new → active → resolved → closed
↑__________|
```
- Cada transición queda registrada en `StateHistory` con timestamp.
- Las notas se persisten como relación hija de la tarea.
- Soft delete mediante `deletedAt` (no se borra físicamente).
## Endpoints
| Método | Ruta | Descripción |
|--------|------|-------------|
| GET | `/api/tasks` | Listar tareas |
| GET | `/api/tasks/:id` | Obtener tarea por ID |
| POST | `/api/tasks` | Crear tarea |
| PUT | `/api/tasks/:id` | Actualizar tarea |
| DELETE | `/api/tasks/:id` | Soft delete |
| PATCH | `/api/tasks/:id/transition` | Cambiar estado |
| POST | `/api/tasks/:id/notes` | Agregar nota |
| DELETE | `/api/tasks/:id/notes/:index` | Eliminar nota |
| GET | `/api/states` | Listar estados válidos |
## Variables de entorno
```env
DATABASE_URL=postgresql://user:password@host:5432/dbname?schema=public
PORT=3000
NODE_ENV=production
```
## Scripts
```bash
pnpm dev # Desarrollo con hot reload
pnpm build # Compilar TypeScript
pnpm start # Ejecutar con tsx
pnpm start:prod # Ejecutar JS compilado
pnpm test # Tests unitarios
pnpm test:watch # Tests en modo watch
pnpm db:migrate # Ejecutar migraciones
pnpm db:seed # Seed de datos
pnpm db:reset # Reset DB + migraciones + seed
```
## Deploy
El proyecto corre en Dokploy con Docker. El `Dockerfile` ejecuta `prisma migrate deploy` antes de levantar el servidor.
CORS restringido a `https://emi.challenge.berand97.dev` en producción.