# Sistema de Assets en Base de Datos

## 📋 Descripción

Los assets del sistema (logos, favicons, manifests, etc.) ahora se gestionan desde la base de datos en lugar de requerir scripts manuales de actualización.

## 🎯 Ventajas

- ✅ **Seedeo Automático**: Los assets se cargan automáticamente al ejecutar `php artisan migrate:fresh --seed`
- ✅ **Gestión Centralizada**: Todos los assets están en la base de datos
- ✅ **Fácil Actualización**: Modifica el JSON y vuelve a seedear
- ✅ **Sin Scripts Manuales**: Ya no necesitas correr `PROJECT UPDATE ASSETS.SH`

## 📁 Estructura

### Migración
```
database/migrations/2026_01_05_151704_create_assets_table.php
```

### Modelo
```php
App\Models\Asset
```

### Seeder
```
database/seeders/AssetsSeeder.php
```

### Datos (JSON)
```json
database/seeders/project-data/assets.json
```

### Archivos Físicos
```
public/cd-project/assets/
├── logo.png
├── logo-alternative.png
├── logo-2.png
├── favicon.svg
├── favicon.ico
├── favicon-96x96.png
├── apple-touch-icon.png
├── web-app-manifest-192x192.png
├── web-app-manifest-512x512.png
└── site.webmanifest
```

## 💾 Tabla de Base de Datos

La tabla `assets` contiene:

| Campo | Tipo | Descripción |
|-------|------|-------------|
| id | bigint | ID autoincremental |
| name | string | Nombre del archivo |
| path | string | Ruta del archivo (única) |
| type | string | Tipo de asset (logo, favicon, manifest, etc.) |
| public_id | string | ID de Cloudinary (opcional) |
| description | text | Descripción del asset |
| width | integer | Ancho de la imagen (opcional) |
| height | integer | Alto de la imagen (opcional) |
| created_at | timestamp | Fecha de creación |
| updated_at | timestamp | Fecha de actualización |

## 🚀 Uso

### Funciones Helper Disponibles

#### 1. `get_asset($identifier, $specificName = null)`

Obtiene un asset por tipo o nombre:

```php
// Por nombre de archivo
$logo = get_asset('logo.png');

// Por tipo (obtiene el primero)
$favicon = get_asset('favicon');

// Por tipo y nombre específico
$logo = get_asset('logo', 'logo-alternative.png');
```

#### 2. `get_asset_path($identifier, $specificName = null, $default = null)`

Obtiene la URL del asset:

```php
// URL del logo principal
$logoUrl = get_asset_path('logo.png');
// Resultado: http://tudominio.com/cd-project/assets/logo.png

// Con fallback si no existe
$logoUrl = get_asset_path('logo-custom.png', null, 'cd-project/assets/logo.png');
```

#### 3. `get_assets_by_type($type)`

Obtiene todos los assets de un tipo:

```php
// Todos los logos
$logos = get_assets_by_type('logo');

// Todos los favicons
$favicons = get_assets_by_type('favicon');
```

#### 4. `get_logo($variant = null)`

Shorthand para obtener logos:

```php
// Logo principal
$logo = get_logo(); // logo.png

// Logo alternativo
$logoAlt = get_logo('alternative'); // logo-alternative.png

// Logo secundario
$logo2 = get_logo('2'); // logo-2.png
```

#### 5. `get_favicon($type = 'ico')`

Shorthand para obtener favicons:

```php
// Favicon .ico
$favicon = get_favicon(); // favicon.ico

// Favicon SVG
$faviconSvg = get_favicon('svg'); // favicon.svg

// Favicon PNG 96x96
$favicon96 = get_favicon('96x96'); // favicon-96x96.png
```

### Ejemplos en Blade

```blade
<!-- Logo en el header -->
<img src="{{ get_logo() }}" alt="Logo">

<!-- Logo alternativo -->
<img src="{{ get_logo('alternative') }}" alt="Logo Alternativo">

<!-- Favicon en el head -->
<link rel="icon" href="{{ get_favicon('ico') }}">
<link rel="icon" type="image/svg+xml" href="{{ get_favicon('svg') }}">

<!-- Apple Touch Icon -->
<link rel="apple-touch-icon" href="{{ get_asset_path('apple-touch-icon.png') }}">

<!-- Web App Manifest -->
<link rel="manifest" href="{{ get_asset_path('site.webmanifest') }}">
```

