From 2d60d9bfe76b4b373aba98b86558df11d20e32e8 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sat, 3 Jan 2026 16:15:23 +0530 Subject: [PATCH 1/7] add: query support for database. --- src/Migration/Destinations/Appwrite.php | 2 +- src/Migration/Destinations/CSV.php | 2 +- src/Migration/Destinations/Local.php | 2 +- src/Migration/Sources/Appwrite.php | 31 +++++++++---------- src/Migration/Sources/Appwrite/Reader.php | 3 +- src/Migration/Sources/Appwrite/Reader/API.php | 21 ++++++++++--- .../Sources/Appwrite/Reader/Database.php | 15 +++++++-- src/Migration/Sources/CSV.php | 2 +- src/Migration/Sources/Firebase.php | 2 +- src/Migration/Sources/NHost.php | 2 +- src/Migration/Sources/Supabase.php | 2 +- src/Migration/Target.php | 20 +++++++++++- .../Unit/Adapters/MockDestination.php | 2 +- tests/Migration/Unit/Adapters/MockSource.php | 2 +- 14 files changed, 73 insertions(+), 35 deletions(-) diff --git a/src/Migration/Destinations/Appwrite.php b/src/Migration/Destinations/Appwrite.php index 523220d5..bbe61512 100644 --- a/src/Migration/Destinations/Appwrite.php +++ b/src/Migration/Destinations/Appwrite.php @@ -136,7 +136,7 @@ public static function getSupportedResources(): array * @throws AppwriteException */ #[Override] - public function report(array $resources = []): array + public function report(array $resources = [], array $resourceIds = []): array { if (empty($resources)) { $resources = $this->getSupportedResources(); diff --git a/src/Migration/Destinations/CSV.php b/src/Migration/Destinations/CSV.php index 12c29ad7..df37f092 100644 --- a/src/Migration/Destinations/CSV.php +++ b/src/Migration/Destinations/CSV.php @@ -65,7 +65,7 @@ public static function getSupportedResources(): array ]; } - public function report(array $resources = []): array + public function report(array $resources = [], array $resourceIds = []): array { return []; } diff --git a/src/Migration/Destinations/Local.php b/src/Migration/Destinations/Local.php index f195f1cb..4c17ab20 100644 --- a/src/Migration/Destinations/Local.php +++ b/src/Migration/Destinations/Local.php @@ -76,7 +76,7 @@ public static function getSupportedResources(): array /** * @throws \Exception */ - public function report(array $resources = []): array + public function report(array $resources = [], array $resourceIds = []): array { $report = []; diff --git a/src/Migration/Sources/Appwrite.php b/src/Migration/Sources/Appwrite.php index 4216d40f..e461a10e 100644 --- a/src/Migration/Sources/Appwrite.php +++ b/src/Migration/Sources/Appwrite.php @@ -52,12 +52,6 @@ class Appwrite extends Source public const SOURCE_API = 'api'; public const SOURCE_DATABASE = 'database'; - // Debug logging for specific projects - public static array $debugProjects = [ - '67ec0369002bd8a96885' => 'SimpMusic#Maxrave', - '6838382d0014e002589c' => 'Fastwrite#DocuTrust', - ]; - protected Client $client; private Users $users; @@ -163,12 +157,15 @@ public function getDatabasesBatchSize(): int /** * @param array $resources + * @param array> $resourceIds * @return array * * @throws \Exception */ - public function report(array $resources = []): array + public function report(array $resources = [], array $resourceIds = []): array { + $this->validateResourceIds($resourceIds); + $report = []; if (empty($resources)) { @@ -176,10 +173,10 @@ public function report(array $resources = []): array } try { - $this->reportAuth($resources, $report); - $this->reportDatabases($resources, $report); - $this->reportStorage($resources, $report); - $this->reportFunctions($resources, $report); + $this->reportAuth($resources, $report, $resourceIds); + $this->reportDatabases($resources, $report, $resourceIds); + $this->reportStorage($resources, $report, $resourceIds); + $this->reportFunctions($resources, $report, $resourceIds); $report['version'] = $this->call( 'GET', @@ -205,9 +202,10 @@ public function report(array $resources = []): array /** * @param array $resources * @param array $report + * @param array> $resourceIds * @throws AppwriteException */ - private function reportAuth(array $resources, array &$report): void + private function reportAuth(array $resources, array &$report, array $resourceIds = []): void { // check if we need to fetch teams! $needTeams = !empty(array_intersect( @@ -274,17 +272,18 @@ private function reportAuth(array $resources, array &$report): void * @throws Exception * @throws AppwriteException */ - private function reportDatabases(array $resources, array &$report): void + private function reportDatabases(array $resources, array &$report, array $resourceIds = []): void { - $this->database->report($resources, $report); + $this->database->report($resources, $report, $resourceIds); } /** * @param array $resources * @param array $report + * @param array> $resourceIds * @throws AppwriteException */ - private function reportStorage(array $resources, array &$report): void + private function reportStorage(array $resources, array &$report, array $resourceIds = []): void { if (\in_array(Resource::TYPE_BUCKET, $resources)) { // just fetch one bucket for the `total` @@ -344,7 +343,7 @@ private function reportStorage(array $resources, array &$report): void } } - private function reportFunctions(array $resources, array &$report): void + private function reportFunctions(array $resources, array &$report, array $resourceIds = []): void { $pageLimit = 25; $needVarsOrDeployments = ( diff --git a/src/Migration/Sources/Appwrite/Reader.php b/src/Migration/Sources/Appwrite/Reader.php index b45f2bdc..314d4c33 100644 --- a/src/Migration/Sources/Appwrite/Reader.php +++ b/src/Migration/Sources/Appwrite/Reader.php @@ -16,9 +16,10 @@ interface Reader * * @param array $resources * @param array $report + * @param array> $resourceIds * @return mixed */ - public function report(array $resources, array &$report): mixed; + public function report(array $resources, array &$report, array $resourceIds = []): mixed; /** * List databases that match the given queries diff --git a/src/Migration/Sources/Appwrite/Reader/API.php b/src/Migration/Sources/Appwrite/Reader/API.php index da1a5022..d305c980 100644 --- a/src/Migration/Sources/Appwrite/Reader/API.php +++ b/src/Migration/Sources/Appwrite/Reader/API.php @@ -25,7 +25,7 @@ public function __construct( /** * @throws AppwriteException */ - public function report(array $resources, array &$report): mixed + public function report(array $resources, array &$report, array $resourceIds = []): mixed { $relevantResources = [ Resource::TYPE_DATABASE, @@ -45,11 +45,22 @@ public function report(array $resources, array &$report): mixed } } - $databasesResponse = $this->database->list(); - $databases = $databasesResponse['databases']; + $databaseQueries = []; + if (isset($resourceIds[Resource::TYPE_DATABASE])) { + $databaseIds = is_array($resourceIds[Resource::TYPE_DATABASE]) + ? $resourceIds[Resource::TYPE_DATABASE] + : [$resourceIds[Resource::TYPE_DATABASE]]; + + foreach ($databaseIds as $databaseId) { + $databaseQueries[] = Query::equal('$id', $databaseId); + } + } + + $response = $this->listDatabases($databaseQueries); + $databases = $response['databases']; if (in_array(Resource::TYPE_DATABASE, $resources)) { - $report[Resource::TYPE_DATABASE] = $databasesResponse['total']; + $report[Resource::TYPE_DATABASE] = $response['total']; } if (count(array_intersect($resources, $relevantResources)) === 1 && @@ -122,7 +133,7 @@ public function report(array $resources, array &$report): mixed */ public function listDatabases(array $queries = []): array { - return $this->database->list($queries)['databases']; + return $this->database->list($queries); } /** diff --git a/src/Migration/Sources/Appwrite/Reader/Database.php b/src/Migration/Sources/Appwrite/Reader/Database.php index c43e246c..3a339861 100644 --- a/src/Migration/Sources/Appwrite/Reader/Database.php +++ b/src/Migration/Sources/Appwrite/Reader/Database.php @@ -24,7 +24,7 @@ public function __construct(private readonly UtopiaDatabase $dbForProject) { } - public function report(array $resources, array &$report): mixed + public function report(array $resources, array &$report, array $resourceIds = []): mixed { $relevantResources = [ Resource::TYPE_DATABASE, @@ -44,8 +44,17 @@ public function report(array $resources, array &$report): mixed } } + $databaseQueries = []; + if (isset($resourceIds[Resource::TYPE_DATABASE])) { + $databaseIds = is_array($resourceIds[Resource::TYPE_DATABASE]) + ? $resourceIds[Resource::TYPE_DATABASE] + : [$resourceIds[Resource::TYPE_DATABASE]]; + + $databaseQueries[] = Query::equal('$id', $databaseIds); + } + if (in_array(Resource::TYPE_DATABASE, $resources)) { - $report[Resource::TYPE_DATABASE] = $this->countResources('databases'); + $report[Resource::TYPE_DATABASE] = $this->countResources('databases', $databaseQueries); } if (count(array_intersect($resources, $relevantResources)) === 1 && @@ -54,7 +63,7 @@ public function report(array $resources, array &$report): mixed } $dbResources = []; - $databases = $this->listDatabases(); + $databases = $this->listDatabases($databaseQueries); // Process each database foreach ($databases as $database) { diff --git a/src/Migration/Sources/CSV.php b/src/Migration/Sources/CSV.php index a6ca0c2d..7aaeaa35 100644 --- a/src/Migration/Sources/CSV.php +++ b/src/Migration/Sources/CSV.php @@ -69,7 +69,7 @@ public static function getSupportedResources(): array /** * @throws \Exception */ - public function report(array $resources = []): array + public function report(array $resources = [], array $resourceIds = []): array { $report = []; diff --git a/src/Migration/Sources/Firebase.php b/src/Migration/Sources/Firebase.php index 917cc0bc..12117d6a 100644 --- a/src/Migration/Sources/Firebase.php +++ b/src/Migration/Sources/Firebase.php @@ -141,7 +141,7 @@ public static function getSupportedResources(): array ]; } - public function report(array $resources = []): array + public function report(array $resources = [], array $resourceIds = []): array { // Check our service account is valid if (! isset($this->serviceAccount['project_id'])) { diff --git a/src/Migration/Sources/NHost.php b/src/Migration/Sources/NHost.php index aa29db3b..f65e7005 100644 --- a/src/Migration/Sources/NHost.php +++ b/src/Migration/Sources/NHost.php @@ -100,7 +100,7 @@ public static function getSupportedResources(): array ]; } - public function report(array $resources = []): array + public function report(array $resources = [], array $resourceIds = []): array { $report = []; diff --git a/src/Migration/Sources/Supabase.php b/src/Migration/Sources/Supabase.php index 489f5211..05006e19 100644 --- a/src/Migration/Sources/Supabase.php +++ b/src/Migration/Sources/Supabase.php @@ -229,7 +229,7 @@ public function __construct(string $endpoint, string $key, string $host, string } } - public function report(array $resources = []): array + public function report(array $resources = [], array $resourceIds = []): array { $report = []; diff --git a/src/Migration/Target.php b/src/Migration/Target.php index 633a85c7..e1eee959 100644 --- a/src/Migration/Target.php +++ b/src/Migration/Target.php @@ -63,9 +63,12 @@ abstract public function run(array $resources, callable $callback, string $rootR * If any issues are found then an exception should be thrown with an error message. * * @param array $resources Resources to report + * @param array> $resourceIds Map of resource type to IDs. Only top-level resources supported. * @return array + * + * @throws \Exception if resourceIds contains non-top-level resource types */ - abstract public function report(array $resources = []): array; + abstract public function report(array $resources = [], array $resourceIds = []): array; /** * Make an API call @@ -183,6 +186,21 @@ protected function flatten(array $data, string $prefix = ''): array return $output; } + /** + * Validate that resourceIds only contains top-level resources + */ + protected function validateResourceIds(array $resourceIds): void + { + foreach (array_keys($resourceIds) as $resourceType) { + if (!in_array($resourceType, Transfer::ROOT_RESOURCES)) { + throw new \Exception( + 'Invalid resource type in resourceIds: ' . $resourceType . '. ' . + 'Only top-level resources are supported: ' . implode(', ', Transfer::ROOT_RESOURCES) + ); + } + } + } + /** * Get Errors * diff --git a/tests/Migration/Unit/Adapters/MockDestination.php b/tests/Migration/Unit/Adapters/MockDestination.php index d9d3bb54..7c9806c6 100644 --- a/tests/Migration/Unit/Adapters/MockDestination.php +++ b/tests/Migration/Unit/Adapters/MockDestination.php @@ -85,7 +85,7 @@ public function import(array $resources, callable $callback): void $callback($resources); } - public function report(array $resources = []): array + public function report(array $resources = [], array $resourceIds = []): array { return []; } diff --git a/tests/Migration/Unit/Adapters/MockSource.php b/tests/Migration/Unit/Adapters/MockSource.php index ef599599..41d352e3 100644 --- a/tests/Migration/Unit/Adapters/MockSource.php +++ b/tests/Migration/Unit/Adapters/MockSource.php @@ -85,7 +85,7 @@ public static function getSupportedResources(): array ]; } - public function report(array $resources = []): array + public function report(array $resources = [], array $resourceIds = []): array { return []; } From b98c6b746fa47b5136b76f49f638eb7ef00b6692 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sat, 3 Jan 2026 16:22:09 +0530 Subject: [PATCH 2/7] fix: query. --- src/Migration/Sources/Appwrite/Reader/API.php | 6 ++---- src/Migration/Sources/Appwrite/Reader/Database.php | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Migration/Sources/Appwrite/Reader/API.php b/src/Migration/Sources/Appwrite/Reader/API.php index d305c980..f4022a48 100644 --- a/src/Migration/Sources/Appwrite/Reader/API.php +++ b/src/Migration/Sources/Appwrite/Reader/API.php @@ -46,14 +46,12 @@ public function report(array $resources, array &$report, array $resourceIds = [] } $databaseQueries = []; - if (isset($resourceIds[Resource::TYPE_DATABASE])) { + if (!empty($resourceIds[Resource::TYPE_DATABASE])) { $databaseIds = is_array($resourceIds[Resource::TYPE_DATABASE]) ? $resourceIds[Resource::TYPE_DATABASE] : [$resourceIds[Resource::TYPE_DATABASE]]; - foreach ($databaseIds as $databaseId) { - $databaseQueries[] = Query::equal('$id', $databaseId); - } + $databaseQueries[] = Query::equal('$id', $databaseIds); } $response = $this->listDatabases($databaseQueries); diff --git a/src/Migration/Sources/Appwrite/Reader/Database.php b/src/Migration/Sources/Appwrite/Reader/Database.php index 3a339861..058b251a 100644 --- a/src/Migration/Sources/Appwrite/Reader/Database.php +++ b/src/Migration/Sources/Appwrite/Reader/Database.php @@ -45,7 +45,7 @@ public function report(array $resources, array &$report, array $resourceIds = [] } $databaseQueries = []; - if (isset($resourceIds[Resource::TYPE_DATABASE])) { + if (!empty($resourceIds[Resource::TYPE_DATABASE])) { $databaseIds = is_array($resourceIds[Resource::TYPE_DATABASE]) ? $resourceIds[Resource::TYPE_DATABASE] : [$resourceIds[Resource::TYPE_DATABASE]]; From 3fb8615206d89485f6bbbcbc0a0e93ad4a55c9d5 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sat, 3 Jan 2026 17:08:30 +0530 Subject: [PATCH 3/7] use: queries on other services too. --- src/Migration/Sources/Appwrite.php | 67 +++++++++++++++++------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/src/Migration/Sources/Appwrite.php b/src/Migration/Sources/Appwrite.php index e461a10e..07f9f885 100644 --- a/src/Migration/Sources/Appwrite.php +++ b/src/Migration/Sources/Appwrite.php @@ -217,9 +217,9 @@ private function reportAuth(array $resources, array &$report, array $resourceIds $teams = ['total' => 0, 'teams' => []]; if (\in_array(Resource::TYPE_USER, $resources)) { - $report[Resource::TYPE_USER] = $this->users->list( - [Query::limit(1)] - )['total']; + $userQueries = $this->buildQueries(Resource::TYPE_USER, $resourceIds, null, 1); + $userList = $this->users->list($userQueries); + $report[Resource::TYPE_USER] = $userList['total']; } if ($needTeams) { @@ -228,12 +228,7 @@ private function reportAuth(array $resources, array &$report, array $resourceIds $lastTeam = null; while (true) { - $params = $lastTeam - // TODO: should we use offset here? - // this, realistically, shouldn't be too much ig - ? [Query::cursorAfter($lastTeam)] - : [Query::limit($pageLimit)]; - + $params = $this->buildQueries(Resource::TYPE_TEAM, $resourceIds, $lastTeam, $pageLimit); $teamList = $this->teams->list($params); $totalTeams = $teamList['total']; @@ -248,7 +243,8 @@ private function reportAuth(array $resources, array &$report, array $resourceIds } $teams = ['total' => $totalTeams, 'teams' => $allTeams]; } else { - $teamList = $this->teams->list([Query::limit(1)]); + $params = $this->buildQueries(Resource::TYPE_TEAM, $resourceIds, null, 1); + $teamList = $this->teams->list($params); $teams = ['total' => $teamList['total'], 'teams' => []]; } } @@ -285,15 +281,13 @@ private function reportDatabases(array $resources, array &$report, array $resour */ private function reportStorage(array $resources, array &$report, array $resourceIds = []): void { + $pageLimit = 25; + if (\in_array(Resource::TYPE_BUCKET, $resources)) { - // just fetch one bucket for the `total` - $report[Resource::TYPE_BUCKET] = $this->storage->listBuckets([ - Query::limit(1) - ])['total']; + $bucketQueries = $this->buildQueries(Resource::TYPE_BUCKET, $resourceIds, null, 1); + $report[Resource::TYPE_BUCKET] = $this->storage->listBuckets($bucketQueries)['total']; } - $pageLimit = 25; - if (\in_array(Resource::TYPE_FILE, $resources)) { $report[Resource::TYPE_FILE] = 0; $report['size'] = 0; @@ -301,11 +295,8 @@ private function reportStorage(array $resources, array &$report, array $resource $lastBucket = null; while (true) { - $currentBuckets = $this->storage->listBuckets( - $lastBucket - ? [Query::cursorAfter($lastBucket)] - : [Query::limit($pageLimit)] - )['buckets']; + $queries = $this->buildQueries(Resource::TYPE_BUCKET, $resourceIds, $lastBucket, $pageLimit); + $currentBuckets = $this->storage->listBuckets($queries)['buckets']; $buckets = array_merge($buckets, $currentBuckets); $lastBucket = $buckets[count($buckets) - 1]['$id'] ?? null; @@ -355,19 +346,15 @@ private function reportFunctions(array $resources, array &$report, array $resour $totalFunctions = 0; if (!$needVarsOrDeployments && \in_array(Resource::TYPE_FUNCTION, $resources)) { - // Only function count needed, short-circuit - $funcList = $this->functions->list([Query::limit(1)]); - $report[Resource::TYPE_FUNCTION] = $funcList['total']; + $functionQueries = $this->buildQueries(Resource::TYPE_FUNCTION, $resourceIds, null, 1); + $report[Resource::TYPE_FUNCTION] = $this->functions->list($functionQueries)['total']; return; } if ($needVarsOrDeployments) { $lastFunction = null; while (true) { - $params = $lastFunction - ? [Query::cursorAfter($lastFunction)] - : [Query::limit($pageLimit)]; - + $params = $this->buildQueries(Resource::TYPE_FUNCTION, $resourceIds, $lastFunction, $pageLimit); $funcList = $this->functions->list($params); $totalFunctions = $funcList['total']; @@ -1613,4 +1600,28 @@ private function exportDeploymentData(Func $func, array $deployment): void } } } + + /** + * Build queries with optional filtering by resource IDs + */ + private function buildQueries(string $resourceType, array $resourceIds, ?string $cursor = null, int $limit = 25): array + { + $queries = []; + + if (!empty($resourceIds[$resourceType])) { + $ids = is_array($resourceIds[$resourceType]) + ? $resourceIds[$resourceType] + : [$resourceIds[$resourceType]]; + + $queries[] = Query::equal('$id', $ids); + } + + if ($cursor) { + $queries[] = Query::cursorAfter($cursor); + } else { + $queries[] = Query::limit($limit); + } + + return $queries; + } } From 60509bd58196a52248358bc96a778ae35a9effe1 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sat, 3 Jan 2026 17:22:23 +0530 Subject: [PATCH 4/7] revert: unnecessary change for consistency. --- src/Migration/Sources/Appwrite/Reader/API.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Migration/Sources/Appwrite/Reader/API.php b/src/Migration/Sources/Appwrite/Reader/API.php index f4022a48..e6066140 100644 --- a/src/Migration/Sources/Appwrite/Reader/API.php +++ b/src/Migration/Sources/Appwrite/Reader/API.php @@ -54,11 +54,11 @@ public function report(array $resources, array &$report, array $resourceIds = [] $databaseQueries[] = Query::equal('$id', $databaseIds); } - $response = $this->listDatabases($databaseQueries); - $databases = $response['databases']; + $databasesResponse = $this->database->list($databaseQueries); + $databases = $databasesResponse['databases']; if (in_array(Resource::TYPE_DATABASE, $resources)) { - $report[Resource::TYPE_DATABASE] = $response['total']; + $report[Resource::TYPE_DATABASE] = $databasesResponse['total']; } if (count(array_intersect($resources, $relevantResources)) === 1 && @@ -131,7 +131,7 @@ public function report(array $resources, array &$report, array $resourceIds = [] */ public function listDatabases(array $queries = []): array { - return $this->database->list($queries); + return $this->database->list($queries)['databases']; } /** From 64ff35113a9900e0bfb407bdd73d529e4431ca9b Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 5 Jan 2026 12:34:39 +0530 Subject: [PATCH 5/7] add: try/catch to `countResources`. --- src/Migration/Sources/Appwrite/Reader/Database.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Migration/Sources/Appwrite/Reader/Database.php b/src/Migration/Sources/Appwrite/Reader/Database.php index 058b251a..d3eb2b4a 100644 --- a/src/Migration/Sources/Appwrite/Reader/Database.php +++ b/src/Migration/Sources/Appwrite/Reader/Database.php @@ -426,10 +426,13 @@ public function queryLimit(int $limit): Query * @param string $table * @param array $queries * @return int - * @throws DatabaseException */ private function countResources(string $table, array $queries = []): int { - return $this->dbForProject->count($table, $queries); + try { + return $this->dbForProject->count($table, $queries); + } catch (DatabaseException $e) { + return 0; + } } } From 76c1944aec150beee2e577a029d8d026c75f550c Mon Sep 17 00:00:00 2001 From: Darshan Date: Tue, 6 Jan 2026 11:19:33 +0530 Subject: [PATCH 6/7] address comments. --- src/Migration/Sources/Appwrite.php | 68 ++++++++++++++----- src/Migration/Sources/Appwrite/Reader/API.php | 4 +- .../Sources/Appwrite/Reader/Database.php | 10 +-- 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/src/Migration/Sources/Appwrite.php b/src/Migration/Sources/Appwrite.php index 07f9f885..9d862e49 100644 --- a/src/Migration/Sources/Appwrite.php +++ b/src/Migration/Sources/Appwrite.php @@ -52,6 +52,8 @@ class Appwrite extends Source public const SOURCE_API = 'api'; public const SOURCE_DATABASE = 'database'; + private const DEFAULT_PAGE_LIMIT = 25; + protected Client $client; private Users $users; @@ -213,11 +215,15 @@ private function reportAuth(array $resources, array &$report, array $resourceIds $resources )); - $pageLimit = 25; + $pageLimit = self::DEFAULT_PAGE_LIMIT; $teams = ['total' => 0, 'teams' => []]; if (\in_array(Resource::TYPE_USER, $resources)) { - $userQueries = $this->buildQueries(Resource::TYPE_USER, $resourceIds, null, 1); + $userQueries = $this->buildQueries( + resourceType: Resource::TYPE_USER, + resourceIds: $resourceIds, + limit: 1 + ); $userList = $this->users->list($userQueries); $report[Resource::TYPE_USER] = $userList['total']; } @@ -228,7 +234,12 @@ private function reportAuth(array $resources, array &$report, array $resourceIds $lastTeam = null; while (true) { - $params = $this->buildQueries(Resource::TYPE_TEAM, $resourceIds, $lastTeam, $pageLimit); + $params = $this->buildQueries( + resourceType: Resource::TYPE_TEAM, + resourceIds: $resourceIds, + cursor: $lastTeam, + limit: $pageLimit + ); $teamList = $this->teams->list($params); $totalTeams = $teamList['total']; @@ -243,7 +254,11 @@ private function reportAuth(array $resources, array &$report, array $resourceIds } $teams = ['total' => $totalTeams, 'teams' => $allTeams]; } else { - $params = $this->buildQueries(Resource::TYPE_TEAM, $resourceIds, null, 1); + $params = $this->buildQueries( + resourceType: Resource::TYPE_TEAM, + resourceIds: $resourceIds, + limit: 1 + ); $teamList = $this->teams->list($params); $teams = ['total' => $teamList['total'], 'teams' => []]; } @@ -281,10 +296,14 @@ private function reportDatabases(array $resources, array &$report, array $resour */ private function reportStorage(array $resources, array &$report, array $resourceIds = []): void { - $pageLimit = 25; + $pageLimit = self::DEFAULT_PAGE_LIMIT; if (\in_array(Resource::TYPE_BUCKET, $resources)) { - $bucketQueries = $this->buildQueries(Resource::TYPE_BUCKET, $resourceIds, null, 1); + $bucketQueries = $this->buildQueries( + resourceType: Resource::TYPE_BUCKET, + resourceIds: $resourceIds, + limit: 1 + ); $report[Resource::TYPE_BUCKET] = $this->storage->listBuckets($bucketQueries)['total']; } @@ -295,7 +314,12 @@ private function reportStorage(array $resources, array &$report, array $resource $lastBucket = null; while (true) { - $queries = $this->buildQueries(Resource::TYPE_BUCKET, $resourceIds, $lastBucket, $pageLimit); + $queries = $this->buildQueries( + resourceType: Resource::TYPE_BUCKET, + resourceIds: $resourceIds, + cursor: $lastBucket, + limit: $pageLimit + ); $currentBuckets = $this->storage->listBuckets($queries)['buckets']; $buckets = array_merge($buckets, $currentBuckets); @@ -309,11 +333,14 @@ private function reportStorage(array $resources, array &$report, array $resource foreach ($buckets as $bucket) { $lastFile = null; while (true) { + $queries = [Query::limit($pageLimit)]; + if ($lastFile) { + $queries[] = Query::cursorAfter($lastFile); + } + $files = $this->storage->listFiles( $bucket['$id'], - $lastFile - ? [Query::cursorAfter($lastFile)] - : [Query::limit($pageLimit)] + $queries )['files']; $report[Resource::TYPE_FILE] += count($files); @@ -336,7 +363,7 @@ private function reportStorage(array $resources, array &$report, array $resource private function reportFunctions(array $resources, array &$report, array $resourceIds = []): void { - $pageLimit = 25; + $pageLimit = self::DEFAULT_PAGE_LIMIT; $needVarsOrDeployments = ( \in_array(Resource::TYPE_DEPLOYMENT, $resources) || \in_array(Resource::TYPE_ENVIRONMENT_VARIABLE, $resources) @@ -346,7 +373,11 @@ private function reportFunctions(array $resources, array &$report, array $resour $totalFunctions = 0; if (!$needVarsOrDeployments && \in_array(Resource::TYPE_FUNCTION, $resources)) { - $functionQueries = $this->buildQueries(Resource::TYPE_FUNCTION, $resourceIds, null, 1); + $functionQueries = $this->buildQueries( + resourceType: Resource::TYPE_FUNCTION, + resourceIds: $resourceIds, + limit: 1 + ); $report[Resource::TYPE_FUNCTION] = $this->functions->list($functionQueries)['total']; return; } @@ -354,7 +385,12 @@ private function reportFunctions(array $resources, array &$report, array $resour if ($needVarsOrDeployments) { $lastFunction = null; while (true) { - $params = $this->buildQueries(Resource::TYPE_FUNCTION, $resourceIds, $lastFunction, $pageLimit); + $params = $this->buildQueries( + resourceType: Resource::TYPE_FUNCTION, + resourceIds: $resourceIds, + cursor: $lastFunction, + limit: $pageLimit + ); $funcList = $this->functions->list($params); $totalFunctions = $funcList['total']; @@ -1604,14 +1640,12 @@ private function exportDeploymentData(Func $func, array $deployment): void /** * Build queries with optional filtering by resource IDs */ - private function buildQueries(string $resourceType, array $resourceIds, ?string $cursor = null, int $limit = 25): array + private function buildQueries(string $resourceType, array $resourceIds, ?string $cursor = null, int $limit = self::DEFAULT_PAGE_LIMIT): array { $queries = []; if (!empty($resourceIds[$resourceType])) { - $ids = is_array($resourceIds[$resourceType]) - ? $resourceIds[$resourceType] - : [$resourceIds[$resourceType]]; + $ids = (array) $resourceIds[$resourceType]; $queries[] = Query::equal('$id', $ids); } diff --git a/src/Migration/Sources/Appwrite/Reader/API.php b/src/Migration/Sources/Appwrite/Reader/API.php index e6066140..388a0ce7 100644 --- a/src/Migration/Sources/Appwrite/Reader/API.php +++ b/src/Migration/Sources/Appwrite/Reader/API.php @@ -47,9 +47,7 @@ public function report(array $resources, array &$report, array $resourceIds = [] $databaseQueries = []; if (!empty($resourceIds[Resource::TYPE_DATABASE])) { - $databaseIds = is_array($resourceIds[Resource::TYPE_DATABASE]) - ? $resourceIds[Resource::TYPE_DATABASE] - : [$resourceIds[Resource::TYPE_DATABASE]]; + $databaseIds = (array) $resourceIds[Resource::TYPE_DATABASE]; $databaseQueries[] = Query::equal('$id', $databaseIds); } diff --git a/src/Migration/Sources/Appwrite/Reader/Database.php b/src/Migration/Sources/Appwrite/Reader/Database.php index d3eb2b4a..bad744ce 100644 --- a/src/Migration/Sources/Appwrite/Reader/Database.php +++ b/src/Migration/Sources/Appwrite/Reader/Database.php @@ -46,9 +46,7 @@ public function report(array $resources, array &$report, array $resourceIds = [] $databaseQueries = []; if (!empty($resourceIds[Resource::TYPE_DATABASE])) { - $databaseIds = is_array($resourceIds[Resource::TYPE_DATABASE]) - ? $resourceIds[Resource::TYPE_DATABASE] - : [$resourceIds[Resource::TYPE_DATABASE]]; + $databaseIds = (array) $resourceIds[Resource::TYPE_DATABASE]; $databaseQueries[] = Query::equal('$id', $databaseIds); } @@ -429,10 +427,6 @@ public function queryLimit(int $limit): Query */ private function countResources(string $table, array $queries = []): int { - try { - return $this->dbForProject->count($table, $queries); - } catch (DatabaseException $e) { - return 0; - } + return $this->dbForProject->count($table, $queries); } } From f29ac69576aadb975ca09ef34199ded4b163d290 Mon Sep 17 00:00:00 2001 From: Darshan Date: Tue, 6 Jan 2026 17:33:25 +0530 Subject: [PATCH 7/7] address comments. --- src/Migration/Sources/Appwrite.php | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/Migration/Sources/Appwrite.php b/src/Migration/Sources/Appwrite.php index 9d862e49..acc8f837 100644 --- a/src/Migration/Sources/Appwrite.php +++ b/src/Migration/Sources/Appwrite.php @@ -215,7 +215,6 @@ private function reportAuth(array $resources, array &$report, array $resourceIds $resources )); - $pageLimit = self::DEFAULT_PAGE_LIMIT; $teams = ['total' => 0, 'teams' => []]; if (\in_array(Resource::TYPE_USER, $resources)) { @@ -237,8 +236,7 @@ private function reportAuth(array $resources, array &$report, array $resourceIds $params = $this->buildQueries( resourceType: Resource::TYPE_TEAM, resourceIds: $resourceIds, - cursor: $lastTeam, - limit: $pageLimit + cursor: $lastTeam ); $teamList = $this->teams->list($params); @@ -248,7 +246,7 @@ private function reportAuth(array $resources, array &$report, array $resourceIds $allTeams = array_merge($allTeams, $currentTeams); $lastTeam = $currentTeams[count($currentTeams) - 1]['$id'] ?? null; - if (count($currentTeams) < $pageLimit) { + if (count($currentTeams) < self::DEFAULT_PAGE_LIMIT) { break; } } @@ -296,7 +294,6 @@ private function reportDatabases(array $resources, array &$report, array $resour */ private function reportStorage(array $resources, array &$report, array $resourceIds = []): void { - $pageLimit = self::DEFAULT_PAGE_LIMIT; if (\in_array(Resource::TYPE_BUCKET, $resources)) { $bucketQueries = $this->buildQueries( @@ -318,14 +315,13 @@ private function reportStorage(array $resources, array &$report, array $resource resourceType: Resource::TYPE_BUCKET, resourceIds: $resourceIds, cursor: $lastBucket, - limit: $pageLimit ); $currentBuckets = $this->storage->listBuckets($queries)['buckets']; $buckets = array_merge($buckets, $currentBuckets); $lastBucket = $buckets[count($buckets) - 1]['$id'] ?? null; - if (count($currentBuckets) < $pageLimit) { + if (count($currentBuckets) < self::DEFAULT_PAGE_LIMIT) { break; } } @@ -333,7 +329,7 @@ private function reportStorage(array $resources, array &$report, array $resource foreach ($buckets as $bucket) { $lastFile = null; while (true) { - $queries = [Query::limit($pageLimit)]; + $queries = [Query::limit(self::DEFAULT_PAGE_LIMIT)]; if ($lastFile) { $queries[] = Query::cursorAfter($lastFile); } @@ -351,7 +347,7 @@ private function reportStorage(array $resources, array &$report, array $resource $lastFile = $files[count($files) - 1]['$id'] ?? null; - if (count($files) < $pageLimit) { + if (count($files) < self::DEFAULT_PAGE_LIMIT) { break; } } @@ -363,7 +359,6 @@ private function reportStorage(array $resources, array &$report, array $resource private function reportFunctions(array $resources, array &$report, array $resourceIds = []): void { - $pageLimit = self::DEFAULT_PAGE_LIMIT; $needVarsOrDeployments = ( \in_array(Resource::TYPE_DEPLOYMENT, $resources) || \in_array(Resource::TYPE_ENVIRONMENT_VARIABLE, $resources) @@ -389,7 +384,6 @@ private function reportFunctions(array $resources, array &$report, array $resour resourceType: Resource::TYPE_FUNCTION, resourceIds: $resourceIds, cursor: $lastFunction, - limit: $pageLimit ); $funcList = $this->functions->list($params); @@ -398,7 +392,7 @@ private function reportFunctions(array $resources, array &$report, array $resour $functions = array_merge($functions, $currentFunctions); $lastFunction = $currentFunctions[count($currentFunctions) - 1]['$id'] ?? null; - if (count($currentFunctions) < $pageLimit) { + if (count($currentFunctions) < self::DEFAULT_PAGE_LIMIT) { break; } } @@ -1640,8 +1634,12 @@ private function exportDeploymentData(Func $func, array $deployment): void /** * Build queries with optional filtering by resource IDs */ - private function buildQueries(string $resourceType, array $resourceIds, ?string $cursor = null, int $limit = self::DEFAULT_PAGE_LIMIT): array - { + private function buildQueries( + string $resourceType, + array $resourceIds, + ?string $cursor = null, + int $limit = self::DEFAULT_PAGE_LIMIT + ): array { $queries = []; if (!empty($resourceIds[$resourceType])) {