diff --git a/src/Database/Adapter.php b/src/Database/Adapter.php index 88fd7d64f..ffd7ede18 100644 --- a/src/Database/Adapter.php +++ b/src/Database/Adapter.php @@ -747,7 +747,7 @@ abstract public function deleteDocument(string $collection, string $id): bool; * Delete Documents * * @param string $collection - * @param array $sequences + * @param array $sequences * @param array $permissionIds * * @return int diff --git a/src/Database/Adapter/MariaDB.php b/src/Database/Adapter/MariaDB.php index bab2eb267..218f06e86 100644 --- a/src/Database/Adapter/MariaDB.php +++ b/src/Database/Adapter/MariaDB.php @@ -905,7 +905,7 @@ public function createDocument(string $collection, Document $document): Document $stmt->execute(); - $document['$sequence'] = $this->pdo->lastInsertId(); + $document['$sequence'] = (int) $this->pdo->lastInsertId(); if (empty($document['$sequence'])) { throw new DatabaseException('Error creating document empty "$sequence"'); @@ -1656,7 +1656,7 @@ public function find(string $collection, array $queries = [], ?int $limit = 25, unset($results[$index]['_uid']); } if (\array_key_exists('_id', $document)) { - $results[$index]['$sequence'] = $document['_id']; + $results[$index]['$sequence'] = (int) $document['_id']; unset($results[$index]['_id']); } if (\array_key_exists('_tenant', $document)) { diff --git a/src/Database/Adapter/Postgres.php b/src/Database/Adapter/Postgres.php index 37d2edeec..f5ed93b65 100644 --- a/src/Database/Adapter/Postgres.php +++ b/src/Database/Adapter/Postgres.php @@ -1028,7 +1028,7 @@ public function createDocument(string $collection, Document $document): Document try { $this->execute($stmt); - $lastInsertedId = $this->getPDO()->lastInsertId(); + $lastInsertedId = (int) $this->getPDO()->lastInsertId(); // Sequence can be manually set as well $document['$sequence'] ??= $lastInsertedId; @@ -1541,7 +1541,7 @@ public function find(string $collection, array $queries = [], ?int $limit = 25, unset($results[$index]['_uid']); } if (\array_key_exists('_id', $document)) { - $results[$index]['$sequence'] = $document['_id']; + $results[$index]['$sequence'] = (int) $document['_id']; unset($results[$index]['_id']); } if (\array_key_exists('_tenant', $document)) { diff --git a/src/Database/Adapter/SQL.php b/src/Database/Adapter/SQL.php index 31bc7e6a3..179ea908a 100644 --- a/src/Database/Adapter/SQL.php +++ b/src/Database/Adapter/SQL.php @@ -369,7 +369,7 @@ public function getDocument(string $collection, string $id, array $queries = [], $document = $document[0]; if (\array_key_exists('_id', $document)) { - $document['$sequence'] = $document['_id']; + $document['$sequence'] = (int) $document['_id']; unset($document['_id']); } if (\array_key_exists('_uid', $document)) { @@ -460,7 +460,7 @@ public function updateDocuments(string $collection, Document $updates, array $do } foreach ($sequences as $id => $value) { - $stmt->bindValue(":_id_{$id}", $value); + $stmt->bindValue(":_id_{$id}", $value, \PDO::PARAM_INT); } $attributeIndex = 0; @@ -642,7 +642,7 @@ public function updateDocuments(string $collection, Document $updates, array $do * Delete Documents * * @param string $collection - * @param array $sequences + * @param array $sequences * @param array $permissionIds * * @return int @@ -1892,7 +1892,7 @@ public function createDocuments(string $collection, array $documents): array foreach ($documents as $document) { if (isset($sequences[$document->getId()])) { - $document['$sequence'] = $sequences[$document->getId()]; + $document['$sequence'] = (int) $sequences[$document->getId()]; } } } catch (PDOException $e) { diff --git a/src/Database/Adapter/SQLite.php b/src/Database/Adapter/SQLite.php index be2c4b5f7..fd42e2260 100644 --- a/src/Database/Adapter/SQLite.php +++ b/src/Database/Adapter/SQLite.php @@ -609,7 +609,7 @@ public function createDocument(string $collection, Document $document): Document $statment->execute(); $last = $statment->fetch(); - $document['$sequence'] = $last['id']; + $document['$sequence'] = (int) $last['id']; if (isset($stmtPermissions)) { $stmtPermissions->execute(); diff --git a/src/Database/Database.php b/src/Database/Database.php index 6ed45aa99..71b9497f9 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -165,8 +165,8 @@ class Database ], [ '$id' => '$sequence', - 'type' => self::VAR_STRING, - 'size' => Database::LENGTH_KEY, + 'type' => self::VAR_INTEGER, + 'size' => 8, 'required' => true, 'signed' => true, 'array' => false, diff --git a/src/Database/Document.php b/src/Database/Document.php index 2ed634f46..9c601d038 100644 --- a/src/Database/Document.php +++ b/src/Database/Document.php @@ -62,11 +62,11 @@ public function getId(): string } /** - * @return string + * @return int */ - public function getSequence(): string + public function getSequence(): int { - return $this->getAttribute('$sequence', ''); + return $this->getAttribute('$sequence', 0); } /** diff --git a/src/Database/Validator/Queries/Documents.php b/src/Database/Validator/Queries/Documents.php index 4e5c13f5f..7bef9e466 100644 --- a/src/Database/Validator/Queries/Documents.php +++ b/src/Database/Validator/Queries/Documents.php @@ -38,7 +38,7 @@ public function __construct( $attributes[] = new Document([ '$id' => '$sequence', 'key' => '$sequence', - 'type' => Database::VAR_STRING, + 'type' => Database::VAR_INTEGER, 'array' => false, ]); $attributes[] = new Document([ diff --git a/src/Database/Validator/Structure.php b/src/Database/Validator/Structure.php index 478557697..e8f6d751f 100644 --- a/src/Database/Validator/Structure.php +++ b/src/Database/Validator/Structure.php @@ -32,8 +32,8 @@ class Structure extends Validator ], [ '$id' => '$sequence', - 'type' => Database::VAR_STRING, - 'size' => 255, + 'type' => Database::VAR_INTEGER, + 'size' => 8, 'required' => false, 'signed' => true, 'array' => false, diff --git a/tests/e2e/Adapter/Scopes/DocumentTests.php b/tests/e2e/Adapter/Scopes/DocumentTests.php index 3fdbb87d7..e44c29e71 100644 --- a/tests/e2e/Adapter/Scopes/DocumentTests.php +++ b/tests/e2e/Adapter/Scopes/DocumentTests.php @@ -93,7 +93,7 @@ public function testCreateDocument(): Document // Test create document with manual internal id $manualIdDocument = $database->createDocument('documents', new Document([ '$id' => '56000', - '$sequence' => '56000', + '$sequence' => 56000, '$permissions' => [ Permission::read(Role::any()), Permission::read(Role::user(ID::custom('1'))), @@ -292,7 +292,7 @@ public function testCreateDocumentsWithAutoIncrement(): void for ($i = $sequence; $i <= ($sequence + $count); $i++) { $documents[] = new Document([ - '$sequence' => (string)$i, + '$sequence' => $i, '$permissions' => [ Permission::read(Role::any()), Permission::create(Role::any()), @@ -363,7 +363,7 @@ public function testCreateDocumentsWithDifferentAttributes(): void $documents = [ new Document([ '$id' => 'third', - '$sequence' => 'third', + '$sequence' => 3, 'string' => 'text📝', ]), new Document([ @@ -1765,9 +1765,9 @@ public function testFindByID(): void * @depends testFind * @param array $data * @return void - * @throws \Utopia\Database\Exception + * @throws DatabaseException */ - public function testFindByInternalID(array $data): void + public function testFindBySequence(array $data): void { /** @var Database $database */ $database = static::getDatabase(); @@ -4228,7 +4228,7 @@ public function testExceptionCaseInsensitiveDuplicate(Document $document): Docum $database = static::getDatabase(); $document->setAttribute('$id', 'caseSensitive'); - $document->setAttribute('$sequence', '200'); + $document->setAttribute('$sequence', 200); $database->createDocument($document->getCollection(), $document); $document->setAttribute('$id', 'CaseSensitive');