Set databaseId for all nested documents
This commit is contained in:
parent
64ee75e80d
commit
275c6bb3a0
3 changed files with 78 additions and 30 deletions
|
@ -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
8
composer.lock
generated
|
@ -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",
|
||||
|
|
|
@ -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'],
|
||||
|
|
Loading…
Reference in a new issue