mirror of
https://github.com/appwrite/appwrite
synced 2026-05-24 09:28:40 +00:00
Switch removable attributes
This commit is contained in:
parent
34cf5a7c2f
commit
ea9cbd2f2c
6 changed files with 45 additions and 23 deletions
|
|
@ -25,6 +25,14 @@ class Action extends UtopiaAction
|
||||||
'subQueryVariables', // Sites
|
'subQueryVariables', // Sites
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attributes to remove from relationship path documents per API
|
||||||
|
* Default is empty - APIs should set their specific attributes
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected array $removableAttributes = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Foreach Document
|
* Foreach Document
|
||||||
* Call provided callback for each document in the collection
|
* Call provided callback for each document in the collection
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,15 @@ namespace Appwrite\Platform\Modules\Databases\Http\Databases\Collections\Documen
|
||||||
|
|
||||||
use Appwrite\Event\Event;
|
use Appwrite\Event\Event;
|
||||||
use Appwrite\Extend\Exception;
|
use Appwrite\Extend\Exception;
|
||||||
|
use Appwrite\Platform\Action as AppwriteAction;
|
||||||
use Utopia\Database\Database;
|
use Utopia\Database\Database;
|
||||||
use Utopia\Database\Document;
|
use Utopia\Database\Document;
|
||||||
use Utopia\Database\Validator\Authorization;
|
use Utopia\Database\Validator\Authorization;
|
||||||
use Utopia\Platform\Action as UtopiaAction;
|
|
||||||
|
|
||||||
abstract class Action extends UtopiaAction
|
use const Appwrite\Platform\Modules\Databases\DOCUMENTS;
|
||||||
|
use const Appwrite\Platform\Modules\Databases\ROWS;
|
||||||
|
|
||||||
|
abstract class Action extends AppwriteAction
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var string|null The current context (either 'row' or 'document')
|
* @var string|null The current context (either 'row' or 'document')
|
||||||
|
|
@ -21,10 +24,15 @@ abstract class Action extends UtopiaAction
|
||||||
*/
|
*/
|
||||||
abstract protected function getResponseModel(): string;
|
abstract protected function getResponseModel(): string;
|
||||||
|
|
||||||
public function setHttpPath(string $path): UtopiaAction
|
public function setHttpPath(string $path): AppwriteAction
|
||||||
{
|
{
|
||||||
if (str_contains($path, '/tablesdb/')) {
|
if (str_contains($path, '/tablesdb/')) {
|
||||||
$this->context = ROWS;
|
$this->context = ROWS;
|
||||||
|
// Set removable attributes for TablesDB API
|
||||||
|
$this->removableAttributes = ['$databaseId', '$tableId'];
|
||||||
|
} else {
|
||||||
|
// Set removable attributes for Collections API
|
||||||
|
$this->removableAttributes = ['$databaseId', '$collectionId'];
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent::setHttpPath($path);
|
return parent::setHttpPath($path);
|
||||||
|
|
@ -192,6 +200,17 @@ abstract class Action extends UtopiaAction
|
||||||
return $this->isCollectionsAPI() ? 'collection' : 'table';
|
return $this->isCollectionsAPI() ? 'collection' : 'table';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove configured removable attributes from a document.
|
||||||
|
* Used for relationship path handling to remove API-specific attributes.
|
||||||
|
*/
|
||||||
|
protected function removeReadonlyAttributes(Document $document): void
|
||||||
|
{
|
||||||
|
foreach ($this->removableAttributes as $attribute) {
|
||||||
|
$document->removeAttribute($attribute);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolves relationships in a document and attaches metadata.
|
* Resolves relationships in a document and attaches metadata.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -318,8 +318,7 @@ class Create extends Action
|
||||||
$relation['$id'] = ID::unique();
|
$relation['$id'] = ID::unique();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$relation->removeAttribute('$collectionId');
|
$this->removeReadonlyAttributes($relation);
|
||||||
$relation->removeAttribute('$databaseId');
|
|
||||||
$relation->setAttribute('$collection', $relatedCollection->getId());
|
$relation->setAttribute('$collection', $relatedCollection->getId());
|
||||||
$type = Database::PERMISSION_UPDATE;
|
$type = Database::PERMISSION_UPDATE;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -209,8 +209,7 @@ class Update extends Action
|
||||||
'database_' . $database->getSequence() . '_collection_' . $relatedCollection->getSequence(),
|
'database_' . $database->getSequence() . '_collection_' . $relatedCollection->getSequence(),
|
||||||
$relation->getId()
|
$relation->getId()
|
||||||
));
|
));
|
||||||
$relation->removeAttribute('$collectionId');
|
$this->removeReadonlyAttributes($relation);
|
||||||
$relation->removeAttribute('$databaseId');
|
|
||||||
// Attribute $collection is required for Utopia.
|
// Attribute $collection is required for Utopia.
|
||||||
$relation->setAttribute(
|
$relation->setAttribute(
|
||||||
'$collection',
|
'$collection',
|
||||||
|
|
|
||||||
|
|
@ -213,8 +213,7 @@ class Upsert extends Action
|
||||||
'database_' . $database->getSequence() . '_collection_' . $relatedCollection->getSequence(),
|
'database_' . $database->getSequence() . '_collection_' . $relatedCollection->getSequence(),
|
||||||
$relation->getId()
|
$relation->getId()
|
||||||
));
|
));
|
||||||
$relation->removeAttribute('$collectionId');
|
$this->removeReadonlyAttributes($relation);
|
||||||
$relation->removeAttribute('$databaseId');
|
|
||||||
// Attribute $collection is required for Utopia.
|
// Attribute $collection is required for Utopia.
|
||||||
$relation->setAttribute(
|
$relation->setAttribute(
|
||||||
'$collection',
|
'$collection',
|
||||||
|
|
|
||||||
|
|
@ -167,11 +167,10 @@ class XList extends Action
|
||||||
return $result || ($query->getMethod() === Query::TYPE_SELECT);
|
return $result || ($query->getMethod() === Query::TYPE_SELECT);
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
// Check if the SELECT query includes $databaseId and $collectionId
|
// Check if the SELECT query includes the removable attributes
|
||||||
$hasWildcard = false;
|
$hasWildcard = false;
|
||||||
$hasDatabaseId = false;
|
|
||||||
$hasCollectionId = false;
|
|
||||||
$hasSelectQueries = !empty($selectQueries);
|
$hasSelectQueries = !empty($selectQueries);
|
||||||
|
$requestedAttributes = [];
|
||||||
|
|
||||||
if ($hasSelectQueries) {
|
if ($hasSelectQueries) {
|
||||||
foreach ($selectQueries as $query) {
|
foreach ($selectQueries as $query) {
|
||||||
|
|
@ -185,22 +184,21 @@ class XList extends Action
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (\in_array('$databaseId', $values, true)) {
|
// Check which removable attributes are explicitly requested
|
||||||
$hasDatabaseId = true;
|
foreach ($this->removableAttributes as $attribute) {
|
||||||
}
|
if (\in_array($attribute, $values, true)) {
|
||||||
|
$requestedAttributes[$attribute] = true;
|
||||||
if (\in_array('$collectionId', $values, true)) {
|
}
|
||||||
$hasCollectionId = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$hasWildcard) {
|
if (!$hasWildcard) {
|
||||||
foreach ($documents as $document) {
|
foreach ($documents as $document) {
|
||||||
if (!$hasDatabaseId) {
|
// Remove attributes that are not explicitly requested
|
||||||
$document->removeAttribute('$databaseId');
|
foreach ($this->removableAttributes as $attribute) {
|
||||||
}
|
if (!isset($requestedAttributes[$attribute])) {
|
||||||
if (!$hasCollectionId) {
|
$document->removeAttribute($attribute);
|
||||||
$document->removeAttribute('$collectionId');
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue