# FLUJO DE CARGA LIMPIA - GAMILIT DATABASE

**Fecha:** 2025-12-18
**Version:** 1.0
**Cumple con:** DIRECTIVA-POLITICA-CARGA-LIMPIA.md

---

## RESUMEN

Este documento describe los 3 escenarios de inicializacion de base de datos y que script usar en cada caso.

---

## ESCENARIOS Y SCRIPTS

### Escenario 1: INSTALACION NUEVA (Usuario y BD no existen)

**Usar:** `init-database.sh` o `init-database-v3.sh`

**Ubicacion:** `apps/database/scripts/`

```bash
cd /home/isem/workspace/projects/gamilit/apps/database/scripts

# Opcion A: Con password manual
./init-database.sh --env dev --password "tu_password_seguro"

# Opcion B: Con dotenv-vault (recomendado para produccion)
./manage-secrets.sh generate --env prod
./manage-secrets.sh sync --env prod
./init-database-v3.sh --env prod
```

**Que hace:**
1. Crea usuario PostgreSQL `gamilit_user`
2. Crea base de datos `gamilit_platform`
3. Ejecuta todos los DDL (16 fases)
4. Carga todos los Seeds (38+ archivos)
5. Genera archivo de credenciales
6. Actualiza .env de backend/frontend

---

### Escenario 2: RECREACION COMPLETA (Usuario existe, BD se resetea)

**Usar:** `drop-and-recreate-database.sh`

**Ubicacion:** `apps/database/`

```bash
cd /home/isem/workspace/projects/gamilit/apps/database

# Con DATABASE_URL
export DATABASE_URL="postgresql://gamilit_user:password@localhost:5432/gamilit_platform"
./drop-and-recreate-database.sh

# O pasando como argumento
./drop-and-recreate-database.sh "postgresql://gamilit_user:password@localhost:5432/gamilit_platform"
```

**Que hace:**
1. Desconecta usuarios activos
2. DROP DATABASE gamilit_platform
3. CREATE DATABASE gamilit_platform
4. Llama a `create-database.sh` automaticamente

---

### Escenario 3: SOLO DDL + SEEDS (BD limpia ya existe)

**Usar:** `create-database.sh`

**Ubicacion:** `apps/database/`

```bash
cd /home/isem/workspace/projects/gamilit/apps/database

export DATABASE_URL="postgresql://gamilit_user:password@localhost:5432/gamilit_platform"
./create-database.sh
```

**Que hace:**
1. Habilita extensiones (pgcrypto, uuid-ossp)
2. Ejecuta DDL en 16 fases ordenadas
3. Carga Seeds de produccion (38+ archivos)
4. Genera reporte de objetos creados

---

## DIAGRAMA DE DECISION

```
¿Existe el usuario gamilit_user?
│
├── NO ──► Escenario 1: ./scripts/init-database.sh --env dev
│
└── SI ──► ¿Necesitas eliminar TODOS los datos?
           │
           ├── SI ──► Escenario 2: ./drop-and-recreate-database.sh
           │
           └── NO ──► ¿La BD esta vacia (recien creada)?
                      │
                      ├── SI ──► Escenario 3: ./create-database.sh
                      │
                      └── NO ──► Escenario 2: ./drop-and-recreate-database.sh
```

---

## COMANDOS RAPIDOS POR AMBIENTE

### Desarrollo (primera vez)

```bash
cd apps/database/scripts
./init-database.sh --env dev --password "dev_password_123"
```

### Desarrollo (recrear BD)

```bash
cd apps/database
export DATABASE_URL="postgresql://gamilit_user:dev_password_123@localhost:5432/gamilit_platform"
./drop-and-recreate-database.sh
```

### Produccion (primera vez)

```bash
cd apps/database/scripts
./manage-secrets.sh generate --env prod
./manage-secrets.sh sync --env prod
./init-database-v3.sh --env prod
```

### Produccion (recrear BD)

```bash
cd apps/database
export DATABASE_URL="postgresql://gamilit_user:$DB_PASSWORD@localhost:5432/gamilit_platform"
./drop-and-recreate-database.sh
```

---

## VALIDACION POST-CARGA

Despues de cualquier escenario, validar con:

```bash
# Verificar conteo de objetos
psql "$DATABASE_URL" -c "
SELECT
    (SELECT COUNT(*) FROM information_schema.schemata WHERE schema_name NOT IN ('pg_catalog','information_schema','pg_toast')) as schemas,
    (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog','information_schema')) as tables,
    (SELECT COUNT(*) FROM pg_type WHERE typcategory = 'E') as enums
;"

# Verificar datos criticos
psql "$DATABASE_URL" -c "
SELECT 'tenants' as tabla, COUNT(*) FROM auth_management.tenants
UNION ALL SELECT 'users', COUNT(*) FROM auth.users
UNION ALL SELECT 'modules', COUNT(*) FROM educational_content.modules
UNION ALL SELECT 'maya_ranks', COUNT(*) FROM gamification_system.maya_ranks
UNION ALL SELECT 'feature_flags', COUNT(*) FROM system_configuration.feature_flags;
"
```

**Valores esperados:**
- Schemas: 15+
- Tablas: 60+
- ENUMs: 35+
- Tenants: 14+
- Users: 20+
- Modules: 5
- Maya Ranks: 5
- Feature Flags: 26+

---

## SCRIPTS DISPONIBLES

| Script | Ubicacion | Proposito |
|--------|-----------|-----------|
| `init-database.sh` | scripts/ | Crear usuario + BD + DDL + Seeds |
| `init-database-v3.sh` | scripts/ | Igual pero con dotenv-vault |
| `drop-and-recreate-database.sh` | ./ | Drop BD + Recrear + DDL + Seeds |
| `create-database.sh` | ./ | Solo DDL + Seeds (BD debe existir) |
| `reset-database.sh` | scripts/ | Reset BD (mantiene usuario) |
| `recreate-database.sh` | scripts/ | Drop completo (usuario + BD) |
| `manage-secrets.sh` | scripts/ | Gestionar passwords con vault |

---

## CUMPLIMIENTO DE DIRECTIVA

Este flujo cumple con DIRECTIVA-POLITICA-CARGA-LIMPIA.md:

- ✅ DDL es fuente de verdad
- ✅ BD es resultado de ejecutar DDL
- ✅ No se usan migrations
- ✅ Recreacion completa en cualquier momento
- ✅ Un comando = BD lista

---

**Ultima actualizacion:** 2025-12-18
