diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 20f64496ac..85a7982f3c 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -43,6 +43,7 @@ use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate; +use Utopia\Database\Exception\Order as OrderException; use Utopia\Database\Exception\Query as QueryException; use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Permission; @@ -4845,8 +4846,12 @@ App::get('/v1/account/identities') } $filterQueries = Query::groupByType($queries)['filters']; - - $results = $dbForProject->find('identities', $queries); + try { + $results = $dbForProject->find('identities', $queries); + } catch (OrderException $e) { + $message = "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."; + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, $message); + } $total = $dbForProject->count('identities', $filterQueries, APP_LIMIT_COUNT); $response->dynamic(new Document([ diff --git a/app/controllers/api/functions.php b/app/controllers/api/functions.php index c7f24f984a..5ce8068c87 100644 --- a/app/controllers/api/functions.php +++ b/app/controllers/api/functions.php @@ -37,6 +37,7 @@ use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate as DuplicateException; +use Utopia\Database\Exception\Order as OrderException; use Utopia\Database\Exception\Query as QueryException; use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Permission; @@ -483,11 +484,15 @@ App::get('/v1/functions') } $filterQueries = Query::groupByType($queries)['filters']; - - $response->dynamic(new Document([ - 'functions' => $dbForProject->find('functions', $queries), - 'total' => $dbForProject->count('functions', $filterQueries, APP_LIMIT_COUNT), - ]), Response::MODEL_FUNCTION_LIST); + try { + $response->dynamic(new Document([ + 'functions' => $dbForProject->find('functions', $queries), + 'total' => $dbForProject->count('functions', $filterQueries, APP_LIMIT_COUNT), + ]), Response::MODEL_FUNCTION_LIST); + } catch (OrderException $e) { + $message = "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."; + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, $message); + } }); App::get('/v1/functions/runtimes') @@ -1537,8 +1542,12 @@ App::get('/v1/functions/:functionId/deployments') } $filterQueries = Query::groupByType($queries)['filters']; - - $results = $dbForProject->find('deployments', $queries); + try { + $results = $dbForProject->find('deployments', $queries); + } catch (OrderException $e) { + $message = "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."; + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, $message); + } $total = $dbForProject->count('deployments', $filterQueries, APP_LIMIT_COUNT); foreach ($results as $result) { @@ -2331,8 +2340,12 @@ App::get('/v1/functions/:functionId/executions') } $filterQueries = Query::groupByType($queries)['filters']; - - $results = $dbForProject->find('executions', $queries); + try { + $results = $dbForProject->find('executions', $queries); + } catch (OrderException $e) { + $message = "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."; + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, $message); + } $total = $dbForProject->count('executions', $filterQueries, APP_LIMIT_COUNT); $roles = Authorization::getRoles(); diff --git a/app/controllers/api/messaging.php b/app/controllers/api/messaging.php index 178266db60..5683f05539 100644 --- a/app/controllers/api/messaging.php +++ b/app/controllers/api/messaging.php @@ -30,6 +30,7 @@ use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate as DuplicateException; +use Utopia\Database\Exception\Order as OrderException; use Utopia\Database\Exception\Query as QueryException; use Utopia\Database\Helpers\ID; use Utopia\Database\Query; @@ -951,11 +952,15 @@ App::get('/v1/messaging/providers') $cursor->setValue($cursorDocument); } - - $response->dynamic(new Document([ - 'providers' => $dbForProject->find('providers', $queries), - 'total' => $dbForProject->count('providers', $queries, APP_LIMIT_COUNT), - ]), Response::MODEL_PROVIDER_LIST); + try { + $response->dynamic(new Document([ + 'providers' => $dbForProject->find('providers', $queries), + 'total' => $dbForProject->count('providers', $queries, APP_LIMIT_COUNT), + ]), Response::MODEL_PROVIDER_LIST); + } catch (OrderException $e) { + $message = "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."; + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, $message); + } }); App::get('/v1/messaging/providers/:providerId/logs') @@ -2181,11 +2186,15 @@ App::get('/v1/messaging/topics') $cursor->setValue($cursorDocument[0]); } - - $response->dynamic(new Document([ - 'topics' => $dbForProject->find('topics', $queries), - 'total' => $dbForProject->count('topics', $queries, APP_LIMIT_COUNT), - ]), Response::MODEL_TOPIC_LIST); + try { + $response->dynamic(new Document([ + 'topics' => $dbForProject->find('topics', $queries), + 'total' => $dbForProject->count('topics', $queries, APP_LIMIT_COUNT), + ]), Response::MODEL_TOPIC_LIST); + } catch (OrderException $e) { + $message = "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."; + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, $message); + } }); App::get('/v1/messaging/topics/:topicId/logs') @@ -2579,8 +2588,12 @@ App::get('/v1/messaging/topics/:topicId/subscribers') $cursor->setValue($cursorDocument); } - - $subscribers = $dbForProject->find('subscribers', $queries); + try { + $subscribers = $dbForProject->find('subscribers', $queries); + } catch (OrderException $e) { + $message = "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."; + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, $message); + } $subscribers = batch(\array_map(function (Document $subscriber) use ($dbForProject) { return function () use ($subscriber, $dbForProject) { @@ -3360,11 +3373,15 @@ App::get('/v1/messaging/messages') $cursor->setValue($cursorDocument); } - - $response->dynamic(new Document([ - 'messages' => $dbForProject->find('messages', $queries), - 'total' => $dbForProject->count('messages', $queries, APP_LIMIT_COUNT), - ]), Response::MODEL_MESSAGE_LIST); + try { + $response->dynamic(new Document([ + 'messages' => $dbForProject->find('messages', $queries), + 'total' => $dbForProject->count('messages', $queries, APP_LIMIT_COUNT), + ]), Response::MODEL_MESSAGE_LIST); + } catch (OrderException $e) { + $message = "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."; + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, $message); + } }); App::get('/v1/messaging/messages/:messageId/logs') @@ -3533,11 +3550,15 @@ App::get('/v1/messaging/messages/:messageId/targets') $cursor->setValue($cursorDocument); } - - $response->dynamic(new Document([ - 'targets' => $dbForProject->find('targets', $queries), - 'total' => $dbForProject->count('targets', $queries, APP_LIMIT_COUNT), - ]), Response::MODEL_TARGET_LIST); + try { + $response->dynamic(new Document([ + 'targets' => $dbForProject->find('targets', $queries), + 'total' => $dbForProject->count('targets', $queries, APP_LIMIT_COUNT), + ]), Response::MODEL_TARGET_LIST); + } catch (OrderException $e) { + $message = "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."; + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, $message); + } }); App::get('/v1/messaging/messages/:messageId') diff --git a/app/controllers/api/migrations.php b/app/controllers/api/migrations.php index 4061f2c2c4..17327ea764 100644 --- a/app/controllers/api/migrations.php +++ b/app/controllers/api/migrations.php @@ -12,6 +12,7 @@ use Appwrite\Utopia\Response; use Utopia\App; use Utopia\Database\Database; use Utopia\Database\Document; +use Utopia\Database\Exception\Order as OrderException; use Utopia\Database\Exception\Query as QueryException; use Utopia\Database\Helpers\ID; use Utopia\Database\Query; @@ -347,11 +348,15 @@ App::get('/v1/migrations') } $filterQueries = Query::groupByType($queries)['filters']; - - $response->dynamic(new Document([ - 'migrations' => $dbForProject->find('migrations', $queries), - 'total' => $dbForProject->count('migrations', $filterQueries, APP_LIMIT_COUNT), - ]), Response::MODEL_MIGRATION_LIST); + try { + $response->dynamic(new Document([ + 'migrations' => $dbForProject->find('migrations', $queries), + 'total' => $dbForProject->count('migrations', $filterQueries, APP_LIMIT_COUNT), + ]), Response::MODEL_MIGRATION_LIST); + } catch (OrderException $e) { + $message = "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."; + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, $message); + } }); App::get('/v1/migrations/:migrationId')