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