Aplicación web para que equipos pequeños registren, aprueben y reporten gastos mensuales.
- Node.js 22+
- Docker + Docker Compose
git clone <repo-url>
cd workshop-sddcp .env.example .envEl archivo .env.example incluye los valores por defecto para desarrollo local. Si no cambias el docker-compose.yml, no necesitas modificar nada.
docker-compose up -dEsto inicia PostgreSQL 16 en localhost:5432. Los datos se persisten en el volumen postgres_data.
npm installInstala las dependencias de ambos workspaces (backend y frontend) desde la raíz.
npm run migrateCrea las tablas y enums en la base de datos.
npm run seedCarga al menos 15 gastos de ejemplo con diferentes categorías, estados y montos.
npm run dev- Backend: http://localhost:3001
- Frontend: http://localhost:5173
| Script | Descripción |
|---|---|
npm run dev |
Inicia backend y frontend en modo desarrollo |
npm run build |
Compila TypeScript y genera el bundle de producción |
npm run lint |
Ejecuta ESLint en ambos workspaces |
npm run test |
Ejecuta los tests de ambos workspaces |
npm run migrate |
Ejecuta las migraciones de Prisma |
npm run seed |
Carga los datos de ejemplo |
GET /api/v1/health
Respuesta 200 OK (DB activa):
{
"status": "ok",
"version": "0.1.0",
"uptime": 123.45,
"checks": {
"database": {
"status": "up",
"latencyMs": 12
}
}
}Respuesta 503 Service Unavailable (DB caída): mismo shape con status: "degraded" y database.status: "down".
workshop-sdd/
├── backend/
│ ├── prisma/
│ │ ├── schema.prisma # Modelo de datos
│ │ └── seed.ts # Datos de ejemplo
│ └── src/
│ ├── domain/ # Entidades y tipos
│ ├── application/ # Casos de uso y servicios
│ ├── infrastructure/ # Prisma singleton
│ └── api/ # Controladores Express y middleware
├── frontend/
│ └── src/
│ ├── lib/api.ts # Cliente HTTP
│ └── pages/ # Componentes de página
├── docker-compose.yml
└── .env.example
Los montos se almacenan como enteros en céntimos (p. ej. 1999 = 19,99 €) para evitar errores de redondeo.
| Campo | Tipo | Descripción |
|---|---|---|
amount |
Int |
Monto en céntimos |
currency |
EUR | USD |
Moneda (default: EUR) |
category |
TRAVEL | FOOD | SOFTWARE | OFFICE | OTHER |
Categoría |
status |
PENDING | APPROVED | REJECTED |
Estado del gasto |
author |
string |
Autor (email) |
El workflow de GitHub Actions se ejecuta en cada PR contra main y:
- Levanta un contenedor de PostgreSQL 16
- Ejecuta lint + build + test en backend y frontend
- Falla si cualquier paso falla