diff --git a/app/controllers/general.php b/app/controllers/general.php index fab7100239..ebbe9b0967 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -8,18 +8,9 @@ use Appwrite\Event\Usage; use Appwrite\Extend\Exception as AppwriteException; use Appwrite\Network\Validator\Origin; use Appwrite\Utopia\Request; -use Appwrite\Utopia\Request\Filters\V12 as RequestV12; -use Appwrite\Utopia\Request\Filters\V13 as RequestV13; -use Appwrite\Utopia\Request\Filters\V14 as RequestV14; -use Appwrite\Utopia\Request\Filters\V15 as RequestV15; use Appwrite\Utopia\Request\Filters\V16 as RequestV16; use Appwrite\Utopia\Request\Filters\V17 as RequestV17; use Appwrite\Utopia\Response; -use Appwrite\Utopia\Response\Filters\V11 as ResponseV11; -use Appwrite\Utopia\Response\Filters\V12 as ResponseV12; -use Appwrite\Utopia\Response\Filters\V13 as ResponseV13; -use Appwrite\Utopia\Response\Filters\V14 as ResponseV14; -use Appwrite\Utopia\Response\Filters\V15 as ResponseV15; use Appwrite\Utopia\Response\Filters\V16 as ResponseV16; use Appwrite\Utopia\Response\Filters\V17 as ResponseV17; use Appwrite\Utopia\View; @@ -400,37 +391,21 @@ App::init() */ $route = $utopia->getRoute(); Request::setRoute($route); + Request::resetFilters(); if ($route === null) { return $response->setStatusCode(404)->send('Not Found'); } - $requestFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', '')); + $requestFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', null)); + if ($requestFormat) { - switch ($requestFormat) { - case version_compare($requestFormat, '0.12.0', '<'): - Request::setFilter(new RequestV12()); - break; - case version_compare($requestFormat, '0.13.0', '<'): - Request::setFilter(new RequestV13()); - break; - case version_compare($requestFormat, '0.14.0', '<'): - Request::setFilter(new RequestV14()); - break; - case version_compare($requestFormat, '0.15.3', '<'): - Request::setFilter(new RequestV15()); - break; - case version_compare($requestFormat, '1.4.0', '<'): - Request::setFilter(new RequestV16()); - break; - case version_compare($requestFormat, '1.5.0', '<'): - Request::setFilter(new RequestV17()); - break; - default: - Request::setFilter(null); + if (version_compare($requestFormat, '1.4.0', '<')) { + Request::addFilter(new RequestV16()); + } + if (version_compare($requestFormat, '1.5.0', '<')) { + Request::addFilter(new RequestV17()); } - } else { - Request::setFilter(null); } $domain = $request->getHostname(); @@ -539,35 +514,16 @@ App::init() /* * Response format */ - $responseFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', '')); + Response::resetFilters(); + + $responseFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', null)); if ($responseFormat) { - switch ($responseFormat) { - case version_compare($responseFormat, '0.11.2', '<='): - Response::setFilter(new ResponseV11()); - break; - case version_compare($responseFormat, '0.12.4', '<='): - Response::setFilter(new ResponseV12()); - break; - case version_compare($responseFormat, '0.13.4', '<='): - Response::setFilter(new ResponseV13()); - break; - case version_compare($responseFormat, '0.14.0', '<='): - Response::setFilter(new ResponseV14()); - break; - case version_compare($responseFormat, '0.15.3', '<='): - Response::setFilter(new ResponseV15()); - break; - case version_compare($responseFormat, '1.4.0', '<'): - Response::setFilter(new ResponseV16()); - break; - case version_compare($responseFormat, '1.5.0', '<'): - Response::setFilter(new ResponseV17()); - break; - default: - Response::setFilter(null); + if (version_compare($responseFormat, '1.4.0', '<')) { + Response::addFilter(new ResponseV16()); + } + if (version_compare($responseFormat, '1.5.0', '<')) { + Response::addFilter(new ResponseV17()); } - } else { - Response::setFilter(null); } /* diff --git a/src/Appwrite/Utopia/Request.php b/src/Appwrite/Utopia/Request.php index 9ad2f6cb7b..af9b136618 100644 --- a/src/Appwrite/Utopia/Request.php +++ b/src/Appwrite/Utopia/Request.php @@ -9,7 +9,11 @@ use Utopia\Swoole\Request as UtopiaRequest; class Request extends UtopiaRequest { - private static ?Filter $filter = null; + /** + * @var array + */ + private static array $filters = []; + private static ?Route $route = null; public function __construct(SwooleRequest $request) @@ -24,35 +28,50 @@ class Request extends UtopiaRequest { $parameters = parent::getParams(); - if (self::hasFilter() && self::hasRoute()) { + if (self::hasFilters() && self::hasRoute()) { $method = self::getRoute()->getLabel('sdk.method', 'unknown'); $endpointIdentifier = self::getRoute()->getLabel('sdk.namespace', 'unknown') . '.' . $method; - $parameters = self::getFilter()->parse($parameters, $endpointIdentifier); + + $parameters = array_reduce( + self::getFilters(), + fn (array $carry, Filter $filter) => $filter->parse($carry, $endpointIdentifier), + $parameters + ); } return $parameters; } /** - * Function to set a response filter + * Function to add a response filter, the order of filters are first in - first out. * - * @param Filter|null $filter Filter the response filter to set + * @param Filter $filter the response filter to set * * @return void */ - public static function setFilter(?Filter $filter): void + public static function addFilter(Filter $filter): void { - self::$filter = $filter; + self::$filters[] = $filter; } /** * Return the currently set filter * - * @return Filter|null + * @return array */ - public static function getFilter(): ?Filter + public static function getFilters(): array { - return self::$filter; + return self::$filters; + } + + /** + * Reset filters + * + * @return void + */ + public static function resetFilters(): void + { + self::$filters = []; } /** @@ -60,9 +79,9 @@ class Request extends UtopiaRequest * * @return bool */ - public static function hasFilter(): bool + public static function hasFilters(): bool { - return self::$filter != null; + return !empty(self::$filters); } /** @@ -94,7 +113,7 @@ class Request extends UtopiaRequest */ public static function hasRoute(): bool { - return self::$route != null; + return self::$route !== null; } /** diff --git a/src/Appwrite/Utopia/Request/Filters/V12.php b/src/Appwrite/Utopia/Request/Filters/V12.php deleted file mode 100644 index 37a5232a14..0000000000 --- a/src/Appwrite/Utopia/Request/Filters/V12.php +++ /dev/null @@ -1,171 +0,0 @@ - Custom IDs - case "account.create": - case "account.createMagicURLSession": - case "users.create": - $content = $this->addId($content, 'userId'); - break; - case "functions.create": - $content = $this->addId($content, 'functionId'); - break; - case "teams.create": - $content = $this->addId($content, 'teamId'); - break; - - // Status integer -> boolean - case "users.updateStatus": - $content = $this->convertStatus($content); - break; - - // Deprecating order type - case "functions.listExecutions": - $content = $this->removeOrderType($content); - break; - - // The rest (more complex) formats - case "database.createDocument": - $content = $this->addId($content, 'documentId'); - $content = $this->removeParentProperties($content); - break; - case "database.listDocuments": - $content = $this->removeOrderCast($content); - $content = $this->convertOrder($content); - $content = $this->convertQueries($content); - break; - case "database.createCollection": - $content = $this->addId($content, 'collectionId'); - $content = $this->removeRules($content); - $content = $this->addCollectionPermissionLevel($content); - break; - case "database.updateCollection": - $content = $this->removeRules($content); - $content = $this->addCollectionPermissionLevel($content); - break; - } - - return $content; - } - - // New parameters - - protected function addId(array $content, string $key): array - { - $content[$key] = 'unique()'; - return $content; - } - - protected function addCollectionPermissionLevel(array $content): array - { - $content['permission'] = 'document'; - return $content; - } - - // Deprecated parameters - - protected function removeRules(array $content): array - { - unset($content['rules']); - return $content; - } - - protected function removeOrderType(array $content): array - { - unset($content['orderType']); - return $content; - } - - protected function removeOrderCast(array $content): array - { - unset($content['orderCast']); - return $content; - } - - protected function removeParentProperties(array $content): array - { - if (isset($content['parentDocument'])) { - unset($content['parentDocument']); - } - if (isset($content['parentProperty'])) { - unset($content['parentProperty']); - } - if (isset($content['parentPropertyType'])) { - unset($content['parentPropertyType']); - } - return $content; - } - - // Modified parameters - - protected function convertStatus(array $content): array - { - if (isset($content['status'])) { - $content['status'] = $content['status'] === 2 ? false : true; - } - return $content; - } - - protected function convertOrder(array $content): array - { - if (isset($content['orderField'])) { - $content['orderAttributes'] = [ $content['orderField'] ]; - unset($content['orderField']); - } - - if (isset($content['orderType'])) { - $content['orderTypes'] = [ $content['orderType'] ]; - unset($content['orderType']); - } - - return $content; - } - - protected function convertQueries(array $content): array - { - $queries = []; - - if (!empty($content['filters'])) { - foreach ($content['filters'] as $filter) { - $operators = ['=' => 'equal', '!=' => 'notEqual', '>' => 'greater', '<' => 'lesser', '<=' => 'lesserEqual', '>=' => 'greaterEqual']; - foreach ($operators as $operator => $operatorVerbose) { - if (\str_contains($filter, $operator)) { - $usedOperator = $operator; - break; - } - } - - if (isset($usedOperator)) { - [ $attributeKey, $filterValue ] = \explode($usedOperator, $filter); - - if ($filterValue === 'true' || $filterValue === 'false') { - // Let's keep it at true and false string, but without "" around - // No action needed - } else { - $filterValue = \is_numeric($filterValue) ? $filterValue : '"' . $filterValue . '"'; - } - - $query = $attributeKey . '.' . $operators[$usedOperator] . '(' . $filterValue . ')'; - \array_push($queries, $query); - } - } - } - - // We cannot migrate search properly - unset($content['search']); - - unset($content['filters']); - $content['queries'] = $queries; - - return $content; - } -} diff --git a/src/Appwrite/Utopia/Request/Filters/V13.php b/src/Appwrite/Utopia/Request/Filters/V13.php deleted file mode 100644 index e1122fdd71..0000000000 --- a/src/Appwrite/Utopia/Request/Filters/V13.php +++ /dev/null @@ -1,38 +0,0 @@ -convertStringToNum($content, "min"); - $content = $this->convertStringToNum($content, "max"); - $content = $this->convertStringToNum($content, "default"); - break; - case "functions.createExecution": - $content = $this->convertExecution($content); - } - - return $content; - } - - private function convertStringToNum($content, $value) - { - $content[$value] = is_null($content[$value]) ? null : (int)$content[$value]; - return $content; - } - - private function convertExecution($content) - { - $content['async'] = true; - return $content; - } -} diff --git a/src/Appwrite/Utopia/Request/Filters/V14.php b/src/Appwrite/Utopia/Request/Filters/V14.php deleted file mode 100644 index f42a351024..0000000000 --- a/src/Appwrite/Utopia/Request/Filters/V14.php +++ /dev/null @@ -1,34 +0,0 @@ -convertEvents($content); - break; - } - - return $content; - } - - private function convertEvents($content) - { - $migration = new MigrationV13(); - - $events = $content['events'] ?? []; - $content['events'] = $migration->migrateEvents($events); - - return $content; - } -} diff --git a/src/Appwrite/Utopia/Request/Filters/V15.php b/src/Appwrite/Utopia/Request/Filters/V15.php deleted file mode 100644 index 52e9c4a72a..0000000000 --- a/src/Appwrite/Utopia/Request/Filters/V15.php +++ /dev/null @@ -1,275 +0,0 @@ -convertLimitAndOffset($content); - break; - case 'account.initials': - unset($content['color']); - break; - case 'databases.list': - case 'databases.listCollections': - case 'functions.list': - case 'functions.listDeployments': - case 'projects.list': - case 'storage.listBuckets': - case 'storage.listFiles': - case 'teams.list': - case 'teams.listMemberships': - case 'users.list': - $content = $this->convertLimitAndOffset($content); - $content = $this->convertCursor($content); - $content = $this->convertOrderType($content); - break; - case 'databases.createCollection': - case 'databases.updateCollection': - $content = $this->convertCollectionPermission($content); - $content = $this->convertReadWrite($content); - break; - case 'databases.createDocument': - case 'databases.updateDocument': - case 'storage.createFile': - case 'storage.updateFile': - $content = $this->convertReadWrite($content); - break; - case 'databases.listDocuments': - $content = $this->convertFilters($content); - $content = $this->convertLimitAndOffset($content); - $content = $this->convertCursor($content); - $content = $this->convertOrders($content); - break; - case 'functions.create': - case 'functions.update': - $content = $this->convertExecute($content); - break; - case 'functions.listExecutions': - $content = $this->convertLimitAndOffset($content); - $content = $this->convertCursor($content); - break; - case 'projects.createKey': - case 'projects.updateKey': - $content = $this->convertExpire($content); - break; - case 'storage.createBucket': - case 'storage.updateBucket': - $content = $this->convertBucketPermission($content); - $content = $this->convertReadWrite($content); - break; - } - - return $content; - } - - protected function convertLimitAndOffset($content) - { - if (isset($content['limit'])) { - $content['queries'][] = 'limit(' . $content['limit'] . ')'; - } - - if (isset($content['offset'])) { - $content['queries'][] = 'offset(' . $content['offset'] . ')'; - } - - unset($content['limit']); - unset($content['offset']); - - return $content; - } - - protected function convertCursor($content) - { - if (isset($content['cursor'])) { - $cursorDirection = $content['cursorDirection'] ?? Database::CURSOR_AFTER; - - if ($cursorDirection === Database::CURSOR_BEFORE) { - $content['queries'][] = 'cursorBefore("' . $content["cursor"] . '")'; - } else { - $content['queries'][] = 'cursorAfter("' . $content["cursor"] . '")'; - } - } - - unset($content['cursor']); - unset($content['cursorDirection']); - - return $content; - } - - protected function convertOrderType($content) - { - if (isset($content['orderType'])) { - if ($content['orderType'] === Database::ORDER_DESC) { - $content['queries'][] = 'orderDesc("")'; - } else { - $content['queries'][] = 'orderAsc("")'; - } - } - unset($content['orderType']); - - return $content; - } - - protected function convertOrders($content) - { - if (isset($content['orderTypes'])) { - foreach ($content['orderTypes'] as $i => $type) { - $attribute = $content['orderAttributes'][$i] ?? ''; - - if ($type === Database::ORDER_DESC) { - $content['queries'][] = 'orderDesc("' . $attribute . '")'; - } else { - $content['queries'][] = 'orderAsc("' . $attribute . '")'; - } - } - } - - unset($content['orderAttributes']); - unset($content['orderTypes']); - - return $content; - } - - protected function convertCollectionPermission($content) - { - if (isset($content['permission'])) { - $content['documentSecurity'] = $content['permission'] === 'document'; - } - - unset($content['permission']); - - return $content; - } - - protected function convertReadWrite($content) - { - if (isset($content['read'])) { - foreach ($content['read'] as $read) { - if ($read === 'role:all') { - $content['permissions'][] = Permission::read(Role::any()); - } elseif ($read === 'role:guest') { - $content['permissions'][] = Permission::read(Role::guests()); - } elseif ($read === 'role:member') { - $content['permissions'][] = Permission::read(Role::users()); - } elseif (str_contains($read, ':')) { - $content['permissions'][] = Permission::read(Role::parse($read)); - } - } - } - - if (isset($content['write'])) { - foreach ($content['write'] as $write) { - if ($write === 'role:all' || $write === 'role:member') { - $content['permissions'][] = Permission::write(Role::users()); - } elseif ($write === 'role:guest') { - // don't add because, historically, - // role:guest for write did nothing - } elseif (str_contains($write, ':')) { - $content['permissions'][] = Permission::write(Role::parse($write)); - } - } - } - - unset($content['read']); - unset($content['write']); - - return $content; - } - - protected function convertFilters($content) - { - if (!isset($content['queries'])) { - return $content; - } - - $operations = [ - 'equal' => Query::TYPE_EQUAL, - 'notEqual' => Query::TYPE_NOT_EQUAL, - 'lesser' => Query::TYPE_LESSER, - 'lesserEqual' => Query::TYPE_LESSER_EQUAL, - 'greater' => Query::TYPE_GREATER, - 'greaterEqual' => Query::TYPE_GREATER_EQUAL, - 'search' => Query::TYPE_SEARCH, - ]; - foreach ($content['queries'] as $i => $query) { - foreach ($operations as $oldOperation => $newOperation) { - $middle = ".$oldOperation("; - if (str_contains($query, $middle)) { - $parts = explode($middle, $query); - if (count($parts) > 1) { - $attribute = $parts[0]; - $value = rtrim($parts[1], ")"); - $content['queries'][$i] = $newOperation . '("' . $attribute . '", [' . $value . '])'; - } - } - } - } - return $content; - } - - protected function convertExecute($content) - { - if (!isset($content['execute'])) { - return $content; - } - - $execute = []; - foreach ($content['execute'] as $role) { - if ($role === 'role:all' || $role === 'role:member') { - $execute[] = Role::users()->toString(); - } elseif ($role === 'role:guest') { - // don't add because, historically, - // role:guest for write did nothing - } elseif (str_contains($role, ':')) { - $execute[] = $role; - } - } - $content['execute'] = $execute; - - return $content; - } - - protected function convertExpire($content) - { - if (!isset($content['expire'])) { - return $content; - } - - $expire = (int) $content['expire']; - - if ($expire === 0) { - $content['expire'] = null; - } else { - $content['expire'] = date(\DateTime::RFC3339_EXTENDED, $expire); - } - - return $content; - } - - protected function convertBucketPermission($content) - { - if (isset($content['permission'])) { - $content['fileSecurity'] = $content['permission'] === 'file'; - } - - unset($content['permission']); - - return $content; - } -} diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 22043b9f26..c570ccfb25 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -299,9 +299,9 @@ class Response extends SwooleResponse public const MODEL_MOCK = 'mock'; /** - * @var Filter + * @var array */ - private static $filter = null; + private static $filters = []; /** * @var array @@ -526,8 +526,8 @@ class Response extends SwooleResponse $output = $this->output(clone $document, $model); // If filter is set, parse the output - if (self::hasFilter()) { - $output = self::getFilter()->parse($output, $model); + foreach (self::$filters as $filter) { + $output = $filter->parse($output, $model); } switch ($this->getContentType()) { @@ -682,15 +682,15 @@ class Response extends SwooleResponse } /** - * Function to set a response filter + * Function to add a response filter, the order of filters are first in - first out. * * @param $filter the response filter to set * * @return void */ - public static function setFilter(?Filter $filter) + public static function addFilter(Filter $filter): void { - self::$filter = $filter; + self::$filters[] = $filter; } /** @@ -698,9 +698,19 @@ class Response extends SwooleResponse * * @return Filter */ - public static function getFilter(): ?Filter + public static function getFilters(): array { - return self::$filter; + return self::$filters; + } + + /** + * Reset filters + * + * @return void + */ + public static function resetFilters(): void + { + self::$filters = []; } /** @@ -708,9 +718,9 @@ class Response extends SwooleResponse * * @return bool */ - public static function hasFilter(): bool + public static function hasFilters(): bool { - return self::$filter != null; + return !empty(self::$filters); } /** diff --git a/src/Appwrite/Utopia/Response/Filter.php b/src/Appwrite/Utopia/Response/Filter.php index 9110abd07a..bd82467f81 100644 --- a/src/Appwrite/Utopia/Response/Filter.php +++ b/src/Appwrite/Utopia/Response/Filter.php @@ -13,4 +13,25 @@ abstract class Filter * @return array */ abstract public function parse(array $content, string $model): array; + + + /** + * Handle list + * + * @param array $content + * @param string $key + * @param callable $callback + * + * @return array + */ + protected function handleList(array $content, string $key, callable $callback): array + { + if (array_key_exists($key, $content) && \is_array($content[$key])) { + foreach ($content[$key] as $i => $item) { + $content[$key][$i] = $callback($item); + } + } + + return $content; + } } diff --git a/src/Appwrite/Utopia/Response/Filters/V11.php b/src/Appwrite/Utopia/Response/Filters/V11.php deleted file mode 100644 index 9d6459915d..0000000000 --- a/src/Appwrite/Utopia/Response/Filters/V11.php +++ /dev/null @@ -1,401 +0,0 @@ -parsePermissions($content); - break; - case Response::MODEL_DOCUMENT_LIST: - $parsedResponse = $this->parseDocumentList($content); - break; - - case Response::MODEL_FILE: - $parsedResponse = $this->parsePermissions($content); - break; - case Response::MODEL_FILE_LIST: - $parsedResponse = $this->parseFileList($content); - break; - - case Response::MODEL_EXECUTION: - $parsedResponse = $this->parseExecutionPermissions($content); - break; - case Response::MODEL_EXECUTION_LIST: - $parsedResponse = $this->parseExecutionsList($content); - break; - - case Response::MODEL_FUNCTION: - $parsedResponse = $this->parseFunctionPermissions($content); - break; - case Response::MODEL_FUNCTION_LIST: - $parsedResponse = $this->parseFunctionsList($content); - break; - - // Convert status from boolean to int - case Response::MODEL_USER: - $parsedResponse = $this->parseStatus($content); - break; - case Response::MODEL_USER_LIST: - $parsedResponse = $this->parseUserList($content); - break; - - // Convert all Health responses back to original - case Response::MODEL_HEALTH_STATUS: - $parsedResponse = $this->parseHealthStatus($content); - break; - case Response::MODEL_HEALTH_VERSION: - $parsedResponse = $this->parseHealthVersion($content); - break; - case Response::MODEL_HEALTH_TIME: - $parsedResponse = $this->parseHealthTime($content); - break; - case Response::MODEL_HEALTH_QUEUE: - $parsedResponse = $this->parseHealthQueue($content); - break; - case Response::MODEL_HEALTH_ANTIVIRUS: - $parsedResponse = $this->parseHealthAntivirus($content); - break; - - // Complex filters - case Response::MODEL_COLLECTION: - $parsedResponse = $this->parseCollection($content); - break; - case Response::MODEL_COLLECTION_LIST: - $parsedResponse = $this->parseCollectionList($content); - break; - - case Response::MODEL_LOG: - $parsedResponse = $this->parseLog($content); - break; - case Response::MODEL_LOG_LIST: - $parsedResponse = $this->parseLogList($content); - break; - - case Response::MODEL_PROJECT: - $parsedResponse = $this->parseProject($content); - break; - case Response::MODEL_PROJECT_LIST: - $parsedResponse = $this->parseProjectList($content); - break; - } - - return $parsedResponse; - } - - protected function parseDocumentList(array $content) - { - $documents = $content['documents']; - $parsedResponse = []; - foreach ($documents as $document) { - $parsedResponse[] = $this->parsePermissions($document); - } - $content['documents'] = $parsedResponse; - return $content; - } - - protected function parseFileList(array $content) - { - $files = $content['files']; - $parsedResponse = []; - foreach ($files as $file) { - $parsedResponse[] = $this->parsePermissions($file); - } - $content['files'] = $parsedResponse; - return $content; - } - - protected function parseExecutionsList(array $content) - { - $executions = $content['executions']; - $parsedResponse = []; - foreach ($executions as $execution) { - $parsedResponse[] = $this->parseExecutionPermissions($execution); - } - $content['executions'] = $parsedResponse; - return $content; - } - - protected function parseFunctionsList(array $content) - { - $functions = $content['functions']; - $parsedResponse = []; - foreach ($functions as $function) { - $parsedResponse[] = $this->parseFunctionPermissions($function); - } - $content['functions'] = $parsedResponse; - return $content; - } - - protected function parseUserList(array $content) - { - $users = $content['users']; - $parsedResponse = []; - foreach ($users as $user) { - $parsedResponse[] = $this->parseStatus($user); - } - $content['users'] = $parsedResponse; - return $content; - } - - protected function parseCollection(array $content) - { - $parsedResponse = []; - $parsedResponse = $this->parsePermissions($content); - $parsedResponse = $this->removeRule($content, 'enabled'); - $parsedResponse = $this->removeRule($content, 'permission'); - $parsedResponse = $this->removeRule($content, 'indexes'); - $parsedResponse = $this->removeRule($content, 'enabled'); - $parsedResponse = $this->addDate($content, 'dateCreated'); - $parsedResponse = $this->addDate($content, 'dateUpdated'); - $parsedResponse = $this->parseAttributes($content); - return $parsedResponse; - } - - protected function parseCollectionList(array $content) - { - $collections = $content['collections']; - $parsedResponse = []; - foreach ($collections as $collection) { - $parsedResponse[] = $this->parseCollection($collection); - } - $content['collections'] = $parsedResponse; - return $content; - } - - protected function parseLog(array $content) - { - $parsedResponse = []; - $parsedResponse = $this->removeRule($content, 'userId'); - $parsedResponse = $this->removeRule($content, 'userEmail'); - $parsedResponse = $this->removeRule($content, 'userName'); - $parsedResponse = $this->removeRule($content, 'mode'); - $parsedResponse = $this->removeRule($content, 'sum'); - return $parsedResponse; - } - - protected function parseLogList(array $content) - { - $logs = $content['logs']; - $parsedResponse = []; - foreach ($logs as $log) { - $parsedResponse[] = $this->parseLog($log); - } - $content['logs'] = $parsedResponse; - return $content; - } - - protected function parseProject(array $content) - { - $parsedResponse = []; - $parsedResponse = $this->addTasks($content); - $parsedResponse = $this->parseAuthLimit($content); - $parsedResponse = $this->parseOAuths($content); - $parsedResponse = $this->parseAuthsStatus($content); - $parsedResponse = $this->removeServicesStatus($content); - return $parsedResponse; - } - - protected function parseProjectList(array $content) - { - $projects = $content['projects']; - $parsedResponse = []; - foreach ($projects as $project) { - $parsedResponse[] = $this->parseProject($project); - } - $content['projects'] = $parsedResponse; - return $content; - } - - protected function parseHealthAntivirus(array $content) - { - if ($content['status'] === 'pass') { - $content['status'] = 'online'; - } - - if ($content['status'] === 'fail') { - $content['status'] = 'offline'; - } - - return $content; - } - - protected function parseHealthTime(array $content) - { - $content['remote'] = $content['remoteTime']; - unset($content['remoteTime']); - - $content['local'] = $content['localTime']; - unset($content['localTime']); - - return $content; - } - - protected function parseHealthVersion(array $content) - { - // Did not change - - return $content; - } - - - protected function parseHealthQueue(array $content) - { - // Did not change - - return $content; - } - - protected function parseHealthStatus(array $content) - { - $content['status'] = 'OK'; // Is always returning pass, was always returning OK - unset($content['ping']); - - return $content; - } - - protected function parseStatus(array $content) - { - $content['status'] = $content['status'] === true ? - $content['emailVerification'] === true ? 1 : 0 - : 2; - - return $content; - } - - protected function parseAttributes(array $content) - { - $content['rules'] = \array_map(function ($attribute) use ($content) { - return [ - '$id' => $attribute['key'], - '$collection' => ID::custom($content['$id']), - 'type' => $attribute['type'], - 'key' => $attribute['key'], - 'label' => $attribute['key'], - 'default' => $attribute['default'], - 'array' => $attribute['array'], - 'required' => $attribute['required'], - 'list' => $attribute['elements'], - ]; - }, $content['attributes']); - unset($content['attributes']); - - return $content; - } - - protected function parseAuthLimit(array $content) - { - $content['usersAuthLimit'] = $content['authLimit']; - unset($content['authLimit']); - - return $content; - } - - protected function parseOAuths(array $content) - { - $regexPattern = "/provider([a-zA-Z0-9]+)(Appid|Secret)/"; - - foreach ($content as $key => $value) { - \preg_match_all($regexPattern, $key, $regexGroups); - if (\count($regexGroups[1]) > 0 && \count($regexGroups[2]) > 0) { - $providerName = $regexGroups[1][0]; - $valueKey = $regexGroups[2][0]; - $content['usersOauth2' . $providerName . $valueKey] = $value; - unset($content['provider' . $providerName . $valueKey]); - } - } - - return $content; - } - - protected function parseAuthsStatus(array $content) - { - $regexPattern = "/auth([a-zA-Z0-9]+)/"; - - foreach ($content as $key => $value) { - \preg_match_all($regexPattern, $key, $regexGroups); - if (\count($regexGroups[1]) > 0) { - $providerName = $regexGroups[1][0]; - - $content[$providerName] = $value; - unset($content['auth' . $providerName]); - } - } - - return $content; - } - - protected function removeServicesStatus(array $content) - { - // Such a key is part of new response, but is not part of old one. We simply remove it, older version never - // expected it anyway. - foreach ($content as $key => $value) { - if (\str_starts_with($key, 'serviceStatusFor')) { - unset($content[$key]); - } - } - - return $content; - } - - protected function removeRule(array $content, $key) - { - // Such a key is part of new response, but is not part of old one. We simply remove it, older version never - // expected it anyway. - unset($content[$key]); - - return $content; - } - - protected function addDate(array $content, $key) - { - // We simply don't have the date available in the content anymore. - // We set it to valid integer that indicates the value is not right - $content[$key] = 0; - - return $content; - } - - protected function addTasks(array $content) - { - // We simply don't have the date available in the content anymore. - // We set it to valid array - $content['tasks'] = []; - - return $content; - } - - protected function parsePermissions(array $content) - { - $content['$permissions'] = [ 'read' => $content['$read'], 'write' => $content['$write'] ]; - unset($content['$read']); - unset($content['$write']); - return $content; - } - - protected function parseFunctionPermissions(array $content) - { - $content['$permissions'] = [ 'execute' => $content['execute'] ]; - unset($content['execute']); - - return $content; - } - - protected function parseExecutionPermissions(array $content) - { - $content['$permissions'] = [ 'read' => $content['$read'] ]; - unset($content['$read']); - - return $content; - } -} diff --git a/src/Appwrite/Utopia/Response/Filters/V12.php b/src/Appwrite/Utopia/Response/Filters/V12.php deleted file mode 100644 index 79d22ad044..0000000000 --- a/src/Appwrite/Utopia/Response/Filters/V12.php +++ /dev/null @@ -1,269 +0,0 @@ -parseError($content); - break; - - case Response::MODEL_SESSION: - $parsedResponse = $this->parseSession($content); - break; - case Response::MODEL_SESSION_LIST: - $parsedResponse = $this->parseSessionList($content); - break; - - case Response::MODEL_FILE: - $parsedResponse = $this->parseFile($content); - break; - case Response::MODEL_FILE_LIST: - $parsedResponse = $this->parseFileList($content); - break; - - case Response::MODEL_FUNCTION: - $parsedResponse = $this->parseFunction($content); - break; - case Response::MODEL_FUNCTION_LIST: - $parsedResponse = $this->parseFunctionList($content); - break; - - case Response::MODEL_DEPLOYMENT: - $parsedResponse = $this->parseDeployment($content); - break; - case Response::MODEL_DEPLOYMENT_LIST: - $parsedResponse = $this->parseDeploymentList($content); - break; - - case Response::MODEL_EXECUTION: - $parsedResponse = $this->parseExecution($content); - break; - case Response::MODEL_EXECUTION_LIST: - $parsedResponse = $this->parseExecutionList($content); - break; - - case Response::MODEL_USAGE_BUCKETS: - $parsedResponse = $this->parseUsageBuckets($content); - break; - - case Response::MODEL_USAGE_STORAGE: - $parsedResponse = $this->parseUsageStorage($content); - break; - - case Response::MODEL_TEAM: - $parsedResponse = $this->parseTeam($content); - break; - case Response::MODEL_TEAM_LIST: - $parsedResponse = $this->parseTeamList($content); - break; - - case Response::MODEL_DOCUMENT_LIST: - case Response::MODEL_COLLECTION_LIST: - case Response::MODEL_INDEX_LIST: - case Response::MODEL_USER_LIST: - case Response::MODEL_LOG_LIST: - case Response::MODEL_BUCKET_LIST: - case Response::MODEL_MEMBERSHIP_LIST: - case Response::MODEL_RUNTIME_LIST: - case Response::MODEL_BUILD_LIST: - case Response::MODEL_PROJECT_LIST: - case Response::MODEL_WEBHOOK_LIST: - case Response::MODEL_KEY_LIST: - case Response::MODEL_PLATFORM_LIST: - case Response::MODEL_DOMAIN_LIST: - case Response::MODEL_COUNTRY_LIST: - case Response::MODEL_CONTINENT_LIST: - case Response::MODEL_LANGUAGE_LIST: - case Response::MODEL_CURRENCY_LIST: - case Response::MODEL_PHONE_LIST: - case Response::MODEL_METRIC_LIST: - case Response::MODEL_ATTRIBUTE_LIST: - $parsedResponse = $this->parseList($content); - break; - } - - return $parsedResponse; - } - - protected function parseError(array $content) - { - unset($content['type']); - return $content; - } - - protected function parseSession(array $content) - { - $content['providerToken'] = $content['providerAccessToken']; - unset($content['providerAccessToken']); - - unset($content['providerAccessTokenExpiry']); - - unset($content['providerRefreshToken']); - - return $content; - } - - protected function parseSessionList(array $content) - { - $sessions = $content['sessions']; - $parsedResponse = []; - foreach ($sessions as $document) { - $parsedResponse[] = $this->parseSession($document); - } - $content['sessions'] = $parsedResponse; - $content['sum'] = $content['total']; - unset($content['total']); - return $content; - } - - protected function parseFile(array $content) - { - unset($content['bucketId']); - unset($content['chunksTotal']); - unset($content['chunksUploaded']); - - return $content; - } - - protected function parseFileList(array $content) - { - $files = $content['files']; - $parsedResponse = []; - foreach ($files as $document) { - $parsedResponse[] = $this->parseFile($document); - } - $content['files'] = $parsedResponse; - $content['sum'] = $content['total']; - unset($content['total']); - return $content; - } - - protected function parseFunction(array $content) - { - $content['tag'] = $content['deployment']; - unset($content['deployment']); - return $content; - } - - protected function parseFunctionList(array $content) - { - $functions = $content['functions']; - $parsedResponse = []; - foreach ($functions as $document) { - $parsedResponse[] = $this->parseFunction($document); - } - $content['functions'] = $parsedResponse; - $content['sum'] = $content['total']; - unset($content['total']); - return $content; - } - - protected function parseDeployment(array $content) - { - $content['functionId'] = $content['resourceId']; - $content['command'] = $content['entrypoint']; - return $content; - } - - protected function parseDeploymentList(array $content) - { - $deployments = $content['deployments']; - $parsedResponse = []; - foreach ($deployments as $document) { - $parsedResponse[] = $this->parseDeployment($document); - } - $content['deployments'] = $parsedResponse; - $content['sum'] = $content['total']; - unset($content['total']); - return $content; - } - - protected function parseUsageBuckets(array $content) - { - unset($content['filesStorage']); - return $content; - } - - protected function parseUsageStorage(array $content) - { - $content['storage'] = $content['filesStorage']; - unset($content['filesStorage']); - - $content['files'] = $content['tagsStorage']; - unset($content['tagsStorage']); - - unset($content['filesCount']); - unset($content['bucketsCount']); - unset($content['bucketsCreate']); - unset($content['bucketsRead']); - unset($content['bucketsUpdate']); - unset($content['bucketsDelete']); - unset($content['filesCount']); - unset($content['bucketsDelete']); - unset($content['filesCreate']); - unset($content['filesRead']); - unset($content['filesUpdate']); - unset($content['filesDelete']); - - return $content; - } - - protected function parseExecution($content) - { - $content['exitCode'] = $content['statusCode']; - unset($content['statusCode']); - - return $content; - } - - protected function parseExecutionList($content) - { - $executions = $content['executions']; - $parsedResponse = []; - foreach ($executions as $document) { - $parsedResponse[] = $this->parseExecution($document); - } - $content['executions'] = $parsedResponse; - $content['sum'] = $content['total']; - unset($content['total']); - return $content; - } - - protected function parseTeam($content) - { - $content['sum'] = $content['total']; - unset($content['total']); - return $content; - } - - protected function parseTeamList($content) - { - $teams = $content['teams']; - $parsedResponse = []; - foreach ($teams as $document) { - $parsedResponse[] = $this->parseTeam($document); - } - $content['teams'] = $parsedResponse; - $content['sum'] = $content['total']; - unset($content['total']); - return $content; - } - - protected function parseList($content) - { - $content['sum'] = $content['total']; - unset($content['total']); - return $content; - } -} diff --git a/src/Appwrite/Utopia/Response/Filters/V13.php b/src/Appwrite/Utopia/Response/Filters/V13.php deleted file mode 100644 index 04f9782915..0000000000 --- a/src/Appwrite/Utopia/Response/Filters/V13.php +++ /dev/null @@ -1,103 +0,0 @@ -parseProject($content); - break; - - case Response::MODEL_PROJECT_LIST: - $parsedResponse = $this->parseProjectList($content); - break; - - case Response::MODEL_MEMBERSHIP: - $parsedResponse = $this->parseMembership($content); - break; - case Response::MODEL_MEMBERSHIP_LIST: - $parsedResponse = $this->parseMembershipList($content); - break; - - case Response::MODEL_EXECUTION: - $parsedResponse = $this->parseExecution($content); - break; - case Response::MODEL_EXECUTION_LIST: - $parsedResponse = $this->parseExecutionList($content); - break; - } - - return $parsedResponse; - } - - protected function parseExecution($content) - { - $content['stdout'] = $content['response']; - unset($content['response']); - - return $content; - } - - protected function parseExecutionList($content) - { - $executions = $content['executions']; - $parsedResponse = []; - foreach ($executions as $document) { - $parsedResponse[] = $this->parseExecution($document); - } - $content['executions'] = $parsedResponse; - return $content; - } - - protected function parseProject($content) - { - $content['providers'] = $content['oAuthProviders']; - unset($content['oAuthProviders']); - - return $content; - } - - protected function parseProjectList($content) - { - $projects = $content['projects']; - $parsedResponse = []; - foreach ($projects as $document) { - $parsedResponse[] = $this->parseProject($document); - } - $content['projects'] = $parsedResponse; - return $content; - } - - protected function parseMembership($content) - { - $content['name'] = $content['userName']; - unset($content['userName']); - - $content['email'] = $content['userEmail']; - unset($content['userEmail']); - - unset($content['teamName']); - - return $content; - } - - protected function parseMembershipList($content) - { - $memberships = $content['memberships']; - $parsedResponse = []; - foreach ($memberships as $document) { - $parsedResponse[] = $this->parseMembership($document); - } - $content['memberships'] = $parsedResponse; - return $content; - } -} diff --git a/src/Appwrite/Utopia/Response/Filters/V14.php b/src/Appwrite/Utopia/Response/Filters/V14.php deleted file mode 100644 index 200823f37f..0000000000 --- a/src/Appwrite/Utopia/Response/Filters/V14.php +++ /dev/null @@ -1,176 +0,0 @@ -parseRemoveAttributes($content, ['$createdAt']); - - break; - case Response::MODEL_SESSION_LIST: - $parsedResponse = $this->parseRemoveAttributesList($content, 'domains', ['$createdAt']); - - break; - case Response::MODEL_DOCUMENT: - case Response::MODEL_DOMAIN: - case Response::MODEL_FUNCTION: - case Response::MODEL_TEAM: - case Response::MODEL_MEMBERSHIP: - case Response::MODEL_PLATFORM: - case Response::MODEL_PROJECT: - case Response::MODEL_USER: - case Response::MODEL_WEBHOOK: - $parsedResponse = $this->parseRemoveAttributes($content, ['$createdAt', '$updatedAt']); - - break; - case Response::MODEL_DOCUMENT_LIST: - $parsedResponse = $this->parseRemoveAttributesList($content, 'documents', ['$createdAt', '$updatedAt']); - - break; - case Response::MODEL_DOMAIN_LIST: - $parsedResponse = $this->parseRemoveAttributesList($content, 'domains', ['$createdAt', '$updatedAt']); - - break; - case Response::MODEL_FUNCTION_LIST: - $parsedResponse = $this->parseRemoveAttributesList($content, 'functions', ['$createdAt', '$updatedAt']); - - break; - case Response::MODEL_TEAM_LIST: - $parsedResponse = $this->parseRemoveAttributesList($content, 'teams', ['$createdAt', '$updatedAt']); - - break; - case Response::MODEL_MEMBERSHIP_LIST: - $parsedResponse = $this->parseRemoveAttributesList($content, 'memberships', ['$createdAt', '$updatedAt']); - - break; - case Response::MODEL_PLATFORM_LIST: - $parsedResponse = $this->parseRemoveAttributesList($content, 'platforms', ['$createdAt', '$updatedAt']); - - break; - case Response::MODEL_PROJECT_LIST: - $parsedResponse = $this->parseRemoveAttributesList($content, 'projects', ['$createdAt', '$updatedAt']); - - break; - case Response::MODEL_USER_LIST: - $parsedResponse = $this->parseRemoveAttributesList($content, 'users', ['$createdAt', '$updatedAt']); - - break; - case Response::MODEL_WEBHOOK_LIST: - $parsedResponse = $this->parseRemoveAttributesList($content, 'webhooks', ['$createdAt', '$updatedAt']); - - break; - case Response::MODEL_TEAM: - case Response::MODEL_EXECUTION: - case Response::MODEL_FILE: - $parsedResponse = $this->parseCreatedAt($content); - break; - - case Response::MODEL_TEAM_LIST: - $parsedResponse = $this->parseCreatedAtList($content, 'teams'); - break; - - case Response::MODEL_EXECUTION_LIST: - $parsedResponse = $this->parseCreatedAtList($content, 'executions'); - break; - - case Response::MODEL_FILE_LIST: - $parsedResponse = $this->parseCreatedAtList($content, 'files'); - break; - - case Response::MODEL_FUNCTION: - case Response::MODEL_DEPLOYMENT: - case Response::MODEL_BUCKET: - $parsedResponse = $this->parseCreatedAtAndUpdatedAt($content); - break; - - case Response::MODEL_FUNCTION_LIST: - $parsedResponse = $this->parseCreatedAtAndUpdatedAtList($content, 'functions'); - break; - - case Response::MODEL_DEPLOYMENT_LIST: - $parsedResponse = $this->parseCreatedAtAndUpdatedAtList($content, 'deployments'); - break; - - case Response::MODEL_BUCKET_LIST: - $parsedResponse = $this->parseCreatedAtAndUpdatedAtList($content, 'buckets'); - break; - } - - return $parsedResponse; - } - - protected function parseRemoveAttributes(array $content, array $attributes) - { - foreach ($attributes as $attribute) { - unset($content[$attribute]); - } - - return $content; - } - - protected function parseRemoveAttributesList(array $content, string $property, array $attributes) - { - $documents = $content[$property]; - $parsedResponse = []; - foreach ($documents as $document) { - $parsedResponse[] = $this->parseRemoveAttributes($document, $attributes); - } - $content[$property] = $parsedResponse; - - return $content; - } - - protected function parseCreatedAt(array $content) - { - $content['dateCreated'] = $content['$createdAt']; - unset($content['$createdAt']); - unset($content['$updatedAt']); - - return $content; - } - - protected function parseCreatedAtList(array $content, string $property) - { - $documents = $content[$property]; - $parsedResponse = []; - foreach ($documents as $document) { - $parsedResponse[] = $this->parseCreatedAt($document); - } - $content[$property] = $parsedResponse; - - return $content; - } - - protected function parseCreatedAtAndUpdatedAt(array $content) - { - $content['dateCreated'] = $content['$createdAt']; - $content['dateUpdated'] = $content['$updatedAt']; - unset($content['$createdAt']); - unset($content['$updatedAt']); - - return $content; - } - - protected function parseCreatedAtAndUpdatedAtList(array $content, string $property) - { - $documents = $content[$property]; - $parsedResponse = []; - foreach ($documents as $document) { - $parsedResponse[] = $this->parseCreatedAtAndUpdatedAt($document); - } - $content[$property] = $parsedResponse; - - return $content; - } -} diff --git a/src/Appwrite/Utopia/Response/Filters/V15.php b/src/Appwrite/Utopia/Response/Filters/V15.php deleted file mode 100644 index 232feec201..0000000000 --- a/src/Appwrite/Utopia/Response/Filters/V15.php +++ /dev/null @@ -1,591 +0,0 @@ -parseUser($parsedResponse); - break; - case Response::MODEL_USER_LIST: - $listKey = 'users'; - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parseUser($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_METRIC: - $parsedResponse = $this->parseMetric($parsedResponse); - break; - case Response::MODEL_BUILD: - $parsedResponse = $this->parseBuild($parsedResponse); - break; - case Response::MODEL_BUILD_LIST: - $listKey = 'builds'; - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parseBuild($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_BUCKET: - $parsedResponse = $this->parseBucket($parsedResponse); - break; - case Response::MODEL_BUCKET_LIST: - $listKey = 'buckets'; - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parseBucket($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_COLLECTION: - $parsedResponse = $this->parseCollection($parsedResponse); - break; - case Response::MODEL_COLLECTION_LIST: - $listKey = 'collections'; - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parseCollection($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_DATABASE: - case Response::MODEL_DEPLOYMENT: - case Response::MODEL_DOMAIN: - case Response::MODEL_PLATFORM: - case Response::MODEL_PROJECT: - case Response::MODEL_TEAM: - case Response::MODEL_WEBHOOK: - $parsedResponse = $this->parseCreatedAtUpdatedAt($parsedResponse); - break; - case Response::MODEL_DATABASE_LIST: - case Response::MODEL_DEPLOYMENT_LIST: - case Response::MODEL_DOMAIN_LIST: - case Response::MODEL_PLATFORM_LIST: - case Response::MODEL_PROJECT_LIST: - case Response::MODEL_TEAM_LIST: - case Response::MODEL_WEBHOOK_LIST: - $listKey = ''; - switch ($model) { - case Response::MODEL_DATABASE_LIST: - $listKey = 'databases'; - break; - case Response::MODEL_DEPLOYMENT_LIST: - $listKey = 'deployments'; - break; - case Response::MODEL_DOMAIN_LIST: - $listKey = 'domains'; - break; - case Response::MODEL_PLATFORM_LIST: - $listKey = 'platforms'; - break; - case Response::MODEL_PROJECT_LIST: - $listKey = 'projects'; - break; - case Response::MODEL_TEAM_LIST: - $listKey = 'teams'; - break; - case Response::MODEL_WEBHOOK_LIST: - $listKey = 'webhooks'; - break; - } - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parseCreatedAtUpdatedAt($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_DOCUMENT: - $parsedResponse = $this->parseDocument($parsedResponse); - break; - case Response::MODEL_FILE: - $parsedResponse = $this->parsePermissionsCreatedAtUpdatedAt($parsedResponse); - break; - case Response::MODEL_DOCUMENT_LIST: - $listKey = 'documents'; - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parseDocument($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_FILE_LIST: - $listKey = 'files'; - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parsePermissionsCreatedAtUpdatedAt($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_EXECUTION: - $parsedResponse = $this->parseExecution($parsedResponse); - break; - case Response::MODEL_EXECUTION_LIST: - $listKey = 'executions'; - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parseExecution($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_FUNCTION: - $parsedResponse = $this->parseFunction($parsedResponse); - break; - case Response::MODEL_FUNCTION_LIST: - $listKey = 'functions'; - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parseFunction($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_KEY: - $parsedResponse = $this->parseKey($parsedResponse); - break; - case Response::MODEL_KEY_LIST: - $listKey = 'keys'; - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parseKey($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_LOG: - $parsedResponse = $this->parseLog($parsedResponse); - break; - case Response::MODEL_LOG_LIST: - $listKey = 'logs'; - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parseLog($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_MEMBERSHIP: - $parsedResponse = $this->parseMembership($parsedResponse); - break; - case Response::MODEL_MEMBERSHIP_LIST: - $listKey = 'memberships'; - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parseMembership($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_SESSION: - $parsedResponse = $this->parseSession($parsedResponse); - break; - case Response::MODEL_SESSION_LIST: - $listKey = 'sessions'; - $parsedResponse[$listKey] = array_map(fn ($content) => $this->parseSession($content), $parsedResponse[$listKey]); - break; - case Response::MODEL_TOKEN: - $parsedResponse = $this->parseDatetimeAttributes($parsedResponse, ['$createdAt', 'expire']); - break; - case Response::MODEL_USAGE_DATABASES: - $parsedResponse = $this->parseUsageDatabases($parsedResponse); - break; - case Response::MODEL_USAGE_DATABASE: - $parsedResponse = $this->parseUsageDatabase($parsedResponse); - break; - case Response::MODEL_USAGE_COLLECTION: - $parsedResponse = $this->parseUsageCollection($parsedResponse); - break; - case Response::MODEL_USAGE_USERS: - $parsedResponse = $this->parseUsageUsers($parsedResponse); - break; - case Response::MODEL_USAGE_BUCKETS: - $parsedResponse = $this->parseUsageBuckets($parsedResponse); - break; - case Response::MODEL_USAGE_FUNCTIONS: - $parsedResponse = $this->parseUsageFuncs($parsedResponse); - break; - case Response::MODEL_USAGE_PROJECT: - $parsedResponse = $this->parseUsageProject($parsedResponse); - break; - case Response::MODEL_USAGE_STORAGE: - $parsedResponse = $this->parseUsageStorage($parsedResponse); - break; - } - - return $parsedResponse; - } - - protected function parseBuild(array $content) - { - $content = $this->parseDatetimeAttributes($content, ['startTime', 'endTime']); - - return $content; - } - - protected function parseBucket(array $content) - { - if (isset($content['fileSecurity'])) { - if ($content['fileSecurity']) { - $content['permission'] = 'file'; - } else { - $content['permission'] = 'bucket'; - } - } - - unset($content['fileSecurity']); - unset($content['compression']); - - $content = $this->parsePermissions($content); - $content = $this->parseDatetimeAttributes($content, ['$createdAt', '$updatedAt']); - - return $content; - } - - protected function parseDatetimeAttributes(array $content, array $attributes): array - { - foreach ($attributes as $attribute) { - if (array_key_exists($attribute, $content)) { - if (empty($content[$attribute])) { - $content[$attribute] = 0; - continue; - } - $content[$attribute] = strtotime($content[$attribute]); - } - } - return $content; - } - - protected function parseUser(array $content): array - { - unset($content['password']); - unset($content['hash']); - unset($content['hashOptions']); - - $content = $this->parseDatetimeAttributes($content, ['registration', 'passwordUpdate', '$createdAt', '$updatedAt']); - return $content; - } - - protected function parseMetric(array $content) - { - $content = $this->parseDatetimeAttributes($content, ['date']); - return $content; - } - - protected function parsePermissions(array $content) - { - if (!isset($content['$permissions'])) { - return $content; - } - - $read = []; - $write = []; - - // downgrade the permissions - foreach ($content['$permissions'] as $permission) { - $permission = Permission::parse($permission); - $permission_value = $permission->getRole(); - if ($permission->getIdentifier()) { - $permission_value .= ':' . $permission->getIdentifier(); - } - if ($permission->getDimension()) { - $permission_value .= '/' . $permission->getDimension(); - } - - // Old type permissions meant that 'write' is equivalent to 'create', 'update' and 'delete' - switch ($permission->getPermission()) { - case Database::PERMISSION_UPDATE: - case Database::PERMISSION_DELETE: - case Database::PERMISSION_WRITE: - case Database::PERMISSION_CREATE: - $write[$this->parseRole($permission_value)] = true; - break; - case Database::PERMISSION_READ: - $read[$this->parseRole($permission_value)] = true; - break; - } - } - - $content['$read'] = array_keys($read); - $content['$write'] = array_keys($write); - - unset($content['$permissions']); - - return $content; - } - - protected function parseRole(string $role) - { - switch ($role) { - case Role::any()->toString(): - return 'role:all'; - case Role::users()->toString(): - return 'role:member'; - case Role::guests()->toString(): - return 'role:guest'; - default: - return $role; - } - - return $role; - } - - protected function parseCollection(array $content) - { - if (isset($content['documentSecurity'])) { - if ($content['documentSecurity']) { - $content['permission'] = 'document'; - } else { - $content['permission'] = 'collection'; - } - } - - unset($content['documentSecurity']); - $content = $this->parsePermissions($content); - $content = $this->parseDatetimeAttributes($content, ['$createdAt', '$updatedAt']); - return $content; - } - - protected function parsePermissionsCreatedAtUpdatedAt(array $content) - { - $content = $this->parsePermissions($content); - $content = $this->parseDatetimeAttributes($content, ['$createdAt', '$updatedAt']); - return $content; - } - - protected function parseDocument(array $content) - { - if (isset($content['$collectionId'])) { - $content['$collection'] = $content['$collectionId']; - unset($content['$collectionId']); - } - - unset($content['$databaseId']); - - $content = $this->parsePermissionsCreatedAtUpdatedAt($content); - return $content; - } - - private function parseExecution($content) - { - unset($content['stdout']); - - if (isset($content['$permissions'])) { - $read = []; - foreach ($content['$permissions'] as $role) { - $read[] = $this->parseRole($role); - } - $content['$read'] = $read; - unset($content['$permissions']); - } - - if (isset($content['duration'])) { - $content['time'] = $content['duration']; - unset($content['duration']); - } - - $content = $this->parseDatetimeAttributes($content, ['$createdAt', '$updatedAt']); - - return $content; - } - - private function parseCreatedAtUpdatedAt($content) - { - $content = $this->parseDatetimeAttributes($content, ['$createdAt', '$updatedAt']); - return $content; - } - - private function parseFunction($content) - { - if (isset($content['execute'])) { - foreach ($content['execute'] as $i => $role) { - $content['execute'][$i] = $this->parseRole($role); - } - } - - if (isset($content['vars'])) { - $vars = []; - foreach ($content['vars'] as $i => $var) { - $vars[$var['key']] = $var['value']; - } - $content['vars'] = $vars; - } - - if (isset($content['enabled'])) { - $content['status'] = $content['enabled'] ? 'enabled' : 'disabled'; - unset($content['enabled']); - } - - $content = $this->parseDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'scheduleNext', 'schedulePrevious']); - - return $content; - } - - private function parseKey($content) - { - $content = $this->parseDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'expire']); - return $content; - } - - private function parseLog($content) - { - $content = $this->parseDatetimeAttributes($content, ['time']); - return $content; - } - - private function parseMembership($content) - { - $content = $this->parseDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'invited', 'joined']); - return $content; - } - - private function parseSession($content) - { - $content = $this->parseDatetimeAttributes($content, ['$createdAt', 'expire', 'providerAccessTokenExpiry']); - return $content; - } - - private function parseUsage($content, $keys) - { - foreach ($keys as $key) { - $data = []; - foreach ($content[$key] as $metric) { - $data[] = $this->parseMetric($metric); - } - $content[$key] = $data; - } - - return $content; - } - - private function parseUsageDatabases($content) - { - $keys = [ - 'databasesCount', - 'documentsCount', - 'collectionsCount', - 'databasesCreate', - 'databasesRead', - 'databasesUpdate', - 'databasesDelete', - 'documentsCreate', - 'documentsRead', - 'documentsUpdate', - 'documentsDelete', - 'collectionsCreate', - 'collectionsRead', - 'collectionsUpdate', - 'collectionsDelete', - ]; - - $content = $this->parseUsage($content, $keys); - - return $content; - } - - private function parseUsageDatabase($content) - { - $keys = [ - 'documentsCount', - 'collectionsCount', - 'documentsCreate', - 'documentsRead', - 'documentsUpdate', - 'documentsDelete', - 'collectionsCreate', - 'collectionsRead', - 'collectionsUpdate', - 'collectionsDelete', - ]; - - $content = $this->parseUsage($content, $keys); - - return $content; - } - - private function parseUsageCollection($content) - { - $keys = [ - 'documentsCount', - 'documentsCreate', - 'documentsRead', - 'documentsUpdate', - 'documentsDelete', - ]; - - $content = $this->parseUsage($content, $keys); - - return $content; - } - - private function parseUsageUsers($content) - { - $keys = [ - 'usersCount', - 'usersCreate', - 'usersRead', - 'usersUpdate', - 'usersDelete', - 'sessionsCreate', - 'sessionsProviderCreate', - 'sessionsDelete', - ]; - - $content = $this->parseUsage($content, $keys); - - return $content; - } - - private function parseUsageBuckets($content) - { - $keys = [ - 'filesCount', - 'filesStorage', - 'filesCreate', - 'filesRead', - 'filesUpdate', - 'filesDelete', - ]; - - $content = $this->parseUsage($content, $keys); - - return $content; - } - - private function parseUsageFuncs($content) - { - $mapping = [ - 'executionsTotal' => 'functionsExecutions', - 'executionsFailure' => 'functionsFailures', - 'executionsTime' => 'functionsCompute', - ]; - - foreach ($mapping as $new => $old) { - if (isset($content[$new])) { - $data = []; - foreach ($content[$new] as $metric) { - $data[] = $this->parseMetric($metric); - } - $content[$old] = $data; - unset($content[$new]); - } - } - - unset($content['functionExecutions']); - unset($content['functionFailure']); - unset($content['executionsTime']); - unset($content['buildsTotal']); - unset($content['executionsSuccess']); - unset($content['buildsFailure']); - unset($content['buildsSuccess']); - unset($content['buildsTime']); - - return $content; - } - - private function parseUsageProject($content) - { - $content['functions'] = $content['executions']; - unset($content['executions']); - - $keys = [ - 'collections', - 'documents', - 'functions', - 'network', - 'requests', - 'storage', - 'users', - ]; - - $content = $this->parseUsage($content, $keys); - - return $content; - } - - private function parseUsageStorage($content) - { - $content['filesStorage'] = $content['storage']; - unset($content['storage']); - - $keys = [ - 'bucketsCount', - 'bucketsCreate', - 'bucketsDelete', - 'bucketsRead', - 'bucketsUpdate', - 'filesCount', - 'filesCreate', - 'filesDelete', - 'filesRead', - 'filesStorage', - 'filesUpdate', - ]; - - $content = $this->parseUsage($content, $keys); - - return $content; - } -} diff --git a/src/Appwrite/Utopia/Response/Filters/V16.php b/src/Appwrite/Utopia/Response/Filters/V16.php index 609f118f6e..0d04ac8b97 100644 --- a/src/Appwrite/Utopia/Response/Filters/V16.php +++ b/src/Appwrite/Utopia/Response/Filters/V16.php @@ -14,27 +14,19 @@ class V16 extends Filter { $parsedResponse = $content; - switch ($model) { - case Response::MODEL_DEPLOYMENT: - $parsedResponse = $this->parseDeployment($parsedResponse); - break; - case Response::MODEL_PROXY_RULE: - // We won't be supporting the domain endpoints for older SDKs - // since these APIs are internal. As such, no filtering required - break; - case Response::MODEL_EXECUTION: - $parsedResponse = $this->parseExecution($parsedResponse); - break; - case Response::MODEL_FUNCTION: - $parsedResponse = $this->parseFunction($parsedResponse); - break; - case Response::MODEL_PROJECT: - $parsedResponse = $this->parseProject($parsedResponse); - break; - case Response::MODEL_VARIABLE: - $parsedResponse = $this->parseVariable($parsedResponse); - break; - } + $parsedResponse = match($model) { + Response::MODEL_DEPLOYMENT => $this->parseDeployment($parsedResponse), + Response::MODEL_DEPLOYMENT_LIST => $this->handleList($content, 'deployments', fn ($item) => $this->parseDeployment($item)), + Response::MODEL_EXECUTION => $this->parseExecution($parsedResponse), + Response::MODEL_EXECUTION_LIST => $this->handleList($content, 'executions', fn ($item) => $this->parseExecution($item)), + Response::MODEL_FUNCTION => $this->parseFunction($parsedResponse), + Response::MODEL_FUNCTION_LIST => $this->handleList($content, 'functions', fn ($item) => $this->parseFunction($item)), + Response::MODEL_PROJECT => $this->parseProject($parsedResponse), + Response::MODEL_PROJECT_LIST => $this->handleList($content, 'projects', fn ($item) => $this->parseProject($item)), + Response::MODEL_VARIABLE => $this->parseVariable($parsedResponse), + Response::MODEL_VARIABLE_LIST => $this->handleList($content, 'variables', fn ($item) => $this->parseVariable($item)), + default => $parsedResponse, + }; return $parsedResponse; } diff --git a/src/Appwrite/Utopia/Response/Filters/V17.php b/src/Appwrite/Utopia/Response/Filters/V17.php index 75fff719cc..75821de160 100644 --- a/src/Appwrite/Utopia/Response/Filters/V17.php +++ b/src/Appwrite/Utopia/Response/Filters/V17.php @@ -12,26 +12,20 @@ class V17 extends Filter { $parsedResponse = $content; - switch ($model) { - case Response::MODEL_PROJECT: - $parsedResponse = $this->parseProject($parsedResponse); - break; - case Response::MODEL_USER: - $parsedResponse = $this->parseUser($parsedResponse); - break; - case Response::MODEL_TOKEN: - $parsedResponse = $this->parseToken($parsedResponse); - break; - case Response::MODEL_MEMBERSHIP: - $parsedResponse = $this->parseMembership($parsedResponse); - break; - case Response::MODEL_SESSION: - $parsedResponse = $this->parseSession($parsedResponse); - break; - case Response::MODEL_WEBHOOK: - $parsedResponse = $this->parseWebhook($parsedResponse); - break; - } + $parsedResponse = match($model) { + Response::MODEL_PROJECT => $this->parseProject($parsedResponse), + Response::MODEL_PROJECT_LIST => $this->handleList($content, 'projects', fn ($item) => $this->parseProject($item)), + Response::MODEL_USER => $this->parseUser($parsedResponse), + Response::MODEL_USER_LIST => $this->handleList($content, 'users', fn ($item) => $this->parseUser($item)), + Response::MODEL_MEMBERSHIP => $this->parseMembership($parsedResponse), + Response::MODEL_MEMBERSHIP_LIST => $this->handleList($content, 'memberships', fn ($item) => $this->parseMembership($item)), + Response::MODEL_SESSION => $this->parseSession($parsedResponse), + Response::MODEL_SESSION_LIST => $this->handleList($content, 'sessions', fn ($item) => $this->parseSession($item)), + Response::MODEL_WEBHOOK => $this->parseWebhook($parsedResponse), + Response::MODEL_WEBHOOK_LIST => $this->handleList($content, 'webhooks', fn ($item) => $this->parseWebhook($item)), + Response::MODEL_TOKEN => $this->parseToken($parsedResponse), + default => $parsedResponse, + }; return $parsedResponse; }