## 🔄 Actualizar Assets

### 1. Modificar los Archivos Físicos

Actualiza los archivos en `public/cd-project/assets/`:

```bash
# Ejemplo: reemplazar el logo
cp nuevo-logo.png public/cd-project/assets/logo.png
```

### 2. Actualizar el JSON (Opcional)

Si cambias nombres o tipos, actualiza `database/seeders/project-data/assets.json`:

```json
{
  "assets": [
    {
      "name": "logo.png",
      "path": "cd-project/assets/logo.png",
      "type": "logo",
      "description": "Logo principal del sitio web",
      "public_id": null,
      "width": null,
      "height": null
    }
  ]
}
```

### 3. Re-seedear

```bash
# Opción 1: Re-seedear solo los assets
php artisan db:seed --class=AssetsSeeder

# Opción 2: Re-seedear todo (incluye assets)
php artisan migrate:fresh --seed
```

## ➕ Agregar Nuevos Assets

1. **Agregar el archivo físico** en `public/cd-project/assets/`

2. **Agregar entrada en el JSON** (`database/seeders/project-data/assets.json`):

```json
{
  "name": "logo-dark.png",
  "path": "cd-project/assets/logo-dark.png",
  "type": "logo",
  "description": "Logo para modo oscuro",
  "public_id": null,
  "width": 200,
  "height": 60
}
```

3. **Re-seedear**:

```bash
php artisan db:seed --class=AssetsSeeder
```

## 🔍 Consultas Directas

También puedes usar el modelo directamente:

```php
use App\Models\Asset;

// Todos los assets
$assets = Asset::all();

// Assets de tipo logo
$logos = Asset::where('type', 'logo')->get();

// Asset específico por path
$logo = Asset::where('path', 'cd-project/assets/logo.png')->first();

// Buscar por nombre
$favicon = Asset::where('name', 'favicon.svg')->first();
```

## 📊 Tipos de Assets Disponibles

| Tipo | Descripción | Ejemplos |
|------|-------------|----------|
| `logo` | Logos del sitio | logo.png, logo-alternative.png |
| `favicon` | Favicons | favicon.ico, favicon.svg |
| `touch-icon` | Iconos para dispositivos táctiles | apple-touch-icon.png |
| `manifest` | Archivos PWA | web-app-manifest-*.png, site.webmanifest |

## 🛠️ Comandos Útiles

```bash
# Ver todos los assets
php artisan tinker
>>> App\Models\Asset::all()

# Contar assets
>>> App\Models\Asset::count()

# Ver assets por tipo
>>> App\Models\Asset::where('type', 'logo')->get()

# Re-seedear solo assets
php artisan db:seed --class=AssetsSeeder

# Re-seedear todo
php artisan migrate:fresh --seed
```

## 🔄 Migración desde el Sistema Anterior

Si anteriormente usabas el script `PROJECT UPDATE ASSETS.SH`:

1. ✅ **Ya no necesitas ese script**
2. ✅ Los assets se cargan automáticamente con `migrate:fresh --seed`
3. ✅ Los archivos físicos siguen en `public/cd-project/assets/`
4. ✅ La base de datos ahora referencia esos archivos

## 📝 Notas Importantes

- Los assets siguen siendo archivos físicos en `public/cd-project/assets/`
- La base de datos solo guarda las referencias (rutas)
- Al hacer `migrate:fresh --seed`, los assets se registran automáticamente
- Puedes usar Cloudinary guardando el `public_id` en el campo correspondiente

## 🎨 Integración con Vistas

Reemplaza las rutas hardcodeadas:

**Antes:**
```blade
<img src="{{ asset('cd-project/assets/logo.png') }}" alt="Logo">
```

**Ahora:**
```blade
<img src="{{ get_logo() }}" alt="Logo">
```

**Ventajas:**
- ✅ Centralizado en la base de datos
- ✅ Fácil de actualizar
- ✅ Puede cambiar dinámicamente
- ✅ Soporta Cloudinary

---

**Creado:** 2026-01-05  
**Sistema:** CD-System  
**Módulo:** Assets Management

