06 — Stack tecnológico — VOLTA
1. Visión
| Capa | Tecnología | Notas |
|---|
| Frontend | Angular (standalone components) | Puerto 4200 |
| Estilos | Tailwind CSS | Tokens chalk/ink/lime |
| Backend | NestJS (TypeScript) | Puerto 3008, prefijo /api |
| ORM | Prisma | schema + migrate + seed |
| DB | Neon PostgreSQL serverless | project delicate-mountain-11765167 |
| Auth | JWT (passport strategy) | Bearer header |
| Diseño | Paper | file 01KZG2VRQFF2QF0PRDB10D4AG7 |
| Repo | /Users/cristian/orca/volta-app/ | GitHub Criscode2022/volta-app |
Stack fijo del cron: no se sustituye por React/Next/Firebase salvo excepción documentada.
2. Estructura monorepo app
volta-app/
├── apps/
│ ├── api/ # NestJS + Prisma
│ │ ├── prisma/
│ │ │ ├── schema.prisma
│ │ │ ├── seed.ts
│ │ │ └── migrations/
│ │ └── src/
│ │ ├── auth/
│ │ ├── requests/
│ │ ├── prisma/
│ │ └── main.ts
│ └── web/ # Angular + Tailwind
│ └── src/app/
│ ├── pages/
│ ├── core/api.service.ts
│ └── app.routes.ts
├── package.json # scripts api / web
└── README.md
Regla D-P1-03: apps/api y apps/web independientes (npm install --prefix), sin workspaces npm que rompan Angular CLI.
3. Backend
| Pieza | Detalle |
|---|
| Framework | NestJS modules: Auth, Requests, Prisma |
| Validación | class-validator DTOs |
| Hash | bcrypt passwords |
| CORS | Habilitado para dev web :4200 |
| Puerto | 3008 (env PORT opcional) |
| Prefijo global | /api |
Módulos
| Módulo | Responsabilidad |
|---|
AuthModule | login, JWT sign, strategy |
RequestsModule | CRUD-lite solicitudes |
PrismaModule | PrismaService global |
4. Frontend
| Pieza | Detalle |
|---|
| Angular | Standalone pages, RouterLink, HttpClient |
| Estado auth | localStorage keys volta_token, volta_user |
| API base | http://localhost:3008/api en ApiService |
| Fuentes | Syne + Work Sans (link Google Fonts / index) |
| Media | assets/hero.jpg |
Rutas web
| Path | Componente |
|---|
/ | HomePage |
/apuntarme | JoinPage |
/ok | SuccessPage |
/login | LoginPage |
/inbox | InboxPage |
/inbox/:id | RequestDetailPage |
5. Base de datos
| Campo | Valor |
|---|
| Provider | PostgreSQL |
| Hosting | Neon |
| Project | delicate-mountain-11765167 |
| Migraciones | Prisma migrate (init) |
| Seed | prisma/seed.ts → 1 coach + 5 requests |
6. Seguridad técnica (resumen)
| Control | Implementación |
|---|
| Password | bcrypt hash |
| API coach | JwtAuthGuard en GET/PATCH |
| Form público | solo POST create |
| Secret | JWT_SECRET en env API |
| PII | no exponer list en endpoints públicos |
Detalle en 11-privacy-security.md.
7. Scripts típicos
cd /Users/cristian/orca/volta-app
npm install --prefix apps/api
npm install --prefix apps/web
# apps/api/.env → DATABASE_URL + JWT_SECRET
npm --prefix apps/api run prisma:migrate
npm --prefix apps/api run prisma:seed
npm run api # :3008
npm run web # :4200
8. Decisiones técnicas
| Decisión | Razón |
|---|
| Puerto API 3008 | No colisionar con SURCO 3007 y anteriores |
| preferredDay/Slot como String | L1 simple; evita timezone complexity |
| Sin FK coach–request | Form anónimo; asignación multi-coach = L2 |
| Soft auth en Angular | API es autoridad; guards formales = L1+ |
| Stats endpoint propio | Evita recalcular en cliente |
9. Dependencias clave (orientativo)
| Capa | Paquetes |
|---|
| API | @nestjs/*, @prisma/client, bcrypt, passport-jwt, class-validator |
| Web | @angular/*, tailwindcss, RxJS |
10. Despliegue (recomendado, no obligatorio del día)
| Servicio | Opción |
|---|
| Web | Vercel / Netlify / static host |
| API | Railway / Fly / Render |
| DB | Neon (ya provisionada) |
Variables: DATABASE_URL, JWT_SECRET, PORT, y en web la URL pública de API.