fix(structure): Correct case-sensitivity for Linux compatibility

Rename folders to match PHP PSR-4 autoloading conventions:
- schemas → Schemas
- shared → Shared
- Wordpress → WordPress (in all locations)

Fixes deployment issues on Linux servers where filesystem is case-sensitive.

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
FrankZamora
2025-11-26 22:53:34 -06:00
parent a2548ab5c2
commit 90863cd8f5
92 changed files with 0 additions and 0 deletions

View File

View File

@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
/**
* Interface para controlador AJAX
*/
interface AjaxControllerInterface {
// Se implementará completamente en Fase 5
}

View File

@@ -0,0 +1,61 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
/**
* Interface CSSGeneratorInterface
*
* Contrato para servicios que generan CSS a partir de configuraciones de componentes.
* Define el comportamiento esperado para la generación de reglas CSS sin depender
* de implementaciones específicas o frameworks.
*
* Responsabilidades:
* - Generar CSS válido a partir de un selector y estilos
* - Formatear reglas CSS correctamente
* - Convertir nombres de propiedades (snake_case → kebab-case)
*
* NO responsable de:
* - Media queries (manejado por Renderer con clases Bootstrap)
* - Visibilidad responsive (manejado por Renderer)
* - Persistencia o caché de CSS
*
* @package ROITheme\Shared\Domain\Contracts
*/
interface CSSGeneratorInterface
{
/**
* Genera una regla CSS completa a partir de un selector y sus estilos.
*
* Convierte un array de estilos en una regla CSS válida y formateada.
* Los nombres de propiedades en snake_case se convierten automáticamente
* a kebab-case según el estándar CSS.
*
* Ejemplo:
* ```php
* $styles = [
* 'background_color' => '#FF8600',
* 'text_color' => '#FFFFFF',
* 'font_size' => '1rem',
* 'padding' => '1rem 0'
* ];
*
* $css = $generator->generate('.navbar', $styles);
*
* // Resultado:
* // .navbar {
* // background-color: #FF8600;
* // color: #FFFFFF;
* // font-size: 1rem;
* // padding: 1rem 0;
* // }
* ```
*
* @param string $selector Selector CSS (ej: '.navbar', '#header', 'body')
* @param array<string, string> $styles Array asociativo de propiedades CSS y sus valores
* Formato: ['property_name' => 'value']
*
* @return string Regla CSS completa y formateada, o string vacío si no hay estilos
*/
public function generate(string $selector, array $styles): string;
}

View File

@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
/**
* Interface para servicio de cache
*/
interface CacheServiceInterface {
// Se implementará completamente en Fase 5
}

View File

@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
/**
* Interface para servicio de limpieza
*/
interface CleanupServiceInterface {
// Se implementará completamente en Fase 5
}

View File

@@ -0,0 +1,76 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
use ROITheme\Shared\Domain\Entities\Component;
use ROITheme\Shared\Domain\ValueObjects\ComponentName;
use ROITheme\Shared\Domain\ValueObjects\ComponentConfiguration;
/**
* ComponentDefaultsRepositoryInterface - Contrato para valores por defecto de componentes
*
* RESPONSABILIDAD: Definir contrato para gestión de configuración por defecto de componentes
*
* PROPÓSITO:
* - Almacenar configuración "factory" de cada tipo de componente
* - Permitir resetear componentes a valores por defecto
* - Proporcionar plantillas para nuevos componentes
*
* CASO DE USO:
* ```php
* // Crear nuevo componente top_bar con valores por defecto
* $defaults = $defaultsRepo->getByName(ComponentName::fromString('top_bar'));
* $component = new Component(
* ComponentName::fromString('top_bar'),
* $defaults // configuración por defecto
* );
*
* // Resetear componente a valores por defecto
* $component = $component->updateConfiguration($defaults);
* ```
*
* @package ROITheme\Shared\Domain\Contracts
*/
interface ComponentDefaultsRepositoryInterface
{
/**
* Obtener configuración por defecto de un componente
*
* @param ComponentName $name Nombre del componente
* @return ComponentConfiguration Configuración por defecto
*/
public function getByName(ComponentName $name): ComponentConfiguration;
/**
* Guardar configuración por defecto para un componente
*
* @param ComponentName $name Nombre del componente
* @param ComponentConfiguration $configuration Configuración por defecto
* @return void
*/
public function save(ComponentName $name, ComponentConfiguration $configuration): void;
/**
* Verificar si existen defaults para un componente
*
* @param ComponentName $name
* @return bool
*/
public function exists(ComponentName $name): bool;
/**
* Obtener todos los defaults
*
* @return array<string, ComponentConfiguration> Array asociativo nombre => configuración
*/
public function findAll(): array;
/**
* Eliminar defaults de un componente
*
* @param ComponentName $name
* @return bool True si se eliminó, false si no existía
*/
public function delete(ComponentName $name): bool;
}

