# Migración a Arquitectura DB-Based

## 🎯 Resumen del Cambio

Se ha migrado la arquitectura para que **los datos específicos del proyecto se almacenen en la base de datos** en lugar de modificar `config/site.php` directamente.

## ✅ Cambios Implementados

### 1. Nuevos Componentes

#### SiteConfigService
**Archivo:** `app/Services/SiteConfigService.php`

Servicio que:
- Carga configuración desde la tabla `settings` (con cache)
- Guarda configuración en la DB
- Merge configuración de DB con archivo

#### SiteConfigServiceProvider
**Archivo:** `app/Providers/SiteConfigServiceProvider.php`

Service Provider que:
- Merge automáticamente DB + `config/site.php` al iniciar la app
- Los valores de la DB tienen prioridad

**Registrado en:** `config/app.php`

### 2. Seeders Modificados

#### SiteDataSeeder
**Antes:**
- Modificaba `config/site.php` directamente usando `preg_replace`

**Ahora:**
- Guarda en DB usando `SiteConfigService::setMany()`
- Datos: `contact`, `description`, `social_media`, `footer`, `development`

#### AnalyticsSeeder
**Antes:**
- Modificaba `config/site.php` directamente usando `preg_replace`

**Ahora:**
- Guarda en DB usando `SiteConfigService::set()`
- Datos: `google_analytics`

### 3. Estructura en DB

**Tabla:** `settings`

**Formato de Keys:**
- `site.contact.phone` → Valor string
- `site.social_media.instagram` → Valor JSON
- `site.google_analytics` → Valor JSON

**Ejemplo:**
```sql
INSERT INTO settings (key, value, user_id) VALUES
('site.contact.phone', '+1 (305) 555-1234', 1),
('site.social_media.instagram', '{"url":"https://...","active":true}', 1),
('site.google_analytics', '{"enabled":true,"tracking_id":"G-..."}', 1);
```

## 🔄 Flujo Actualizado

### Antes (Archivo-Based)
```
JSON → Seeder → Modifica config/site.php → App usa config('site.*')
```

### Ahora (DB-Based)
```
JSON → Seeder → Guarda en DB (settings) → Service Provider merge → App usa config('site.*')
```

## 📋 Datos que van a DB

### ✅ Guardados en DB
- `contact` (phone, email, address, hours)
- `description`
- `social_media` (URLs, active, icons, titles)
- `footer` (navegación principal, módulos principales)
- `development` (enabled, title, subtitle, progress, show_newsletter)
- `google_analytics` (enabled, tracking_id, tracking_id_dev, track_in_local)

### ❌ Permanecen en config/site.php
- `name`, `tagline`, `url`, `author` (valores base/estructura)
- `theme` (estructura)
- `seo` (estructura y valores base)
- `og` (estructura y valores base)
- `twitter` (estructura y valores base)
- `assets` (rutas base)

## 🚀 Cómo Funciona

### 1. Al Ejecutar Seeders

```bash
php artisan migrate:fresh --seed
```

**SiteDataSeeder:**
```php
// Lee site-data.json
$data = json_decode(file_get_contents('site-data.json'), true);

// Guarda en DB
SiteConfigService::setMany([
    'contact' => $data['contact'],
    'social_media' => $data['social_media'],
    'footer' => $data['footer'],
    'development' => $data['development'],
], 1);
```

**Resultado:** Datos guardados en tabla `settings` con keys `site.*`

### 2. Al Iniciar la App

**SiteConfigServiceProvider::boot():**
```php
// Carga configuración del archivo
$fileConfig = config('site', []);

// Carga configuración de la DB
$dbConfig = SiteConfigService::getSiteConfigFromDb();

// Merge (DB tiene prioridad)
$mergedConfig = array_replace_recursive($fileConfig, $dbConfig);

// Actualiza config
Config::set('site', $mergedConfig);
```

**Resultado:** `config('site.*')` contiene valores de DB (si existen) o de archivo (fallback)

### 3. En la Aplicación

```php
// Funciona igual que antes
$contact = config('site.contact');  // Desde DB o archivo
$gaId = config('site.google_analytics.tracking_id'); // Desde DB
```

## ✅ Ventajas Logradas

### 1. Propagación Sin Conflictos
- ✅ Actualizar código base → No afecta datos del proyecto
- ✅ `config/site.php` puede cambiar → Datos permanecen en DB
- ✅ Git pull/merge → Sin conflictos

### 2. Multi-Tenant Real
- ✅ Cada proyecto con su propia DB
- ✅ Datos completamente aislados
- ✅ Cambiar DB = Cambiar todo el proyecto

### 3. Mantenibilidad
- ✅ Datos del proyecto en un solo lugar (DB)
- ✅ Fácil backup/restore
- ✅ Versionado independiente

## 🔧 Comandos Útiles

### Ver configuración desde DB
```bash
php artisan tinker
>>> \App\Services\SiteConfigService::getSiteConfigFromDb();
```

### Guardar configuración manualmente
```bash
php artisan tinker
>>> \App\Services\SiteConfigService::set('contact.phone', '+1 (305) 555-1234');
```

### Limpiar cache
```bash
php artisan tinker
>>> \App\Services\SiteConfigService::clearCache();
```

O:
```bash
php artisan config:clear
```

## ⚠️ Notas Importantes

1. **Cache:** Los valores se cachean por 24 horas. Si cambias algo en la DB, limpia el cache.

2. **Prioridad:** Los valores de la DB tienen prioridad sobre los de `config/site.php`.

3. **Fallback:** Si la tabla `settings` no existe o hay error, se usa solo `config/site.php`.

4. **Seeders:** Siempre ejecutar seeders después de cambiar DB para cargar datos del proyecto.

5. **JSON:** Los arrays se guardan como JSON en la DB. `SiteConfigService` los decodifica automáticamente.

## 📚 Archivos Modificados

### Nuevos
- `app/Services/SiteConfigService.php`
- `app/Providers/SiteConfigServiceProvider.php`
- `docs/saas/ARQUITECTURA-DB-BASED.md`
- `docs/saas/MIGRACION-DB-BASED.md` (este archivo)

### Modificados
- `database/seeders/SiteDataSeeder.php`
- `database/seeders/AnalyticsSeeder.php`
- `config/app.php` (registrado SiteConfigServiceProvider)
- `docs/saas/README.md` (actualizado)

## 🎯 Próximos Pasos

1. ✅ Probar el flujo completo ejecutando seeders
2. ✅ Verificar que los datos se cargan correctamente desde DB
3. ✅ Verificar que `config('site.*')` funciona igual que antes
4. ✅ Documentar proceso para otros proyectos

## ✨ Estado

**✅ Implementación Completa**

La arquitectura DB-based está implementada y lista para usar. Los datos del proyecto ahora se almacenan en la DB, permitiendo actualizaciones del código base sin afectar los datos del proyecto.
