RELE · 20-implementation.md · 22 de 22

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

20 — Implementación — RELE

1. Resumen ejecutivo técnico

CampoValor
App path/Users/cristian/orca/rele-app/
GitHubhttps://github.com/Criscode2022/rele-app
APINestJS · puerto 3009 · prefijo /api
WebAngular standalone · puerto 4200
DBNeon PostgreSQL · Prisma · sparkling-snow-59844541
AuthJWT Bearer · roles RESIDENT | ADVISOR
DominioUser, Home, Reading
Fecha2026-08-09
Case/Users/cristian/orca/ux-projects/2026-08-09-rele/

2. Cómo arrancar

cd /Users/cristian/orca/rele-app

# Dependencias (apps independientes, sin workspaces)
npm install --prefix apps/api
npm install --prefix apps/web

# Entorno API: DATABASE_URL (Neon) + JWT_SECRET
# cp apps/api/.env.example apps/api/.env   # si existe

npm --prefix apps/api run prisma:migrate
npm --prefix apps/api run prisma:seed

npm run api    # Nest → http://localhost:3009
npm run web    # Angular → http://localhost:4200

Credenciales

RolNombreEmailPassword
RESIDENTElena Maríncasa@rele.energypassword123
ADVISORToni Gilasesor@rele.energypassword123

3. Módulos API implementados

Auth

  • POST /api/auth/login
  • Valida email/password; compara bcrypt; emite JWT.
  • Response: { accessToken, user: { id, email, name, role } }.
  • JwtStrategy + JwtAuthGuard protegen readings.

Readings

MétodoRutaNotas
GET/api/readingsfiltro por rol (resident propias / advisor todas)
GET/api/readings/stats/summarytotal, open, byStatus, kwhTotal
GET/api/readings/:idownership check resident
POST/api/readingssolo RESIDENT; home resolve/create; status SUBMITTED
PATCH/api/readings/:id/statussolo ADVISOR; advisorId + advisorNote

Prisma

Enums Role, ReadingStatus; modelos User, Home, Reading; seed 2 users + 1 home + 5 readings.

4. Frontend implementado

PáginaPathResponsabilidad
HomePage/marketing, hero, pasos, CTAs rol
LoginPage/loginform → ApiService.login → /lecturas
ReadingsPage/lecturasstats + list + empty/error + logout
ReadingNewPage/lecturas/nuevaform create (resident)
ReadingDetailPage/lecturas/:idget + patch status (advisor)

ApiService centraliza base URL http://localhost:3009/api, storage rele_token / rele_user, métodos HTTP tipados.

5. Decisiones de implementación

DecisiónRazón
Puerto API 3009Evitar colisión con VOLTA 3008 / SURCO 3007
Soft auth en páginasSimple L2; API es autoridad
Create → SUBMITTEDMenos fricción que DRAFT
Home implícita en createMenos pantallas CRUD L2
open = SUBMITTED + FLAGGEDOps de “requiere atención”
kwhTotal en statsDominio energía visible
Templates inline standaloneVelocidad daily
accessToken camelCaseAlineado serie (SURCO)

6. Variables de entorno

VariableServicioDescripción
DATABASE_URLAPINeon connection string
JWT_SECRETAPIFirma tokens
PORTAPIopcional, 3009

Web: URL de API en apps/web/src/app/core/api.service.ts.

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

  1. Seed OK en consola (RELE seed OK).
  2. Login residente 200 + accessToken.
  3. List length ≥ 1; stats con kwhTotal.
  4. Create reading 200/201 · code RE-… · SUBMITTED.
  5. Login asesor ve lecturas de Elena.
  6. Patch REVIEWED/FLAGGED 200.
  7. RESIDENT patch → 403; ADVISOR create → 403.
  8. Web muestra palette maritime + badges.

8. Estructura de ficheros clave

rele-app/
├── package.json
├── README.md
└── apps/
    ├── api/
    │   ├── prisma/schema.prisma
    │   ├── prisma/seed.ts
    │   └── src/
    │       ├── main.ts                 # port 3009, prefix api
    │       ├── app.module.ts
    │       ├── auth/
    │       │   ├── auth.controller.ts
    │       │   ├── auth.service.ts
    │       │   ├── jwt.strategy.ts
    │       │   └── jwt-auth.guard.ts
    │       ├── readings/
    │       │   ├── readings.controller.ts
    │       │   ├── readings.service.ts
    │       │   └── readings.module.ts
    │       └── prisma/
    └── web/
        ├── tailwind.config.js          # fog/navy/sea/coral · Sora/Nunito
        ├── src/styles.css
        └── src/app/
            ├── app.routes.ts
            ├── core/api.service.ts
            └── pages/
                ├── home/home.page.ts
                ├── login/login.page.ts
                ├── readings/readings.page.ts
                ├── reading-new/reading-new.page.ts
                └── reading-detail/reading-detail.page.ts

9. Tokens implementados (web)

TokenValor
bg#EEF1F4
ink#0C2340
sea#2F8F8C
coral#E07A5F
border#D0D8E0
displaySora
sansNunito Sans

10. Seed detallado

CódigoPeriodokWhStatusNota asesor
RE-0809-012026-0721248.6REVIEWEDPico coherente con ola de calor.
RE-0809-022026-0616839.2REVIEWEDDentro de rango.
RE-0809-032026-0824556.1SUBMITTED
RE-0809-042026-0514133.4FLAGGEDRevisar tarifa PVPC vs fija.
RE-0809-052026-0415536.0SUBMITTED

Home: Piso Ruzafa · C/ Sueca 18, 3º · València · CUPS ES0021000000000001AB.

11. Endpoints — tabla de contratos

MétodoRutaAuthBody / notes
POST/api/auth/loginNo{ email, password }
GET/api/readingsJWT
GET/api/readings/stats/summaryJWT
GET/api/readings/:idJWT
POST/api/readingsJWT RESIDENT{ period, kwh, costEur?, notes?, homeLabel? }
PATCH/api/readings/:id/statusJWT ADVISOR{ status, advisorNote? }

12. Paridad con Paper y case

ArtefactoRef
Paper01KZJNCCMJ1FDHHPZZ923RWDWY
Heroassets/hero.jpg (case + web)
Docs2026-08-09-rele/docs/*
Executivepresentation/executive-summary.md

13. Criterio de cierre implementación

  • API runnable :3009
  • Web runnable :4200
  • Neon + seed
  • Multi-rol authz
  • Vertical slice lecturas
  • Tokens no genéricos
  • GitHub Criscode2022/rele-app