View File

@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
/**
* Interface para facade ComponentManager
*/
interface ComponentManagerInterface {
// Se implementará completamente en Fase 5
}

View File

@@ -0,0 +1,124 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
use ROITheme\Shared\Domain\Entities\Component;
use ROITheme\Shared\Domain\ValueObjects\ComponentName;
use ROITheme\Shared\Domain\Exceptions\ComponentNotFoundException;
/**
* ComponentRepositoryInterface - Contrato para persistencia de componentes
*
* RESPONSABILIDAD: Definir contrato para operaciones CRUD de componentes
*
* INVERSIÓN DE DEPENDENCIAS:
* - Esta interfaz está en Domain (núcleo)
* - Infrastructure implementa esta interfaz
* - Application depende de esta interfaz (NO de la implementación)
*
* IMPLEMENTACIONES ESPERADAS:
* - WordPressComponentRepository (usa wpdb y tablas WP)
* - InMemoryComponentRepository (para testing)
* - FileSystemComponentRepository (futuro: archivos JSON)
*
* PRINCIPIOS:
* - Métodos retornan entidades de dominio (Component)
* - Parámetros son Value Objects o primitivos
* - Excepciones son de dominio
* - Sin conocimiento de WordPress/BD
*
* USO:
* ```php
* // En Application Layer
* class SaveComponentUseCase {
* public function __construct(
* private ComponentRepositoryInterface $repository
* ) {}
*
* public function execute(SaveComponentRequest $request): void {
* $component = new Component(...);
* $this->repository->save($component);
* }
* }
* ```
*
* @package ROITheme\Shared\Domain\Contracts
*/
interface ComponentRepositoryInterface
{
/**
* Guardar o actualizar un componente
*
* Si el componente ya existe (por nombre), se actualiza.
* Si no existe, se crea.
*
* @param Component $component Componente a guardar
* @return Component Componente guardado (con timestamps actualizados)
*/
public function save(Component $component): Component;
/**
* Buscar componente por nombre
*
* @param ComponentName $name Nombre del componente
* @return Component|null Componente encontrado o null
*/
public function findByName(ComponentName $name): ?Component;
/**
* Obtener componente por nombre (lanza excepción si no existe)
*
* @param ComponentName $name
* @return Component
* @throws ComponentNotFoundException
*/
public function getByName(ComponentName $name): Component;
/**
* Obtener todos los componentes
*
* @return Component[] Array de componentes
*/
public function findAll(): array;
/**
* Obtener componentes habilitados
*
* @return Component[] Array de componentes habilitados
*/
public function findEnabled(): array;
/**
* Verificar si existe un componente con el nombre dado
*
* @param ComponentName $name
* @return bool
*/
public function exists(ComponentName $name): bool;
/**
* Eliminar un componente
*
* @param ComponentName $name Nombre del componente a eliminar
* @return bool True si se eliminó, false si no existía
*/
public function delete(ComponentName $name): bool;
/**
* Obtener cantidad total de componentes
*
* @return int
*/
public function count(): int;
/**
* Obtener componentes por grupo de configuración
*
* Ejemplo: Obtener todos los componentes que tienen configuración de 'content'
*
* @param string $group Grupo de configuración (visibility, content, styles, general)
* @return Component[]
*/
public function findByConfigGroup(string $group): array;
}

View File

