Skip to content

Commit

Permalink
Use raw DB
Browse files Browse the repository at this point in the history
  • Loading branch information
adrolli committed Sep 5, 2024
1 parent 67ed312 commit bc2ed06
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 60 deletions.
73 changes: 24 additions & 49 deletions packages/sync/src/Handlers/PressSyncHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

namespace Moox\Sync\Handlers;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Moox\Core\Traits\LogLevel;

Expand All @@ -14,10 +13,16 @@ class PressSyncHandler

protected $modelData;

protected $tableName;

protected $metaTableName;

public function __construct(string $modelClass, array $modelData)
{
$this->modelClass = $modelClass;
$this->modelData = $modelData;
$this->tableName = (new $modelClass)->getTable();
$this->metaTableName = $this->tableName.'_meta';
}

public function sync()
Expand All @@ -42,28 +47,35 @@ public function sync()
}
}

protected function syncMainRecord(): Model
protected function syncMainRecord()
{
$mainTableData = $this->getMainTableData();
$idField = $this->getIdField();

$model = $this->modelClass::updateOrCreate(
$this->logDebug('Syncing main record', [
'table' => $this->tableName,
'id_field' => $idField,
'id_value' => $mainTableData[$idField],
'data' => $mainTableData,
]);

DB::table($this->tableName)->updateOrInsert(
[$idField => $mainTableData[$idField]],
$mainTableData
);

return $model;
return $mainTableData[$idField];
}

protected function syncMetaData(Model $mainRecord)
protected function syncMetaData($mainRecordId)
{
$metaData = $this->getMetaData();
$metaModel = $this->getMetaModel($mainRecord);
$foreignKeyName = $this->getForeignKeyName();

foreach ($metaData as $key => $value) {
$metaModel::updateOrCreate(
DB::table($this->metaTableName)->updateOrInsert(
[
$this->getForeignKeyName($mainRecord) => $mainRecord->getKey(),
$foreignKeyName => $mainRecordId,
'meta_key' => $key,
],
['meta_value' => $value]
Expand All @@ -76,13 +88,6 @@ protected function getMainTableData(): array
$mainFields = $this->getMainFields();
$mainTableData = array_intersect_key($this->modelData, array_flip($mainFields));

// Ensure all required fields are present, even if empty
foreach ($mainFields as $field) {
if (! isset($mainTableData[$field])) {
$mainTableData[$field] = '';
}
}

// Ensure user_url and user_activation_key are not null
$mainTableData['user_url'] = $mainTableData['user_url'] ?? '';
$mainTableData['user_activation_key'] = $mainTableData['user_activation_key'] ?? '';
Expand All @@ -93,13 +98,8 @@ protected function getMainTableData(): array
protected function getMetaData(): array
{
$defaultMeta = config('press.default_user_meta', []);
$metaData = array_intersect_key($this->modelData, array_flip($defaultMeta));

foreach ($defaultMeta as $key) {
$metaData[$key] = $metaData[$key] ?? '';
}

return $metaData;
return array_intersect_key($this->modelData, array_flip($defaultMeta));
}

protected function getMainFields(): array
Expand All @@ -110,38 +110,13 @@ protected function getMainFields(): array
];
}

protected function getMetaModel(Model $mainRecord): string
{
switch (get_class($mainRecord)) {
case \Moox\Press\Models\WpUser::class:
return \Moox\Press\Models\WpUserMeta::class;
case \Moox\Press\Models\WpPost::class:
return \Moox\Press\Models\WpPostMeta::class;
default:
throw new \Exception('Unsupported model class: '.get_class($mainRecord));
}
}

protected function getIdField(): string
{
$idFields = config('sync.local_identifier_fields', ['ID', 'uuid', 'ulid', 'id']);
foreach ($idFields as $field) {
if (isset($this->modelData[$field])) {
return $field;
}
}
throw new \Exception('No suitable ID field found for model');
return 'ID';
}

protected function getForeignKeyName(Model $mainRecord): string
protected function getForeignKeyName(): string
{
switch (get_class($mainRecord)) {
case \Moox\Press\Models\WpUser::class:
return 'user_id';
case \Moox\Press\Models\WpPost::class:
return 'post_id';
default:
throw new \Exception('Unsupported model class: '.get_class($mainRecord));
}
return strtolower(class_basename($this->modelClass)).'_id';
}
}
20 changes: 9 additions & 11 deletions packages/sync/src/Jobs/SyncJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Moox\Core\Traits\LogLevel;
use Moox\Sync\Handlers\PressSyncHandler;
Expand Down Expand Up @@ -92,21 +93,18 @@ protected function syncPlatform()
protected function syncModel($modelId)
{
if ($this->eventType === 'deleted') {
$model = $this->modelClass::where($modelId['field'], $modelId['value'])->first();
if ($model) {
$model->delete();
$this->logDebug('Model deleted successfully', [
'model_class' => $this->modelClass,
'model_id_field' => $modelId['field'],
'model_id_value' => $modelId['value'],
]);
}
DB::table((new $this->modelClass)->getTable())->where($modelId['field'], $modelId['value'])->delete();
$this->logDebug('Model deleted successfully', [
'model_class' => $this->modelClass,
'model_id_field' => $modelId['field'],
'model_id_value' => $modelId['value'],
]);
} else {
if ($this->isPressSyncableModel()) {
$handler = new PressSyncHandler($this->modelClass, $this->modelData);
$model = $handler->sync();
$handler->sync();
} else {
$model = $this->modelClass::updateOrCreate(
DB::table((new $this->modelClass)->getTable())->updateOrInsert(
[$modelId['field'] => $modelId['value']],
$this->modelData
);
Expand Down

0 comments on commit bc2ed06

Please sign in to comment.