mirror of
https://github.com/appwrite/appwrite
synced 2026-05-23 00:49:02 +00:00
Merge pull request #9728 from appwrite/update-exceptions
Update Exceptions
This commit is contained in:
commit
28a74e664d
31 changed files with 287 additions and 125 deletions
|
|
@ -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,
|
||||
],
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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') {
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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([
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 = [];
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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() ?? [];
|
||||
|
|
|
|||
|
|
@ -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', []);
|
||||
|
|
|
|||
|
|
@ -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'));
|
||||
}
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 [];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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']);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue