docs: add README with project documentation
This commit is contained in:
parent
2367371c5d
commit
fd98a80236
|
|
@ -0,0 +1,85 @@
|
||||||
|
# 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.
|
||||||
Loading…
Reference in New Issue