mirror of
https://github.com/appwrite/appwrite.git
synced 2026-05-26 13:51:13 +00:00
Merge remote-tracking branch 'origin/1.8.x' into feat-txn
# Conflicts: # composer.lock # src/Appwrite/Platform/Workers/StatsResources.php # src/Appwrite/Platform/Workers/StatsUsage.php
This commit is contained in:
@@ -255,6 +255,8 @@ Database::addFilter(
|
||||
->find('variables', [
|
||||
Query::equal('resourceInternalId', [$document->getSequence()]),
|
||||
Query::equal('resourceType', $resourceType),
|
||||
Query::orderAsc('resourceType'),
|
||||
Query::orderAsc(),
|
||||
Query::limit(APP_LIMIT_SUBQUERY),
|
||||
]);
|
||||
}
|
||||
|
||||
Generated
+12
-12
@@ -1352,16 +1352,16 @@
|
||||
},
|
||||
{
|
||||
"name": "open-telemetry/gen-otlp-protobuf",
|
||||
"version": "1.5.0",
|
||||
"version": "1.8.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/opentelemetry-php/gen-otlp-protobuf.git",
|
||||
"reference": "585bafddd4ae6565de154610b10a787a455c9ba0"
|
||||
"reference": "673af5b06545b513466081884b47ef15a536edde"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/opentelemetry-php/gen-otlp-protobuf/zipball/585bafddd4ae6565de154610b10a787a455c9ba0",
|
||||
"reference": "585bafddd4ae6565de154610b10a787a455c9ba0",
|
||||
"url": "https://api.github.com/repos/opentelemetry-php/gen-otlp-protobuf/zipball/673af5b06545b513466081884b47ef15a536edde",
|
||||
"reference": "673af5b06545b513466081884b47ef15a536edde",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1411,7 +1411,7 @@
|
||||
"issues": "https://github.com/open-telemetry/opentelemetry-php/issues",
|
||||
"source": "https://github.com/open-telemetry/opentelemetry-php"
|
||||
},
|
||||
"time": "2025-01-15T23:07:07+00:00"
|
||||
"time": "2025-09-17T23:10:12+00:00"
|
||||
},
|
||||
{
|
||||
"name": "open-telemetry/sdk",
|
||||
@@ -5004,16 +5004,16 @@
|
||||
"packages-dev": [
|
||||
{
|
||||
"name": "appwrite/sdk-generator",
|
||||
"version": "1.3.4",
|
||||
"version": "1.3.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/appwrite/sdk-generator.git",
|
||||
"reference": "d3b420dced42f1eec1f6d0aa98b7bbf8de4042ac"
|
||||
"reference": "6fda9e58b37c9872c1a2a424e5467de8de1bc567"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/d3b420dced42f1eec1f6d0aa98b7bbf8de4042ac",
|
||||
"reference": "d3b420dced42f1eec1f6d0aa98b7bbf8de4042ac",
|
||||
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/6fda9e58b37c9872c1a2a424e5467de8de1bc567",
|
||||
"reference": "6fda9e58b37c9872c1a2a424e5467de8de1bc567",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -5049,9 +5049,9 @@
|
||||
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
|
||||
"support": {
|
||||
"issues": "https://github.com/appwrite/sdk-generator/issues",
|
||||
"source": "https://github.com/appwrite/sdk-generator/tree/1.3.4"
|
||||
"source": "https://github.com/appwrite/sdk-generator/tree/1.3.5"
|
||||
},
|
||||
"time": "2025-09-08T11:56:04+00:00"
|
||||
"time": "2025-09-15T04:19:40+00:00"
|
||||
},
|
||||
{
|
||||
"name": "doctrine/annotations",
|
||||
@@ -8506,7 +8506,7 @@
|
||||
],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": {},
|
||||
"stability-flags": [],
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {
|
||||
|
||||
+17
-3
@@ -122,7 +122,7 @@ abstract class Action extends UtopiaAction
|
||||
/**
|
||||
* Get the correct invalid structure message.
|
||||
*/
|
||||
protected function getInvalidStructureException(): string
|
||||
protected function getStructureException(): string
|
||||
{
|
||||
return $this->isCollectionsAPI()
|
||||
? Exception::DOCUMENT_INVALID_STRUCTURE
|
||||
@@ -366,13 +366,27 @@ abstract class Action extends UtopiaAction
|
||||
'filters' => $filters,
|
||||
'options' => $options,
|
||||
]);
|
||||
if (
|
||||
!$dbForProject->getAdapter()->getSupportForSpatialIndexNull() &&
|
||||
\in_array($attribute->getAttribute('type'), Database::SPATIAL_TYPES) &&
|
||||
$attribute->getAttribute('required')
|
||||
) {
|
||||
$hasData = !Authorization::skip(fn () => $dbForProject
|
||||
->findOne('database_' . $db->getSequence() . '_collection_' . $collection->getSequence()))
|
||||
->isEmpty();
|
||||
|
||||
if ($hasData) {
|
||||
throw new StructureException('Failed to add required spatial column: existing rows present. Make the column optional.');
|
||||
}
|
||||
}
|
||||
$dbForProject->checkAttribute($collection, $attribute);
|
||||
$attribute = $dbForProject->createDocument('attributes', $attribute);
|
||||
} catch (DuplicateException) {
|
||||
throw new Exception($this->getDuplicateException());
|
||||
} catch (LimitException) {
|
||||
throw new Exception($this->getLimitException());
|
||||
} catch (StructureException $e) {
|
||||
throw new Exception($this->getStructureException(), $e->getMessage());
|
||||
} catch (Throwable $e) {
|
||||
$dbForProject->purgeCachedDocument('database_' . $db->getSequence(), $collectionId);
|
||||
$dbForProject->purgeCachedCollection('database_' . $db->getSequence() . '_collection_' . $collection->getSequence());
|
||||
@@ -416,7 +430,7 @@ abstract class Action extends UtopiaAction
|
||||
} catch (LimitException) {
|
||||
throw new Exception($this->getLimitException());
|
||||
} catch (StructureException) {
|
||||
throw new Exception($this->getInvalidStructureException());
|
||||
throw new Exception($this->getStructureException());
|
||||
} catch (Throwable $e) {
|
||||
$dbForProject->deleteDocument('attributes', $attribute->getId());
|
||||
throw $e;
|
||||
@@ -580,7 +594,7 @@ abstract class Action extends UtopiaAction
|
||||
} catch (RelationshipException $e) {
|
||||
throw new Exception(Exception::RELATIONSHIP_VALUE_INVALID, $e->getMessage());
|
||||
} catch (StructureException $e) {
|
||||
throw new Exception($this->getInvalidStructureException(), $e->getMessage());
|
||||
throw new Exception($this->getStructureException(), $e->getMessage());
|
||||
}
|
||||
|
||||
if ($primaryDocumentOptions['twoWay']) {
|
||||
|
||||
+1
-1
@@ -160,7 +160,7 @@ abstract class Action extends AppwriteAction
|
||||
/**
|
||||
* Get the correct invalid structure message.
|
||||
*/
|
||||
protected function getInvalidStructureException(): string
|
||||
protected function getStructureException(): string
|
||||
{
|
||||
return $this->isCollectionsAPI()
|
||||
? Exception::DOCUMENT_INVALID_STRUCTURE
|
||||
|
||||
+2
@@ -174,6 +174,8 @@ class Delete extends Action
|
||||
throw new Exception($this->getConflictException());
|
||||
} catch (RestrictedException) {
|
||||
throw new Exception($this->getRestrictedException());
|
||||
} catch (QueryException $e) {
|
||||
throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage());
|
||||
}
|
||||
|
||||
foreach ($documents as $document) {
|
||||
|
||||
+3
-1
@@ -200,7 +200,9 @@ class Update extends Action
|
||||
} catch (RelationshipException $e) {
|
||||
throw new Exception(Exception::RELATIONSHIP_VALUE_INVALID, $e->getMessage());
|
||||
} catch (StructureException $e) {
|
||||
throw new Exception($this->getInvalidStructureException(), $e->getMessage());
|
||||
throw new Exception($this->getStructureException(), $e->getMessage());
|
||||
} catch (QueryException $e) {
|
||||
throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage());
|
||||
}
|
||||
|
||||
foreach ($documents as $document) {
|
||||
|
||||
+1
-1
@@ -178,7 +178,7 @@ class Upsert extends Action
|
||||
} catch (RelationshipException $e) {
|
||||
throw new Exception(Exception::RELATIONSHIP_VALUE_INVALID, $e->getMessage());
|
||||
} catch (StructureException $e) {
|
||||
throw new Exception($this->getInvalidStructureException(), $e->getMessage());
|
||||
throw new Exception($this->getStructureException(), $e->getMessage());
|
||||
}
|
||||
|
||||
foreach ($upserted as $document) {
|
||||
|
||||
+1
-1
@@ -438,7 +438,7 @@ class Create extends Action
|
||||
} catch (RelationshipException $e) {
|
||||
throw new Exception(Exception::RELATIONSHIP_VALUE_INVALID, $e->getMessage());
|
||||
} catch (StructureException $e) {
|
||||
throw new Exception($this->getInvalidStructureException(), $e->getMessage());
|
||||
throw new Exception($this->getStructureException(), $e->getMessage());
|
||||
}
|
||||
|
||||
$queueForEvents
|
||||
|
||||
+1
-1
@@ -314,7 +314,7 @@ class Update extends Action
|
||||
} catch (RelationshipException $e) {
|
||||
throw new Exception(Exception::RELATIONSHIP_VALUE_INVALID, $e->getMessage());
|
||||
} catch (StructureException $e) {
|
||||
throw new Exception($this->getInvalidStructureException(), $e->getMessage());
|
||||
throw new Exception($this->getStructureException(), $e->getMessage());
|
||||
}
|
||||
|
||||
$collectionsCache = [];
|
||||
|
||||
+1
-1
@@ -323,7 +323,7 @@ class Upsert extends Action
|
||||
} catch (RelationshipException $e) {
|
||||
throw new Exception(Exception::RELATIONSHIP_VALUE_INVALID, $e->getMessage());
|
||||
} catch (StructureException $e) {
|
||||
throw new Exception($this->getInvalidStructureException(), $e->getMessage());
|
||||
throw new Exception($this->getStructureException(), $e->getMessage());
|
||||
}
|
||||
|
||||
$collectionsCache = [];
|
||||
|
||||
-37
@@ -166,43 +166,6 @@ class XList extends Action
|
||||
->addMetric(METRIC_DATABASES_OPERATIONS_READS, max($operations, 1))
|
||||
->addMetric(str_replace('{databaseInternalId}', $database->getSequence(), METRIC_DATABASE_ID_OPERATIONS_READS), $operations);
|
||||
|
||||
// Check if the SELECT query includes the removable attributes
|
||||
$hasWildcard = false;
|
||||
$hasSelectQueries = !empty($selectQueries);
|
||||
$requestedAttributes = [];
|
||||
|
||||
if ($hasSelectQueries) {
|
||||
foreach ($selectQueries as $query) {
|
||||
if ($query->getMethod() !== Query::TYPE_SELECT) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$values = $query->getValues();
|
||||
if (\in_array('*', $values, true)) {
|
||||
$hasWildcard = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Check which removable attributes are explicitly requested
|
||||
foreach ($this->removableAttributes['*'] as $attribute) {
|
||||
if (\in_array($attribute, $values, true)) {
|
||||
$requestedAttributes[$attribute] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$hasWildcard) {
|
||||
foreach ($documents as $document) {
|
||||
// Remove attributes that are not explicitly requested
|
||||
foreach ($this->removableAttributes['*'] as $attribute) {
|
||||
if (!isset($requestedAttributes[$attribute])) {
|
||||
$document->removeAttribute($attribute);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$response->dynamic(new Document([
|
||||
'total' => $total,
|
||||
// rows or documents
|
||||
|
||||
@@ -432,11 +432,45 @@ class StatsResources extends Action
|
||||
|
||||
protected function writeDocuments(Database $dbForLogs, Document $project): void
|
||||
{
|
||||
$dbForLogs->upsertDocuments(
|
||||
'stats',
|
||||
$this->documents
|
||||
);
|
||||
$this->documents = [];
|
||||
Console::success('Stats written to logs db for project: ' . $project->getId() . '(' . $project->getSequence() . ')');
|
||||
$message = 'Stats writeDocuments project: ' . $project->getId() . '(' . $project->getSequence() . ')';
|
||||
|
||||
/**
|
||||
* sort by unique index key reduce locks/deadlocks
|
||||
*/
|
||||
usort($this->documents, function ($a, $b) {
|
||||
// Metric DESC
|
||||
$cmp = strcmp($b['metric'], $a['metric']);
|
||||
if ($cmp !== 0) {
|
||||
return $cmp;
|
||||
}
|
||||
|
||||
// Period ASC
|
||||
$cmp = strcmp($a['period'], $b['period']);
|
||||
if ($cmp !== 0) {
|
||||
return $cmp;
|
||||
}
|
||||
|
||||
// Time ASC, NULLs first
|
||||
if ($a['time'] === null) {
|
||||
return ($b['time'] === null) ? 0 : -1;
|
||||
}
|
||||
if ($b['time'] === null) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return strcmp($a['time'], $b['time']);
|
||||
});
|
||||
|
||||
try {
|
||||
$dbForLogs->upsertDocuments(
|
||||
'stats',
|
||||
$this->documents,
|
||||
);
|
||||
|
||||
Console::success($message . ' | Documents: ' . count($this->documents));
|
||||
} catch (\Throwable $e) {
|
||||
Console::error('Error: ' . $message . ' | Exception: ' . $e->getMessage());
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -424,12 +424,41 @@ class StatsUsage extends Action
|
||||
try {
|
||||
$dbForProject = $getProjectDB($projectStats['project']);
|
||||
Console::log('Processing batch with ' . count($projectStats['stats']) . ' stats');
|
||||
$dbForProject->upsertDocumentsWithIncrease('stats', 'value', $projectStats['stats']);
|
||||
Console::success('Batch successfully written to DB');
|
||||
|
||||
/**
|
||||
* Sort by unique index key reduce locks/deadlocks
|
||||
*/
|
||||
usort($projectStats['stats'], function ($a, $b) {
|
||||
// Metric DESC
|
||||
$cmp = strcmp($b['metric'], $a['metric']);
|
||||
if ($cmp !== 0) {
|
||||
return $cmp;
|
||||
}
|
||||
|
||||
unset($this->projects[$sequence]);
|
||||
// Period ASC
|
||||
$cmp = strcmp($a['period'], $b['period']);
|
||||
if ($cmp !== 0) {
|
||||
return $cmp;
|
||||
}
|
||||
|
||||
// Time ASC, NULLs first
|
||||
if ($a['time'] === null) {
|
||||
return ($b['time'] === null) ? 0 : -1;
|
||||
}
|
||||
if ($b['time'] === null) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return strcmp($a['time'], $b['time']);
|
||||
});
|
||||
|
||||
$dbForProject->upsertDocumentsWithIncrease('stats', 'value', $projectStats['stats']);
|
||||
Console::success('Batch successfully written to DB');
|
||||
} catch (Throwable $e) {
|
||||
Console::error('Error processing stats: ' . $e->getMessage());
|
||||
} finally {
|
||||
unset($this->projects[$sequence]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -468,12 +497,53 @@ class StatsUsage extends Action
|
||||
|
||||
try {
|
||||
Console::log('Processing batch with ' . count($this->statDocuments) . ' stats');
|
||||
$dbForLogs->upsertDocumentsWithIncrease(
|
||||
|
||||
/**
|
||||
* Sort by UNIQUE KEY "_key_metric_period_time" ("_tenant","metric" DESC,"period","time")
|
||||
* Here we sort by _tenant as well because of setTenantPerDocument
|
||||
*/
|
||||
|
||||
usort($this->statDocuments, function ($a, $b) {
|
||||
// Tenant ASC
|
||||
$cmp = $a['$tenant'] <=> $b['$tenant'];
|
||||
if ($cmp !== 0) {
|
||||
return $cmp;
|
||||
}
|
||||
|
||||
// Metric DESC
|
||||
$cmp = strcmp($b['metric'], $a['metric']);
|
||||
if ($cmp !== 0) {
|
||||
return $cmp;
|
||||
}
|
||||
|
||||
// Period ASC
|
||||
$cmp = strcmp($a['period'], $b['period']);
|
||||
if ($cmp !== 0) {
|
||||
return $cmp;
|
||||
}
|
||||
|
||||
// Time ASC, NULLs first
|
||||
if ($a['time'] === null) {
|
||||
return ($b['time'] === null) ? 0 : -1;
|
||||
}
|
||||
if ($b['time'] === null) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return strcmp($a['time'], $b['time']);
|
||||
});
|
||||
|
||||
$dbForLogs->createOrUpdateDocumentsWithIncrease(
|
||||
'stats',
|
||||
'value',
|
||||
$this->statDocuments
|
||||
);
|
||||
Console::success('Usage logs pushed to Logs DB');
|
||||
|
||||
/**
|
||||
* todo: Do we need to unset $this->statDocuments?
|
||||
*/
|
||||
|
||||
} catch (Throwable $th) {
|
||||
Console::error($th->getMessage());
|
||||
}
|
||||
|
||||
@@ -5270,8 +5270,8 @@ trait DatabasesBase
|
||||
$this->assertEquals(2, count($response['body']['documents']));
|
||||
$this->assertEquals(null, $response['body']['documents'][0]['fullName']);
|
||||
$this->assertArrayNotHasKey("libraries", $response['body']['documents'][0]);
|
||||
$this->assertArrayNotHasKey('$databaseId', $response['body']['documents'][0]);
|
||||
$this->assertArrayNotHasKey('$collectionId', $response['body']['documents'][0]);
|
||||
$this->assertArrayHasKey('$databaseId', $response['body']['documents'][0]);
|
||||
$this->assertArrayHasKey('$collectionId', $response['body']['documents'][0]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -5291,8 +5291,8 @@ trait DatabasesBase
|
||||
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertArrayNotHasKey('libraries', $response['body']['documents'][0]);
|
||||
$this->assertArrayNotHasKey('$databaseId', $response['body']['documents'][0]);
|
||||
$this->assertArrayNotHasKey('$collectionId', $response['body']['documents'][0]);
|
||||
$this->assertArrayHasKey('$databaseId', $response['body']['documents'][0]);
|
||||
$this->assertArrayHasKey('$collectionId', $response['body']['documents'][0]);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_GET, '/databases/' . $data['databaseId'] . '/collections/' . $data['personCollection'] . '/documents', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
@@ -5305,8 +5305,8 @@ trait DatabasesBase
|
||||
$document = $response['body']['documents'][0];
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertArrayHasKey('libraries', $document);
|
||||
$this->assertArrayNotHasKey('$databaseId', $document);
|
||||
$this->assertArrayNotHasKey('$collectionId', $document);
|
||||
$this->assertArrayHasKey('$databaseId', $document);
|
||||
$this->assertArrayHasKey('$collectionId', $document);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_GET, '/databases/' . $data['databaseId'] . '/collections/' . $data['personCollection'] . '/documents/' . $document['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
@@ -7798,4 +7798,269 @@ trait DatabasesBase
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]));
|
||||
}
|
||||
|
||||
public function testSpatialColCreateOnExistingData(): void
|
||||
{
|
||||
$database = $this->client->call(Client::METHOD_POST, '/databases', [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
], [
|
||||
'databaseId' => ID::unique(),
|
||||
'name' => 'Spatial Distance Meters Database'
|
||||
]);
|
||||
|
||||
$databaseId = $database['body']['$id'];
|
||||
|
||||
$colId = ID::unique();
|
||||
$collection = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'collectionId' => $colId,
|
||||
'name' => 'spatial-test',
|
||||
'documentSecurity' => true,
|
||||
'permissions' => [
|
||||
Permission::create(Role::any()),
|
||||
Permission::read(Role::any()),
|
||||
],
|
||||
]);
|
||||
|
||||
$this->assertEquals(201, $collection['headers']['status-code']);
|
||||
|
||||
$description = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/attributes/string', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'description',
|
||||
'size' => 512,
|
||||
'required' => false,
|
||||
'default' => '',
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $description['headers']['status-code']);
|
||||
sleep(2);
|
||||
|
||||
$document = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/documents', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'documentId' => ID::unique(),
|
||||
'data' => [
|
||||
'description' => 'description'
|
||||
],
|
||||
'permissions' => [
|
||||
Permission::read(Role::user($this->getUser()['$id'])),
|
||||
Permission::update(Role::user($this->getUser()['$id'])),
|
||||
Permission::delete(Role::user($this->getUser()['$id'])),
|
||||
]
|
||||
]);
|
||||
$this->assertEquals(201, $document['headers']['status-code']);
|
||||
|
||||
$point = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/attributes/point', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'loc',
|
||||
'required' => true,
|
||||
]);
|
||||
|
||||
$this->assertEquals(400, $point['headers']['status-code']);
|
||||
|
||||
$point = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/attributes/point', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'loc',
|
||||
'required' => false,
|
||||
'default' => null
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $point['headers']['status-code']);
|
||||
|
||||
$line = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/attributes/line', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'route',
|
||||
'required' => true,
|
||||
]);
|
||||
|
||||
$this->assertEquals(400, $line['headers']['status-code']);
|
||||
|
||||
$line = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/attributes/line', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'route',
|
||||
'required' => false,
|
||||
'default' => null
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $line['headers']['status-code']);
|
||||
|
||||
$poly = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/attributes/polygon', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'area',
|
||||
'required' => true,
|
||||
]);
|
||||
|
||||
$this->assertEquals(400, $poly['headers']['status-code']);
|
||||
|
||||
$poly = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/attributes/polygon', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'area',
|
||||
'required' => false,
|
||||
'default' => null
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $poly['headers']['status-code']);
|
||||
}
|
||||
|
||||
public function testSpatialColCreateOnExistingDataWithDefaults(): void
|
||||
{
|
||||
$database = $this->client->call(Client::METHOD_POST, '/databases', [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
], [
|
||||
'databaseId' => ID::unique(),
|
||||
'name' => 'Spatial With Defaults Database'
|
||||
]);
|
||||
|
||||
$databaseId = $database['body']['$id'];
|
||||
|
||||
$colId = ID::unique();
|
||||
$collection = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'collectionId' => $colId,
|
||||
'name' => 'spatial-test-defaults',
|
||||
'documentSecurity' => true,
|
||||
'permissions' => [
|
||||
Permission::create(Role::any()),
|
||||
Permission::read(Role::any()),
|
||||
],
|
||||
]);
|
||||
|
||||
$this->assertEquals(201, $collection['headers']['status-code']);
|
||||
|
||||
$description = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/attributes/string', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'description',
|
||||
'size' => 512,
|
||||
'required' => false,
|
||||
'default' => '',
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $description['headers']['status-code']);
|
||||
sleep(2);
|
||||
|
||||
$document = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/documents', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'documentId' => ID::unique(),
|
||||
'data' => [
|
||||
'description' => 'description'
|
||||
],
|
||||
'permissions' => [
|
||||
Permission::read(Role::user($this->getUser()['$id'])),
|
||||
Permission::update(Role::user($this->getUser()['$id'])),
|
||||
Permission::delete(Role::user($this->getUser()['$id'])),
|
||||
]
|
||||
]);
|
||||
$this->assertEquals(201, $document['headers']['status-code']);
|
||||
|
||||
// Test point with default value
|
||||
$point = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/attributes/point', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'loc',
|
||||
'required' => false,
|
||||
'default' => [0.0, 0.0]
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $point['headers']['status-code']);
|
||||
|
||||
// Test line with default value
|
||||
$line = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/attributes/line', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'route',
|
||||
'required' => false,
|
||||
'default' => [[0.0, 0.0], [1.0, 1.0]]
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $line['headers']['status-code']);
|
||||
|
||||
// Test polygon with default value
|
||||
$poly = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/attributes/polygon', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'area',
|
||||
'required' => false,
|
||||
'default' => [[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0], [0.0, 0.0]]]
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $poly['headers']['status-code']);
|
||||
|
||||
// Wait for attributes to be available
|
||||
sleep(2);
|
||||
|
||||
// Create a new document without spatial data to test default values
|
||||
$newDocument = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $colId . '/documents', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'documentId' => ID::unique(),
|
||||
'data' => [
|
||||
'description' => 'test default values'
|
||||
],
|
||||
'permissions' => [
|
||||
Permission::read(Role::user($this->getUser()['$id'])),
|
||||
Permission::update(Role::user($this->getUser()['$id'])),
|
||||
Permission::delete(Role::user($this->getUser()['$id'])),
|
||||
]
|
||||
]);
|
||||
$this->assertEquals(201, $newDocument['headers']['status-code']);
|
||||
|
||||
$newDocumentId = $newDocument['body']['$id'];
|
||||
|
||||
// Fetch the document to verify default values are applied
|
||||
$fetchedDocument = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $colId . '/documents/' . $newDocumentId, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()));
|
||||
|
||||
$this->assertEquals(200, $fetchedDocument['headers']['status-code']);
|
||||
|
||||
// Verify default values are applied
|
||||
$this->assertEquals([0.0, 0.0], $fetchedDocument['body']['loc']);
|
||||
$this->assertEquals([[0.0, 0.0], [1.0, 1.0]], $fetchedDocument['body']['route']);
|
||||
$this->assertEquals([[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0], [0.0, 0.0]]], $fetchedDocument['body']['area']);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3062,7 +3062,7 @@ trait DatabasesBase
|
||||
|
||||
public function testInvalidRowStructure(): void
|
||||
{
|
||||
$database = $this->client->call(Client::METHOD_POST, '/databases', array_merge([
|
||||
$database = $this->client->call(Client::METHOD_POST, '/tablesdb', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
@@ -3735,7 +3735,7 @@ trait DatabasesBase
|
||||
|
||||
public function testEnforceTableAndRowPermissions(): void
|
||||
{
|
||||
$database = $this->client->call(Client::METHOD_POST, '/databases', array_merge([
|
||||
$database = $this->client->call(Client::METHOD_POST, '/tablesdb', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
@@ -3928,7 +3928,7 @@ trait DatabasesBase
|
||||
|
||||
public function testEnforceTablePermissions(): void
|
||||
{
|
||||
$database = $this->client->call(Client::METHOD_POST, '/databases', array_merge([
|
||||
$database = $this->client->call(Client::METHOD_POST, '/tablesdb', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
@@ -4284,7 +4284,7 @@ trait DatabasesBase
|
||||
public function testUpdatePermissionsWithEmptyPayload(): array
|
||||
{
|
||||
// Create Database
|
||||
$database = $this->client->call(Client::METHOD_POST, '/databases', array_merge([
|
||||
$database = $this->client->call(Client::METHOD_POST, '/tablesdb', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
@@ -5197,8 +5197,8 @@ trait DatabasesBase
|
||||
$this->assertEquals(2, count($response['body']['rows']));
|
||||
$this->assertEquals(null, $response['body']['rows'][0]['fullName']);
|
||||
$this->assertArrayNotHasKey("libraries", $response['body']['rows'][0]);
|
||||
$this->assertArrayNotHasKey('$databaseId', $response['body']['rows'][0]);
|
||||
$this->assertArrayNotHasKey('$tableId', $response['body']['rows'][0]);
|
||||
$this->assertArrayHasKey('$databaseId', $response['body']['rows'][0]);
|
||||
$this->assertArrayHasKey('$tableId', $response['body']['rows'][0]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -5218,8 +5218,8 @@ trait DatabasesBase
|
||||
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertArrayNotHasKey('libraries', $response['body']['rows'][0]);
|
||||
$this->assertArrayNotHasKey('$databaseId', $response['body']['rows'][0]);
|
||||
$this->assertArrayNotHasKey('$tableId', $response['body']['rows'][0]);
|
||||
$this->assertArrayHasKey('$databaseId', $response['body']['rows'][0]);
|
||||
$this->assertArrayHasKey('$tableId', $response['body']['rows'][0]);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_GET, '/tablesdb/' . $data['databaseId'] . '/tables/' . $data['personCollection'] . '/rows', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
@@ -5232,8 +5232,8 @@ trait DatabasesBase
|
||||
$row = $response['body']['rows'][0];
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertArrayHasKey('libraries', $row);
|
||||
$this->assertArrayNotHasKey('$databaseId', $row);
|
||||
$this->assertArrayNotHasKey('$tableId', $row);
|
||||
$this->assertArrayHasKey('$databaseId', $row);
|
||||
$this->assertArrayHasKey('$tableId', $row);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_GET, '/tablesdb/' . $data['databaseId'] . '/tables/' . $data['personCollection'] . '/rows/' . $row['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
@@ -8828,4 +8828,269 @@ trait DatabasesBase
|
||||
$this->client->call(Client::METHOD_DELETE, "/tablesdb/{$databaseId}", $headers);
|
||||
}
|
||||
|
||||
public function testSpatialColCreateOnExistingData(): void
|
||||
{
|
||||
$database = $this->client->call(Client::METHOD_POST, '/tablesdb', [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
], [
|
||||
'databaseId' => ID::unique(),
|
||||
'name' => 'Spatial Distance Meters Database'
|
||||
]);
|
||||
|
||||
$databaseId = $database['body']['$id'];
|
||||
|
||||
$tableId = ID::unique();
|
||||
$table = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'tableId' => $tableId,
|
||||
'name' => 'spatial-test',
|
||||
'rowSecurity' => true,
|
||||
'permissions' => [
|
||||
Permission::create(Role::any()),
|
||||
Permission::read(Role::any()),
|
||||
],
|
||||
]);
|
||||
|
||||
$this->assertEquals(201, $table['headers']['status-code']);
|
||||
|
||||
$description = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/columns/string', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'description',
|
||||
'size' => 512,
|
||||
'required' => false,
|
||||
'default' => '',
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $description['headers']['status-code']);
|
||||
sleep(2);
|
||||
|
||||
$row = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/rows', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'rowId' => ID::unique(),
|
||||
'data' => [
|
||||
'description' => 'description'
|
||||
],
|
||||
'permissions' => [
|
||||
Permission::read(Role::user($this->getUser()['$id'])),
|
||||
Permission::update(Role::user($this->getUser()['$id'])),
|
||||
Permission::delete(Role::user($this->getUser()['$id'])),
|
||||
]
|
||||
]);
|
||||
$this->assertEquals(201, $row['headers']['status-code']);
|
||||
|
||||
$point = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/columns/point', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'loc',
|
||||
'required' => true,
|
||||
]);
|
||||
|
||||
$this->assertEquals(400, $point['headers']['status-code']);
|
||||
|
||||
$point = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/columns/point', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'loc',
|
||||
'required' => false,
|
||||
'default' => null
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $point['headers']['status-code']);
|
||||
|
||||
$line = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/columns/line', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'route',
|
||||
'required' => true,
|
||||
]);
|
||||
|
||||
$this->assertEquals(400, $line['headers']['status-code']);
|
||||
|
||||
$line = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/columns/line', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'route',
|
||||
'required' => false,
|
||||
'default' => null
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $line['headers']['status-code']);
|
||||
|
||||
$poly = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/columns/polygon', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'area',
|
||||
'required' => true,
|
||||
]);
|
||||
|
||||
$this->assertEquals(400, $poly['headers']['status-code']);
|
||||
|
||||
$poly = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/columns/polygon', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'area',
|
||||
'required' => false,
|
||||
'default' => null
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $poly['headers']['status-code']);
|
||||
}
|
||||
|
||||
public function testSpatialColCreateOnExistingDataWithDefaults(): void
|
||||
{
|
||||
$database = $this->client->call(Client::METHOD_POST, '/tablesdb', [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
], [
|
||||
'databaseId' => ID::unique(),
|
||||
'name' => 'Spatial With Defaults Database'
|
||||
]);
|
||||
|
||||
$databaseId = $database['body']['$id'];
|
||||
|
||||
$tableId = ID::unique();
|
||||
$table = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'tableId' => $tableId,
|
||||
'name' => 'spatial-test-defaults',
|
||||
'rowSecurity' => true,
|
||||
'permissions' => [
|
||||
Permission::create(Role::any()),
|
||||
Permission::read(Role::any()),
|
||||
],
|
||||
]);
|
||||
|
||||
$this->assertEquals(201, $table['headers']['status-code']);
|
||||
|
||||
$description = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/columns/string', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'description',
|
||||
'size' => 512,
|
||||
'required' => false,
|
||||
'default' => '',
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $description['headers']['status-code']);
|
||||
sleep(2);
|
||||
|
||||
$row = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/rows', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'rowId' => ID::unique(),
|
||||
'data' => [
|
||||
'description' => 'description'
|
||||
],
|
||||
'permissions' => [
|
||||
Permission::read(Role::user($this->getUser()['$id'])),
|
||||
Permission::update(Role::user($this->getUser()['$id'])),
|
||||
Permission::delete(Role::user($this->getUser()['$id'])),
|
||||
]
|
||||
]);
|
||||
$this->assertEquals(201, $row['headers']['status-code']);
|
||||
|
||||
// Test point with default value
|
||||
$point = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/columns/point', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'loc',
|
||||
'required' => false,
|
||||
'default' => [0.0, 0.0]
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $point['headers']['status-code']);
|
||||
|
||||
// Test line with default value
|
||||
$line = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/columns/line', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'route',
|
||||
'required' => false,
|
||||
'default' => [[0.0, 0.0], [1.0, 1.0]]
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $line['headers']['status-code']);
|
||||
|
||||
// Test polygon with default value
|
||||
$poly = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/columns/polygon', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'key' => 'area',
|
||||
'required' => false,
|
||||
'default' => [[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0], [0.0, 0.0]]]
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $poly['headers']['status-code']);
|
||||
|
||||
// Wait for columns to be available
|
||||
sleep(2);
|
||||
|
||||
// Create a new row without spatial data to test default values
|
||||
$newRow = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/rows', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'rowId' => ID::unique(),
|
||||
'data' => [
|
||||
'description' => 'test default values'
|
||||
],
|
||||
'permissions' => [
|
||||
Permission::read(Role::user($this->getUser()['$id'])),
|
||||
Permission::update(Role::user($this->getUser()['$id'])),
|
||||
Permission::delete(Role::user($this->getUser()['$id'])),
|
||||
]
|
||||
]);
|
||||
$this->assertEquals(201, $newRow['headers']['status-code']);
|
||||
|
||||
$newRowId = $newRow['body']['$id'];
|
||||
|
||||
// Fetch the row to verify default values are applied
|
||||
$fetchedRow = $this->client->call(Client::METHOD_GET, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/rows/' . $newRowId, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()));
|
||||
|
||||
$this->assertEquals(200, $fetchedRow['headers']['status-code']);
|
||||
|
||||
// Verify default values are applied
|
||||
$this->assertEquals([0.0, 0.0], $fetchedRow['body']['loc']);
|
||||
$this->assertEquals([[0.0, 0.0], [1.0, 1.0]], $fetchedRow['body']['route']);
|
||||
$this->assertEquals([[[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0], [0.0, 0.0]]], $fetchedRow['body']['area']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user