diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 01f86cb5e8..c9e8800569 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -438,9 +438,10 @@ class Response extends SwooleResponse return isset(self::$models[$key]); } - public function applyFilters(array $data, string $model): array + public function applyFilters(array $data, string $model, array $raw): array { foreach ($this->filters as $filter) { + $filter->setRawContent($raw); $data = $filter->parse($data, $model); } @@ -460,7 +461,7 @@ class Response extends SwooleResponse public function dynamic(Document $document, string $model): void { $output = $this->output(clone $document, $model); - $output = $this->applyFilters($output, $model); + $output = $this->applyFilters($output, $model, raw: clone $document); switch ($this->getContentType()) { case self::CONTENT_TYPE_JSON: diff --git a/src/Appwrite/Utopia/Response/Filter.php b/src/Appwrite/Utopia/Response/Filter.php index bd82467f81..b170ccd6ef 100644 --- a/src/Appwrite/Utopia/Response/Filter.php +++ b/src/Appwrite/Utopia/Response/Filter.php @@ -4,6 +4,11 @@ namespace Appwrite\Utopia\Response; abstract class Filter { + /** + * @var ?array $rawContent + */ + protected ?array $rawContent = null; + /** * Parse the content to another format. * @@ -14,6 +19,10 @@ abstract class Filter */ abstract public function parse(array $content, string $model): array; + public function setRawContent(array $rawContent): void + { + $this->rawContent = $rawContent; + } /** * Handle list diff --git a/src/Appwrite/Utopia/Response/Filters/V26.php b/src/Appwrite/Utopia/Response/Filters/V26.php index 43106ebb30..1aa6c0c821 100644 --- a/src/Appwrite/Utopia/Response/Filters/V26.php +++ b/src/Appwrite/Utopia/Response/Filters/V26.php @@ -5,25 +5,33 @@ namespace Appwrite\Utopia\Response\Filters; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Filter; use Utopia\Config\Config; -use Utopia\Database\Document; // Convert 1.9.5 Data format to 1.9.4 format class V26 extends Filter { - public function __construct(protected Document $project) - { - } - public function parse(array $content, string $model): array { return match ($model) { - Response::MODEL_PROJECT => $this->parseProject($content), - Response::MODEL_PROJECT_LIST => $this->handleList($content, 'projects', fn ($item) => $this->parseProjectItem($item)), + Response::MODEL_PROJECT => $this->parseProject($content, $this->rawContent), + Response::MODEL_PROJECT_LIST => $this->handleList($content, 'projects', function ($item) { + $projectId = $item['$id'] ?? ''; + + $rawProjects = $this->rawContent['projects'] ?? []; + $rawProject = null; + foreach ($rawProjects as $rawItem) { + if ($rawItem['$id'] === $projectId) { + $rawProject = $rawItem; + break; + } + } + + return $this->parseProject($item, $rawProject); + }), default => $content, }; } - private function parseProjectItem(array $content): array + private function parseProject(array $content, array $raw): array { $this->expandAuthMethods($content); $this->expandServices($content); @@ -31,14 +39,7 @@ class V26 extends Filter unset($content['authMethods'], $content['services'], $content['protocols']); - return $content; - } - - private function parseProject(array $content): array - { - $content = $this->parseProjectItem($content); - - $auths = $this->project->getAttribute('auths', []); + $auths = $raw['auths'] ?? []; $content['authLimit'] = $auths['limit'] ?? 0; $content['authDuration'] = $auths['duration'] ?? TOKEN_EXPIRATION_LOGIN_LONG; $content['authSessionsLimit'] = $auths['maxSessions'] ?? 0; @@ -57,20 +58,20 @@ class V26 extends Filter $content['authMembershipsUserPhone'] = $auths['membershipsUserPhone'] ?? false; $content['authInvalidateSessions'] = $auths['invalidateSessions'] ?? false; - $content['description'] = $this->project->getAttribute('description', ''); - $content['logo'] = $this->project->getAttribute('logo', ''); - $content['url'] = $this->project->getAttribute('url', ''); - $content['legalName'] = $this->project->getAttribute('legalName', ''); - $content['legalCountry'] = $this->project->getAttribute('legalCountry', ''); - $content['legalState'] = $this->project->getAttribute('legalState', ''); - $content['legalCity'] = $this->project->getAttribute('legalCity', ''); - $content['legalAddress'] = $this->project->getAttribute('legalAddress', ''); - $content['legalTaxId'] = $this->project->getAttribute('legalTaxId', ''); + $content['description'] = $raw['description'] ?? ''; + $content['logo'] = $raw['logo'] ?? ''; + $content['url'] = $raw['url'] ?? ''; + $content['legalName'] = $raw['legalName'] ?? ''; + $content['legalCountry'] = $raw['legalCountry'] ?? ''; + $content['legalState'] = $raw['legalState'] ?? ''; + $content['legalCity'] = $raw['legalCity'] ?? ''; + $content['legalAddress'] = $raw['legalAddress'] ?? ''; + $content['legalTaxId'] = $raw['legalTaxId'] ?? ''; $content['oAuthProviders'] = $this->expandOAuthProviders(); - $content['platforms'] = $this->getDocumentArray($this->project->getAttribute('platforms', [])); - $content['webhooks'] = $this->getDocumentArray($this->project->getAttribute('webhooks', [])); - $content['keys'] = $this->getDocumentArray($this->project->getAttribute('keys', [])); + $content['platforms'] = $raw['platforms'] ?? []; + $content['webhooks'] = $raw['webhooks'] ?? []; + $content['keys'] = $raw['keys'] ?? []; return $content; } @@ -120,7 +121,7 @@ class V26 extends Filter private function expandOAuthProviders(): array { $providers = Config::getParam('oAuthProviders', []); - $providerValues = $this->project->getAttribute('oAuthProviders', []); + $providerValues = $this->rawContent['oAuthProviders'] ?? []; $projectProviders = []; foreach ($providers as $key => $provider) { @@ -139,17 +140,4 @@ class V26 extends Filter return $projectProviders; } - - private function getDocumentArray(array $documents): array - { - $result = []; - foreach ($documents as $document) { - if ($document instanceof Document) { - $result[] = $document->getArrayCopy(); - } elseif (\is_array($document)) { - $result[] = $document; - } - } - return $result; - } }