template-saas/orchestration/trazas/TRAZA-TAREAS-DATABASE.md
rckrdmrd 26f0e52ca7 feat: Initial commit - template-saas
Template base para proyectos SaaS multi-tenant.

Estructura inicial:
- apps/backend (NestJS API)
- apps/frontend (React/Vite)
- apps/database (PostgreSQL DDL)
- docs/ (Documentación)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 04:41:24 -06:00

281 lines
8.1 KiB
Markdown

# TRAZA DE TAREAS - DATABASE
**Proyecto:** template-saas
**Capa:** Database
**Version:** 1.0.0
**Inicio:** 2026-01-07
---
## HISTORIAL
### [2026-01-07] SAAS-001-DDL
**Estado:** completado
**Agente:** Database-Agent
**Duracion:** ~2h
**SP:** 8
#### Descripcion
Creacion de DDL para schemas core: auth, tenants, users (incluyendo roles y permisos).
#### Archivos Creados
- `apps/database/ddl/00-extensions.sql` - Extensiones PostgreSQL
- `apps/database/ddl/01-schemas.sql` - Creacion de 9 schemas
- `apps/database/ddl/02-enums.sql` - 25 tipos enum
- `apps/database/ddl/schemas/tenants/tables/01-tenants.sql` - Tabla tenants
- `apps/database/ddl/schemas/tenants/tables/02-tenant-settings.sql` - Settings por tenant
- `apps/database/ddl/schemas/users/tables/01-users.sql` - Tabla users con RLS
- `apps/database/ddl/schemas/users/tables/02-roles.sql` - Roles, user_roles, permissions
- `apps/database/ddl/schemas/users/tables/03-invitations.sql` - Invitaciones
- `apps/database/ddl/schemas/auth/tables/01-sessions.sql` - Sesiones activas
- `apps/database/ddl/schemas/auth/tables/02-tokens.sql` - Tokens y refresh tokens
- `apps/database/ddl/schemas/auth/tables/03-oauth.sql` - Conexiones OAuth
#### Resultado
- 11 tablas creadas
- 12 RLS policies implementadas
- 6 triggers de updated_at
- Funciones de contexto de tenant
#### Notas
- RLS usa `current_setting('app.current_tenant_id')` para aislamiento
- Tabla `tenants.tenants` no tiene RLS (es la base del multi-tenancy)
- OAuth soporta: google, microsoft, github, apple
---
### [2026-01-07] SAAS-002-DDL
**Estado:** completado
**Agente:** Database-Agent
**Duracion:** ~1.5h
**SP:** 5
#### Descripcion
Creacion de DDL para schemas de billing y plans.
#### Archivos Creados
- `apps/database/ddl/schemas/plans/tables/01-plans.sql` - Plans y plan_features
- `apps/database/ddl/schemas/billing/tables/01-subscriptions.sql` - Subscriptions
- `apps/database/ddl/schemas/billing/tables/02-invoices.sql` - Invoices, payments
#### Resultado
- 7 tablas creadas (plans, plan_features, subscriptions, subscription_items, invoices, invoice_items, payments)
- 5 RLS policies para billing
- Secuencia para invoice_number
- Funcion generate_invoice_number()
#### Notas
- Plans no usa RLS (datos globales)
- Billing completamente aislado por tenant
- Soporte para metered billing con subscription_items
---
### [2026-01-07] SAAS-003-DDL
**Estado:** completado
**Agente:** Database-Agent
**Duracion:** ~1.5h
**SP:** 5
#### Descripcion
Creacion de DDL para schemas de features: notifications, feature_flags, audit.
#### Archivos Creados
- `apps/database/ddl/schemas/audit/tables/01-audit-logs.sql` - Audit y activity logs
- `apps/database/ddl/schemas/notifications/tables/01-notifications.sql` - Templates, notifications, preferences
- `apps/database/ddl/schemas/feature_flags/tables/01-flags.sql` - Flags, tenant_flags, user_flags, evaluations
#### Resultado
- 10 tablas creadas
- 6 RLS policies
- Funcion evaluate_flag() para evaluacion de feature flags
- Funcion log_event() para auditoria
- Funciones de cleanup para retencion
#### Notas
- Feature flags soporta: disabled, enabled, percentage, user_list
- Audit logs con cleanup configurable por dias
- Notifications con templates y variables dinamicas
---
### [2026-01-07] SAAS-004-RLS
**Estado:** completado
**Agente:** Database-Agent
**Duracion:** ~30m
**SP:** 5
#### Descripcion
Implementacion de RLS policies en todos los schemas y funciones de contexto.
#### Archivos Creados
- `apps/database/ddl/03-functions.sql` - Funciones de contexto y utilidad
#### Resultado
- 20+ RLS policies totales
- Funciones de contexto:
- `auth.set_current_tenant(uuid)`
- `auth.get_current_tenant()`
- `auth.set_current_user(uuid)`
- `auth.clear_context()`
- Funciones de utilidad:
- `plans.get_tenant_limits(uuid)`
- `plans.check_limit(uuid, varchar, int)`
- `plans.has_feature(uuid, varchar)`
- `users.count_active_users(uuid)`
- `users.can_add_user(uuid)`
- `public.slugify(varchar)`
- `public.generate_token(int)`
- `public.hash_token(varchar)`
#### Notas
- Todas las tablas con datos de tenant tienen RLS habilitado
- Contexto se establece via set_config() para transaccion
---
### [2026-01-07] SAAS-005-SEEDS
**Estado:** completado
**Agente:** Database-Agent
**Duracion:** ~1h
**SP:** 3
#### Descripcion
Seeds de produccion con datos base del sistema.
#### Archivos Creados
- `apps/database/seeds/prod/01-plans.sql` - 4 planes SaaS
- `apps/database/seeds/prod/02-permissions.sql` - 21 permisos + 8 feature flags
- `apps/database/seeds/prod/03-notification-templates.sql` - 6 email templates
#### Resultado
- **Plans:** Free, Starter ($29), Pro ($79), Enterprise
- **Permissions:** users:*, roles:*, billing:*, settings:*, api_keys:*, audit:*, features:*, notifications:*
- **Feature Flags:** dark_mode, api_access, analytics_basic/advanced, ai_assistant, slack/zapier integration
- **Templates:** welcome, email_verification, password_reset, invitation, invoice_paid, trial_ending
#### Notas
- Plans incluyen limits JSONB para enforcement
- Permissions con categorias y flags is_sensitive/requires_owner
- Templates con variables para renderizado dinamico
---
### [2026-01-07] SAAS-006-SCRIPTS
**Estado:** completado
**Agente:** Database-Agent
**Duracion:** ~30m
**SP:** 1
#### Descripcion
Creacion de scripts de creacion y recreacion de base de datos.
#### Archivos Creados
- `apps/database/scripts/create-database.sh` - Script de creacion completa
- `apps/database/scripts/drop-and-recreate.sh` - Script de drop y recreacion
#### Resultado
- Script de 7 pasos: conexion, usuario, database, extensions, DDL, tables, seeds
- Soporte para variables de entorno configurables
- Manejo de usuarios sin privilegio CREATEROLE
- Verificacion automatica de tablas y seeds
#### Notas
- Usa gamilit_user con CREATEDB como admin alternativo
- FORCE=1 para skip confirmacion en drop-and-recreate
---
### [2026-01-07] SAAS-007-VALIDATE
**Estado:** completado
**Agente:** Database-Agent
**Duracion:** ~15m
**SP:** 1
#### Descripcion
Validacion de DDL ejecutando recreacion completa de la base de datos.
#### Resultado
- 27 tablas creadas exitosamente
- 4 planes cargados
- 21 permisos cargados
- 8 feature flags cargados
- 6 notification templates cargados
#### Correcciones Aplicadas
- UUIDs en seeds corregidos (p0000000 -> a0000001, nt000000 -> b0000001)
---
## TAREAS PENDIENTES
| ID | Tarea | Prioridad | SP | Dependencias |
|----|-------|-----------|-----|--------------|
| SAAS-008-STORAGE | DDL schema storage | P2 | 2 | - |
---
## METRICAS
| Metrica | Valor |
|---------|-------|
| Tablas creadas | 27 |
| RLS policies | 20+ |
| Funciones | 22 |
| Triggers | 14 |
| Enums | 19 |
| Seeds (prod) | 3 archivos |
| Scripts | 2 (create, drop-recreate) |
| SP completados | 28/28 (100% Fase 1 DDL + Scripts) |
---
## ARCHIVOS CREADOS (RESUMEN)
```
apps/database/
├── ddl/
│ ├── 00-extensions.sql
│ ├── 01-schemas.sql
│ ├── 02-enums.sql
│ ├── 03-functions.sql
│ └── schemas/
│ ├── auth/tables/
│ │ ├── 01-sessions.sql
│ │ ├── 02-tokens.sql
│ │ └── 03-oauth.sql
│ ├── tenants/tables/
│ │ ├── 01-tenants.sql
│ │ └── 02-tenant-settings.sql
│ ├── users/tables/
│ │ ├── 01-users.sql
│ │ ├── 02-roles.sql
│ │ └── 03-invitations.sql
│ ├── billing/tables/
│ │ ├── 01-subscriptions.sql
│ │ └── 02-invoices.sql
│ ├── plans/tables/
│ │ └── 01-plans.sql
│ ├── audit/tables/
│ │ └── 01-audit-logs.sql
│ ├── notifications/tables/
│ │ └── 01-notifications.sql
│ └── feature_flags/tables/
│ └── 01-flags.sql
├── seeds/
│ ├── prod/
│ │ ├── 01-plans.sql
│ │ ├── 02-permissions.sql
│ │ └── 03-notification-templates.sql
│ └── dev/
├── scripts/
│ ├── create-database.sh
│ └── drop-and-recreate.sh
└── README.md
```
---
**Ultima actualizacion:** 2026-01-07
**Actualizado por:** Orquestador