Database de template-saas - Workspace V2
Creates 99-additional-fk-indexes.sql with indexes for all FKs that were identified without dedicated index coverage. Organized by priority: - HIGH: billing (3), notifications (1), sales (2), commissions (1) - MEDIUM: audit (2), storage (1), webhooks (1), whatsapp (1) - LOW: created_by/approved_by fields across multiple schemas References: TASK-2026-02-03-REMEDIACION-BD (P1) Based on: INFORME-INTEGRIDAD-REFERENCIAL.md analysis Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> |
||
|---|---|---|
| ddl | ||
| migrations | ||
| scripts | ||
| seeds/prod | ||
| .gitignore | ||
| README.md | ||
Template SaaS - Database
Version: 1.0.0 Database: PostgreSQL 16+ Multi-tenancy: Row-Level Security (RLS)
Schemas
| Schema | Descripcion | RLS |
|---|---|---|
| auth | Sesiones, tokens, OAuth | Si |
| tenants | Tenants y configuracion | No* |
| users | Usuarios, roles, permisos | Si |
| billing | Subscripciones, facturas, pagos | Si |
| plans | Planes y features | No |
| audit | Logs de auditoria y actividad | Si |
| notifications | Templates y notificaciones | Si |
| feature_flags | Feature flags y evaluaciones | Si |
| storage | Archivos y metadata | Si |
*tenants.tenants no usa RLS ya que es la tabla base de multi-tenancy.
Estructura de Archivos
database/
├── ddl/
│ ├── 00-extensions.sql # Extensiones PostgreSQL
│ ├── 01-schemas.sql # Creacion de schemas
│ ├── 02-enums.sql # Tipos enum
│ ├── 03-functions.sql # Funciones de utilidad
│ └── schemas/
│ ├── auth/tables/ # Sesiones, tokens, OAuth
│ ├── tenants/tables/ # Tenants, settings
│ ├── users/tables/ # Users, roles, invitations
│ ├── billing/tables/ # Subscriptions, invoices
│ ├── plans/tables/ # Plans, features
│ ├── audit/tables/ # Audit logs, activity
│ ├── notifications/tables/
│ └── feature_flags/tables/
├── seeds/
│ ├── prod/ # Seeds para produccion
│ └── dev/ # Seeds para desarrollo
└── scripts/
├── create-database.sh
└── drop-and-recreate.sh
Uso de RLS
Establecer Contexto de Tenant
-- En cada request
SELECT auth.set_current_tenant('tenant-uuid-here');
-- Opcional: establecer usuario
SELECT auth.set_current_user('user-uuid-here');
Desde el Backend
// Middleware de tenant
async function setTenantContext(tenantId: string) {
await dataSource.query('SELECT auth.set_current_tenant($1)', [tenantId]);
}
// En el request handler
const tenantId = req.user.tenantId;
await setTenantContext(tenantId);
// Ahora todas las queries respetan RLS
Funciones de Utilidad
Contexto
auth.set_current_tenant(uuid)- Establece tenant para RLSauth.get_current_tenant()- Obtiene tenant actualauth.set_current_user(uuid)- Establece usuario actualauth.clear_context()- Limpia contexto
Limites de Plan
plans.get_tenant_limits(tenant_id)- Obtiene limites del planplans.check_limit(tenant_id, key, count)- Verifica limiteplans.has_feature(tenant_id, feature_code)- Verifica feature
Usuarios
users.count_active_users(tenant_id)- Cuenta usuarios activosusers.can_add_user(tenant_id)- Puede agregar usuario
Feature Flags
feature_flags.evaluate_flag(code, tenant_id, user_id)- Evalua flag
Utilidades
public.slugify(text)- Genera slugpublic.generate_token(length)- Genera token aleatoriopublic.hash_token(token)- Hash SHA256
Scripts
Crear Base de Datos
cd apps/database/scripts
./create-database.sh
Recrear Base de Datos
./drop-and-recreate.sh
Variables de Entorno
DB_HOST=localhost
DB_PORT=5432
DB_NAME=template_saas_dev
DB_USER=template_saas_user
DB_PASSWORD=your_password
DB_ADMIN_USER=postgres
DB_ADMIN_PASSWORD=admin_password
Orden de Ejecucion DDL
00-extensions.sql01-schemas.sql02-enums.sqlschemas/tenants/tables/*.sqlschemas/plans/tables/*.sqlschemas/users/tables/*.sqlschemas/auth/tables/*.sqlschemas/billing/tables/*.sqlschemas/audit/tables/*.sqlschemas/notifications/tables/*.sqlschemas/feature_flags/tables/*.sql03-functions.sql
Seeds Iniciales
Produccion
- Planes default (Free, Starter, Pro, Enterprise)
- Roles de sistema (owner, admin, member)
- Permisos base
- Templates de notificacion
Desarrollo
- Tenant de prueba
- Usuarios de prueba
- Datos de ejemplo
Cambios Recientes
2026-01-07: Tabla payment_methods
- Agregada tabla
billing.payment_methodspara almacenar métodos de pago - Agregado enum
billing.payment_method_type('card', 'bank_transfer', 'oxxo') - Agregado enum
billing.subscription_status('trial', 'active', 'past_due', 'cancelled', 'expired') - RLS habilitado para aislamiento multi-tenant
- Total tablas: 35
Actualizado: 2026-01-07