Merge pull request #9728 from appwrite/update-exceptions

Update Exceptions
This commit is contained in:
Darshan 2025-05-07 11:31:49 +05:30 committed by GitHub
commit 28a74e664d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
31 changed files with 287 additions and 125 deletions

View file

@ -71,7 +71,7 @@ return [
],
Exception::GENERAL_QUERY_LIMIT_EXCEEDED => [
'name' => Exception::GENERAL_QUERY_LIMIT_EXCEEDED,
'description' => 'Query limit exceeded for the current attribute. Usage of more than 100 query values on a single attribute is prohibited.',
'description' => 'Query limit exceeded for the current attribute/column. Usage of more than 100 query values on a single column is prohibited.',
'code' => 400,
],
Exception::GENERAL_QUERY_INVALID => [
@ -653,7 +653,7 @@ return [
],
Exception::DATABASE_QUERY_ORDER_NULL => [
'name' => Exception::DATABASE_QUERY_ORDER_NULL,
'description' => 'The order attribute had a null value. Cursor pagination requires all documents order attribute values are non-null.',
'description' => 'The order attribute/column had a null value. Cursor pagination requires all documents/rows order attribute/column values are non-null.',
'code' => 400,
],
@ -674,6 +674,23 @@ return [
'code' => 400,
],
/** Tables */
Exception::TABLE_NOT_FOUND => [
'name' => Exception::TABLE_NOT_FOUND,
'description' => 'Table with the requested ID could not be found.',
'code' => 404,
],
Exception::TABLE_ALREADY_EXISTS => [
'name' => Exception::TABLE_ALREADY_EXISTS,
'description' => 'A table with the requested ID already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
'code' => 409,
],
Exception::TABLE_LIMIT_EXCEEDED => [
'name' => Exception::TABLE_LIMIT_EXCEEDED,
'description' => 'The maximum number of tables has been reached.',
'code' => 400,
],
/** Documents */
Exception::DOCUMENT_NOT_FOUND => [
'name' => Exception::DOCUMENT_NOT_FOUND,
@ -711,6 +728,43 @@ return [
'code' => 403,
],
/** Rows */
Exception::ROW_NOT_FOUND => [
'name' => Exception::ROW_NOT_FOUND,
'description' => 'Row with the requested ID could not be found.',
'code' => 404,
],
Exception::ROW_INVALID_STRUCTURE => [
'name' => Exception::ROW_INVALID_STRUCTURE,
'description' => 'The row structure is invalid. Please ensure the columns match the table definition.',
'code' => 400,
],
Exception::ROW_MISSING_DATA => [
'name' => Exception::ROW_MISSING_DATA,
'description' => 'The row data is missing. Try again with row data populated',
'code' => 400,
],
Exception::ROW_MISSING_PAYLOAD => [
'name' => Exception::ROW_MISSING_PAYLOAD,
'description' => 'The row data and permissions are missing. You must provide either row data or permissions to be updated.',
'code' => 400,
],
Exception::ROW_ALREADY_EXISTS => [
'name' => Exception::ROW_ALREADY_EXISTS,
'description' => 'Row with the requested ID already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
'code' => 409,
],
Exception::ROW_UPDATE_CONFLICT => [
'name' => Exception::ROW_UPDATE_CONFLICT,
'description' => 'Remote row is newer than local.',
'code' => 409,
],
Exception::ROW_DELETE_RESTRICTED => [
'name' => Exception::ROW_DELETE_RESTRICTED,
'description' => 'Row cannot be deleted because it is referenced by another row.',
'code' => 403,
],
/** Attributes */
Exception::ATTRIBUTE_NOT_FOUND => [
'name' => Exception::ATTRIBUTE_NOT_FOUND,
@ -757,13 +811,67 @@ return [
'description' => 'The attribute type is invalid.',
'code' => 400,
],
Exception::ATTRIBUTE_INVALID_RESIZE => [
'name' => Exception::ATTRIBUTE_INVALID_RESIZE,
'description' => "Existing data is too large for new size, truncate your existing data then try again.",
'code' => 400,
],
/** Exists for both Attributes & Columns */
Exception::RELATIONSHIP_VALUE_INVALID => [
'name' => Exception::RELATIONSHIP_VALUE_INVALID,
'description' => 'The relationship value is invalid.',
'code' => 400,
],
Exception::ATTRIBUTE_INVALID_RESIZE => [
'name' => Exception::ATTRIBUTE_INVALID_RESIZE,
/** Columns */
Exception::COLUMN_NOT_FOUND => [
'name' => Exception::COLUMN_NOT_FOUND,
'description' => 'Column with the requested ID could not be found.',
'code' => 404,
],
Exception::COLUMN_UNKNOWN => [
'name' => Exception::COLUMN_UNKNOWN,
'description' => 'The column required for the index could not be found. Please confirm all your columns are in the available state.',
'code' => 400,
],
Exception::COLUMN_NOT_AVAILABLE => [
'name' => Exception::COLUMN_NOT_AVAILABLE,
'description' => 'The requested column is not yet available. Please try again later.',
'code' => 400,
],
Exception::COLUMN_FORMAT_UNSUPPORTED => [
'name' => Exception::COLUMN_FORMAT_UNSUPPORTED,
'description' => 'The requested column format is not supported.',
'code' => 400,
],
Exception::COLUMN_DEFAULT_UNSUPPORTED => [
'name' => Exception::COLUMN_DEFAULT_UNSUPPORTED,
'description' => 'Default values cannot be set for array or required columns.',
'code' => 400,
],
Exception::COLUMN_ALREADY_EXISTS => [
'name' => Exception::COLUMN_ALREADY_EXISTS,
'description' => 'Column with the requested key already exists. Column keys must be unique, try again with a different key.',
'code' => 409,
],
Exception::COLUMN_LIMIT_EXCEEDED => [
'name' => Exception::COLUMN_LIMIT_EXCEEDED,
'description' => 'The maximum number or size of columns for this table has been reached.',
'code' => 400,
],
Exception::COLUMN_VALUE_INVALID => [
'name' => Exception::COLUMN_VALUE_INVALID,
'description' => 'The column value is invalid. Please check the type, range and value of the column.',
'code' => 400,
],
Exception::COLUMN_TYPE_INVALID => [
'name' => Exception::COLUMN_TYPE_INVALID,
'description' => 'The column type is invalid.',
'code' => 400,
],
Exception::COLUMN_INVALID_RESIZE => [
'name' => Exception::COLUMN_INVALID_RESIZE,
'description' => "Existing data is too large for new size, truncate your existing data then try again.",
'code' => 400,
],

View file

@ -1148,6 +1148,9 @@ App::error()
Console::error('[Error] Line: ' . $line);
}
// routes like /tables, /tables/:tableId, etc.
$isTablesAPI = str_contains($route->getPath(), '/databases/:databaseId/tables');
switch ($class) {
case 'Utopia\Exception':
$error = new AppwriteException(AppwriteException::GENERAL_UNKNOWN, $message, $code, $error);
@ -1161,7 +1164,12 @@ App::error()
}
break;
case 'Utopia\Database\Exception\Conflict':
$error = new AppwriteException(AppwriteException::DOCUMENT_UPDATE_CONFLICT, previous: $error);
$error = new AppwriteException(
$isTablesAPI
? AppwriteException::ROW_UPDATE_CONFLICT
: AppwriteException::DOCUMENT_UPDATE_CONFLICT,
previous: $error
);
break;
case 'Utopia\Database\Exception\Timeout':
$error = new AppwriteException(AppwriteException::DATABASE_TIMEOUT, previous: $error);
@ -1170,13 +1178,27 @@ App::error()
$error = new AppwriteException(AppwriteException::GENERAL_QUERY_INVALID, $error->getMessage(), previous: $error);
break;
case 'Utopia\Database\Exception\Structure':
$error = new AppwriteException(AppwriteException::DOCUMENT_INVALID_STRUCTURE, $error->getMessage(), previous: $error);
$error = new AppwriteException(
$isTablesAPI
? AppwriteException::ROW_INVALID_STRUCTURE
: AppwriteException::DOCUMENT_INVALID_STRUCTURE,
$error->getMessage(),
previous: $error
);
break;
case 'Utopia\Database\Exception\Duplicate':
$error = new AppwriteException(AppwriteException::DOCUMENT_ALREADY_EXISTS);
$error = new AppwriteException(
$isTablesAPI
? AppwriteException::ROW_ALREADY_EXISTS
: AppwriteException::DOCUMENT_ALREADY_EXISTS
);
break;
case 'Utopia\Database\Exception\Restricted':
$error = new AppwriteException(AppwriteException::DOCUMENT_DELETE_RESTRICTED);
$error = new AppwriteException(
$isTablesAPI
? AppwriteException::ROW_DELETE_RESTRICTED
: AppwriteException::DOCUMENT_DELETE_RESTRICTED
);
break;
case 'Utopia\Database\Exception\Authorization':
$error = new AppwriteException(AppwriteException::USER_UNAUTHORIZED);
@ -1185,7 +1207,13 @@ App::error()
$error = new AppwriteException(AppwriteException::RELATIONSHIP_VALUE_INVALID, $error->getMessage(), previous: $error);
break;
case 'Utopia\Database\Exception\NotFound':
$error = new AppwriteException(AppwriteException::COLLECTION_NOT_FOUND, $error->getMessage(), previous: $error);
$error = new AppwriteException(
$isTablesAPI
? AppwriteException::TABLE_NOT_FOUND
: AppwriteException::COLLECTION_NOT_FOUND,
$error->getMessage(),
previous: $error
);
break;
case 'Utopia\Database\Exception\Dependency':
$error = new AppwriteException(AppwriteException::INDEX_DEPENDENCY, null, previous: $error);

View file

@ -196,6 +196,11 @@ class Exception extends \Exception
public const COLLECTION_ALREADY_EXISTS = 'collection_already_exists';
public const COLLECTION_LIMIT_EXCEEDED = 'collection_limit_exceeded';
/** Tables */
public const TABLE_NOT_FOUND = 'table_not_found';
public const TABLE_ALREADY_EXISTS = 'table_already_exists';
public const TABLE_LIMIT_EXCEEDED = 'table_limit_exceeded';
/** Documents */
public const DOCUMENT_NOT_FOUND = 'document_not_found';
public const DOCUMENT_INVALID_STRUCTURE = 'document_invalid_structure';
@ -205,7 +210,16 @@ class Exception extends \Exception
public const DOCUMENT_UPDATE_CONFLICT = 'document_update_conflict';
public const DOCUMENT_DELETE_RESTRICTED = 'document_delete_restricted';
/** Attribute */
/** Rows */
public const ROW_NOT_FOUND = 'row_not_found';
public const ROW_INVALID_STRUCTURE = 'row_invalid_structure';
public const ROW_MISSING_DATA = 'row_missing_data';
public const ROW_MISSING_PAYLOAD = 'row_missing_payload';
public const ROW_ALREADY_EXISTS = 'row_already_exists';
public const ROW_UPDATE_CONFLICT = 'row_update_conflict';
public const ROW_DELETE_RESTRICTED = 'row_delete_restricted';
/** Attributes */
public const ATTRIBUTE_NOT_FOUND = 'attribute_not_found';
public const ATTRIBUTE_UNKNOWN = 'attribute_unknown';
public const ATTRIBUTE_NOT_AVAILABLE = 'attribute_not_available';
@ -217,6 +231,18 @@ class Exception extends \Exception
public const ATTRIBUTE_TYPE_INVALID = 'attribute_type_invalid';
public const ATTRIBUTE_INVALID_RESIZE = 'attribute_invalid_resize';
/** Columns */
public const COLUMN_NOT_FOUND = 'column_not_found';
public const COLUMN_UNKNOWN = 'column_unknown';
public const COLUMN_NOT_AVAILABLE = 'column_not_available';
public const COLUMN_FORMAT_UNSUPPORTED = 'column_format_unsupported';
public const COLUMN_DEFAULT_UNSUPPORTED = 'column_default_unsupported';
public const COLUMN_ALREADY_EXISTS = 'column_already_exists';
public const COLUMN_LIMIT_EXCEEDED = 'column_limit_exceeded';
public const COLUMN_VALUE_INVALID = 'column_value_invalid';
public const COLUMN_TYPE_INVALID = 'column_type_invalid';
public const COLUMN_INVALID_RESIZE = 'column_invalid_resize';
/** Relationship */
public const RELATIONSHIP_VALUE_INVALID = 'relationship_value_invalid';

View file

@ -78,29 +78,29 @@ class Action extends UtopiaAction
$table = $dbForProject->getDocument('database_' . $db->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
if (!empty($format)) {
if (!Structure::hasFormat($format, $type)) {
throw new Exception(Exception::ATTRIBUTE_FORMAT_UNSUPPORTED, "Format {$format} not available for {$type} columns.");
throw new Exception(Exception::COLUMN_FORMAT_UNSUPPORTED, "Format {$format} not available for {$type} columns.");
}
}
// Must throw here since dbForProject->createAttribute is performed by db worker
if ($required && isset($default)) {
throw new Exception(Exception::ATTRIBUTE_DEFAULT_UNSUPPORTED, 'Cannot set default value for required column');
throw new Exception(Exception::COLUMN_DEFAULT_UNSUPPORTED, 'Cannot set default value for required column');
}
if ($array && isset($default)) {
throw new Exception(Exception::ATTRIBUTE_DEFAULT_UNSUPPORTED, 'Cannot set default value for array columns');
throw new Exception(Exception::COLUMN_DEFAULT_UNSUPPORTED, 'Cannot set default value for array columns');
}
if ($type === Database::VAR_RELATIONSHIP) {
$options['side'] = Database::RELATION_SIDE_PARENT;
$relatedTable = $dbForProject->getDocument('database_' . $db->getInternalId(), $options['relatedCollection'] ?? '');
if ($relatedTable->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND, 'The related table was not found.');
throw new Exception(Exception::TABLE_NOT_FOUND, 'The related table was not found.');
}
}
@ -128,9 +128,9 @@ class Action extends UtopiaAction
$dbForProject->checkAttribute($table, $column);
$column = $dbForProject->createDocument('attributes', $column);
} catch (DuplicateException) {
throw new Exception(Exception::ATTRIBUTE_ALREADY_EXISTS);
throw new Exception(Exception::COLUMN_ALREADY_EXISTS);
} catch (LimitException) {
throw new Exception(Exception::ATTRIBUTE_LIMIT_EXCEEDED);
throw new Exception(Exception::COLUMN_LIMIT_EXCEEDED);
} catch (Throwable $e) {
$dbForProject->purgeCachedDocument('database_' . $db->getInternalId(), $tableId);
$dbForProject->purgeCachedCollection('database_' . $db->getInternalId() . '_collection_' . $table->getInternalId());
@ -171,10 +171,10 @@ class Action extends UtopiaAction
$dbForProject->createDocument('attributes', $twoWayAttribute);
} catch (DuplicateException) {
$dbForProject->deleteDocument('attributes', $column->getId());
throw new Exception(Exception::ATTRIBUTE_ALREADY_EXISTS);
throw new Exception(Exception::COLUMN_ALREADY_EXISTS);
} catch (LimitException) {
$dbForProject->deleteDocument('attributes', $column->getId());
throw new Exception(Exception::ATTRIBUTE_LIMIT_EXCEEDED);
throw new Exception(Exception::COLUMN_LIMIT_EXCEEDED);
} catch (Throwable $e) {
$dbForProject->purgeCachedDocument('database_' . $db->getInternalId(), $relatedTable->getId());
$dbForProject->purgeCachedCollection('database_' . $db->getInternalId() . '_collection_' . $relatedTable->getInternalId());
@ -229,33 +229,33 @@ class Action extends UtopiaAction
$table = $dbForProject->getDocument('database_' . $db->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$column = $dbForProject->getDocument('attributes', $db->getInternalId() . '_' . $table->getInternalId() . '_' . $key);
if ($column->isEmpty()) {
throw new Exception(Exception::ATTRIBUTE_NOT_FOUND);
throw new Exception(Exception::COLUMN_NOT_FOUND);
}
if ($column->getAttribute('status') !== 'available') {
throw new Exception(Exception::ATTRIBUTE_NOT_AVAILABLE);
throw new Exception(Exception::COLUMN_NOT_AVAILABLE);
}
if ($column->getAttribute(('type') !== $type)) {
throw new Exception(Exception::ATTRIBUTE_TYPE_INVALID);
throw new Exception(Exception::COLUMN_TYPE_INVALID);
}
if ($column->getAttribute('type') === Database::VAR_STRING && $column->getAttribute(('filter') !== $filter)) {
throw new Exception(Exception::ATTRIBUTE_TYPE_INVALID);
throw new Exception(Exception::COLUMN_TYPE_INVALID);
}
if ($required && isset($default)) {
throw new Exception(Exception::ATTRIBUTE_DEFAULT_UNSUPPORTED, 'Cannot set default value for required column');
throw new Exception(Exception::COLUMN_DEFAULT_UNSUPPORTED, 'Cannot set default value for required column');
}
if ($column->getAttribute('array', false) && isset($default)) {
throw new Exception(Exception::ATTRIBUTE_DEFAULT_UNSUPPORTED, 'Cannot set default value for array columns');
throw new Exception(Exception::COLUMN_DEFAULT_UNSUPPORTED, 'Cannot set default value for array columns');
}
$tableId = 'database_' . $db->getInternalId() . '_collection_' . $table->getInternalId();
@ -275,7 +275,7 @@ class Action extends UtopiaAction
$max ??= $column->getAttribute('formatOptions')['max'];
if ($min > $max) {
throw new Exception(Exception::ATTRIBUTE_VALUE_INVALID, 'Minimum value must be lesser than maximum value');
throw new Exception(Exception::COLUMN_VALUE_INVALID, 'Minimum value must be lesser than maximum value');
}
if ($column->getAttribute('format') === APP_DATABASE_ATTRIBUTE_INT_RANGE) {
@ -289,7 +289,7 @@ class Action extends UtopiaAction
}
if (!is_null($default) && !$validator->isValid($default)) {
throw new Exception(Exception::ATTRIBUTE_VALUE_INVALID, $validator->getDescription());
throw new Exception(Exception::COLUMN_VALUE_INVALID, $validator->getDescription());
}
$options = [
@ -301,17 +301,17 @@ class Action extends UtopiaAction
break;
case APP_DATABASE_ATTRIBUTE_ENUM:
if (empty($elements)) {
throw new Exception(Exception::ATTRIBUTE_VALUE_INVALID, 'Enum elements must not be empty');
throw new Exception(Exception::COLUMN_VALUE_INVALID, 'Enum elements must not be empty');
}
foreach ($elements as $element) {
if (\strlen($element) === 0) {
throw new Exception(Exception::ATTRIBUTE_VALUE_INVALID, 'Each enum element must not be empty');
throw new Exception(Exception::COLUMN_VALUE_INVALID, 'Each enum element must not be empty');
}
}
if (!is_null($default) && !in_array($default, $elements)) {
throw new Exception(Exception::ATTRIBUTE_VALUE_INVALID, 'Default value not found in elements');
throw new Exception(Exception::COLUMN_VALUE_INVALID, 'Default value not found in elements');
}
$options = [
@ -334,7 +334,7 @@ class Action extends UtopiaAction
onDelete: $primaryRowOptions['onDelete'],
);
} catch (NotFoundException) {
throw new Exception(Exception::ATTRIBUTE_NOT_FOUND);
throw new Exception(Exception::COLUMN_NOT_FOUND);
}
if ($primaryRowOptions['twoWay']) {
@ -364,11 +364,11 @@ class Action extends UtopiaAction
newKey: $newKey ?? null
);
} catch (TruncateException) {
throw new Exception(Exception::ATTRIBUTE_INVALID_RESIZE);
throw new Exception(Exception::COLUMN_INVALID_RESIZE);
} catch (NotFoundException) {
throw new Exception(Exception::ATTRIBUTE_NOT_FOUND);
throw new Exception(Exception::COLUMN_NOT_FOUND);
} catch (LimitException) {
throw new Exception(Exception::ATTRIBUTE_LIMIT_EXCEEDED);
throw new Exception(Exception::COLUMN_LIMIT_EXCEEDED);
} catch (IndexException $e) {
throw new Exception(Exception::INDEX_INVALID, $e->getMessage());
}

View file

@ -81,12 +81,12 @@ class Delete extends Action
$table = $dbForProject->getDocument('database_' . $db->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$column = $dbForProject->getDocument('attributes', $db->getInternalId() . '_' . $table->getInternalId() . '_' . $key);
if ($column->isEmpty()) {
throw new Exception(Exception::ATTRIBUTE_NOT_FOUND);
throw new Exception(Exception::COLUMN_NOT_FOUND);
}
$validator = new IndexDependencyValidator(
@ -109,12 +109,12 @@ class Delete extends Action
if ($options['twoWay']) {
$relatedTable = $dbForProject->getDocument('database_' . $db->getInternalId(), $options['relatedCollection']);
if ($relatedTable->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$relatedColumn = $dbForProject->getDocument('attributes', $db->getInternalId() . '_' . $relatedTable->getInternalId() . '_' . $options['twoWayKey']);
if ($relatedColumn->isEmpty()) {
throw new Exception(Exception::ATTRIBUTE_NOT_FOUND);
throw new Exception(Exception::COLUMN_NOT_FOUND);
}
if ($relatedColumn->getAttribute('status') === 'available') {

View file

@ -84,7 +84,7 @@ class Create extends ColumnAction
Event $queueForEvents
): void {
if (!is_null($default) && !in_array($default, $elements, true)) {
throw new Exception(Exception::ATTRIBUTE_VALUE_INVALID, 'Default value not found in elements');
throw new Exception(Exception::COLUMN_VALUE_INVALID, 'Default value not found in elements');
}
$column = $this->createColumn(

View file

@ -89,12 +89,12 @@ class Create extends ColumnAction
$max ??= PHP_FLOAT_MAX;
if ($min > $max) {
throw new Exception(Exception::ATTRIBUTE_VALUE_INVALID, 'Minimum value must be lesser than maximum value');
throw new Exception(Exception::COLUMN_VALUE_INVALID, 'Minimum value must be lesser than maximum value');
}
$validator = new Range($min, $max, Database::VAR_FLOAT);
if (!\is_null($default) && !$validator->isValid($default)) {
throw new Exception(Exception::ATTRIBUTE_VALUE_INVALID, $validator->getDescription());
throw new Exception(Exception::COLUMN_VALUE_INVALID, $validator->getDescription());
}
$column = $this->createColumn($databaseId, $tableId, new Document([

View file

@ -75,12 +75,12 @@ class Get extends Action
$table = $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$column = $dbForProject->getDocument('attributes', $database->getInternalId() . '_' . $table->getInternalId() . '_' . $key);
if ($column->isEmpty()) {
throw new Exception(Exception::ATTRIBUTE_NOT_FOUND);
throw new Exception(Exception::COLUMN_NOT_FOUND);
}
$type = $column->getAttribute('type');

View file

@ -89,12 +89,12 @@ class Create extends ColumnAction
$max ??= \PHP_INT_MAX;
if ($min > $max) {
throw new Exception(Exception::ATTRIBUTE_VALUE_INVALID, 'Minimum value must be lesser than maximum value');
throw new Exception(Exception::COLUMN_VALUE_INVALID, 'Minimum value must be lesser than maximum value');
}
$validator = new Range($min, $max, Database::VAR_INTEGER);
if (!\is_null($default) && !$validator->isValid($default)) {
throw new Exception(Exception::ATTRIBUTE_VALUE_INVALID, $validator->getDescription());
throw new Exception(Exception::COLUMN_VALUE_INVALID, $validator->getDescription());
}
$size = $max > 2147483647 ? 8 : 4;

View file

@ -105,13 +105,13 @@ class Create extends ColumnAction
$table = $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId);
$table = $dbForProject->getCollection('database_' . $database->getInternalId() . '_collection_' . $table->getInternalId());
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$relatedTableDocument = $dbForProject->getDocument('database_' . $database->getInternalId(), $relatedTableId);
$relatedTable = $dbForProject->getCollection('database_' . $database->getInternalId() . '_collection_' . $relatedTableDocument->getInternalId());
if ($relatedTable->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$columns = $table->getAttribute('attributes', []);
@ -121,14 +121,14 @@ class Create extends ColumnAction
}
if (\strtolower($column->getId()) === \strtolower($key)) {
throw new Exception(Exception::ATTRIBUTE_ALREADY_EXISTS);
throw new Exception(Exception::COLUMN_ALREADY_EXISTS);
}
if (
\strtolower($column->getAttribute('options')['twoWayKey']) === \strtolower($twoWayKey) &&
$column->getAttribute('options')['relatedCollection'] === $relatedTable->getId()
) {
throw new Exception(Exception::ATTRIBUTE_ALREADY_EXISTS, 'Attribute with the requested key already exists. Attribute keys must be unique, try again with a different key.');
throw new Exception(Exception::COLUMN_ALREADY_EXISTS, 'Attribute with the requested key already exists. Attribute keys must be unique, try again with a different key.');
}
if (
@ -136,7 +136,7 @@ class Create extends ColumnAction
$column->getAttribute('options')['relationType'] === Database::RELATION_MANY_TO_MANY &&
$column->getAttribute('options')['relatedCollection'] === $relatedTable->getId()
) {
throw new Exception(Exception::ATTRIBUTE_ALREADY_EXISTS, 'Creating more than one "manyToMany" relationship on the same table is currently not permitted.');
throw new Exception(Exception::COLUMN_ALREADY_EXISTS, 'Creating more than one "manyToMany" relationship on the same table is currently not permitted.');
}
}

View file

@ -89,7 +89,7 @@ class Create extends ColumnAction
// Ensure default fits in the given size
$validator = new Text($size, 0);
if (!is_null($default) && !$validator->isValid($default)) {
throw new Exception(Exception::ATTRIBUTE_VALUE_INVALID, $validator->getDescription());
throw new Exception(Exception::COLUMN_VALUE_INVALID, $validator->getDescription());
}
$filters = [];

View file

@ -68,7 +68,7 @@ class XList extends Action
$table = $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$queries = Query::parseQueries($queries);

View file

@ -85,7 +85,7 @@ class Create extends Action
$table = $dbForProject->getDocument('database_' . $db->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$count = $dbForProject->count('indexes', [
@ -142,7 +142,7 @@ class Create extends Action
$columnIndex = \array_search($column, array_column($oldColumns, 'key'));
if ($columnIndex === false) {
throw new Exception(Exception::ATTRIBUTE_UNKNOWN, 'Unknown column: ' . $column . '. Verify the column name or create the column.');
throw new Exception(Exception::COLUMN_UNKNOWN, 'Unknown column: ' . $column . '. Verify the column name or create the column.');
}
$columnStatus = $oldColumns[$columnIndex]['status'];
@ -150,12 +150,12 @@ class Create extends Action
$columnArray = $oldColumns[$columnIndex]['array'] ?? false;
if ($columnType === Database::VAR_RELATIONSHIP) {
throw new Exception(Exception::ATTRIBUTE_TYPE_INVALID, 'Cannot create an index for a relationship column: ' . $oldColumns[$columnIndex]['key']);
throw new Exception(Exception::COLUMN_TYPE_INVALID, 'Cannot create an index for a relationship column: ' . $oldColumns[$columnIndex]['key']);
}
// ensure attribute is available
if ($columnStatus !== 'available') {
throw new Exception(Exception::ATTRIBUTE_NOT_AVAILABLE, 'Column not available: ' . $oldColumns[$columnIndex]['key']);
throw new Exception(Exception::COLUMN_NOT_AVAILABLE, 'Column not available: ' . $oldColumns[$columnIndex]['key']);
}
$lengths[$i] = null;

View file

@ -74,7 +74,7 @@ class Delete extends Action
$table = $dbForProject->getDocument('database_' . $db->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$index = $dbForProject->getDocument('indexes', $db->getInternalId() . '_' . $table->getInternalId() . '_' . $key);

View file

@ -67,7 +67,7 @@ class Get extends Action
$table = $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$index = $table->find('key', $key, 'indexes');

View file

@ -73,7 +73,7 @@ class XList extends Action
$table = $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$queries = Query::parseQueries($queries);

View file

@ -87,11 +87,11 @@ class Create extends Action
$data = (\is_string($data)) ? \json_decode($data, true) : $data; // Cast to JSON array
if (empty($data)) {
throw new Exception(Exception::DOCUMENT_MISSING_DATA);
throw new Exception(Exception::ROW_MISSING_DATA);
}
if (isset($data['$id'])) {
throw new Exception(Exception::DOCUMENT_INVALID_STRUCTURE, '$id is not allowed for creating new rows, try update instead');
throw new Exception(Exception::ROW_INVALID_STRUCTURE, '$id is not allowed for creating new rows, try update instead');
}
$database = Authorization::skip(fn () => $dbForProject->getDocument('databases', $databaseId));
@ -106,7 +106,7 @@ class Create extends Action
$table = Authorization::skip(fn () => $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId));
if ($table->isEmpty() || (!$table->getAttribute('enabled', false) && !$isAPIKey && !$isPrivilegedUser)) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$allowedPermissions = [
@ -175,7 +175,7 @@ class Create extends Action
$relationships = \array_filter(
$table->getAttribute('attributes', []),
fn ($attribute) => $attribute->getAttribute('type') === Database::VAR_RELATIONSHIP
fn ($column) => $column->getAttribute('type') === Database::VAR_RELATIONSHIP
);
foreach ($relationships as $relationship) {
@ -242,11 +242,11 @@ class Create extends Action
try {
$row = $dbForProject->createDocument('database_' . $database->getInternalId() . '_collection_' . $table->getInternalId(), $row);
} catch (StructureException $e) {
throw new Exception(Exception::DOCUMENT_INVALID_STRUCTURE, $e->getMessage());
throw new Exception(Exception::ROW_INVALID_STRUCTURE, $e->getMessage());
} catch (DuplicateException) {
throw new Exception(Exception::DOCUMENT_ALREADY_EXISTS);
throw new Exception(Exception::ROW_ALREADY_EXISTS);
} catch (NotFoundException) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
@ -257,7 +257,7 @@ class Create extends Action
$relationships = \array_filter(
$table->getAttribute('attributes', []),
fn ($attribute) => $attribute->getAttribute('type') === Database::VAR_RELATIONSHIP
fn ($column) => $column->getAttribute('type') === Database::VAR_RELATIONSHIP
);
foreach ($relationships as $relationship) {
@ -296,10 +296,10 @@ class Create extends Action
->dynamic($row, UtopiaResponse::MODEL_ROW);
$relationships = \array_map(
fn ($document) => $document->getAttribute('key'),
fn ($row) => $row->getAttribute('key'),
\array_filter(
$table->getAttribute('attributes', []),
fn ($attribute) => $attribute->getAttribute('type') === Database::VAR_RELATIONSHIP
fn ($column) => $column->getAttribute('type') === Database::VAR_RELATIONSHIP
)
);

View file

@ -84,14 +84,14 @@ class Delete extends Action
$table = Authorization::skip(fn () => $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId));
if ($table->isEmpty() || (!$table->getAttribute('enabled', false) && !$isAPIKey && !$isPrivilegedUser)) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
// Read permission should not be required for delete
$row = Authorization::skip(fn () => $dbForProject->getDocument('database_' . $database->getInternalId() . '_collection_' . $table->getInternalId(), $rowId));
if ($row->isEmpty()) {
throw new Exception(Exception::DOCUMENT_NOT_FOUND);
throw new Exception(Exception::ROW_NOT_FOUND);
}
try {
@ -102,7 +102,7 @@ class Delete extends Action
);
});
} catch (NotFoundException) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
// Add $tableId and $databaseId for all rows
@ -112,7 +112,7 @@ class Delete extends Action
$relationships = \array_filter(
$table->getAttribute('attributes', []),
fn ($attribute) => $attribute->getAttribute('type') === Database::VAR_RELATIONSHIP
fn ($column) => $column->getAttribute('type') === Database::VAR_RELATIONSHIP
);
foreach ($relationships as $relationship) {
@ -147,10 +147,10 @@ class Delete extends Action
$response->addHeader('X-Debug-Operations', 1);
$relationships = \array_map(
fn ($document) => $document->getAttribute('key'),
fn ($row) => $row->getAttribute('key'),
\array_filter(
$table->getAttribute('attributes', []),
fn ($attribute) => $attribute->getAttribute('type') === Database::VAR_RELATIONSHIP
fn ($column) => $column->getAttribute('type') === Database::VAR_RELATIONSHIP
)
);

View file

@ -79,7 +79,7 @@ class Get extends Action
$table = Authorization::skip(fn () => $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId));
if ($table->isEmpty() || (!$table->getAttribute('enabled', false) && !$isAPIKey && !$isPrivilegedUser)) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
try {
@ -92,7 +92,7 @@ class Get extends Action
}
if ($row->isEmpty()) {
throw new Exception(Exception::DOCUMENT_NOT_FOUND);
throw new Exception(Exception::ROW_NOT_FOUND);
}
$operations = 0;
@ -110,7 +110,7 @@ class Get extends Action
$relationships = \array_filter(
$table->getAttribute('attributes', []),
fn ($attribute) => $attribute->getAttribute('type') === Database::VAR_RELATIONSHIP
fn ($column) => $column->getAttribute('type') === Database::VAR_RELATIONSHIP
);
foreach ($relationships as $relationship) {

View file

@ -81,13 +81,13 @@ class XList extends Action
$table = $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$row = $dbForProject->getDocument('database_' . $database->getInternalId() . '_collection_' . $table->getInternalId(), $rowId);
if ($row->isEmpty()) {
throw new Exception(Exception::DOCUMENT_NOT_FOUND);
throw new Exception(Exception::ROW_NOT_FOUND);
}
try {

View file

@ -86,7 +86,7 @@ class Update extends Action
$data = (\is_string($data)) ? \json_decode($data, true) : $data; // Cast to JSON array
if (empty($data) && \is_null($permissions)) {
throw new Exception(Exception::DOCUMENT_MISSING_PAYLOAD);
throw new Exception(Exception::ROW_MISSING_PAYLOAD);
}
$database = Authorization::skip(fn () => $dbForProject->getDocument('databases', $databaseId));
@ -101,7 +101,7 @@ class Update extends Action
$table = Authorization::skip(fn () => $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId));
if ($table->isEmpty() || (!$table->getAttribute('enabled', false) && !$isAPIKey && !$isPrivilegedUser)) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
// Read permission should not be required for update
@ -109,7 +109,7 @@ class Update extends Action
$row = Authorization::skip(fn () => $dbForProject->getDocument('database_' . $database->getInternalId() . '_collection_' . $table->getInternalId(), $rowId));
if ($row->isEmpty()) {
throw new Exception(Exception::DOCUMENT_NOT_FOUND);
throw new Exception(Exception::ROW_NOT_FOUND);
}
// Map aggregate permissions into the multiple permissions they represent.
@ -156,7 +156,7 @@ class Update extends Action
$relationships = \array_filter(
$table->getAttribute('attributes', []),
fn ($attribute) => $attribute->getAttribute('type') === Database::VAR_RELATIONSHIP
fn ($column) => $column->getAttribute('type') === Database::VAR_RELATIONSHIP
);
foreach ($relationships as $relationship) {
@ -239,11 +239,11 @@ class Update extends Action
} catch (AuthorizationException) {
throw new Exception(Exception::USER_UNAUTHORIZED);
} catch (DuplicateException) {
throw new Exception(Exception::DOCUMENT_ALREADY_EXISTS);
throw new Exception(Exception::ROW_ALREADY_EXISTS);
} catch (StructureException $e) {
throw new Exception(Exception::DOCUMENT_INVALID_STRUCTURE, $e->getMessage());
throw new Exception(Exception::ROW_INVALID_STRUCTURE, $e->getMessage());
} catch (NotFoundException) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
// Add $tableId and $databaseId for all rows
@ -253,7 +253,7 @@ class Update extends Action
$relationships = \array_filter(
$table->getAttribute('attributes', []),
fn ($attribute) => $attribute->getAttribute('type') === Database::VAR_RELATIONSHIP
fn ($column) => $column->getAttribute('type') === Database::VAR_RELATIONSHIP
);
foreach ($relationships as $relationship) {
@ -284,10 +284,10 @@ class Update extends Action
$response->dynamic($row, UtopiaResponse::MODEL_ROW);
$relationships = \array_map(
fn ($document) => $document->getAttribute('key'),
fn ($row) => $row->getAttribute('key'),
\array_filter(
$table->getAttribute('attributes', []),
fn ($attribute) => $attribute->getAttribute('type') === Database::VAR_RELATIONSHIP
fn ($column) => $column->getAttribute('type') === Database::VAR_RELATIONSHIP
)
);

View file

@ -79,7 +79,7 @@ class XList extends Action
$table = Authorization::skip(fn () => $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId));
if ($table->isEmpty() || (!$table->getAttribute('enabled', false) && !$isAPIKey && !$isPrivilegedUser)) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
try {
@ -136,7 +136,7 @@ class XList extends Action
$relationships = \array_filter(
$table->getAttribute('attributes', []),
fn ($attribute) => $attribute->getAttribute('type') === Database::VAR_RELATIONSHIP
fn ($column) => $column->getAttribute('type') === Database::VAR_RELATIONSHIP
);
foreach ($relationships as $relationship) {

View file

@ -99,9 +99,9 @@ class Create extends Action
$dbForProject->createCollection('database_' . $database->getInternalId() . '_collection_' . $table->getInternalId(), permissions: $permissions, documentSecurity: $documentSecurity);
} catch (DuplicateException) {
throw new Exception(Exception::COLLECTION_ALREADY_EXISTS);
throw new Exception(Exception::TABLE_ALREADY_EXISTS);
} catch (LimitException) {
throw new Exception(Exception::COLLECTION_LIMIT_EXCEEDED);
throw new Exception(Exception::TABLE_LIMIT_EXCEEDED);
}
$queueForEvents

View file

@ -71,7 +71,7 @@ class Delete extends Action
$table = $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
if (!$dbForProject->deleteDocument('database_' . $database->getInternalId(), $tableId)) {

View file

@ -66,7 +66,7 @@ class Get extends Action
$table = $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$response->dynamic($table, UtopiaResponse::MODEL_TABLE);

View file

@ -81,7 +81,7 @@ class XList extends Action
$table = $dbForProject->getCollection('database_' . $database->getInternalId() . '_collection_' . $tableDocument->getInternalId());
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
try {

View file

@ -77,7 +77,7 @@ class Update extends Action
$table = $dbForProject->getDocument('database_' . $database->getInternalId(), $tableId);
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$permissions ??= $table->getPermissions() ?? [];

View file

@ -68,7 +68,7 @@ class Get extends Action
$table = $dbForProject->getCollection('database_' . $database->getInternalId() . '_collection_' . $tableDocument->getInternalId());
if ($table->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
throw new Exception(Exception::TABLE_NOT_FOUND);
}
$periods = Config::getParam('usage', []);

View file

@ -539,9 +539,9 @@ class Databases extends Action
Query::contains('options', ['"relatedCollection":"'. $collectionId .'"']),
],
$dbForProject,
function ($attribute) use ($dbForProject, $databaseInternalId) {
$dbForProject->purgeCachedDocument('database_' . $databaseInternalId, $attribute->getAttribute('collectionId'));
$dbForProject->purgeCachedCollection('database_' . $databaseInternalId . '_collection_' . $attribute->getAttribute('collectionInternalId'));
function ($column) use ($dbForProject, $databaseInternalId) {
$dbForProject->purgeCachedDocument('database_' . $databaseInternalId, $column->getAttribute('collectionId'));
$dbForProject->purgeCachedCollection('database_' . $databaseInternalId . '_collection_' . $column->getAttribute('collectionInternalId'));
}
);

View file

@ -2399,7 +2399,7 @@ trait DatabasesBase
$this->assertEquals(409, $response['headers']['status-code']);
$this->assertEquals('Remote document is newer than local.', $response['body']['message']);
$this->assertEquals(Exception::DOCUMENT_UPDATE_CONFLICT, $response['body']['type']);
$this->assertEquals(Exception::ROW_UPDATE_CONFLICT, $response['body']['type']);
return [];
}

View file

@ -1785,7 +1785,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_DEFAULT_UNSUPPORTED, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_DEFAULT_UNSUPPORTED, $update['body']['type']);
}
/**
@ -1928,7 +1928,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_DEFAULT_UNSUPPORTED, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_DEFAULT_UNSUPPORTED, $update['body']['type']);
}
/**
@ -2070,7 +2070,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_DEFAULT_UNSUPPORTED, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_DEFAULT_UNSUPPORTED, $update['body']['type']);
}
/**
@ -2212,7 +2212,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_DEFAULT_UNSUPPORTED, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_DEFAULT_UNSUPPORTED, $update['body']['type']);
}
/**
@ -2430,7 +2430,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_DEFAULT_UNSUPPORTED, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_DEFAULT_UNSUPPORTED, $update['body']['type']);
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key, array_merge([
'content-type' => 'application/json',
@ -2444,7 +2444,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_VALUE_INVALID, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_VALUE_INVALID, $update['body']['type']);
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key, array_merge([
'content-type' => 'application/json',
@ -2458,7 +2458,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_VALUE_INVALID, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_VALUE_INVALID, $update['body']['type']);
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/integer/' . $key, array_merge([
@ -2473,7 +2473,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_VALUE_INVALID, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_VALUE_INVALID, $update['body']['type']);
}
/**
@ -2691,7 +2691,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_DEFAULT_UNSUPPORTED, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_DEFAULT_UNSUPPORTED, $update['body']['type']);
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key, array_merge([
'content-type' => 'application/json',
@ -2705,7 +2705,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_VALUE_INVALID, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_VALUE_INVALID, $update['body']['type']);
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key, array_merge([
'content-type' => 'application/json',
@ -2719,7 +2719,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_VALUE_INVALID, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_VALUE_INVALID, $update['body']['type']);
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/float/' . $key, array_merge([
@ -2734,7 +2734,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_VALUE_INVALID, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_VALUE_INVALID, $update['body']['type']);
}
/**
@ -2876,7 +2876,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_DEFAULT_UNSUPPORTED, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_DEFAULT_UNSUPPORTED, $update['body']['type']);
}
/**
@ -3018,7 +3018,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_DEFAULT_UNSUPPORTED, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_DEFAULT_UNSUPPORTED, $update['body']['type']);
}
/**
@ -3133,7 +3133,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_VALUE_INVALID, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_VALUE_INVALID, $update['body']['type']);
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key, array_merge([
'content-type' => 'application/json',
@ -3146,7 +3146,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_VALUE_INVALID, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_VALUE_INVALID, $update['body']['type']);
$update = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/enum/' . $key, array_merge([
'content-type' => 'application/json',
@ -3234,7 +3234,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_DEFAULT_UNSUPPORTED, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_DEFAULT_UNSUPPORTED, $update['body']['type']);
}
/**
@ -3324,7 +3324,7 @@ class DatabasesCustomServerTest extends Scope
]);
$this->assertEquals(400, $attribute['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_INVALID_RESIZE, $attribute['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_INVALID_RESIZE, $attribute['body']['type']);
// original documents to original size, remove new document
$document = $this->client->call(Client::METHOD_PATCH, '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents/' . $document['body']['$id'], array_merge([
@ -3417,7 +3417,7 @@ class DatabasesCustomServerTest extends Scope
);
$this->assertEquals(400, $newDoc['headers']['status-code']);
$this->assertEquals(AppwriteException::DOCUMENT_INVALID_STRUCTURE, $newDoc['body']['type']);
$this->assertEquals(AppwriteException::ROW_INVALID_STRUCTURE, $newDoc['body']['type']);
}
/**
@ -3491,7 +3491,7 @@ class DatabasesCustomServerTest extends Scope
]), $payload);
$this->assertEquals(404, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::COLLECTION_NOT_FOUND, $update['body']['type']);
$this->assertEquals(AppwriteException::TABLE_NOT_FOUND, $update['body']['type']);
/**
* Check if Attribute exists
@ -3503,7 +3503,7 @@ class DatabasesCustomServerTest extends Scope
]), $payload);
$this->assertEquals(404, $update['headers']['status-code']);
$this->assertEquals(AppwriteException::ATTRIBUTE_NOT_FOUND, $update['body']['type']);
$this->assertEquals(AppwriteException::COLUMN_NOT_FOUND, $update['body']['type']);
}
}