From 61f9bd90e50117d29c41cb4d430da3750b2af800 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 Aug 2025 20:01:34 +0000 Subject: [PATCH 1/5] Initial plan From 6763b8ecb6142798f5931641f8b83f7e7e577117 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 Aug 2025 20:06:26 +0000 Subject: [PATCH 2/5] Apply sequence integer casting fix to Row.php and add test assertion Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com> --- src/Appwrite/Utopia/Response/Model/Row.php | 1 + tests/e2e/Services/Databases/TablesDB/DatabasesBase.php | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/Appwrite/Utopia/Response/Model/Row.php b/src/Appwrite/Utopia/Response/Model/Row.php index 77df48ce89..370d3065ba 100644 --- a/src/Appwrite/Utopia/Response/Model/Row.php +++ b/src/Appwrite/Utopia/Response/Model/Row.php @@ -79,6 +79,7 @@ class Row extends Any { $document->removeAttribute('$collection'); $document->removeAttribute('$tenant'); + $document->setAttribute('$sequence', (int)$document->getAttribute('$sequence', 0)); foreach ($document->getAttributes() as $column) { if (\is_array($column)) { diff --git a/tests/e2e/Services/Databases/TablesDB/DatabasesBase.php b/tests/e2e/Services/Databases/TablesDB/DatabasesBase.php index 0b92208c95..c57421c384 100644 --- a/tests/e2e/Services/Databases/TablesDB/DatabasesBase.php +++ b/tests/e2e/Services/Databases/TablesDB/DatabasesBase.php @@ -1625,6 +1625,8 @@ trait DatabasesBase $this->assertEquals($row1['body']['actors'][0], 'Chris Evans'); $this->assertEquals($row1['body']['actors'][1], 'Samuel Jackson'); $this->assertEquals($row1['body']['birthDay'], '1975-06-12T12:12:55.000+00:00'); + $this->assertTrue(array_key_exists('$sequence', $row1['body'])); + $this->assertIsInt($row1['body']['$sequence']); $this->assertEquals(201, $row2['headers']['status-code']); $this->assertEquals($data['moviesId'], $row2['body']['$tableId']); From bfd8b554cdd49ba7b96f5ffa06962e9f9decfdb3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 Aug 2025 20:37:33 +0000 Subject: [PATCH 3/5] Add $tenant attribute removal to Action.php processDocument method Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com> --- .../Databases/Http/Databases/Collections/Documents/Action.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Action.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Action.php index ca5dc91cb4..541d8edece 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Action.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Action.php @@ -232,6 +232,7 @@ abstract class Action extends AppwriteAction $collectionId = $collection->getId(); $document->removeAttribute('$collection'); + $document->removeAttribute('$tenant'); $document->setAttribute('$databaseId', $database->getId()); $document->setAttribute('$' . $this->getCollectionsEventsContext() . 'Id', $collectionId); From 737e2f86241f255c9f42ad151767a28da99176c2 Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Tue, 26 Aug 2025 15:10:23 -0700 Subject: [PATCH 4/5] fix: Remove $sequence attribute from documents on create and update Including attribute can cause a invalid structure error as the incoming data may be an int but the database expects a string. --- .../Databases/Http/Databases/Collections/Documents/Action.php | 3 +-- .../Http/Databases/Collections/Documents/Bulk/Update.php | 3 +++ .../Databases/Http/Databases/Collections/Documents/Create.php | 3 +++ .../Databases/Http/Databases/Collections/Documents/Update.php | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Action.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Action.php index 541d8edece..78df15b0c1 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Action.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Action.php @@ -29,7 +29,7 @@ abstract class Action extends AppwriteAction // Use the same helper method to ensure consistency $contextId = '$' . $this->getCollectionsEventsContext() . 'Id'; - $this->removableAttributes = ['$databaseId', $contextId]; + $this->removableAttributes = ['$databaseId', $contextId, '$sequence']; return parent::setHttpPath($path); } @@ -232,7 +232,6 @@ abstract class Action extends AppwriteAction $collectionId = $collection->getId(); $document->removeAttribute('$collection'); - $document->removeAttribute('$tenant'); $document->setAttribute('$databaseId', $database->getId()); $document->setAttribute('$' . $this->getCollectionsEventsContext() . 'Id', $collectionId); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Update.php index b5a4750c4f..a9f9c3f76d 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Update.php @@ -127,6 +127,9 @@ class Update extends Action } } + // Remove sequence if set + unset($document['$sequence']); + $documents = []; try { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Create.php index f2d678f411..04c90c4ec1 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Create.php @@ -351,6 +351,9 @@ class Create extends Action } } + // Remove sequence if set + unset($document['$sequence']); + // Assign a unique ID if needed, otherwise use the provided ID. $document['$id'] = $sourceId === 'unique()' ? ID::unique() : $sourceId; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Update.php index 4f5055abc4..334bcb8448 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Update.php @@ -159,6 +159,9 @@ class Update extends Action $permissions = $document->getPermissions() ?? []; } + // Remove sequence if set + unset($document['$sequence']); + $data['$id'] = $documentId; $data['$permissions'] = $permissions; $newDocument = new Document($data); From b57bef2d0c220a4b584ed1e494e8d966c26b5f43 Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Tue, 26 Aug 2025 15:11:27 -0700 Subject: [PATCH 5/5] chore: fix lint error --- src/Appwrite/Utopia/Request/Filters/V20.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Utopia/Request/Filters/V20.php b/src/Appwrite/Utopia/Request/Filters/V20.php index 939eeeabe7..30de1fb2d3 100644 --- a/src/Appwrite/Utopia/Request/Filters/V20.php +++ b/src/Appwrite/Utopia/Request/Filters/V20.php @@ -52,7 +52,7 @@ class V20 extends Filter if (empty($selections)) { $hasWildcard = true; $parsed[] = Query::select(['*']); - } else if (!$hasWildcard) { + } elseif (!$hasWildcard) { // check if any select includes a wildcard as we added one above foreach ($selections as $select) { if (\in_array('*', $select->getValues(), true)) {