|
|
||
|---|---|---|
| prisma | ||
| src | ||
| test/unit/application/task | ||
| Dockerfile | ||
| README.md | ||
| jest.config.ts | ||
| nixpacks.toml | ||
| package.json | ||
| pnpm-lock.yaml | ||
| prisma.config.ts | ||
| tsconfig.json | ||
README.md
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
infrastructureypresentation. - 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
StateHistorycon 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
DATABASE_URL=postgresql://user:password@host:5432/dbname?schema=public
PORT=3000
NODE_ENV=production
Scripts
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.