CleanTech es una plataforma SaaS full-stack para la monitorización e incentivo del reciclaje de Residuos de Aparatos Eléctricos y Electrónicos (RAEE). El sistema implementa la arquitectura completa de un producto real: frontend web interactivo con simulación IoT, backend API REST con autenticación JWT, base de datos PostgreSQL persistente, y CI/CD automatizado para despliegue en producción.
- Arquitectura General
- Tecnologías
- Estructura del Monorepo
- Frontend Web (web/)
- Backend API (api/)
- Tipos Compartidos (shared/)
- Inicio Rápido
- API Endpoints
- Autenticación y Seguridad
- Base de Datos
- Docker
- Despliegue en Producción
- Testing
- Roadmap
┌─────────────────────────────────────────────────────────────────┐
│ CLEANTECH SAAS │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────┐ ┌──────────────────────────────┐ │
│ │ FRONTEND (web/) │ │ BACKEND API (api/) │ │
│ │ │ │ │ │
│ │ TypeScript + Vite │────▶│ Node.js + Express │ │
│ │ TailwindCSS │ │ JWT Authentication │ │
│ │ Simulation IoT │ │ Prisma ORM │ │
│ │ Dashboard UI │ │ PostgreSQL Database │ │
│ └─────────────────────┘ │ Redis Cache (opcional) │ │
│ │ Swagger API Docs │ │
│ └──────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────┐ │
│ │ INFRASTRUCTURA (AWS) │ │
│ │ │ │
│ │ EC2 + RDS + ElastiCache │ │
│ │ CloudFront + Route53 │ │
│ │ Docker + GitHub Actions │ │
│ └──────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
| Capa | Tecnología | Descripción |
|---|---|---|
| 1. Cliente (Frontend) | TypeScript, Vite, TailwindCSS | UI interactiva, simulación de sensores, dashboard |
| 2. Servidor (API) | Node.js, Express, JWT, Prisma | Lógica de negocio, autenticación, validación |
| 3. Datos | PostgreSQL 15, Redis 7 | Persistencia, caché, migraciones |
- TypeScript 5.x — Strict mode absoluto
- Vite 5 — Build ultrarrápido y HMR
- TailwindCSS 3 — Utility-first CSS
- Vitest — Testing unitario con cobertura
- Patrón Observable — Estado reactivo sin frameworks
- Node.js 20 — Runtime LTS
- Express 4 — Framework HTTP minimalista
- Prisma ORM 5 — Type-safe database client
- PostgreSQL 15 — Base de datos relacional
- JWT — Autenticación stateless (access + refresh tokens)
- Joi — Validación de schemas
- Pino — Logger estructurado JSON
- Swagger/OpenAPI — Documentación automática de API
- Bcrypt — Hash de contraseñas
- Helmet — Seguridad HTTP headers
- CORS — Configuración restrictiva
- Docker + Docker Compose para desarrollo local
- GitHub Actions — CI/CD automatizado
- AWS — EC2, RDS, ElastiCache, CloudFront
- Sentry — Error tracking (próximamente)
CleanTech/
├── api/ # 🟢 Backend API
│ ├── prisma/
│ │ └── schema.prisma # Esquema de base de datos
│ ├── src/
│ │ ├── index.ts # Entry point del servidor
│ │ ├── config/ # Configuración centralizada
│ │ ├── controllers/ # Manejadores HTTP
│ │ │ ├── auth.controller.ts
│ │ │ ├── transaction.controller.ts
│ │ │ ├── reward.controller.ts
│ │ │ └── admin.controller.ts
│ │ ├── services/ # Lógica de negocio
│ │ │ ├── auth.service.ts
│ │ │ ├── transaction.service.ts
│ │ │ └── reward.service.ts
│ │ ├── middleware/ # Middleware Express
│ │ │ ├── auth.ts # JWT authentication
│ │ │ ├── errorHandler.ts # Error handling global
│ │ │ └── validate.ts # Validación Joi
│ │ ├── routes/ # Definiciones de rutas
│ │ ├── utils/ # Utilidades
│ │ │ ├── logger.ts # Pino logger
│ │ │ └── validation.ts # Schemas Joi
│ │ └── database/
│ │ ├── client.ts # Prisma singleton
│ │ └── seed.ts # Datos de ejemplo
│ ├── tests/ # Tests backend
│ ├── Dockerfile # Container API
│ ├── package.json
│ └── tsconfig.json
│
├── web/ # 🟣 Frontend Web
│ ├── src/ # Código fuente TypeScript
│ ├── tests/ # Tests frontend
│ ├── index.html # HTML entry
│ ├── vite.config.ts
│ ├── package.json
│ └── tsconfig.json
│
├── shared/ # 🟡 Tipos Compartidos
│ └── types/
│ └── index.ts # Interfaces y tipos compartidos
│
├── docker-compose.yml # Desarrollo local
├── README.md # Esta documentación
└── LICENSE (MIT)
El frontend es una aplicación web interactiva que simula un sistema IoT de reciclaje RAEE con:
- Simulación de sensores HX711 con ruido gaussiano, deriva térmica y jitter
- Dashboard analítico con métricas en tiempo real
- Display LCD de estado del sistema
- Sistema de recompensas con niveles (bronze → platinum)
- Animaciones premium con scroll, contadores y parallax
Documentación detallada del frontend →
API REST robusta con arquitectura en capas:
- Express con middleware de seguridad (Helmet, CORS)
- JWT con access tokens (15 min) y refresh tokens (7 días)
- Prisma ORM para PostgreSQL con migraciones
- Joi para validación server-side en todos los endpoints
- Pino para logging estructurado JSON
- Swagger UI disponible en
/api/docs
| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
| POST | /auth/register |
Registro de usuario | No |
| POST | /auth/login |
Inicio de sesión | No |
| POST | /auth/refresh |
Refrescar token | No |
| GET | /auth/me |
Perfil usuario | JWT |
| PUT | /auth/me |
Actualizar perfil | JWT |
| POST | /api/transactions |
Registrar depósito RAEE | JWT |
| GET | /api/transactions |
Historial (paginado) | JWT |
| GET | /api/rewards |
Recompensas disponibles | JWT |
| POST | /api/rewards/:id/redeem |
Canjear recompensa | JWT |
| GET | /api/dashboard |
Dashboard usuario | JWT |
| GET | /api/admin/dashboard |
Dashboard admin | Admin |
| GET | /api/admin/users |
Listar usuarios | Admin |
| CRUD | /api/admin/containers |
Gestionar contenedores | Admin |
| GET | /health |
Health check | No |
Documentación completa Swagger →
- Access Token: 15 minutos de validez
- Refresh Token: 7 días de validez
- Almacenados en
httpOnlycookies (producción) oAuthorizationheader - En cada request protegido, el middleware
authenticateTokenverifica:- Token presente en header
Authorization: Bearer <token> - Firma válida con
JWT_ACCESS_SECRET - Token no expirado
- Token presente en header
- Bcrypt con 10 rounds para hash de contraseñas
- Rate limiting en login/register (5 intentos/15 min)
- Helmet para HTTP headers de seguridad
- CORS restrictivo por origen
- Validación Joi en todos los inputs
- Prepared statements via Prisma (previene SQL injection)
- Validación de proximidad GPS (±50m del contenedor)
Users ──┐ ┌── Containers
│ │
├── Transactions ──┘
│
└── UserRewards ── Rewards
Municipalities ── Containers
- User — Ciudadanos, admins, municipios (con soft delete)
- Municipality — Municipios registrados en la plataforma
- Container — Contenedores IoT con GPS y capacidad
- Transaction — Depósitos de RAEE con validación de proximidad
- Reward — Recompensas canjeables por tokens
- UserReward — Historial de canjes
- AuditLog — Trazabilidad de todas las operaciones
# Iniciar todos los servicios (API + PostgreSQL + Redis)
docker-compose up -d
# Ejecutar migraciones
npm run migrate
# Poblar base de datos con datos demo
npm run seed
# Ver logs
docker-compose logs -f api| Servicio | Puerto | Descripción |
|---|---|---|
api |
3000 | Node.js API |
postgres |
5432 | PostgreSQL 15 |
redis |
6379 | Redis 7 (caché) |
- EC2 (t3.medium) — API Node.js con auto-scaling
- RDS — PostgreSQL 15 managed
- ElastiCache — Redis cluster
- CloudFront — CDN frontend estático
- Route53 — DNS management
- ACM — SSL/TLS certificates
Push/PR → Lint → Test (unit + integration) → Build → Deploy
- Tests automáticos en cada push
- Deploy a staging en PR merge
- Deploy a producción en push a
main - Rollback automático si health check falla
- 31 tests unitarios + integración
- Cobertura mínima: 80%
- Flujo completo: sensor simulado → edge → state
- Tests unitarios de servicios
- Tests de lógica de negocio (tokens, niveles, GPS)
- Tests de autenticación (JWT, bcrypt)
- Cobertura mínima: 80%
# Frontend
cd web && npm run test
# Backend
cd api && npm run test| Fase | Duración | Objetivos |
|---|---|---|
| Fase 1 (TFG) | ✅ Completo | Frontend IoT simulado, documentación |
| Fase 2 (Actual) | Sem 1-2 | API REST + PostgreSQL + Autenticación |
| Fase 3 | Sem 3-4 | Transacciones reales, recompensas, GPS |
| Fase 4 | Sem 5-6 | Admin dashboard, testing, Swagger |
| Fase 5 | Sem 7-8 | Docker, CI/CD, deploy AWS producción |
| Fase 6 (Futuro) | Próximo | MQTT real, Stripe, app mobile |
- Node.js Documentation
- Express.js Guide
- Prisma ORM Docs
- PostgreSQL Documentation
- JWT.io
- Docker Compose
- GitHub Actions
- AWS EC2
- HX711 Datasheet
© 2024 Izan Vil — Licencia MIT