From 04a613eb93c64ae588f2d88559b93e5e200320be Mon Sep 17 00:00:00 2001 From: Alf Drollinger Date: Sat, 7 Sep 2024 01:17:16 +0200 Subject: [PATCH] wip --- .../src/Transformer/WpUserTransformer.php | 116 +++++++++++++++++- packages/sync/src/Jobs/SyncJob.php | 4 +- 2 files changed, 112 insertions(+), 8 deletions(-) diff --git a/packages/press/src/Transformer/WpUserTransformer.php b/packages/press/src/Transformer/WpUserTransformer.php index 4c910e195..d31a3a1ea 100644 --- a/packages/press/src/Transformer/WpUserTransformer.php +++ b/packages/press/src/Transformer/WpUserTransformer.php @@ -2,23 +2,127 @@ namespace Moox\Press\Transformer; +use Illuminate\Support\Facades\Config; +use Illuminate\Support\Facades\DB; +use Moox\Core\Traits\LogLevel; use Moox\Sync\Transformer\AbstractTransformer; class WpUserTransformer extends AbstractTransformer { + use LogLevel; + + protected $tableName; + + protected $metaTableName; + + public function __construct($query) + { + parent::__construct($query); + $this->tableName = $this->model->getTable(); + $this->metaTableName = str_replace('users', 'usermeta', $this->tableName); + } + + public function transform(): array + { + $data = parent::transform(); + $this->logInfo('Moox Sync: Starting WpUser transform', ['data' => $data]); + + $mainData = $this->getMainTableData($data); + $metaData = $this->getMetaData($data); + + $this->checkDataTypes($mainData); + + $transformedData = array_merge($mainData, $metaData); + + $this->logInfo('Moox Sync: WpUser transform completed', ['transformed_data' => $transformedData]); + + return $transformedData; + } + protected function transformCustomFields(array $data): array { - $metaFields = $this->getMetaFields(); - foreach ($metaFields as $metaKey) { - $data[$metaKey] = $this->getMetaValue($metaKey) ?? config("press.default_user_meta.{$metaKey}", ''); + // This method is now handled by getMainTableData and getMetaData + return $data; + } + + protected function getMainTableData(array $data): array + { + $mainFields = $this->getMainFields(); + $mainTableData = array_intersect_key($data, array_flip($mainFields)); + + $mainTableData['user_url'] = $mainTableData['user_url'] ?? ''; + $mainTableData['user_activation_key'] = $mainTableData['user_activation_key'] ?? ''; + + return $mainTableData; + } + + protected function getMetaData(array $data): array + { + $defaultMeta = Config::get('press.default_user_meta', []); + $this->logInfo('Moox Sync: Default meta keys', ['default_meta' => $defaultMeta]); + + $metaData = array_intersect_key($data, $defaultMeta); + $this->logInfo('Moox Sync: Initial meta data', ['meta_data' => $metaData]); + + foreach ($defaultMeta as $metaKey => $defaultValue) { + if (! isset($metaData[$metaKey])) { + $metaData[$metaKey] = $defaultValue; + } } - return $data; + $this->logInfo('Moox Sync: Final meta data', ['meta_data' => $metaData]); + + return $metaData; + } + + protected function getMainFields(): array + { + return [ + 'ID', 'user_login', 'user_pass', 'user_nicename', 'user_email', 'user_url', + 'user_registered', 'user_activation_key', 'user_status', 'display_name', + ]; } - protected function getMetaFields(): array + protected function checkDataTypes($mainTableData) { - return array_keys(config('press.default_user_meta', [])); + $tableColumns = DB::getSchemaBuilder()->getColumnListing($this->tableName); + $columnTypes = []; + foreach ($tableColumns as $column) { + $columnTypes[$column] = DB::getSchemaBuilder()->getColumnType($this->tableName, $column); + } + + $potentialMismatches = []; + foreach ($mainTableData as $field => $value) { + if (isset($columnTypes[$field])) { + $expectedType = $columnTypes[$field]; + $actualType = gettype($value); + if ($this->isTypeMismatch($expectedType, $actualType)) { + $potentialMismatches[$field] = [ + 'expected' => $expectedType, + 'actual' => $actualType, + 'value' => $value, + ]; + } + } + } + + if (! empty($potentialMismatches)) { + $this->logDebug('Moox Sync: Potential data type mismatches', ['mismatches' => $potentialMismatches]); + } + } + + protected function isTypeMismatch($expectedType, $actualType) + { + $typeMap = [ + 'int' => ['integer'], + 'bigint' => ['integer'], + 'varchar' => ['string'], + 'text' => ['string'], + 'datetime' => ['string', 'object'], + // Add more mappings as needed + ]; + + return ! in_array($actualType, $typeMap[$expectedType] ?? [$expectedType]); } public function getDelay(): int diff --git a/packages/sync/src/Jobs/SyncJob.php b/packages/sync/src/Jobs/SyncJob.php index 9d836592a..73e45d9ef 100644 --- a/packages/sync/src/Jobs/SyncJob.php +++ b/packages/sync/src/Jobs/SyncJob.php @@ -49,7 +49,7 @@ public function handle() $this->syncModel(); } } catch (\Exception $e) { - $this->logError('Moox Sync: Error syncing model', [ + $this->logDebug('Moox Sync: Error syncing model', [ 'model_class' => $this->modelClass, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString(), @@ -132,7 +132,7 @@ protected function getModelId() } } - $this->logError('Moox Sync: No suitable ID field found for model', [ + $this->logDebug('Moox Sync: No suitable ID field found for model', [ 'model_class' => $this->modelClass, 'model_data' => $this->modelData, ]);