272 lines
14 KiB
Markdown
272 lines
14 KiB
Markdown
# Indice de Requerimientos Funcionales - MGN-004 Tenants
|
|
|
|
## Resumen del Modulo
|
|
|
|
| Campo | Valor |
|
|
|-------|-------|
|
|
| **Modulo** | MGN-004 |
|
|
| **Nombre** | Tenants (Multi-Tenancy) |
|
|
| **Descripcion** | Arquitectura multi-tenant con aislamiento de datos |
|
|
| **Total RFs** | 4 |
|
|
| **Story Points** | 100 |
|
|
| **Estado** | Ready |
|
|
| **Fecha** | 2025-12-05 |
|
|
|
|
---
|
|
|
|
## Lista de Requerimientos
|
|
|
|
| ID | Nombre | Prioridad | SP | Estado |
|
|
|----|--------|-----------|-----|--------|
|
|
| [RF-TENANT-001](./RF-TENANT-001.md) | Gestion de Tenants | P0 | 29 | Ready |
|
|
| [RF-TENANT-002](./RF-TENANT-002.md) | Configuracion de Tenant | P0 | 19 | Ready |
|
|
| [RF-TENANT-003](./RF-TENANT-003.md) | Aislamiento de Datos | P0 | 20 | Ready |
|
|
| [RF-TENANT-004](./RF-TENANT-004.md) | Subscripciones y Limites | P1 | 32 | Ready |
|
|
|
|
---
|
|
|
|
## Diagrama de Arquitectura Multi-Tenant
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Platform Layer │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ Platform Admin UI │ API Gateway │ Auth Service │
|
|
│ (Gestion tenants) │ (Routing) │ (JWT + tenant) │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Application Layer │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
│ │ TenantGuard │ │ RbacGuard │ │LimitGuard │ │
|
|
│ │(Contexto) │ │ (Permisos) │ │(Subscripcion)│ │
|
|
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐│
|
|
│ │ TenantAwareServices ││
|
|
│ │ (Todos los servicios heredan contexto de tenant) ││
|
|
│ └─────────────────────────────────────────────────────────────┘│
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Data Layer │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ PostgreSQL Database (Shared) │
|
|
│ │
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
│ │ Tenant A │ │ Tenant B │ │ Tenant C │ │
|
|
│ │ tenant_id │ │ tenant_id │ │ tenant_id │ │
|
|
│ │ =uuid-a │ │ =uuid-b │ │ =uuid-c │ │
|
|
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|
│ │
|
|
│ Row Level Security (RLS) - Aislamiento automatico │
|
|
│ SET app.current_tenant_id = 'tenant-uuid' │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Flujo de Request Multi-Tenant
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Request Flow │
|
|
├─────────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ 1. Request HTTP │
|
|
│ └─> Authorization: Bearer {JWT con tenant_id} │
|
|
│ │
|
|
│ 2. JwtAuthGuard │
|
|
│ └─> Valida token, extrae user + tenant_id │
|
|
│ │
|
|
│ 3. TenantGuard │
|
|
│ └─> Verifica tenant activo │
|
|
│ └─> Inyecta tenant en request │
|
|
│ │
|
|
│ 4. TenantContextMiddleware │
|
|
│ └─> SET app.current_tenant_id = :tenantId │
|
|
│ │
|
|
│ 5. LimitGuard (si aplica) │
|
|
│ └─> Verifica limites de subscripcion │
|
|
│ │
|
|
│ 6. RbacGuard │
|
|
│ └─> Valida permisos del usuario │
|
|
│ │
|
|
│ 7. Controller │
|
|
│ └─> Ejecuta logica de negocio │
|
|
│ │
|
|
│ 8. TenantAwareService │
|
|
│ └─> Automaticamente filtra por tenant │
|
|
│ │
|
|
│ 9. PostgreSQL RLS │
|
|
│ └─> Ultima linea de defensa │
|
|
│ └─> WHERE tenant_id = current_setting('app.current_tenant_id')│
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Estados del Tenant
|
|
|
|
```
|
|
┌──────────────┐
|
|
│ created │
|
|
└──────┬───────┘
|
|
│
|
|
▼
|
|
┌──────────────┐
|
|
┌──────────│ trial │──────────┐
|
|
│ └──────┬───────┘ │
|
|
│ │ │
|
|
│ (upgrade) │ (trial expires) │ (convert)
|
|
│ │ │
|
|
│ ▼ │
|
|
│ ┌──────────────┐ │
|
|
│ │trial_expired │ │
|
|
│ └──────────────┘ │
|
|
│ │
|
|
▼ ▼
|
|
┌──────────────┐ ┌──────────────┐
|
|
│ active │◄────────────────────│ active │
|
|
└──────┬───────┘ (reactivate) └──────┬───────┘
|
|
│ │
|
|
│ (suspend) │
|
|
│ │
|
|
▼ │
|
|
┌──────────────┐ │
|
|
│ suspended │────────────────────────────┘
|
|
└──────┬───────┘
|
|
│
|
|
│ (schedule delete)
|
|
▼
|
|
┌──────────────────┐
|
|
│ pending_deletion │
|
|
└────────┬─────────┘
|
|
│
|
|
│ (30 days grace)
|
|
▼
|
|
┌──────────────┐
|
|
│ deleted │
|
|
└──────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## Planes de Subscripcion
|
|
|
|
| Plan | Usuarios | Storage | Modulos | API Calls | Precio |
|
|
|------|----------|---------|---------|-----------|--------|
|
|
| **Trial** | 5 | 1 GB | Basicos | 1K/mes | Gratis |
|
|
| **Starter** | 10 | 5 GB | Basicos | 10K/mes | $29/mes |
|
|
| **Professional** | 50 | 25 GB | Standard | 50K/mes | $99/mes |
|
|
| **Enterprise** | ∞ | 100 GB | Premium | 500K/mes | $299/mes |
|
|
| **Custom** | Config | Config | Config | Config | Cotizacion |
|
|
|
|
---
|
|
|
|
## Tablas de Base de Datos
|
|
|
|
| Tabla | Descripcion |
|
|
|-------|-------------|
|
|
| tenants | Tenants registrados |
|
|
| tenant_settings | Configuracion de cada tenant (JSONB) |
|
|
| subscriptions | Subscripciones activas y pasadas |
|
|
| plans | Planes de subscripcion disponibles |
|
|
| invoices | Historial de facturacion |
|
|
| tenant_modules | Modulos activos por tenant |
|
|
|
|
---
|
|
|
|
## Estimacion Total
|
|
|
|
| Capa | Story Points |
|
|
|------|--------------|
|
|
| Backend: CRUD Tenants | 12 |
|
|
| Backend: Settings | 7 |
|
|
| Backend: RLS & Guards | 15 |
|
|
| Backend: Subscriptions | 15 |
|
|
| Backend: Billing | 10 |
|
|
| Backend: Tests | 12 |
|
|
| Frontend: Platform Admin | 15 |
|
|
| Frontend: Tenant Settings | 8 |
|
|
| Frontend: Subscription UI | 8 |
|
|
| Frontend: Tests | 6 |
|
|
| **Total** | **108 SP** |
|
|
|
|
> Nota: Los 100 SP indicados en resumen corresponden a la suma de RF individuales.
|
|
|
|
---
|
|
|
|
## Definition of Done del Modulo
|
|
|
|
- [ ] RF-TENANT-001: CRUD de tenants funcional
|
|
- [ ] RF-TENANT-002: Settings por tenant operativos
|
|
- [ ] RF-TENANT-003: RLS aplicado en TODAS las tablas
|
|
- [ ] RF-TENANT-003: Tests de aislamiento pasando
|
|
- [ ] RF-TENANT-004: Planes y limites configurados
|
|
- [ ] RF-TENANT-004: Enforcement de limites activo
|
|
- [ ] Platform Admin UI completa
|
|
- [ ] Tests unitarios > 80% coverage
|
|
- [ ] Tests de aislamiento exhaustivos
|
|
- [ ] Security review de RLS aprobado
|
|
- [ ] Performance tests con multiples tenants
|
|
|
|
---
|
|
|
|
## Consideraciones de Seguridad
|
|
|
|
### Aislamiento de Datos
|
|
|
|
- RLS como ultima linea de defensa
|
|
- Validacion en TODAS las capas
|
|
- Nunca confiar en input del cliente
|
|
- Auditar accesos cross-tenant
|
|
|
|
### Platform Admin
|
|
|
|
- Autenticacion separada
|
|
- 2FA obligatorio
|
|
- Logs de todas las acciones
|
|
- Switch de tenant explicito y auditado
|
|
|
|
### Datos Sensibles
|
|
|
|
- Encriptar datos sensibles por tenant
|
|
- Claves de encriptacion por tenant
|
|
- Backups separados (opcional enterprise)
|
|
|
|
---
|
|
|
|
## Notas de Implementacion
|
|
|
|
### Orden Recomendado
|
|
|
|
1. **Primero**: RF-TENANT-003 (RLS) - Base para todo lo demas
|
|
2. **Segundo**: RF-TENANT-001 (CRUD) - Crear tenants
|
|
3. **Tercero**: RF-TENANT-002 (Settings) - Configurar tenants
|
|
4. **Cuarto**: RF-TENANT-004 (Subscriptions) - Monetizacion
|
|
|
|
### Migracion de Datos Existentes
|
|
|
|
Si hay datos sin tenant_id:
|
|
1. Crear tenant "default"
|
|
2. Asignar todos los datos al default
|
|
3. Habilitar RLS
|
|
4. Migrar datos a tenants especificos
|
|
|
|
---
|
|
|
|
## Historial
|
|
|
|
| Version | Fecha | Autor | Cambios |
|
|
|---------|-------|-------|---------|
|
|
| 1.0 | 2025-12-05 | System | Creacion inicial con 4 RFs |
|