diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 247044f4c3..47761f3fd0 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -330,7 +330,10 @@ class Deletes extends Action $queries[] = Query::equal('resourceType', [$resourceType]); } - $queries[] = Query::select($this->selects); + foreach ($this->selects as $select) { + $queries[] = Query::select($select); + } + $queries[] = Query::orderAsc(); $this->deleteByGroup( @@ -367,12 +370,16 @@ class Deletes extends Action ); $queries = [ - Query::select([...$this->selects, 'accessedAt']), + Query::select('accessedAt'), Query::lessThan('accessedAt', $datetime), Query::orderDesc('accessedAt'), Query::orderDesc(), ]; + foreach ($this->selects as $select) { + $queries[] = Query::select($select); + } + $this->deleteByGroup( 'cache', $queries, @@ -403,27 +410,37 @@ class Deletes extends Action $selects = [...$this->selects, 'time']; - // Delete Usage stats from projectDB - $this->deleteByGroup('stats', [ - Query::select($selects), + $queries = [ Query::equal('period', ['1h']), Query::lessThan('time', $hourlyUsageRetentionDatetime), Query::orderDesc('time'), Query::orderDesc(), - ], $dbForProject); + ]; + + foreach ($selects as $select) { + $queries[] = Query::select($select); + } + + // Delete Usage stats from projectDB + $this->deleteByGroup('stats', $queries, $dbForProject); if ($project->getId() !== 'console') { /** @var Database $dbForLogs */ $dbForLogs = call_user_func($getLogsDB, $project); - // Delete Usage stats from logsDB - $this->deleteByGroup('stats', [ - Query::select($selects), + $queries[] = [ Query::equal('period', ['1h']), Query::lessThan('time', $hourlyUsageRetentionDatetime), Query::orderDesc('time'), Query::orderDesc(), - ], $dbForLogs); + ]; + + foreach ($selects as $select) { + $queries[] = Query::select($select); + } + + // Delete Usage stats from logsDB + $this->deleteByGroup('stats', $queries, $dbForLogs); } } @@ -689,13 +706,19 @@ class Deletes extends Action { $dbForProject = $getProjectDB($project); - // Delete Executions - $this->deleteByGroup('executions', [ - Query::select([...$this->selects, '$createdAt']), + $queries = [ + Query::select('$createdAt'), Query::lessThan('$createdAt', $datetime), Query::orderDesc('$createdAt'), Query::orderDesc(), - ], $dbForProject); + ]; + + foreach ($this->selects as $select) { + $queries[] = Query::select($select); + } + + // Delete Executions + $this->deleteByGroup('executions', $queries, $dbForProject); } /** @@ -710,13 +733,19 @@ class Deletes extends Action $duration = $project->getAttribute('auths', [])['duration'] ?? TOKEN_EXPIRATION_LOGIN_LONG; $expired = DateTime::addSeconds(new \DateTime(), -1 * $duration); - // Delete Sessions - $this->deleteByGroup('sessions', [ - Query::select([...$this->selects, '$createdAt']), + $queries = [ + Query::select('$createdAt'), Query::lessThan('$createdAt', $expired), Query::orderDesc('$createdAt'), Query::orderDesc(), - ], $dbForProject); + ]; + + foreach ($this->selects as $select) { + $queries[] = Query::select($select); + } + + // Delete Sessions + $this->deleteByGroup('sessions', $queries, $dbForProject); } /** @@ -738,14 +767,22 @@ class Deletes extends Action Console::info("Deleting CSV export files older than " . $oneWeekAgo); - $this->deleteByGroup('bucket_' . $bucket->getSequence(), [ - Query::select([...$this->selects, '$createdAt', 'name', 'path']), + $queries = [ + Query::select('$createdAt'), + Query::select('name'), + Query::select('path'), Query::equal('bucketId', ['default']), Query::createdBefore($oneWeekAgo), Query::endsWith('name', '.csv'), Query::orderDesc('$createdAt'), Query::orderDesc(), - ], $dbForPlatform, function (Document $file) use ($deviceForFiles) { + ]; + + foreach ($this->selects as $select) { + $queries[] = Query::select($select); + } + + $this->deleteByGroup('bucket_' . $bucket->getSequence(), $queries, $dbForPlatform, function (Document $file) use ($deviceForFiles) { $path = $file->getAttribute('path'); if ($deviceForFiles->exists($path)) { $deviceForFiles->delete($path); @@ -782,13 +819,19 @@ class Deletes extends Action $projectId = $project->getId(); $dbForProject = $getProjectDB($project); + $queries = [ + Query::select('time'), + Query::lessThan('time', $auditRetention), + Query::orderDesc('time'), + Query::orderAsc(), + ]; + + foreach ($this->selects as $select) { + $queries[] = Query::select($select); + } + try { - $this->deleteByGroup(Audit::COLLECTION, [ - Query::select([...$this->selects, 'time']), - Query::lessThan('time', $auditRetention), - Query::orderDesc('time'), - Query::orderAsc(), - ], $dbForProject); + $this->deleteByGroup(Audit::COLLECTION, $queries, $dbForProject); } catch (DatabaseException $e) { Console::error('Failed to delete audit logs for project ' . $projectId . ': ' . $e->getMessage()); } @@ -853,12 +896,18 @@ class Deletes extends Action * Delete Logs */ Console::info("Deleting logs for site " . $siteId); - $this->deleteByGroup('executions', [ - Query::select($this->selects), + + $queries = [ Query::equal('resourceInternalId', [$siteInternalId]), Query::equal('resourceType', ['sites']), Query::orderAsc() - ], $dbForProject); + ]; + + foreach ($this->selects as $select) { + $queries[] = Query::select($select); + } + + $this->deleteByGroup('executions', $queries, $dbForProject); /** * Delete VCS Repositories and VCS Comments @@ -939,12 +988,18 @@ class Deletes extends Action * Delete Executions */ Console::info("Deleting executions for function " . $functionId); - $this->deleteByGroup('executions', [ - Query::select($this->selects), + + $queries = [ Query::equal('resourceInternalId', [$functionInternalId]), Query::equal('resourceType', ['functions']), Query::orderAsc() - ], $dbForProject); + ]; + + foreach ($this->selects as $select) { + $queries[] = Query::select($select); + } + + $this->deleteByGroup('executions', $queries, $dbForProject); /** * Delete VCS Repositories and VCS Comments diff --git a/src/Appwrite/Utopia/Request/Filters/V20.php b/src/Appwrite/Utopia/Request/Filters/V20.php index e3d5fe2f79..3cd041c11c 100644 --- a/src/Appwrite/Utopia/Request/Filters/V20.php +++ b/src/Appwrite/Utopia/Request/Filters/V20.php @@ -67,7 +67,7 @@ class V20 extends Filter $needsRelationships = empty($selections); if (!$needsRelationships) { foreach ($selections as $select) { - if (\in_array('*', $select->getValues(), true)) { + if ($select->getValue() === '*') { $needsRelationships = true; break; } @@ -88,7 +88,9 @@ class V20 extends Filter ); // Add wildcard + relationship(s) selects - $parsed[] = Query::select($selects); + foreach ($selects as $select) { + $parsed[] = Query::select($select); + } } $resolvedQueries = []; diff --git a/tests/e2e/Services/Users/UsersBase.php b/tests/e2e/Services/Users/UsersBase.php index 37b9a7a605..02cdb77268 100644 --- a/tests/e2e/Services/Users/UsersBase.php +++ b/tests/e2e/Services/Users/UsersBase.php @@ -453,7 +453,7 @@ trait UsersBase 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ 'queries' => [ - Query::select(['name'])->toString() + Query::select('name')->toString() ] ]); $this->assertEquals($response['headers']['status-code'], 400);