@@ -0,0 +1,74 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
/**
* Interface para el repositorio de configuraciones de componentes
*
* Domain Layer - Define el contrato para acceso a datos de configuraci<63>n
* Trabaja con la tabla wp_roi_theme_component_settings (normalizada)
*
* Esta interfaz es gen<65>rica y funciona para todos los componentes del tema.
*
* @package ROITheme\Shared\Domain\Contracts
*/
interface ComponentSettingsRepositoryInterface
{
/**
* Obtiene todas las configuraciones de un componente agrupadas por grupo
*
* @param string $componentName Nombre del componente (ej: 'top-notification-bar')
* @return array<string, array<string, mixed>> Configuraciones agrupadas
* Ejemplo: [
* 'visibility' => ['enabled' => true, 'show_on_mobile' => true, ...],
* 'content' => ['icon_class' => 'bi-star', 'label_text' => 'Nuevo', ...],
* 'styles' => ['background_color' => '#0E2337', ...]
* ]
*/
public function getComponentSettings(string $componentName): array;
/**
* Guarda las configuraciones de un componente
*
* @param string $componentName Nombre del componente
* @param array<string, array<string, mixed>> $settings Configuraciones agrupadas
* Ejemplo: [
* 'visibility' => ['enabled' => true],
* 'content' => ['icon_class' => 'bi-star']
* ]
* @return int N<>mero de campos actualizados
*/
public function saveComponentSettings(string $componentName, array $settings): int;
/**
* Obtiene el valor de un campo espec<65>fico
*
* @param string $componentName Nombre del componente
* @param string $groupName Nombre del grupo
* @param string $attributeName Nombre del atributo
* @return mixed|null Valor del campo o null si no existe
*/
public function getFieldValue(string $componentName, string $groupName, string $attributeName): mixed;
/**
* Guarda el valor de un campo espec<65>fico
*
* @param string $componentName Nombre del componente
* @param string $groupName Nombre del grupo
* @param string $attributeName Nombre del atributo
* @param mixed $value Valor a guardar
* @return bool True si se guard<72> correctamente
*/
public function saveFieldValue(string $componentName, string $groupName, string $attributeName, mixed $value): bool;
/**
* Restaura un componente a sus valores por defecto desde el schema JSON
*
* @param string $componentName Nombre del componente
* @param string $schemaPath Ruta al archivo schema JSON
* @return int N<>mero de campos restaurados
*/
public function resetToDefaults(string $componentName, string $schemaPath): int;
}

View File

@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
/**
* Interface para servicio de configuración
*/
interface ConfigurationServiceInterface {
// Se implementará completamente en Fase 5
}

View File

@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
/**
* Interface para repositorio de defaults
*/
interface DefaultRepositoryInterface {
// Se implementará completamente en Fase 5
}

View File

@@ -0,0 +1,55 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
use ROITheme\Shared\Domain\Entities\Component;
/**
* RendererInterface - Contrato para renderizadores de componentes
*
* RESPONSABILIDAD: Definir el contrato que deben cumplir todos los renderizadores
* de componentes para generar HTML a partir de los datos del componente.
*
* PRINCIPIOS:
* - Interface Segregation: Una sola responsabilidad - renderizar HTML
* - Dependency Inversion: Depender de abstracción, no de implementación
*
* USO:
* ```php
* final class MyRenderer implements RendererInterface
* {
* public function render(Component $component): string
* {
* $data = $component->getData();
* // Generar HTML
* return $html;
* }
*
* public function supports(string $componentType): bool
* {
* return $componentType === 'my-component';
* }
* }
* ```
*
* @package ROITheme\Domain\Component
*/
interface RendererInterface
{
/**
* Renderizar un componente a HTML
*
* @param Component $component Componente a renderizar
* @return string HTML generado
*/
public function render(Component $component): string;
/**
* Verificar si este renderizador soporta un tipo de componente
*
* @param string $componentType Tipo de componente (ej: 'navbar', 'footer')
* @return bool True si soporta el tipo, false en caso contrario
*/
public function supports(string $componentType): bool;
}

View File

@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
/**
* Interface para servicio de sincronización de schemas
*/
interface SchemaSyncServiceInterface {
// Se implementará completamente en Fase 5
}

View File

