1
0
Fork 0
mirror of synced 2024-10-01 17:58:02 +13:00

Set databaseId for all nested documents

This commit is contained in:
Jake Barnby 2023-03-27 15:42:36 +13:00
parent 64ee75e80d
commit 275c6bb3a0
No known key found for this signature in database
GPG key ID: C437A8CC85B96E9C
3 changed files with 78 additions and 30 deletions

View file

@ -4,6 +4,7 @@ use Utopia\App;
use Appwrite\Event\Delete;
use Appwrite\Extend\Exception;
use Utopia\Audit\Audit;
use Utopia\Database\Document as DatabaseDocument;
use Utopia\Database\Helpers\Permission;
use Utopia\Database\Helpers\Role;
use Utopia\Database\Validator\Datetime as DatetimeValidator;
@ -2636,14 +2637,25 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/documents')
try {
$document = $dbForProject->createDocument('database_' . $database->getInternalId() . '_collection_' . $collection->getInternalId(), new Document($data));
$document->setAttribute('$collectionId', $collectionId);
$document->setAttribute('$databaseId', $databaseId);
} catch (StructureException $exception) {
throw new Exception(Exception::DOCUMENT_INVALID_STRUCTURE, $exception->getMessage());
} catch (DuplicateException $exception) {
throw new Exception(Exception::DOCUMENT_ALREADY_EXISTS);
}
$document->setAttribute('$collectionId', $collectionId);
// Add $databaseId to all documents
$resetIds = function (Document $document) use (&$resetIds, $databaseId) {
$document->setAttribute('$databaseId', $databaseId);
foreach ($document->getAttributes() as $attribute) {
if ($attribute instanceof Document) {
$resetIds($attribute);
}
}
};
$resetIds($document);
$events
->setParam('databaseId', $databaseId)
->setParam('collectionId', $collection->getId())
@ -2714,7 +2726,6 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/documents')
$cursor = Query::getByType($queries, Query::TYPE_CURSORAFTER, Query::TYPE_CURSORBEFORE);
$cursor = reset($cursor);
if ($cursor) {
/** @var Query $cursor */
$documentId = $cursor->getValue();
if ($documentSecurity && !$valid) {
@ -2747,14 +2758,20 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/documents')
$total = Authorization::skip(fn () => $dbForProject->count('database_' . $database->getInternalId() . '_collection_' . $collection->getInternalId(), $filterQueries, APP_LIMIT_COUNT));
}
/**
* Reset $collection attribute to remove prefix.
*/
$documents = array_map(function (Document $document) use ($collectionId, $databaseId) {
$document->setAttribute('$collectionId', $collectionId);
// Add $databaseId for all documents
$resetIds = function (Document $document) use (&$resetIds, $databaseId) {
$document->setAttribute('$databaseId', $databaseId);
return $document;
}, $documents);
foreach ($document->getAttributes() as $attribute) {
if ($attribute instanceof Document) {
$resetIds($attribute);
}
}
};
foreach ($documents as $document) {
$document->setAttribute('$collectionId', $collectionId);
$resetIds($document);
}
$response->dynamic(new Document([
'total' => $total,
@ -2827,11 +2844,18 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/documents/:documen
throw new Exception(Exception::DOCUMENT_NOT_FOUND);
}
/**
* Reset $collection attribute to remove prefix.
*/
$document->setAttribute('$collectionId', $collectionId);
$document->setAttribute('$databaseId', $databaseId);
// Add $databaseId to all documents
$resetIds = function (Document $document) use (&$resetIds, $databaseId) {
$document->setAttribute('$databaseId', $databaseId);
foreach ($document->getAttributes() as $attribute) {
if ($attribute instanceof Document) {
$resetIds($attribute);
}
}
};
$resetIds($document);
$response->dynamic($document, Response::MODEL_DOCUMENT);
});
@ -3071,12 +3095,6 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/documents/:docum
);
});
}
/**
* Reset $collection attribute to remove prefix.
*/
$document->setAttribute('$collectionId', $collectionId);
$document->setAttribute('$databaseId', $databaseId);
} catch (AuthorizationException) {
throw new Exception(Exception::USER_UNAUTHORIZED);
} catch (DuplicateException) {
@ -3085,6 +3103,19 @@ App::patch('/v1/databases/:databaseId/collections/:collectionId/documents/:docum
throw new Exception(Exception::DOCUMENT_INVALID_STRUCTURE, $exception->getMessage());
}
$document->setAttribute('$collectionId', $collectionId);
// Add $databaseId to all documents
$resetIds = function (Document $document) use (&$resetIds, $databaseId) {
$document->setAttribute('$databaseId', $databaseId);
foreach ($document->getAttributes() as $attribute) {
if ($attribute instanceof Document) {
$resetIds($attribute);
}
}
};
$resetIds($document);
$events
->setParam('databaseId', $databaseId)
->setParam('collectionId', $collection->getId())
@ -3176,11 +3207,18 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/documents/:docu
$dbForProject->deleteCachedDocument($privateCollectionId, $documentId);
/**
* Reset $collection attribute to remove prefix.
*/
$document->setAttribute('$collectionId', $collectionId);
$document->setAttribute('$databaseId', $databaseId);
// Add $databaseId to all documents
$resetIds = function (Document $document) use (&$resetIds, $databaseId) {
$document->setAttribute('$databaseId', $databaseId);
foreach ($document->getAttributes() as $attribute) {
if ($attribute instanceof Document) {
$resetIds($attribute);
}
}
};
$resetIds($document);
$deletes
->setType(DELETE_TYPE_AUDIT)

8
composer.lock generated
View file

@ -2116,12 +2116,12 @@
"source": {
"type": "git",
"url": "https://github.com/utopia-php/database.git",
"reference": "c1df0b712746b1283737956a1b0b143dca8f8610"
"reference": "faf43ac4d654328588a8f4150ad2e889cbebc2c7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/database/zipball/c1df0b712746b1283737956a1b0b143dca8f8610",
"reference": "c1df0b712746b1283737956a1b0b143dca8f8610",
"url": "https://api.github.com/repos/utopia-php/database/zipball/faf43ac4d654328588a8f4150ad2e889cbebc2c7",
"reference": "faf43ac4d654328588a8f4150ad2e889cbebc2c7",
"shasum": ""
},
"require": {
@ -2166,7 +2166,7 @@
"issues": "https://github.com/utopia-php/database/issues",
"source": "https://github.com/utopia-php/database/tree/feat-relationships"
},
"time": "2023-03-23T10:52:28+00:00"
"time": "2023-03-27T02:33:24+00:00"
},
{
"name": "utopia-php/domains",

View file

@ -833,8 +833,6 @@ trait DatabasesBase
$this->assertEquals($datetimeResponse['body']['array'], $attributes[8]['array']);
$this->assertEquals($datetimeResponse['body']['default'], $attributes[8]['default']);
\var_dump($attributes[9]);
$this->assertEquals($relationshipResponse['body']['key'], $attributes[9]['key']);
$this->assertEquals($relationshipResponse['body']['type'], $attributes[9]['type']);
$this->assertEquals($relationshipResponse['body']['status'], $attributes[9]['status']);
@ -3317,6 +3315,18 @@ trait DatabasesBase
$this->assertEquals('Library 1', $person1['body']['library']['libraryName']);
// Ensure IDs were set and internal IDs removed
$this->assertEquals($databaseId, $person1['body']['$databaseId']);
$this->assertEquals($databaseId, $person1['body']['library']['$databaseId']);
$this->assertEquals($person['body']['$id'], $person1['body']['$collectionId']);
//$this->assertEquals($library['body']['$id'], $person1['body']['library']['$collectionId']);
$this->assertArrayNotHasKey('$collection', $person1['body']);
$this->assertArrayNotHasKey('$collection', $person1['body']['library']);
$this->assertArrayNotHasKey('$internalId', $person1['body']);
$this->assertArrayNotHasKey('$internalId', $person1['body']['library']);
$documents = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $person['body']['$id'] . '/documents', array_merge([
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],