Migración completa a Clean Architecture con componentes funcionales

- Reorganización de estructura: Admin/, Public/, Shared/, Schemas/
- 12 componentes migrados: TopNotificationBar, Navbar, CtaLetsTalk, Hero,
  FeaturedImage, TableOfContents, CtaBoxSidebar, SocialShare, CtaPost,
  RelatedPost, ContactForm, Footer
- Panel de administración con tabs Bootstrap 5 funcionales
- Schemas JSON para configuración de componentes
- Renderers dinámicos con CSSGeneratorService (cero CSS hardcodeado)
- FormBuilders para UI admin con Design System consistente
- Fix: Bootstrap JS cargado en header para tabs funcionales
- Fix: buildTextInput maneja valores mixed (bool/string)
- Eliminación de estructura legacy (src/, admin/, assets/css/componente-*)

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
FrankZamora
2025-11-25 21:20:06 -06:00
parent 90de6df77c
commit 0846a3bf03
224 changed files with 21670 additions and 17816 deletions

View File

@@ -1,217 +1,133 @@
# Capa de Infraestructura - Shared (Implementaciones Concretas)
# Capa de Infraestructura
## Propósito
## 📋 Propósito
La capa de Infraestructura de `shared/` contiene **implementaciones concretas** de los servicios definidos en
Application, utilizando WordPress y otras librerías externas.
La **Capa de Infraestructura** contiene las implementaciones concretas de las interfaces definidas en el Dominio. Conecta la lógica de negocio con el mundo exterior (WordPress, MySQL, cache, HTTP).
## Principios
## 🎯 Responsabilidades
1. **Implementaciones concretas**: Código que interactúa con WordPress y librerías
2. **Cumple contratos**: Implementa las interfaces definidas en Application
3. **Detalles técnicos**: Maneja aspectos técnicos como caché, base de datos, APIs
4. **Reusabilidad**: Servicios compartidos por todos los contextos
-Implementar interfaces del Dominio
- ✅ Conectar con frameworks (WordPress)
- ✅ Persistencia (MySQL via wpdb)
- ✅ Cache (WordPress Transients)
- ✅ HTTP (AJAX endpoints)
- ✅ Contiene detalles de implementación
## Estructura
## 📦 Estructura
```
shared/Infrastructure/
├── Services/ # Implementaciones de servicios (WordPressCacheService, etc.)
└── Traits/ # Traits reutilizables (WordPress helpers, etc.)
Infrastructure/
├── Persistence/
│ └── WordPress/
│ ├── WordPressComponentRepository.php (MySQL)
│ └── WordPressDefaultsRepository.php (Schemas)
├── Services/
│ ├── WordPressValidationService.php (Validación)
│ ├── WordPressCacheService.php (Transients)
│ ├── SchemaSyncService.php (JSON → BD)
│ └── CleanupService.php (Limpieza)
├── API/
│ └── WordPress/
│ └── AjaxController.php (Endpoints AJAX)
├── Facades/
│ └── ComponentManager.php (API unificada)
├── DI/
│ └── DIContainer.php (Dependency Injection)
└── README.md
```
## Ejemplos de Uso
## 🔌 Implementaciones
### Services (Implementaciones Concretas)
### Repositories
Implementación de CacheService usando WordPress Transients:
#### WordPressComponentRepository
Persiste componentes en `wp_roi_theme_components`.
**Métodos**:
- `save(Component)`: INSERT o UPDATE
- `findByName(string)`: Buscar por nombre
- `findAll()`: Obtener todos
- `delete(string)`: Eliminar
#### WordPressDefaultsRepository
Gestiona schemas en `wp_roi_theme_defaults`.
### Services
#### WordPressValidationService
Valida datos contra schemas.
**Estrategia**:
1. Obtener schema de BD
2. Validar estructura
3. Sanitizar con funciones WordPress
#### WordPressCacheService
Cache con WordPress Transients API.
**TTL default**: 1 hora (3600 segundos)
#### SchemaSyncService
Sincroniza schemas desde JSON a BD.
#### CleanupService
Elimina componentes obsoletos.
### API
#### AjaxController
Endpoints AJAX de WordPress.
**Endpoints disponibles**:
- `roi_theme_save_component` (POST)
- `roi_theme_get_component` (GET)
- `roi_theme_delete_component` (POST)
- `roi_theme_sync_schema` (POST)
**Seguridad**:
- Nonce verification
- Capability check (manage_options)
### Facade
#### ComponentManager
API unificada para todo el sistema.
**Uso**:
```php
$manager = new ComponentManager($container);
$result = $manager->saveComponent('top_bar', $data);
```
## 📐 Principios Arquitectónicos
### Dependency Inversion
Infrastructure implementa interfaces del Domain:
```php
namespace ROITheme\Shared\Infrastructure\Services;
use ROITheme\Shared\Application\Contracts\CacheServiceInterface;
final class WordPressCacheService implements CacheServiceInterface
class WordPressComponentRepository implements ComponentRepositoryInterface
{
public function get(string $key): mixed
{
return get_transient($this->prefixKey($key));
}
public function set(string $key, mixed $value, int $ttl = 3600): bool
{
return set_transient($this->prefixKey($key), $value, $ttl);
}
public function delete(string $key): bool
{
return delete_transient($this->prefixKey($key));
}
public function flush(): bool
{
return wp_cache_flush();
}
private function prefixKey(string $key): string
{
return 'roi_theme_' . $key;
}
// Implementación específica de WordPress
}
```
Implementación de ValidationService usando WordPress Sanitization:
### Separación de Concerns
```php
namespace ROITheme\Shared\Infrastructure\Services;
- **Repositories**: Solo persistencia
- **Services**: Lógica de infraestructura
- **Controller**: Solo HTTP
- **Facade**: Orquestación simple
use ROITheme\Shared\Application\Services\BaseValidationService;
## 🧪 Testing
final class WordPressValidationService extends BaseValidationService
{
public function validate(array $data, array $rules): array
{
$validated = [];
Tests de **integración** (usan BD real de WordPress):
foreach ($rules as $field => $rule) {
if (!isset($data[$field])) {
$this->errors[$field] = "Field {$field} is required";
continue;
}
$validated[$field] = match($rule) {
'email' => sanitize_email($data[$field]),
'text' => sanitize_text_field($data[$field]),
'int' => intval($data[$field]),
'url' => esc_url_raw($data[$field]),
default => $data[$field]
};
}
return $validated;
}
}
```bash
vendor\bin\phpunit tests\Integration\Infrastructure
```
### Traits (Helpers Reutilizables)
## 🔗 Referencias
Traits para funcionalidad común de WordPress:
```php
namespace ROITheme\Shared\Infrastructure\Traits;
trait WordPressMetaDataTrait
{
private function getMeta(int $postId, string $key, bool $single = true): mixed
{
return get_post_meta($postId, $this->prefixMetaKey($key), $single);
}
private function updateMeta(int $postId, string $key, mixed $value): bool
{
return update_post_meta($postId, $this->prefixMetaKey($key), $value);
}
private function deleteMeta(int $postId, string $key): bool
{
return delete_post_meta($postId, $this->prefixMetaKey($key));
}
private function prefixMetaKey(string $key): string
{
return '_roi_' . $key;
}
}
```
## Relación con Application
La capa Infrastructure **implementa** los contratos definidos en Application:
```
shared/Application/Contracts/CacheServiceInterface.php (interface)
↓ implementa
shared/Infrastructure/Services/WordPressCacheService.php (implementación)
```
## Inyección de Dependencias
Los servicios se registran en el DI Container y se inyectan a través de constructores:
```php
// En el DI Container (configuración)
$container->bind(
CacheServiceInterface::class,
WordPressCacheService::class
);
// En el código que usa el servicio
public function __construct(
private readonly CacheServiceInterface $cache
) {}
```
## Reglas de Dependencia
**PUEDE** depender de:
- `shared/Domain/` (Value Objects, Entities)
- `shared/Application/` (especialmente Contracts)
- WordPress functions
- Librerías externas (Composer packages)
**NO PUEDE** depender de:
- `admin/` o `public/` (contextos específicos)
## Testing
Los servicios de Infrastructure se testean con **tests de integración** que usan WordPress:
```php
// tests/Integration/Shared/Infrastructure/Services/WordPressCacheServiceTest.php
public function test_stores_and_retrieves_from_cache()
{
$cache = new WordPressCacheService();
$cache->set('test_key', 'test_value', 3600);
$result = $cache->get('test_key');
$this->assertEquals('test_value', $result);
}
```
## Cuándo Agregar Código Aquí
Agrega código a `shared/Infrastructure/` cuando:
- Implementas un servicio definido en Application/Contracts/
- Necesitas interactuar con WordPress (base de datos, caché, opciones, etc.)
- Integras una librería externa
- Creas utilidades de bajo nivel compartidas
No agregues aquí:
- Lógica de negocio (va en Domain/)
- Definiciones de interfaces (van en Application/Contracts/)
- Código específico de admin o public
- Código sin contrato (sin interface)
## Servicios Comunes en Infrastructure
### Services/
- `WordPressCacheService`: Caché usando WordPress Transients
- `WordPressValidationService`: Validación con WordPress sanitization
- `WordPressLoggerService`: Logging usando error_log o debug.log
- `WordPressDatabaseService`: Interacciones directas con $wpdb
### Traits/
- `WordPressMetaDataTrait`: Helpers para post meta
- `WordPressTaxonomyTrait`: Helpers para términos y taxonomías
- `WordPressHooksTrait`: Helpers para actions y filters
- `WordPressSanitizationTrait`: Helpers para sanitización
## Patrón de Diseño
Seguimos el patrón **Adapter**:
- WordPress es el "adaptee" (sistema externo)
- Nuestros Services son "adapters"
- Los Contracts son las interfaces que queremos
Esto permite cambiar WordPress por otro sistema en el futuro sin afectar el código de negocio.
- Domain Layer: `../Domain/README.md`
- Application Layer: `../Application/README.md`