06 — Stack tecnológico — SURCO
1. Resumen
| Capa | Tecnología | Versión / nota |
|---|
| Frontend | Angular (standalone components) | App en apps/web |
| Estilos | Tailwind CSS | Tokens en tailwind.config.js |
| Backend | NestJS | App en apps/api |
| ORM | Prisma | schema + migrate + seed |
| DB | Neon (PostgreSQL serverless) | project old-paper-48739086 |
| Auth | JWT (Passport strategy + guard) | Header Authorization: Bearer |
| Validación API | class-validator + DTOs | Login, create, status |
| Password | bcrypt | cost 10 en seed |
| Diseño | Paper | file 01KZDGF3509TA4WDZTTQJW1V45 |
| Fuentes | Google Fonts Literata + Manrope | styles.css |
Stack fijo de la serie ALS-2: no se sustituye Angular/Nest/Neon/Tailwind sin excepción documentada.
2. Estructura monorepo app
surco-app/
├── package.json # scripts api / web / db:*
├── apps/
│ ├── api/
│ │ ├── prisma/
│ │ │ ├── schema.prisma
│ │ │ ├── seed.ts
│ │ │ └── migrations/
│ │ ├── src/
│ │ │ ├── main.ts
│ │ │ ├── app.module.ts
│ │ │ ├── auth/
│ │ │ ├── tasks/
│ │ │ └── prisma/
│ │ └── package.json
│ └── web/
│ ├── src/app/
│ │ ├── pages/ (home, login, tasks, task-detail, task-new)
│ │ ├── core/api.service.ts
│ │ └── app.routes.ts
│ ├── tailwind.config.js
│ └── package.json
└── README.md
Decisión: apps independientes (npm --prefix), sin npm workspaces que rompan Angular (directiva D-P1-03).
3. Puertos y entornos
Variables típicas API (.env):
| Var | Uso |
|---|
DATABASE_URL | Neon connection string |
JWT_SECRET | Firma de tokens |
PORT | 3007 (si aplica) |
4. Backend — módulos
| Módulo | Responsabilidad |
|---|
AuthModule | login, JWT emit, strategy, guard |
TasksModule | CRUD parcial de FieldTask + stats |
PrismaModule | cliente Prisma global |
Endpoints
| Método | Path | Auth | Rol |
|---|
| POST | /api/auth/login | No | — |
| GET | /api/tasks | JWT | FARMER / TECHNICIAN |
| GET | /api/tasks/stats/summary | JWT | FARMER / TECHNICIAN |
| GET | /api/tasks/:id | JWT | parte de la tarea |
| POST | /api/tasks | JWT | FARMER only |
| PATCH | /api/tasks/:id/status | JWT | parte + reglas status |
CORS: habilitado para dev web en :4200 (según main.ts).
5. Frontend — arquitectura
| Pieza | Detalle |
|---|
| Routing | app.routes.ts — 5 rutas + wildcard |
| Estado auth | localStorage token + user en ApiService |
| HTTP | HttpClient vía service |
| UI | Templates inline en componentes standalone |
| Guard | Soft-guard en ngOnInit (redirect si no token) |
Rutas
| Path | Página |
|---|
'' | HomePage |
login | LoginPage |
app/tasks | TasksPage |
app/tasks/new | TaskNewPage |
app/tasks/:id | TaskDetailPage |
6. Diseño → código
| Token marca | Uso Tailwind app (aprox.) |
|---|
| Bone | bg-bg #F3F0E8 |
| Leaf | primary #3A5A40 |
| Straw | straw #C4A574 |
| Border | border #E0D9CC |
| Display | font-display Literata |
| Sans | font-sans Manrope |
7. Scripts npm (raíz app)
npm run api # Nest start:dev :3007
npm run web # ng serve :4200
npm run db:migrate # prisma migrate
npm run db:seed # seed demo
Instalación:
npm install --prefix apps/api
npm install --prefix apps/web
8. Seguridad técnica (resumen; ver doc 11)
| Control | Implementación |
|---|
| Passwords | bcrypt hash |
| Sesión | JWT bearer |
| Autorización | guard + checks farmer/technician |
| Validación | DTOs class-validator |
| Secretos | .env no commitear |
9. Observabilidad
v1: logs Nest por defecto; sin APM. Errores de UI se muestran como copy al usuario. Analytics de producto: doc 12 (modelo).
10. Criterios de aceptación técnicos
npm run api levanta en 3007 y responde login seed.
npm run web sirve en 4200 y consume API.
- Prisma migrate + seed generan 2 users y 5 tasks.
ng build (o serve) sin errores de compilación.
- Rutas de tasks sin JWT → 401.