210 lines
6.2 KiB
Markdown
210 lines
6.2 KiB
Markdown
# EPICA: EPIC-MGN-004 - Multi-Tenancy
|
|
|
|
## Metadata
|
|
|
|
| Campo | Valor |
|
|
|-------|-------|
|
|
| **ID** | EPIC-MGN-004 |
|
|
| **Nombre** | Multi-Tenancy |
|
|
| **Modulo** | tenants |
|
|
| **Fase** | Fase 1 - Foundation |
|
|
| **Prioridad** | P0 (Critico) |
|
|
| **Estado** | Ready |
|
|
| **Story Points** | 21 |
|
|
| **Sprint(s)** | Sprint 4 (multi-tenancy) |
|
|
| **Plan Detalle** | [SPRINT-PLAN-FASE-1.md](../SPRINT-PLAN-FASE-1.md) |
|
|
|
|
---
|
|
|
|
## Descripcion
|
|
|
|
Sistema de multi-tenancy que permite aislar datos entre diferentes organizaciones (tenants) usando Row-Level Security (RLS) en PostgreSQL. Incluye creacion de tenants, configuracion por tenant, feature flags, limites/quotas y aislamiento completo de datos.
|
|
|
|
Es la base arquitectonica para ofrecer el sistema como SaaS multi-cliente.
|
|
|
|
---
|
|
|
|
## Objetivo de Negocio
|
|
|
|
Implementar arquitectura multi-tenant que:
|
|
- Aisle completamente los datos entre clientes
|
|
- Permita personalizacion por cliente (branding, features)
|
|
- Soporte diferentes planes de suscripcion
|
|
- Escale a miles de tenants
|
|
- Facilite el onboarding de nuevos clientes
|
|
|
|
---
|
|
|
|
## Stakeholders
|
|
|
|
| Rol | Nombre/Equipo | Responsabilidad |
|
|
|-----|---------------|-----------------|
|
|
| Product Owner | Equipo Producto | Definicion de features por plan |
|
|
| Tech Lead | Equipo Backend | Implementacion de RLS |
|
|
| Operaciones | Equipo Infra | Monitoreo y escalabilidad |
|
|
| Clientes | Tenant admins | Feedback de gestion |
|
|
|
|
---
|
|
|
|
## Historias de Usuario
|
|
|
|
| ID | Historia | Prioridad | SP | Estado |
|
|
|----|----------|-----------|-----|--------|
|
|
| US-MGN004-001 | Como superadmin, quiero crear tenants para dar de alta nuevos clientes | P0 | 5 | Ready |
|
|
| US-MGN004-002 | Como tenant admin, quiero configurar mi organizacion (nombre, logo, colores) | P0 | 3 | Ready |
|
|
| US-MGN004-003 | Como superadmin, quiero habilitar/deshabilitar features por tenant | P0 | 5 | Ready |
|
|
| US-MGN004-004 | Como sistema, quiero aislar datos automaticamente por tenant usando RLS | P0 | 5 | Ready |
|
|
| US-MGN004-005 | Como superadmin, quiero definir limites y quotas por tenant | P1 | 3 | Ready |
|
|
|
|
**Total Story Points:** 21 SP
|
|
|
|
---
|
|
|
|
## Criterios de Aceptacion de la Epica
|
|
|
|
**Funcionales:**
|
|
- [ ] CRUD de tenants con datos de organizacion
|
|
- [ ] Configuracion personalizada por tenant (branding)
|
|
- [ ] Feature flags activables por tenant
|
|
- [ ] Aislamiento de datos via RLS
|
|
- [ ] Limites configurables (usuarios, storage, etc.)
|
|
- [ ] Dashboard de tenant para admins
|
|
|
|
**No Funcionales:**
|
|
- [ ] Performance: Overhead de RLS < 5%
|
|
- [ ] Seguridad: Imposible acceder a datos de otro tenant
|
|
- [ ] Escalabilidad: Soporte 10,000+ tenants
|
|
|
|
**Tecnicos:**
|
|
- [ ] RLS policies en todas las tablas
|
|
- [ ] Contexto de tenant via `app.current_tenant_id`
|
|
- [ ] Cobertura de tests > 90%
|
|
- [ ] Tests de seguridad (penetration tests)
|
|
|
|
---
|
|
|
|
## Dependencias
|
|
|
|
**Esta epica depende de:**
|
|
| Epica/Modulo | Estado | Bloqueante |
|
|
|--------------|--------|------------|
|
|
| EPIC-MGN-001 Auth | Ready | Si |
|
|
| PostgreSQL con RLS | Ready | Si |
|
|
|
|
**Esta epica bloquea:**
|
|
| Epica/Modulo | Razon |
|
|
|--------------|-------|
|
|
| EPIC-MGN-005 Catalogs | Requiere tenant para aislar datos |
|
|
| EPIC-MGN-016 Billing | Facturacion por tenant |
|
|
| Todos los modulos | Aislamiento de datos |
|
|
|
|
---
|
|
|
|
## Desglose Tecnico
|
|
|
|
**Database:**
|
|
- [ ] Schema: `core_system`
|
|
- [ ] Tablas: 3 (tenants, tenant_settings, tenant_features)
|
|
- [ ] Funciones: 3 (set_tenant_context, get_current_tenant, validar_tenant)
|
|
- [ ] RLS Policies: Todas las tablas del sistema
|
|
- [ ] Triggers: auto-set tenant_id on insert
|
|
|
|
**Backend:**
|
|
- [ ] Modulo: `tenants`
|
|
- [ ] Entities: 3 (Tenant, TenantSetting, TenantFeature)
|
|
- [ ] Middleware: TenantContextMiddleware
|
|
- [ ] Interceptor: TenantInjector
|
|
- [ ] Endpoints: 8 (CRUD + config + features + stats)
|
|
- [ ] Tests: 25+
|
|
|
|
**Frontend:**
|
|
- [ ] Paginas: 3 (TenantsList, TenantConfig, TenantFeatures)
|
|
- [ ] Componentes: 6 (TenantForm, TenantCard, FeatureToggle, etc.)
|
|
- [ ] Stores: 1 (tenantStore)
|
|
- [ ] Context: CurrentTenantProvider
|
|
|
|
---
|
|
|
|
## Arquitectura RLS
|
|
|
|
```sql
|
|
-- Politica base para todas las tablas
|
|
CREATE POLICY tenant_isolation ON {tabla}
|
|
USING (tenant_id = current_setting('app.current_tenant_id')::uuid);
|
|
|
|
-- Funcion para establecer contexto
|
|
CREATE FUNCTION set_tenant_context(p_tenant_id UUID)
|
|
RETURNS VOID AS $$
|
|
BEGIN
|
|
PERFORM set_config('app.current_tenant_id', p_tenant_id::text, false);
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
```
|
|
|
|
**Feature Flags por Plan:**
|
|
|
|
| Feature | Starter | Growth | Enterprise |
|
|
|---------|---------|--------|------------|
|
|
| Usuarios max | 5 | 25 | Ilimitados |
|
|
| Storage | 1GB | 10GB | 100GB |
|
|
| Reportes | Basicos | Avanzados | Personalizados |
|
|
| API Access | No | Si | Si |
|
|
| WhatsApp | No | No | Si |
|
|
| AI Agents | No | No | Si |
|
|
| Soporte | Email | Chat | Dedicado |
|
|
|
|
---
|
|
|
|
## Riesgos
|
|
|
|
| Riesgo | Probabilidad | Impacto | Mitigacion |
|
|
|--------|--------------|---------|------------|
|
|
| Fuga de datos entre tenants | Baja | Critico | Tests exhaustivos, auditorias |
|
|
| Performance con RLS | Media | Alto | Indices optimizados, benchmarks |
|
|
| Complejidad de migraciones | Media | Medio | Migraciones por tenant |
|
|
|
|
---
|
|
|
|
## Definition of Ready (DoR)
|
|
|
|
- [x] Historias de usuario definidas
|
|
- [x] Criterios de aceptacion claros
|
|
- [x] Dependencias identificadas
|
|
- [x] Estimacion completada
|
|
- [x] Arquitectura RLS aprobada
|
|
- [x] Sin bloqueadores activos
|
|
|
|
## Definition of Done (DoD)
|
|
|
|
- [ ] Codigo implementado y revisado
|
|
- [ ] RLS policies en todas las tablas
|
|
- [ ] Tests de aislamiento pasando
|
|
- [ ] Tests de penetracion ejecutados
|
|
- [ ] Documentacion actualizada
|
|
- [ ] Demo realizada
|
|
- [ ] Security review aprobado
|
|
|
|
---
|
|
|
|
## Documentacion Relacionada
|
|
|
|
- Requerimientos: `docs/03-requerimientos/RF-tenants/`
|
|
- Especificaciones: `docs/04-modelado/especificaciones-tecnicas/ET-tenants-*.md`
|
|
- User Stories: `docs/05-user-stories/MGN-004/`
|
|
- DDL Spec: `docs/04-modelado/database-design/DDL-SPEC-core_tenants.md`
|
|
- ADR: `docs/97-adr/ADR-003-multi-tenancy.md`
|
|
|
|
---
|
|
|
|
## Historial
|
|
|
|
| Fecha | Cambio | Autor |
|
|
|-------|--------|-------|
|
|
| 2025-12-05 | Creacion de epica | Requirements-Analyst |
|
|
|
|
---
|
|
|
|
**Creada por:** Requirements-Analyst
|
|
**Fecha:** 2025-12-05
|
|
**Ultima actualizacion:** 2025-12-05
|