mirror of
https://github.com/appwrite/appwrite
synced 2026-05-05 22:38:37 +00:00
Merge pull request #8544 from appwrite/feat-renaming-attributes
Implement Renaming Attributes in the API
This commit is contained in:
commit
583bb7d512
26 changed files with 713 additions and 52 deletions
|
|
@ -203,7 +203,7 @@ return [
|
|||
[
|
||||
'key' => 'web',
|
||||
'name' => 'Console',
|
||||
'version' => '1.0.1',
|
||||
'version' => '1.1.0-rc.3',
|
||||
'url' => 'https://github.com/appwrite/sdk-for-console',
|
||||
'package' => '',
|
||||
'enabled' => true,
|
||||
|
|
@ -214,7 +214,7 @@ return [
|
|||
'prism' => 'javascript',
|
||||
'source' => \realpath(__DIR__ . '/../sdks/console-web'),
|
||||
'gitUrl' => 'git@github.com:appwrite/sdk-for-console.git',
|
||||
'gitBranch' => 'dev',
|
||||
'gitBranch' => '1.6.1',
|
||||
'gitRepoName' => 'sdk-for-console',
|
||||
'gitUserName' => 'appwrite',
|
||||
],
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -229,6 +229,7 @@ function updateAttribute(
|
|||
Database $dbForProject,
|
||||
Event $queueForEvents,
|
||||
string $type,
|
||||
int $size = null,
|
||||
string $filter = null,
|
||||
string|bool|int|float $default = null,
|
||||
bool $required = null,
|
||||
|
|
@ -236,7 +237,7 @@ function updateAttribute(
|
|||
int|float $max = null,
|
||||
array $elements = null,
|
||||
array $options = [],
|
||||
int $size = null
|
||||
string $newKey = null,
|
||||
): Document {
|
||||
$db = Authorization::skip(fn () => $dbForProject->getDocument('databases', $databaseId));
|
||||
|
||||
|
|
@ -351,6 +352,7 @@ function updateAttribute(
|
|||
$dbForProject->updateRelationship(
|
||||
collection: $collectionId,
|
||||
id: $key,
|
||||
newKey: $newKey,
|
||||
onDelete: $primaryDocumentOptions['onDelete'],
|
||||
);
|
||||
|
||||
|
|
@ -358,9 +360,15 @@ function updateAttribute(
|
|||
$relatedCollection = $dbForProject->getDocument('database_' . $db->getInternalId(), $primaryDocumentOptions['relatedCollection']);
|
||||
|
||||
$relatedAttribute = $dbForProject->getDocument('attributes', $db->getInternalId() . '_' . $relatedCollection->getInternalId() . '_' . $primaryDocumentOptions['twoWayKey']);
|
||||
|
||||
if (!empty($newKey) && $newKey !== $key) {
|
||||
$options['twoWayKey'] = $newKey;
|
||||
}
|
||||
|
||||
$relatedOptions = \array_merge($relatedAttribute->getAttribute('options'), $options);
|
||||
$relatedAttribute->setAttribute('options', $relatedOptions);
|
||||
$dbForProject->updateDocument('attributes', $db->getInternalId() . '_' . $relatedCollection->getInternalId() . '_' . $primaryDocumentOptions['twoWayKey'], $relatedAttribute);
|
||||
|
||||
$dbForProject->purgeCachedDocument('database_' . $db->getInternalId(), $relatedCollection->getId());
|
||||
}
|
||||
} else {
|
||||
|
|
@ -368,17 +376,36 @@ function updateAttribute(
|
|||
$dbForProject->updateAttribute(
|
||||
collection: $collectionId,
|
||||
id: $key,
|
||||
size: $size,
|
||||
required: $required,
|
||||
default: $default,
|
||||
formatOptions: $options ?? null,
|
||||
size: $size ?? null,
|
||||
newKey: $newKey ?? null
|
||||
);
|
||||
} catch (TruncateException $e) {
|
||||
} catch (TruncateException) {
|
||||
throw new Exception(Exception::ATTRIBUTE_INVALID_RESIZE);
|
||||
}
|
||||
}
|
||||
|
||||
$attribute = $dbForProject->updateDocument('attributes', $db->getInternalId() . '_' . $collection->getInternalId() . '_' . $key, $attribute);
|
||||
if (!empty($newKey) && $key !== $newKey) {
|
||||
// Delete attribute and recreate since we can't modify IDs
|
||||
$original = clone $attribute;
|
||||
|
||||
$dbForProject->deleteDocument('attributes', $attribute->getId());
|
||||
|
||||
$attribute
|
||||
->setAttribute('$id', ID::custom($db->getInternalId() . '_' . $collection->getInternalId() . '_' . $newKey))
|
||||
->setAttribute('key', $newKey);
|
||||
|
||||
try {
|
||||
$attribute = $dbForProject->createDocument('attributes', $attribute);
|
||||
} catch (\Throwable) {
|
||||
$attribute = $dbForProject->createDocument('attributes', $original);
|
||||
}
|
||||
} else {
|
||||
$attribute = $dbForProject->updateDocument('attributes', $db->getInternalId() . '_' . $collection->getInternalId() . '_' . $key, $attribute);
|
||||
}
|
||||
|
||||
$dbForProject->purgeCachedDocument('database_' . $db->getInternalId(), $collection->getId());
|
||||
|
||||
$queueForEvents
|
||||
|
|
@ -1872,10 +1899,11 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/strin
|
|||
->param('required', null, new Boolean(), 'Is attribute required?')
|
||||
->param('default', null, new Nullable(new Text(0, 0)), 'Default value for attribute when not provided. Cannot be set when attribute is required.')
|
||||
->param('size', null, new Integer(), 'Maximum size of the string attribute.', true)
|
||||
->param('newKey', null, new Key(), 'New attribute key.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForEvents')
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?string $default, ?int $size, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?string $default, ?int $size, ?string $newKey, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
|
||||
$attribute = updateAttribute(
|
||||
databaseId: $databaseId,
|
||||
|
|
@ -1884,9 +1912,10 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/strin
|
|||
dbForProject: $dbForProject,
|
||||
queueForEvents: $queueForEvents,
|
||||
type: Database::VAR_STRING,
|
||||
size: $size,
|
||||
default: $default,
|
||||
required: $required,
|
||||
size: $size
|
||||
newKey: $newKey
|
||||
);
|
||||
|
||||
$response
|
||||
|
|
@ -1912,10 +1941,11 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/email
|
|||
->param('key', '', new Key(), 'Attribute Key.')
|
||||
->param('required', null, new Boolean(), 'Is attribute required?')
|
||||
->param('default', null, new Nullable(new Email()), 'Default value for attribute when not provided. Cannot be set when attribute is required.')
|
||||
->param('newKey', null, new Key(), 'New attribute key.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForEvents')
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?string $default, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?string $default, ?string $newKey, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
$attribute = updateAttribute(
|
||||
databaseId: $databaseId,
|
||||
collectionId: $collectionId,
|
||||
|
|
@ -1925,7 +1955,8 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/email
|
|||
type: Database::VAR_STRING,
|
||||
filter: APP_DATABASE_ATTRIBUTE_EMAIL,
|
||||
default: $default,
|
||||
required: $required
|
||||
required: $required,
|
||||
newKey: $newKey
|
||||
);
|
||||
|
||||
$response
|
||||
|
|
@ -1952,10 +1983,11 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/enum/
|
|||
->param('elements', null, new ArrayList(new Text(DATABASE::LENGTH_KEY), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of elements in enumerated type. Uses length of longest element to determine size. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' elements are allowed, each ' . DATABASE::LENGTH_KEY . ' characters long.')
|
||||
->param('required', null, new Boolean(), 'Is attribute required?')
|
||||
->param('default', null, new Nullable(new Text(0)), 'Default value for attribute when not provided. Cannot be set when attribute is required.')
|
||||
->param('newKey', null, new Key(), 'New attribute key.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForEvents')
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?array $elements, ?bool $required, ?string $default, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?array $elements, ?bool $required, ?string $default, ?string $newKey, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
$attribute = updateAttribute(
|
||||
databaseId: $databaseId,
|
||||
collectionId: $collectionId,
|
||||
|
|
@ -1966,7 +1998,8 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/enum/
|
|||
filter: APP_DATABASE_ATTRIBUTE_ENUM,
|
||||
default: $default,
|
||||
required: $required,
|
||||
elements: $elements
|
||||
elements: $elements,
|
||||
newKey: $newKey
|
||||
);
|
||||
|
||||
$response
|
||||
|
|
@ -1992,10 +2025,11 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/ip/:k
|
|||
->param('key', '', new Key(), 'Attribute Key.')
|
||||
->param('required', null, new Boolean(), 'Is attribute required?')
|
||||
->param('default', null, new Nullable(new IP()), 'Default value for attribute when not provided. Cannot be set when attribute is required.')
|
||||
->param('newKey', null, new Key(), 'New attribute key.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForEvents')
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?string $default, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?string $default, ?string $newKey, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
$attribute = updateAttribute(
|
||||
databaseId: $databaseId,
|
||||
collectionId: $collectionId,
|
||||
|
|
@ -2005,7 +2039,8 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/ip/:k
|
|||
type: Database::VAR_STRING,
|
||||
filter: APP_DATABASE_ATTRIBUTE_IP,
|
||||
default: $default,
|
||||
required: $required
|
||||
required: $required,
|
||||
newKey: $newKey
|
||||
);
|
||||
|
||||
$response
|
||||
|
|
@ -2031,10 +2066,11 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/url/:
|
|||
->param('key', '', new Key(), 'Attribute Key.')
|
||||
->param('required', null, new Boolean(), 'Is attribute required?')
|
||||
->param('default', null, new Nullable(new URL()), 'Default value for attribute when not provided. Cannot be set when attribute is required.')
|
||||
->param('newKey', null, new Key(), 'New attribute key.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForEvents')
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?string $default, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?string $default, ?string $newKey, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
$attribute = updateAttribute(
|
||||
databaseId: $databaseId,
|
||||
collectionId: $collectionId,
|
||||
|
|
@ -2044,7 +2080,8 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/url/:
|
|||
type: Database::VAR_STRING,
|
||||
filter: APP_DATABASE_ATTRIBUTE_URL,
|
||||
default: $default,
|
||||
required: $required
|
||||
required: $required,
|
||||
newKey: $newKey
|
||||
);
|
||||
|
||||
$response
|
||||
|
|
@ -2072,10 +2109,11 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/integ
|
|||
->param('min', null, new Integer(), 'Minimum value to enforce on new documents')
|
||||
->param('max', null, new Integer(), 'Maximum value to enforce on new documents')
|
||||
->param('default', null, new Nullable(new Integer()), 'Default value for attribute when not provided. Cannot be set when attribute is required.')
|
||||
->param('newKey', null, new Key(), 'New attribute key.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForEvents')
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?int $min, ?int $max, ?int $default, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?int $min, ?int $max, ?int $default, ?string $newKey, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
$attribute = updateAttribute(
|
||||
databaseId: $databaseId,
|
||||
collectionId: $collectionId,
|
||||
|
|
@ -2086,7 +2124,8 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/integ
|
|||
default: $default,
|
||||
required: $required,
|
||||
min: $min,
|
||||
max: $max
|
||||
max: $max,
|
||||
newKey: $newKey
|
||||
);
|
||||
|
||||
$formatOptions = $attribute->getAttribute('formatOptions', []);
|
||||
|
|
@ -2121,10 +2160,11 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/float
|
|||
->param('min', null, new FloatValidator(), 'Minimum value to enforce on new documents')
|
||||
->param('max', null, new FloatValidator(), 'Maximum value to enforce on new documents')
|
||||
->param('default', null, new Nullable(new FloatValidator()), 'Default value for attribute when not provided. Cannot be set when attribute is required.')
|
||||
->param('newKey', null, new Key(), 'New attribute key.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForEvents')
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?float $min, ?float $max, ?float $default, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?float $min, ?float $max, ?float $default, ?string $newKey, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
$attribute = updateAttribute(
|
||||
databaseId: $databaseId,
|
||||
collectionId: $collectionId,
|
||||
|
|
@ -2135,7 +2175,8 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/float
|
|||
default: $default,
|
||||
required: $required,
|
||||
min: $min,
|
||||
max: $max
|
||||
max: $max,
|
||||
newKey: $newKey
|
||||
);
|
||||
|
||||
$formatOptions = $attribute->getAttribute('formatOptions', []);
|
||||
|
|
@ -2168,10 +2209,11 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/boole
|
|||
->param('key', '', new Key(), 'Attribute Key.')
|
||||
->param('required', null, new Boolean(), 'Is attribute required?')
|
||||
->param('default', null, new Nullable(new Boolean()), 'Default value for attribute when not provided. Cannot be set when attribute is required.')
|
||||
->param('newKey', null, new Key(), 'New attribute key.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForEvents')
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?bool $default, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?bool $default, ?string $newKey, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
$attribute = updateAttribute(
|
||||
databaseId: $databaseId,
|
||||
collectionId: $collectionId,
|
||||
|
|
@ -2180,7 +2222,8 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/boole
|
|||
queueForEvents: $queueForEvents,
|
||||
type: Database::VAR_BOOLEAN,
|
||||
default: $default,
|
||||
required: $required
|
||||
required: $required,
|
||||
newKey: $newKey
|
||||
);
|
||||
|
||||
$response
|
||||
|
|
@ -2206,10 +2249,11 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/datet
|
|||
->param('key', '', new Key(), 'Attribute Key.')
|
||||
->param('required', null, new Boolean(), 'Is attribute required?')
|
||||
->param('default', null, new Nullable(new DatetimeValidator()), 'Default value for attribute when not provided. Cannot be set when attribute is required.')
|
||||
->param('newKey', null, new Key(), 'New attribute key.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForEvents')
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?string $default, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
->action(function (string $databaseId, string $collectionId, string $key, ?bool $required, ?string $default, ?string $newKey, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
$attribute = updateAttribute(
|
||||
databaseId: $databaseId,
|
||||
collectionId: $collectionId,
|
||||
|
|
@ -2218,7 +2262,8 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/datet
|
|||
queueForEvents: $queueForEvents,
|
||||
type: Database::VAR_DATETIME,
|
||||
default: $default,
|
||||
required: $required
|
||||
required: $required,
|
||||
newKey: $newKey
|
||||
);
|
||||
|
||||
$response
|
||||
|
|
@ -2243,6 +2288,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/:key/
|
|||
->param('collectionId', '', new UID(), 'Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection).')
|
||||
->param('key', '', new Key(), 'Attribute Key.')
|
||||
->param('onDelete', null, new WhiteList([Database::RELATION_MUTATE_CASCADE, Database::RELATION_MUTATE_RESTRICT, Database::RELATION_MUTATE_SET_NULL], true), 'Constraints option', true)
|
||||
->param('newKey', null, new Key(), 'New attribute key.', true)
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForEvents')
|
||||
|
|
@ -2251,6 +2297,7 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/:key/
|
|||
string $collectionId,
|
||||
string $key,
|
||||
?string $onDelete,
|
||||
?string $newKey,
|
||||
Response $response,
|
||||
Database $dbForProject,
|
||||
Event $queueForEvents
|
||||
|
|
@ -2265,7 +2312,8 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/attributes/:key/
|
|||
required: false,
|
||||
options: [
|
||||
'onDelete' => $onDelete
|
||||
]
|
||||
],
|
||||
newKey: $newKey
|
||||
);
|
||||
|
||||
$options = $attribute->getAttribute('options', []);
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@ use Appwrite\Event\Validator\FunctionEvent;
|
|||
use Appwrite\Extend\Exception;
|
||||
use Appwrite\Extend\Exception as AppwriteException;
|
||||
use Appwrite\Functions\Validator\Headers;
|
||||
use Appwrite\Functions\Validator\Payload;
|
||||
use Appwrite\Functions\Validator\RuntimeSpecification;
|
||||
use Appwrite\Messaging\Adapter\Realtime;
|
||||
use Appwrite\Platform\Tasks\ScheduleExecutions;
|
||||
|
|
@ -1717,7 +1716,7 @@ App::post('/v1/functions/:functionId/executions')
|
|||
->label('sdk.response.model', Response::MODEL_EXECUTION)
|
||||
->label('sdk.request.type', Response::CONTENT_TYPE_JSON)
|
||||
->param('functionId', '', new UID(), 'Function ID.')
|
||||
->param('body', '', new Payload(10485760, 0), 'HTTP body of execution. Default value is empty string.', true)
|
||||
->param('body', '', new Text(10485760, 0), 'HTTP body of execution. Default value is empty string.', true)
|
||||
->param('async', false, new Boolean(), 'Execute code in the background. Default value is false.', true)
|
||||
->param('path', '/', new Text(2048), 'HTTP path of execution. Path can include query params. Default value is /', true)
|
||||
->param('method', 'POST', new Whitelist(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], true), 'HTTP method of execution. Default value is GET.', true)
|
||||
|
|
|
|||
|
|
@ -11,7 +11,8 @@ const result = await databases.updateBooleanAttribute(
|
|||
'<COLLECTION_ID>', // collectionId
|
||||
'', // key
|
||||
false, // required
|
||||
false // default
|
||||
false, // default
|
||||
'' // newKey (optional)
|
||||
);
|
||||
|
||||
console.log(result);
|
||||
|
|
|
|||
|
|
@ -11,7 +11,8 @@ const result = await databases.updateDatetimeAttribute(
|
|||
'<COLLECTION_ID>', // collectionId
|
||||
'', // key
|
||||
false, // required
|
||||
'' // default
|
||||
'', // default
|
||||
'' // newKey (optional)
|
||||
);
|
||||
|
||||
console.log(result);
|
||||
|
|
|
|||
|
|
@ -11,7 +11,8 @@ const result = await databases.updateEmailAttribute(
|
|||
'<COLLECTION_ID>', // collectionId
|
||||
'', // key
|
||||
false, // required
|
||||
'email@example.com' // default
|
||||
'email@example.com', // default
|
||||
'' // newKey (optional)
|
||||
);
|
||||
|
||||
console.log(result);
|
||||
|
|
|
|||
|
|
@ -12,7 +12,8 @@ const result = await databases.updateEnumAttribute(
|
|||
'', // key
|
||||
[], // elements
|
||||
false, // required
|
||||
'<DEFAULT>' // default
|
||||
'<DEFAULT>', // default
|
||||
'' // newKey (optional)
|
||||
);
|
||||
|
||||
console.log(result);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@ const result = await databases.updateFloatAttribute(
|
|||
false, // required
|
||||
null, // min
|
||||
null, // max
|
||||
null // default
|
||||
null, // default
|
||||
'' // newKey (optional)
|
||||
);
|
||||
|
||||
console.log(result);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,8 @@ const result = await databases.updateIntegerAttribute(
|
|||
false, // required
|
||||
null, // min
|
||||
null, // max
|
||||
null // default
|
||||
null, // default
|
||||
'' // newKey (optional)
|
||||
);
|
||||
|
||||
console.log(result);
|
||||
|
|
|
|||
|
|
@ -11,7 +11,8 @@ const result = await databases.updateIpAttribute(
|
|||
'<COLLECTION_ID>', // collectionId
|
||||
'', // key
|
||||
false, // required
|
||||
'' // default
|
||||
'', // default
|
||||
'' // newKey (optional)
|
||||
);
|
||||
|
||||
console.log(result);
|
||||
|
|
|
|||
|
|
@ -10,7 +10,8 @@ const result = await databases.updateRelationshipAttribute(
|
|||
'<DATABASE_ID>', // databaseId
|
||||
'<COLLECTION_ID>', // collectionId
|
||||
'', // key
|
||||
RelationMutate.Cascade // onDelete (optional)
|
||||
RelationMutate.Cascade, // onDelete (optional)
|
||||
'' // newKey (optional)
|
||||
);
|
||||
|
||||
console.log(result);
|
||||
|
|
|
|||
|
|
@ -11,7 +11,9 @@ const result = await databases.updateStringAttribute(
|
|||
'<COLLECTION_ID>', // collectionId
|
||||
'', // key
|
||||
false, // required
|
||||
'<DEFAULT>' // default
|
||||
'<DEFAULT>', // default
|
||||
null, // size (optional)
|
||||
'' // newKey (optional)
|
||||
);
|
||||
|
||||
console.log(result);
|
||||
|
|
|
|||
|
|
@ -11,7 +11,8 @@ const result = await databases.updateUrlAttribute(
|
|||
'<COLLECTION_ID>', // collectionId
|
||||
'', // key
|
||||
false, // required
|
||||
'https://example.com' // default
|
||||
'https://example.com', // default
|
||||
'' // newKey (optional)
|
||||
);
|
||||
|
||||
console.log(result);
|
||||
|
|
|
|||
|
|
@ -640,7 +640,7 @@ class DatabasesCustomServerTest extends Scope
|
|||
}
|
||||
|
||||
/**
|
||||
* @depends testListCollections
|
||||
* @depends testListCollections
|
||||
*/
|
||||
public function testCreateEncryptedAttribute(array $data): void
|
||||
{
|
||||
|
|
@ -866,7 +866,7 @@ class DatabasesCustomServerTest extends Scope
|
|||
$this->assertEquals($collection['body']['indexes'][0]['key'], $index['body']['key']);
|
||||
|
||||
// Delete attribute
|
||||
$attribute = $this->client->call(Client::METHOD_DELETE, '/databases/' . $databaseId . '/collections/' . $actors ['body']['$id'] . '/attributes/' . $unneededId, array_merge([
|
||||
$attribute = $this->client->call(Client::METHOD_DELETE, '/databases/' . $databaseId . '/collections/' . $actors['body']['$id'] . '/attributes/' . $unneededId, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
|
|
@ -1646,7 +1646,6 @@ class DatabasesCustomServerTest extends Scope
|
|||
];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @depends testAttributeUpdate
|
||||
*/
|
||||
|
|
@ -3511,4 +3510,608 @@ class DatabasesCustomServerTest extends Scope
|
|||
$this->assertEquals(AppwriteException::ATTRIBUTE_NOT_FOUND, $update['body']['type']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testAttributeUpdate
|
||||
*/
|
||||
public function testAttributeRename(array $data)
|
||||
{
|
||||
$key = 'string';
|
||||
$databaseId = $data['databaseId'];
|
||||
$collectionId = $data['collectionId'];
|
||||
|
||||
// Create document to test against
|
||||
$document = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/databases/' . $databaseId . '/collections/' . $collectionId . '/documents',
|
||||
array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]),
|
||||
[
|
||||
'documentId' => 'unique()',
|
||||
'data' => [
|
||||
'string' => 'string'
|
||||
],
|
||||
"permissions" => ["read(\"any\")"]
|
||||
]
|
||||
);
|
||||
|
||||
$this->assertEquals(201, $document['headers']['status-code']);
|
||||
|
||||
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string/' . $key, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'required' => false,
|
||||
'default' => 'lorum',
|
||||
'newKey' => 'new_string',
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $update['headers']['status-code']);
|
||||
|
||||
$key = 'new_string';
|
||||
|
||||
$new = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/' . $key, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]));
|
||||
|
||||
$this->assertEquals('new_string', $new['body']['key']);
|
||||
|
||||
$doc1 = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents/' . $document['body']['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]));
|
||||
|
||||
$this->assertArrayHasKey('new_string', $doc1['body']);
|
||||
$this->assertEquals('string', $doc1['body']['new_string']);
|
||||
$this->assertArrayNotHasKey('string', $doc1['body']);
|
||||
|
||||
// Try and create a new document with the new attribute
|
||||
$doc2 = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/databases/' . $databaseId . '/collections/' . $collectionId . '/documents',
|
||||
array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]),
|
||||
[
|
||||
'documentId' => 'unique()',
|
||||
'data' => [
|
||||
'new_string' => 'string'
|
||||
],
|
||||
"permissions" => ["read(\"any\")"]
|
||||
]
|
||||
);
|
||||
|
||||
$this->assertEquals(201, $doc2['headers']['status-code']);
|
||||
$this->assertArrayHasKey('new_string', $doc2['body']);
|
||||
$this->assertEquals('string', $doc2['body']['new_string']);
|
||||
|
||||
// Expect fail, try and create a new document with the old attribute
|
||||
$doc3 = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/databases/' . $databaseId . '/collections/' . $collectionId . '/documents',
|
||||
array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]),
|
||||
[
|
||||
'documentId' => 'unique()',
|
||||
'data' => [
|
||||
'string' => 'string'
|
||||
],
|
||||
"permissions" => ["read(\"any\")"]
|
||||
]
|
||||
);
|
||||
|
||||
$this->assertEquals(400, $doc3['headers']['status-code']);
|
||||
}
|
||||
|
||||
public function createRelationshipCollections()
|
||||
{
|
||||
// Prepare the database with collections and relationships
|
||||
$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' => 'database1',
|
||||
'name' => 'Test Database'
|
||||
]);
|
||||
|
||||
$databaseId = $database['body']['$id'];
|
||||
|
||||
$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' => 'collection1',
|
||||
'name' => 'level1',
|
||||
'documentSecurity' => false,
|
||||
'permissions' => [
|
||||
Permission::create(Role::user($this->getUser()['$id'])),
|
||||
Permission::read(Role::user($this->getUser()['$id'])),
|
||||
Permission::update(Role::user($this->getUser()['$id'])),
|
||||
Permission::delete(Role::user($this->getUser()['$id'])),
|
||||
]
|
||||
]);
|
||||
|
||||
$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' => 'collection2',
|
||||
'name' => 'level2',
|
||||
'documentSecurity' => false,
|
||||
'permissions' => [
|
||||
Permission::create(Role::user($this->getUser()['$id'])),
|
||||
Permission::read(Role::user($this->getUser()['$id'])),
|
||||
Permission::update(Role::user($this->getUser()['$id'])),
|
||||
Permission::delete(Role::user($this->getUser()['$id'])),
|
||||
]
|
||||
]);
|
||||
|
||||
\sleep(2);
|
||||
}
|
||||
|
||||
public function cleanupRelationshipCollection()
|
||||
{
|
||||
$this->client->call(Client::METHOD_DELETE, '/databases/database1', [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
\sleep(2);
|
||||
}
|
||||
|
||||
public function testAttributeRenameRelationshipOneToMany()
|
||||
{
|
||||
$databaseId = 'database1';
|
||||
$collection1Id = 'collection1';
|
||||
$collection2Id = 'collection2';
|
||||
|
||||
$this->createRelationshipCollections();
|
||||
|
||||
$relation = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/relationship', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'relatedCollectionId' => $collection2Id,
|
||||
'type' => 'oneToMany',
|
||||
'twoWay' => true,
|
||||
'onDelete' => 'cascade',
|
||||
'key' => 'level2',
|
||||
'twoWayKey' => 'level1'
|
||||
]);
|
||||
|
||||
\sleep(3);
|
||||
|
||||
$collection1Attributes = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection1Id, [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
$collection1RelationAttribute = $collection1Attributes['body']['attributes'][0];
|
||||
|
||||
$this->assertEquals($relation['body']['side'], $collection1RelationAttribute['side']);
|
||||
$this->assertEquals($relation['body']['twoWayKey'], $collection1RelationAttribute['twoWayKey']);
|
||||
$this->assertEquals($relation['body']['relatedCollection'], $collection1RelationAttribute['relatedCollection']);
|
||||
|
||||
// Create a document for checking later
|
||||
$originalDocument = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'documentId' => 'unique()',
|
||||
'data' => [
|
||||
'level2' => [[
|
||||
'$id' => 'unique()',
|
||||
'$permissions' => ["read(\"any\")"]
|
||||
]],
|
||||
],
|
||||
"permissions" => ["read(\"any\")"]
|
||||
]);
|
||||
|
||||
$this->assertEquals(201, $originalDocument['headers']['status-code']);
|
||||
|
||||
// Rename the attribute
|
||||
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/level2' . '/relationship', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'newKey' => 'new_level_2'
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $update['headers']['status-code']);
|
||||
|
||||
// Check the document's key has been renamed
|
||||
$newDocument = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents/' . $originalDocument['body']['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]));
|
||||
|
||||
$this->assertArrayHasKey('new_level_2', $newDocument['body']);
|
||||
$this->assertEquals(1, count($newDocument['body']['new_level_2']));
|
||||
$this->assertArrayNotHasKey('level2', $newDocument['body']);
|
||||
|
||||
// Check level2 document has been renamed
|
||||
$level2Document = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection2Id . '/documents/' . $newDocument['body']['new_level_2'][0]['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]));
|
||||
|
||||
$this->assertArrayHasKey('level1', $level2Document['body']);
|
||||
$this->assertNotEmpty($level2Document['body']['level1']);
|
||||
|
||||
// Check if attribute was renamed on the parent's side
|
||||
$collection1Attributes = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection1Id, [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $collection1Attributes['headers']['status-code']);
|
||||
$this->assertEquals(1, count($collection1Attributes['body']['attributes']));
|
||||
$this->assertEquals('new_level_2', $collection1Attributes['body']['attributes'][0]['key']);
|
||||
|
||||
// Check if attribute was renamed on the child's side
|
||||
$collection2Attributes = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection2Id, [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $collection2Attributes['headers']['status-code']);
|
||||
$this->assertEquals(1, count($collection2Attributes['body']['attributes']));
|
||||
$this->assertEquals('new_level_2', $collection2Attributes['body']['attributes'][0]['twoWayKey']);
|
||||
|
||||
$this->cleanupRelationshipCollection();
|
||||
}
|
||||
|
||||
public function testAttributeRenameRelationshipOneToOne()
|
||||
{
|
||||
$databaseId = 'database1';
|
||||
$collection1Id = 'collection1';
|
||||
$collection2Id = 'collection2';
|
||||
|
||||
$this->createRelationshipCollections();
|
||||
|
||||
$relation = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/relationship', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'relatedCollectionId' => $collection2Id,
|
||||
'type' => 'oneToOne',
|
||||
'twoWay' => true,
|
||||
'onDelete' => 'cascade',
|
||||
'key' => 'level2',
|
||||
'twoWayKey' => 'level1'
|
||||
]);
|
||||
|
||||
\sleep(3);
|
||||
|
||||
$collection1Attributes = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection1Id, [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
$collection1RelationAttribute = $collection1Attributes['body']['attributes'][0];
|
||||
|
||||
$this->assertEquals($relation['body']['side'], $collection1RelationAttribute['side']);
|
||||
$this->assertEquals($relation['body']['twoWayKey'], $collection1RelationAttribute['twoWayKey']);
|
||||
$this->assertEquals($relation['body']['relatedCollection'], $collection1RelationAttribute['relatedCollection']);
|
||||
|
||||
// Create a document for checking later
|
||||
$originalDocument = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'documentId' => 'unique()',
|
||||
'data' => [
|
||||
'level2' => [
|
||||
'$id' => 'unique()',
|
||||
'$permissions' => ["read(\"any\")"]
|
||||
],
|
||||
],
|
||||
"permissions" => ["read(\"any\")"]
|
||||
]);
|
||||
|
||||
$this->assertEquals(201, $originalDocument['headers']['status-code']);
|
||||
|
||||
// Rename the attribute
|
||||
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/level2' . '/relationship', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'newKey' => 'new_level_2'
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $update['headers']['status-code']);
|
||||
|
||||
// Check the document's key has been renamed
|
||||
$newDocument = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents/' . $originalDocument['body']['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]));
|
||||
|
||||
$this->assertArrayHasKey('new_level_2', $newDocument['body']);
|
||||
$this->assertNotEmpty($newDocument['body']['new_level_2']);
|
||||
$this->assertArrayNotHasKey('level2', $newDocument['body']);
|
||||
|
||||
// Check level2 document has been renamed
|
||||
$level2Document = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection2Id . '/documents/' . $newDocument['body']['new_level_2']['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]));
|
||||
|
||||
$this->assertArrayHasKey('level1', $level2Document['body']);
|
||||
$this->assertNotEmpty($level2Document['body']['level1']);
|
||||
|
||||
// Check if attribute was renamed on the parent's side
|
||||
$collection1Attributes = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection1Id, [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $collection1Attributes['headers']['status-code']);
|
||||
$this->assertEquals(1, count($collection1Attributes['body']['attributes']));
|
||||
$this->assertEquals('new_level_2', $collection1Attributes['body']['attributes'][0]['key']);
|
||||
|
||||
// Check if attribute was renamed on the child's side
|
||||
$collection2Attributes = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection2Id, [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $collection2Attributes['headers']['status-code']);
|
||||
$this->assertEquals(1, count($collection2Attributes['body']['attributes']));
|
||||
$this->assertEquals('new_level_2', $collection2Attributes['body']['attributes'][0]['twoWayKey']);
|
||||
|
||||
$this->cleanupRelationshipCollection();
|
||||
}
|
||||
|
||||
public function testAttributeRenameRelationshipManyToOne()
|
||||
{
|
||||
$databaseId = 'database1';
|
||||
$collection1Id = 'collection1';
|
||||
$collection2Id = 'collection2';
|
||||
|
||||
$this->createRelationshipCollections();
|
||||
|
||||
$relation = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/relationship', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'relatedCollectionId' => $collection2Id,
|
||||
'type' => 'manyToOne',
|
||||
'twoWay' => true,
|
||||
'onDelete' => 'cascade',
|
||||
'key' => 'level2',
|
||||
'twoWayKey' => 'level1'
|
||||
]);
|
||||
|
||||
\sleep(3);
|
||||
|
||||
$collection1Attributes = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection1Id, [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
$collection1RelationAttribute = $collection1Attributes['body']['attributes'][0];
|
||||
|
||||
$this->assertEquals($relation['body']['side'], $collection1RelationAttribute['side']);
|
||||
$this->assertEquals($relation['body']['twoWayKey'], $collection1RelationAttribute['twoWayKey']);
|
||||
$this->assertEquals($relation['body']['relatedCollection'], $collection1RelationAttribute['relatedCollection']);
|
||||
|
||||
// Create a document for checking later
|
||||
$originalDocument = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'documentId' => 'unique()',
|
||||
'data' => [
|
||||
'level2' => [
|
||||
'$id' => 'unique()',
|
||||
'$permissions' => ["read(\"any\")"]
|
||||
],
|
||||
],
|
||||
"permissions" => ["read(\"any\")"]
|
||||
]);
|
||||
|
||||
$this->assertEquals(201, $originalDocument['headers']['status-code']);
|
||||
|
||||
// Rename the attribute
|
||||
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/level2' . '/relationship', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'newKey' => 'new_level_2'
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $update['headers']['status-code']);
|
||||
|
||||
// Check the document's key has been renamed
|
||||
$newDocument = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents/' . $originalDocument['body']['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]));
|
||||
|
||||
$this->assertArrayHasKey('new_level_2', $newDocument['body']);
|
||||
$this->assertNotEmpty($newDocument['body']['new_level_2']);
|
||||
$this->assertArrayNotHasKey('level2', $newDocument['body']);
|
||||
|
||||
// Check level2 document has been renamed
|
||||
$level2Document = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection2Id . '/documents/' . $newDocument['body']['new_level_2']['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]));
|
||||
|
||||
$this->assertArrayHasKey('level1', $level2Document['body']);
|
||||
$this->assertNotEmpty($level2Document['body']['level1']);
|
||||
|
||||
// Check if attribute was renamed on the parent's side
|
||||
$collection1Attributes = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection1Id, [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $collection1Attributes['headers']['status-code']);
|
||||
$this->assertEquals(1, count($collection1Attributes['body']['attributes']));
|
||||
$this->assertEquals('new_level_2', $collection1Attributes['body']['attributes'][0]['key']);
|
||||
|
||||
// Check if attribute was renamed on the child's side
|
||||
$collection2Attributes = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection2Id, [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $collection2Attributes['headers']['status-code']);
|
||||
$this->assertEquals(1, count($collection2Attributes['body']['attributes']));
|
||||
$this->assertEquals('new_level_2', $collection2Attributes['body']['attributes'][0]['twoWayKey']);
|
||||
|
||||
$this->cleanupRelationshipCollection();
|
||||
}
|
||||
|
||||
public function testAttributeRenameRelationshipManyToMany()
|
||||
{
|
||||
$databaseId = 'database1';
|
||||
$collection1Id = 'collection1';
|
||||
$collection2Id = 'collection2';
|
||||
|
||||
$this->createRelationshipCollections();
|
||||
|
||||
$relation = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/relationship', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'relatedCollectionId' => $collection2Id,
|
||||
'type' => 'manyToOne',
|
||||
'twoWay' => true,
|
||||
'onDelete' => 'cascade',
|
||||
'key' => 'level2',
|
||||
'twoWayKey' => 'level1'
|
||||
]);
|
||||
|
||||
\sleep(3);
|
||||
|
||||
$collection1Attributes = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection1Id, [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
$collection1RelationAttribute = $collection1Attributes['body']['attributes'][0];
|
||||
|
||||
$this->assertEquals($relation['body']['side'], $collection1RelationAttribute['side']);
|
||||
$this->assertEquals($relation['body']['twoWayKey'], $collection1RelationAttribute['twoWayKey']);
|
||||
$this->assertEquals($relation['body']['relatedCollection'], $collection1RelationAttribute['relatedCollection']);
|
||||
|
||||
// Create a document for checking later
|
||||
$originalDocument = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'documentId' => 'unique()',
|
||||
'data' => [
|
||||
'level2' => [
|
||||
'$id' => 'unique()',
|
||||
'$permissions' => ["read(\"any\")"]
|
||||
],
|
||||
],
|
||||
"permissions" => ["read(\"any\")"]
|
||||
]);
|
||||
|
||||
$this->assertEquals(201, $originalDocument['headers']['status-code']);
|
||||
|
||||
// Rename the attribute
|
||||
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/attributes/level2' . '/relationship', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'newKey' => 'new_level_2'
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $update['headers']['status-code']);
|
||||
|
||||
// Check the document's key has been renamed
|
||||
$newDocument = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection1Id . '/documents/' . $originalDocument['body']['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]));
|
||||
|
||||
$this->assertArrayHasKey('new_level_2', $newDocument['body']);
|
||||
$this->assertNotEmpty($newDocument['body']['new_level_2']);
|
||||
$this->assertArrayNotHasKey('level2', $newDocument['body']);
|
||||
|
||||
// Check level2 document has been renamed
|
||||
$level2Document = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection2Id . '/documents/' . $newDocument['body']['new_level_2']['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]));
|
||||
|
||||
$this->assertArrayHasKey('level1', $level2Document['body']);
|
||||
$this->assertNotEmpty($level2Document['body']['level1']);
|
||||
|
||||
// Check if attribute was renamed on the parent's side
|
||||
$collection1Attributes = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection1Id, [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $collection1Attributes['headers']['status-code']);
|
||||
$this->assertEquals(1, count($collection1Attributes['body']['attributes']));
|
||||
$this->assertEquals('new_level_2', $collection1Attributes['body']['attributes'][0]['key']);
|
||||
|
||||
// Check if attribute was renamed on the child's side
|
||||
$collection2Attributes = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collection2Id, [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $collection2Attributes['headers']['status-code']);
|
||||
$this->assertEquals(1, count($collection2Attributes['body']['attributes']));
|
||||
$this->assertEquals('new_level_2', $collection2Attributes['body']['attributes'][0]['twoWayKey']);
|
||||
|
||||
$this->cleanupRelationshipCollection();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue