From 95b06c660a5ace1b2f2c14eb28ea528f9d8fd0a0 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 15 Jun 2023 17:29:03 +1200 Subject: [PATCH] Add index validator --- app/controllers/api/databases.php | 119 ++++++++++++++++-------------- 1 file changed, 64 insertions(+), 55 deletions(-) diff --git a/app/controllers/api/databases.php b/app/controllers/api/databases.php index e1e941bfaa..f64b4d07c0 100644 --- a/app/controllers/api/databases.php +++ b/app/controllers/api/databases.php @@ -1,56 +1,57 @@ createCollection('database_' . $database->getInternalId(), $attributes, $indexes); - } catch (DuplicateException $th) { + } catch (DuplicateException) { throw new Exception(Exception::DATABASE_ALREADY_EXISTS); } @@ -637,7 +638,7 @@ App::put('/v1/databases/:databaseId') ->setAttribute('name', $name) ->setAttribute('enabled', $enabled) ->setAttribute('search', implode(' ', [$databaseId, $name]))); - } catch (AuthorizationException $exception) { + } catch (AuthorizationException) { throw new Exception(Exception::USER_UNAUTHORIZED); } catch (StructureException $exception) { throw new Exception(Exception::DOCUMENT_INVALID_STRUCTURE, 'Bad structure. ' . $exception->getMessage()); @@ -2345,6 +2346,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/indexes') if ($db->isEmpty()) { throw new Exception(Exception::DATABASE_NOT_FOUND); } + $collection = $dbForProject->getDocument('database_' . $db->getInternalId(), $collectionId); if ($collection->isEmpty()) { @@ -2425,21 +2427,28 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/indexes') $lengths[$i] = ($attributeType === Database::VAR_STRING) ? $attributeSize : null; } + $index = new Document([ + '$id' => ID::custom($db->getInternalId() . '_' . $collection->getInternalId() . '_' . $key), + 'key' => $key, + 'status' => 'processing', // processing, available, failed, deleting, stuck + 'databaseInternalId' => $db->getInternalId(), + 'databaseId' => $databaseId, + 'collectionInternalId' => $collection->getInternalId(), + 'collectionId' => $collectionId, + 'type' => $type, + 'attributes' => $attributes, + 'lengths' => $lengths, + 'orders' => $orders, + ]); + + $validator = new IndexValidator($dbForProject->getAdapter()->getMaxIndexLength()); + if (!$validator->isValid($collection->setAttribute('indexes', $index, Document::SET_TYPE_APPEND))) { + throw new Exception(Exception::INDEX_INVALID, $validator->getDescription()); + } + try { - $index = $dbForProject->createDocument('indexes', new Document([ - '$id' => ID::custom($db->getInternalId() . '_' . $collection->getInternalId() . '_' . $key), - 'key' => $key, - 'status' => 'processing', // processing, available, failed, deleting, stuck - 'databaseInternalId' => $db->getInternalId(), - 'databaseId' => $databaseId, - 'collectionInternalId' => $collection->getInternalId(), - 'collectionId' => $collectionId, - 'type' => $type, - 'attributes' => $attributes, - 'lengths' => $lengths, - 'orders' => $orders, - ])); - } catch (DuplicateException $th) { + $index = $dbForProject->createDocument('indexes', $index); + } catch (DuplicateException) { throw new Exception(Exception::INDEX_ALREADY_EXISTS); }