RELE · 06-tech-stack.md · 8 de 22

En esta página 1. Resumen 0%

06 — Stack tecnológico — RELE

1. Resumen

CapaTecnologíaNotas
FrontendAngular (standalone components)Puerto 4200
EstilosTailwind CSSTokens en tailwind.config.js
BackendNestJSPrefijo global /api, puerto 3009
ORMPrismaschema en apps/api/prisma
DBNeon PostgreSQLproject sparkling-snow-59844541
AuthJWT (Bearer)accessToken en login
Validaciónclass-validator + ValidationPipewhitelist + transform
Repo/Users/cristian/orca/rele-app/GitHub Criscode2022/rele-app

2. Estructura monorepo app

rele-app/
├── package.json              # scripts api / web
├── apps/
│   ├── api/                  # NestJS
│   │   ├── prisma/
│   │   │   ├── schema.prisma
│   │   │   └── seed.ts
│   │   ├── src/
│   │   │   ├── auth/
│   │   │   ├── readings/
│   │   │   ├── prisma/
│   │   │   ├── app.module.ts
│   │   │   └── main.ts
│   │   └── package.json
│   └── web/                  # Angular
│       ├── src/app/
│       │   ├── core/api.service.ts
│       │   └── pages/...
│       ├── tailwind.config.js
│       └── package.json
└── README.md

[DECISIÓN / D-P1-03]: apps independientes (npm install --prefix), sin workspaces npm que rompan Angular.

3. Frontend

AspectoDetalle
ComponentesStandalone + templates inline
Routingapp.routes.ts
HTTPHttpClient vía ApiService
Estado authlocalStorage keys rele_token, rele_user
API basehttp://localhost:3009/api
FontsGoogle Fonts Sora + Nunito Sans en styles.css

Rutas web

PathPágina
/HomePage
/loginLoginPage
/lecturasReadingsPage
/lecturas/nuevaReadingNewPage
/lecturas/:idReadingDetailPage

4. Backend

AspectoDetalle
Prefijo/api
CORSorigin: true, credentials
Puertoprocess.env.PORT || 3009
MódulosAuthModule, ReadingsModule, PrismaModule

Endpoints

MétodoRutaAuthRol
POST/api/auth/loginNo
GET/api/readingsJWTambos
GET/api/readings/stats/summaryJWTambos
GET/api/readings/:idJWTscope
POST/api/readingsJWTRESIDENT
PATCH/api/readings/:id/statusJWTADVISOR

5. Base de datos

CampoValor
ProviderPostgreSQL
HostingNeon serverless
Projectsparkling-snow-59844541
URLDATABASE_URL en .env (no commitear secretos)
Seedprisma/seed.ts → 2 users, 1 home, 5 readings

6. Auth JWT

PiezaRol
Loginbcrypt compare + sign JWT
Payloadsub/userId, email, role
GuardJwtAuthGuard en ReadingsController
Strategypassport-jwt Bearer
Clienteheader Authorization: Bearer <token>

7. Variables de entorno

VariableServicioDescripción
DATABASE_URLAPIConnection string Neon
JWT_SECRETAPIFirma de tokens
PORTAPIOpcional, default 3009

Web: URL API fija en api.service.ts (localhost:3009) en v1.

8. Scripts habituales

cd /Users/cristian/orca/rele-app
npm install --prefix apps/api
npm install --prefix apps/web
npm --prefix apps/api run prisma:migrate
npm --prefix apps/api run prisma:seed
npm run api    # :3009
npm run web    # :4200

9. Decisiones técnicas

DecisiónRazón
Puerto 3009Diversidad vs VOLTA 3008 / SURCO 3007
Soft guards en AngularAutoridad real en API; L2 simple
Create → SUBMITTEDMenos fricción que DRAFT+submit
Stats con kwhTotalDominio energía visible en strip
Templates inlineVelocidad daily; componentes autocontenidos
accessToken camelCaseAlineado a SURCO; evita snake_case mismatch

10. Dependencias clave (orientativo)

APIWeb
@nestjs/*@angular/*
@prisma/clienttailwindcss
passport-jwtrxjs
bcrypt
class-validator

11. Despliegue (recomendado, no obligatorio v1)

CapaOpción
APIRailway / Fly / Render
WebVercel / Netlify / static ng build
DBNeon (ya)

Documentar CORS y API URL de producción al desplegar.