Files
roi-theme/Shared/Infrastructure/Adapters/LegacyDBManagerAdapter.php
FrankZamora 8f4e854a20 fix: Corregir case-sensitivity en namespaces PHP para compatibilidad Linux
- HeroSectionRenderer: namespace herosection → HeroSection (PascalCase)
- TopNotificationBarFormBuilder: namespace UI → Ui
- TopNotificationBarRenderer: @package docblock corregido
- LegacyDBManagerAdapter: ROITheme\Component → ROITheme\Shared
- LegacyDBManagerAdapter: ROITheme\Domain\Component → ROITheme\Shared\Domain\Entities
- functions-addon: actualizada referencia a HeroSectionRenderer

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 11:51:23 -06:00

321 lines
10 KiB
PHP

<?php
declare(strict_types=1);
namespace ROITheme\Shared\Infrastructure\Adapters;
use ROITheme\Shared\Infrastructure\Di\DIContainer;
use ROITheme\Shared\Domain\ValueObjects\ComponentName;
use ROITheme\Shared\Domain\ValueObjects\ComponentConfiguration;
use ROITheme\Shared\Domain\Contracts\ComponentRepositoryInterface;
use ROITheme\Shared\Domain\Contracts\DefaultRepositoryInterface;
/**
* LegacyDBManagerAdapter - Adapter para ROI_DB_Manager deprecated
*
* RESPONSABILIDAD: Traducir llamadas legacy a la nueva arquitectura
*
* PATRÓN: Adapter Pattern
* - Interfaz antigua (ROI_DB_Manager methods)
* - Implementación nueva (Clean Architecture repositories)
*
* Este adapter mantiene compatibilidad backward mientras se migra el código
*
* @package ROITheme\Infrastructure\Adapters
*/
final class LegacyDBManagerAdapter
{
private ComponentRepositoryInterface $componentRepository;
private ComponentDefaultsRepositoryInterface $defaultsRepository;
public function __construct()
{
global $wpdb;
// Get repositories from DI Container
$schemasPath = get_template_directory() . '/schemas';
$container = new DIContainer($wpdb, $schemasPath);
$this->componentRepository = $container->getComponentRepository();
$this->defaultsRepository = $container->getDefaultsRepository();
}
/**
* Save component configuration (legacy method)
*
* Adapta save_config() legacy a WordPressComponentRepository::save()
*
* @param string $component_name Component name
* @param string $config_key Configuration key
* @param mixed $config_value Configuration value
* @param string $data_type Data type
* @param string|null $version Schema version
* @param string $table_type Table type (components or defaults)
* @return bool Success status
*/
public function save_config(
string $component_name,
string $config_key,
$config_value,
string $data_type = 'string',
?string $version = null,
string $table_type = 'components'
): bool {
try {
$componentNameVO = new ComponentName($component_name);
if ($table_type === 'defaults') {
// Save to defaults repository
$config = $this->defaultsRepository->exists($componentNameVO)
? $this->defaultsRepository->getByName($componentNameVO)
: ComponentConfiguration::fromArray([]);
$data = $config->toArray();
$data[$config_key] = $this->convertValue($config_value, $data_type);
$newConfig = ComponentConfiguration::fromArray($data);
$this->defaultsRepository->save($componentNameVO, $newConfig);
return true;
}
// Save to component repository
$component = $this->componentRepository->findByName($componentNameVO);
if ($component === null) {
// Create new component with this configuration
$data = [
'visibility' => ['is_enabled' => true],
'content' => [$config_key => $this->convertValue($config_value, $data_type)],
'styles' => [],
'config' => []
];
$newComponent = new \ROITheme\Shared\Domain\Entities\Component(
$component_name,
$component_name,
$data
);
$this->componentRepository->save($newComponent);
} else {
// Update existing component
$data = $component->getData();
// Determinar en qué sección guardar
$section = $this->determineSection($config_key);
if (!isset($data[$section])) {
$data[$section] = [];
}
$data[$section][$config_key] = $this->convertValue($config_value, $data_type);
$updatedComponent = $component->withData($data);
$this->componentRepository->save($updatedComponent);
}
return true;
} catch (\Exception $e) {
// Log error but maintain backward compatibility
error_log("LegacyDBManagerAdapter::save_config error: " . $e->getMessage());
return false;
}
}
/**
* Get component configuration (legacy method)
*
* Adapta get_config() legacy a WordPressComponentRepository::findByName()
*
* @param string $component_name Component name
* @param string|null $config_key Specific configuration key (null for all)
* @param string $table_type Table type (components or defaults)
* @return mixed Configuration value(s) or null
*/
public function get_config(
string $component_name,
?string $config_key = null,
string $table_type = 'components'
) {
try {
$componentNameVO = new ComponentName($component_name);
if ($table_type === 'defaults') {
if (!$this->defaultsRepository->exists($componentNameVO)) {
return null;
}
$config = $this->defaultsRepository->getByName($componentNameVO);
$data = $config->toArray();
return $config_key ? ($data[$config_key] ?? null) : $data;
}
// Get from component repository
$component = $this->componentRepository->findByName($componentNameVO);
if ($component === null) {
return null;
}
$data = $component->getData();
if ($config_key === null) {
// Return all configuration
return $this->flattenComponentData($data);
}
// Search for key in all sections
foreach (['visibility', 'content', 'styles', 'config'] as $section) {
if (isset($data[$section][$config_key])) {
return $data[$section][$config_key];
}
}
return null;
} catch (\Exception $e) {
error_log("LegacyDBManagerAdapter::get_config error: " . $e->getMessage());
return null;
}
}
/**
* Delete component configuration (legacy method)
*
* Adapta delete_config() legacy a WordPressComponentRepository::delete()
*
* @param string $component_name Component name
* @param string $table_type Table type (components or defaults)
* @return bool Success status
*/
public function delete_config(string $component_name, string $table_type = 'components'): bool
{
try {
$componentNameVO = new ComponentName($component_name);
if ($table_type === 'defaults') {
return $this->defaultsRepository->delete($componentNameVO);
}
return $this->componentRepository->delete($componentNameVO);
} catch (\Exception $e) {
error_log("LegacyDBManagerAdapter::delete_config error: " . $e->getMessage());
return false;
}
}
/**
* Get component by table (legacy method)
*
* @param string $component_name Component name
* @param string $table_type Table type
* @return array|null Component data or null
*/
public function get_component_by_table(string $component_name, string $table_type = 'components'): ?array
{
try {
$componentNameVO = new ComponentName($component_name);
if ($table_type === 'defaults') {
if (!$this->defaultsRepository->exists($componentNameVO)) {
return null;
}
$config = $this->defaultsRepository->getByName($componentNameVO);
return [
'component_name' => $component_name,
'default_schema' => json_encode($config->toArray()),
'created_at' => '',
'updated_at' => ''
];
}
$component = $this->componentRepository->findByName($componentNameVO);
if ($component === null) {
return null;
}
return [
'component_name' => $component_name,
'configuration' => json_encode($component->getData()),
'is_enabled' => $component->isEnabled() ? 1 : 0,
'created_at' => '',
'updated_at' => ''
];
} catch (\Exception $e) {
error_log("LegacyDBManagerAdapter::get_component_by_table error: " . $e->getMessage());
return null;
}
}
/**
* Convert value to appropriate type
*
* @param mixed $value Value to convert
* @param string $type Target type
* @return mixed Converted value
*/
private function convertValue($value, string $type)
{
switch ($type) {
case 'boolean':
return filter_var($value, FILTER_VALIDATE_BOOLEAN);
case 'integer':
return (int) $value;
case 'array':
return is_array($value) ? $value : json_decode($value, true);
case 'string':
default:
return (string) $value;
}
}
/**
* Determine which section a config key belongs to
*
* @param string $key Configuration key
* @return string Section name
*/
private function determineSection(string $key): string
{
// Visibility keys
if (in_array($key, ['is_enabled', 'sticky', 'show_on_mobile', 'show_on_desktop'])) {
return 'visibility';
}
// Style keys
if (strpos($key, 'color') !== false || strpos($key, 'font') !== false || strpos($key, 'size') !== false) {
return 'styles';
}
// Config keys
if (in_array($key, ['auto_close', 'close_delay', 'animation'])) {
return 'config';
}
// Default to content
return 'content';
}
/**
* Flatten component data for legacy compatibility
*
* @param array $data Component data
* @return array Flattened data
*/
private function flattenComponentData(array $data): array
{
$flattened = [];
foreach ($data as $section => $values) {
if (is_array($values)) {
foreach ($values as $key => $value) {
$flattened[$key] = $value;
}
}
}
return $flattened;
}
}