diff --git a/composer.json b/composer.json index 7d08c2bf32..d45d723430 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ "utopia-php/locale": "0.8.*", "utopia-php/logger": "0.6.*", "utopia-php/messaging": "0.20.*", - "utopia-php/migration": "1.*.*", + "utopia-php/migration": "1.3.*", "utopia-php/orchestration": "0.9.*", "utopia-php/platform": "0.7.*", "utopia-php/pools": "0.8.*", diff --git a/composer.lock b/composer.lock index 996844994c..73abeb57f0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f63c88303152af32cae4c800b8642540", + "content-hash": "375a062e8675e7e6938c1d8cc7b61ecf", "packages": [ { "name": "adhocore/jwt", @@ -4516,16 +4516,16 @@ }, { "name": "utopia-php/migration", - "version": "1.3.11", + "version": "1.3.12", "source": { "type": "git", "url": "https://github.com/utopia-php/migration.git", - "reference": "798f0976a1c14234c4b283b858b08c9afbcc1662" + "reference": "1b8d5519c50630e4c0b6a79be615b70d5f23d2e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/migration/zipball/798f0976a1c14234c4b283b858b08c9afbcc1662", - "reference": "798f0976a1c14234c4b283b858b08c9afbcc1662", + "url": "https://api.github.com/repos/utopia-php/migration/zipball/1b8d5519c50630e4c0b6a79be615b70d5f23d2e4", + "reference": "1b8d5519c50630e4c0b6a79be615b70d5f23d2e4", "shasum": "" }, "require": { @@ -4582,10 +4582,10 @@ "utopia" ], "support": { - "source": "https://github.com/utopia-php/migration/tree/1.3.11", + "source": "https://github.com/utopia-php/migration/tree/1.3.12", "issues": "https://github.com/utopia-php/migration/issues" }, - "time": "2026-01-06T12:07:07+00:00" + "time": "2026-01-07T06:07:33+00:00" }, { "name": "utopia-php/mongo", diff --git a/src/Appwrite/Platform/Workers/Migrations.php b/src/Appwrite/Platform/Workers/Migrations.php index 972757408e..e1039510f4 100644 --- a/src/Appwrite/Platform/Workers/Migrations.php +++ b/src/Appwrite/Platform/Workers/Migrations.php @@ -110,10 +110,18 @@ class Migrations extends Action $events = $payload['events'] ?? []; $migration = new Document($payload['migration'] ?? []); + if ($migration->isEmpty()) { + throw new \Exception('Migration not found'); + } + if ($project->getId() === 'console') { return; } + if ($project->isEmpty()) { + throw new \Exception('Project not found'); + } + $this->dbForProject = $dbForProject; $this->dbForPlatform = $dbForPlatform; $this->project = $project; @@ -312,7 +320,8 @@ class Migrations extends Action Mail $queueForMails, array $platform, ): void { - $project = $this->dbForPlatform->getDocument('projects', $this->project->getId()); + $project = $this->project; + $tempAPIKey = $this->generateAPIKey($project); $transfer = $source = $destination = null; @@ -386,62 +395,59 @@ class Migrations extends Action Console::error('Line: ' . $th->getLine()); Console::error($th->getTraceAsString()); - if (! $migration->isEmpty()) { - $migration->setAttribute('status', 'failed'); - $migration->setAttribute('stage', 'finished'); + $migration->setAttribute('status', 'failed'); + $migration->setAttribute('stage', 'finished'); - call_user_func($this->logError, $th, 'appwrite-worker', 'appwrite-queue-'.self::getName(), [ - 'migrationId' => $migration->getId(), - 'source' => $migration->getAttribute('source') ?? '', - 'destination' => $migration->getAttribute('destination') ?? '', - ]); + call_user_func($this->logError, $th, 'appwrite-worker', 'appwrite-queue-'.self::getName(), [ + 'migrationId' => $migration->getId(), + 'source' => $migration->getAttribute('source') ?? '', + 'destination' => $migration->getAttribute('destination') ?? '', + ]); - return; - } - - if ($transfer) { - $sourceErrors = $source->getErrors(); - $destinationErrors = $destination->getErrors(); - $migration->setAttribute('errors', $this->sanitizeErrors($sourceErrors, $destinationErrors)); - } } finally { - $this->updateMigrationDocument($migration, $project, $queueForRealtime); + try { + $this->updateMigrationDocument($migration, $project, $queueForRealtime); - if ($migration->getAttribute('status', '') === 'failed') { - Console::error('Migration('.$migration->getSequence().':'.$migration->getId().') failed, Project('.$this->project->getSequence().':'.$this->project->getId().')'); + if ($migration->getAttribute('status', '') === 'failed') { + Console::error('Migration('.$migration->getSequence().':'.$migration->getId().') failed, Project('.$this->project->getSequence().':'.$this->project->getId().')'); - $sourceErrors = $source?->getErrors() ?? []; - $destinationErrors = $destination?->getErrors() ?? []; + $sourceErrors = $source?->getErrors() ?? []; + $destinationErrors = $destination?->getErrors() ?? []; - foreach ([...$sourceErrors, ...$destinationErrors] as $error) { - /** @var MigrationException $error */ - if ($error->getCode() === 0 || $error->getCode() >= 500) { - ($this->logError)($error, 'appwrite-worker', 'appwrite-queue-' . self::getName(), [ - 'migrationId' => $migration->getId(), - 'source' => $migration->getAttribute('source') ?? '', - 'destination' => $migration->getAttribute('destination') ?? '', - 'resourceName' => $error->getResourceName(), - 'resourceGroup' => $error->getResourceGroup(), - ]); + foreach ([...$sourceErrors, ...$destinationErrors] as $error) { + /** @var MigrationException $error */ + if ($error->getCode() === 0 || $error->getCode() >= 500) { + ($this->logError)($error, 'appwrite-worker', 'appwrite-queue-' . self::getName(), [ + 'migrationId' => $migration->getId(), + 'source' => $migration->getAttribute('source') ?? '', + 'destination' => $migration->getAttribute('destination') ?? '', + 'resourceName' => $error->getResourceName(), + 'resourceGroup' => $error->getResourceGroup(), + ]); + } + } + + $source?->error(); + $destination?->error(); + } + + if ($migration->getAttribute('status', '') === 'completed') { + $destination?->success(); + $source?->success(); + + // todo: Move to CSV hook + if ($migration->getAttribute('destination') === DestinationCSV::getName()) { + $this->handleCSVExportComplete($project, $migration, $queueForMails, $queueForRealtime, $platform); } } + } finally { + $source?->cleanUp(); + $destination?->cleanUp(); - $source?->error(); - $destination?->error(); + $transfer = null; + $source = null; + $destination = null; } - - if ($migration->getAttribute('status', '') === 'completed') { - $destination?->success(); - $source?->success(); - - if ($migration->getAttribute('destination') === DestinationCSV::getName()) { - $this->handleCSVExportComplete($project, $migration, $queueForMails, $queueForRealtime, $platform); - } - } - - $transfer = null; - $source = null; - $destination = null; } }