VOLTA · 20-implementation.md · 22 de 22

En esta página 1. Resumen ejecutivo técnico 0%

20 — Implementación — VOLTA

1. Resumen ejecutivo técnico

CampoValor
App path/Users/cristian/orca/volta-app/
APINestJS · puerto 3008 · prefijo /api
WebAngular standalone · puerto 4200
DBNeon PostgreSQL · Prisma · delicate-mountain-11765167
AuthJWT Bearer · role COACH
DominioUser, ClassRequest
Fecha2026-08-08
GitHubCriscode2022/volta-app (puede estar pendiente de push)

2. Cómo arrancar

cd /Users/cristian/orca/volta-app
npm install --prefix apps/api
npm install --prefix apps/web
# Configurar apps/api/.env con DATABASE_URL y JWT_SECRET
npm --prefix apps/api run prisma:migrate   # o script documentado en README app
npm --prefix apps/api run prisma:seed
npm run api   # http://localhost:3008
npm run web   # http://localhost:4200

Credenciales

RolEmailPassword
COACHcoach@volta.clubpassword123

3. Módulos API implementados

Auth

  • POST /api/auth/login
  • Valida email/password; compara bcrypt; emite JWT con sub, email, role.
  • JwtStrategy + JwtAuthGuard protegen requests de lectura/escritura coach.

Requests

MétodoRutaAuthNotas
POST/api/requestsNocreate público; status NEW; code VO-
GET/api/requestsJWTlist createdAt desc
GET/api/requests/stats/summaryJWTtotal, open, byStatus
GET/api/requests/:idJWT404 si no existe
PATCH/api/requests/:id/statusJWTbody { status }

Prisma

Enums Role, RequestStatus, ClassType; modelos alineados a doc 05; migración init; seed 1 coach + 5 requests.

4. Frontend implementado

PáginaResponsabilidad
HomePagemarketing, hero, clases, horarios, footer
JoinPageform create público
SuccessPageconfirmación + código
LoginPageform → ApiService.login → navigate inbox
InboxPagestats + list + empty/error + logout
RequestDetailPageget + patch status

ApiService centraliza base URL http://localhost:3008/api, token storage (volta_token, volta_user), métodos HTTP tipados (ClassRequest, stats, User).

5. Decisiones de implementación

DecisiónRazón
Puerto API 3008Evitar colisión con otros daily apps
Soft auth en páginasSimple L1; API sigue siendo autoridad
preferredDay/Slot StringMenos fricción timezone en L1
Sin FK User–ClassRequestForm anónimo
Código VO-MMDD-randomReferencia oral corta
Templates inline standaloneVelocidad daily; páginas autocontenidas
Stats endpoint propioEvolución y menos lógica en cliente
Ruta stats/summary antes de :idEvitar captura de param

6. Variables de entorno

VariableServicioDescripción
DATABASE_URLAPINeon connection string
JWT_SECRETAPIFirma tokens
PORTAPIopcional, 3008

Web: URL de API en ApiService (default localhost:3008).

7. Smoke de implementación (mínimo)

  1. Seed OK en consola (VOLTA seed OK).
  2. Login coach 200.
  3. List length ≥ 1.
  4. Create request 201 + code.
  5. Patch CONTACTED/CONFIRMED 200.
  6. GET sin token 401.
  7. Web muestra badges y home con Syne/lime.

8. Estructura de ficheros clave

volta-app/
├── apps/api/
│   ├── prisma/schema.prisma
│   ├── prisma/seed.ts
│   └── src/
│       ├── main.ts
│       ├── app.module.ts
│       ├── auth/
│       │   ├── auth.controller.ts
│       │   ├── auth.service.ts
│       │   ├── jwt.strategy.ts
│       │   └── jwt-auth.guard.ts
│       ├── requests/
│       │   ├── requests.controller.ts
│       │   └── requests.service.ts
│       └── prisma/
├── apps/web/
│   ├── tailwind.config.js
│   └── src/app/
│       ├── app.routes.ts
│       ├── core/api.service.ts
│       └── pages/
│           ├── home/
│           ├── join/
│           ├── success/
│           ├── login/
│           ├── inbox/
│           └── request-detail/
└── package.json

9. Alineación case ↔ app

DocEvidencia en código
05 data modelschema.prisma enums y models
04 flowsroutes + controller methods
08 DStailwind colors + fontFamily
09 contentstrings en templates home/join/…
00 paperURLs en README case

10. Notas de cierre técnico

  • Vertical slice L1 runnable local con Neon.
  • No quedan features must-have del brief sin implementar.
  • Mejoras (guards Angular, e2e, rate limit) viven en backlog L1+, no como deuda de cierre del día.