@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
/**
* Interface para gestión de transacciones de base de datos
*/
interface TransactionManagerInterface {
// Se implementará completamente en Fase 5
}

View File

@@ -0,0 +1,199 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
/**
* ValidationServiceInterface - Contrato para servicio de validación
*
* RESPONSABILIDAD: Definir contrato para validación de datos de entrada
*
* PROPÓSITO:
* - Validar datos antes de crear entidades de dominio
* - Sanitizar entrada del usuario
* - Retornar errores de validación estructurados
*
* UBICACIÓN EN ARQUITECTURA:
* - Interfaz definida en Domain
* - Implementación en Infrastructure (puede usar WordPress functions)
* - Usado por Application Layer (Use Cases)
*
* IMPLEMENTACIONES ESPERADAS:
* - WordPressValidationService (usa sanitize_*, wp_kses, etc.)
* - StrictValidationService (validación más estricta para prod)
* - LenientValidationService (validación más permisiva para dev)
*
* USO:
* ```php
* // En Application Layer
* class SaveComponentUseCase {
* public function __construct(
* private ValidationServiceInterface $validator
* ) {}
*
* public function execute(SaveComponentRequest $request): void {
* $result = $this->validator->validate(
* $request->getData(),
* $request->getComponentName()
* );
*
* if (!$result->isValid()) {
* throw new ValidationException($result->getErrors());
* }
*
* // ... crear componente con datos validados
* }
* }
* ```
*
* @package ROITheme\Shared\Domain\Contracts
*/
interface ValidationServiceInterface
{
/**
* Validar datos de un componente
*
* @param array $data Datos a validar
* @param string $componentName Nombre del componente (para reglas específicas)
* @return ValidationResult Resultado de validación
*/
public function validate(array $data, string $componentName): ValidationResult;
/**
* Sanitizar datos de entrada
*
* @param array $data Datos a sanitizar
* @param string $componentName Nombre del componente
* @return array Datos sanitizados
*/
public function sanitize(array $data, string $componentName): array;
/**
* Validar una URL
*
* @param string $url URL a validar
* @return bool
*/
public function isValidUrl(string $url): bool;
/**
* Validar un color hexadecimal
*
* @param string $color Color a validar (ej: #000000)
* @return bool
*/
public function isValidColor(string $color): bool;
/**
* Validar nombre de componente
*
* @param string $name Nombre a validar
* @return bool
*/
public function isValidComponentName(string $name): bool;
}
/**
* ValidationResult - Value Object para resultado de validación
*
* RESPONSABILIDAD: Encapsular resultado de una validación
*
* @package ROITheme\Shared\Domain\Contracts
*/
final readonly class ValidationResult
{
/**
* Constructor
*
* @param bool $isValid Si la validación pasó
* @param array $errors Array de errores (campo => mensaje)
* @param array $sanitizedData Datos sanitizados
*/
public function __construct(
private bool $isValid,
private array $errors = [],
private array $sanitizedData = []
) {}
/**
* Verificar si la validación pasó
*
* @return bool
*/
public function isValid(): bool
{
return $this->isValid;
}
/**
* Obtener errores de validación
*
* @return array Array asociativo campo => mensaje
*/
public function getErrors(): array
{
return $this->errors;
}
/**
* Obtener datos sanitizados
*
* @return array
*/
public function getSanitizedData(): array
{
return $this->sanitizedData;
}
/**
* Verificar si hay error en campo específico
*
* @param string $field
* @return bool
*/
public function hasError(string $field): bool
{
return isset($this->errors[$field]);
}
/**
* Obtener error de un campo específico
*
* @param string $field
* @return string|null
*/
public function getError(string $field): ?string
{
return $this->errors[$field] ?? null;
}
/**
* Factory: Resultado exitoso
*
* @param array $sanitizedData
* @return self
*/
public static function success(array $sanitizedData): self
{
return new self(
isValid: true,
errors: [],
sanitizedData: $sanitizedData
);
}
/**
* Factory: Resultado con errores
*
* @param array $errors
* @return self
*/
public static function failure(array $errors): self
{
return new self(
isValid: false,
errors: $errors,
sanitizedData: []
);
}
}