1
0
Fork 0
mirror of synced 2024-07-01 20:50:49 +12:00

Continue working on response filters

This commit is contained in:
Bradley Schofield 2022-08-17 14:08:09 +01:00
parent 407c150631
commit 80ff661aeb
3 changed files with 96 additions and 39 deletions

View file

@ -30,6 +30,7 @@ use Utopia\Validator\Hostname;
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 Utopia\Validator\Text;
Config::setParam('domainVerification', false);
@ -65,6 +66,9 @@ App::init()
case version_compare($requestFormat, '0.14.0', '<'):
Request::setFilter(new RequestV14());
break;
case version_compare($requestFormat, '0.15.0', '<'):
Request::setFilter(new RequestV15());
break;
default:
Request::setFilter(null);
}

View file

@ -0,0 +1,18 @@
<?php
namespace Appwrite\Utopia\Request\Filters;
use Appwrite\Utopia\Request\Filter;
class V15 extends Filter
{
// Convert 0.15 params format to 0.16 format
public function parse(array $content, string $model): array
{
switch ($model) {
}
return $content;
}
}

View file

@ -13,52 +13,86 @@ class V15 extends Filter
$parsedResponse = $content;
switch ($model) {
case Response::MODEL_SESSION:
case Response::MODEL_TOKEN:
case Response::MODEL_SESSION_LIST:
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:
case Response::MODEL_DOCUMENT_LIST:
case Response::MODEL_DOMAIN_LIST:
case Response::MODEL_FUNCTION_LIST:
case Response::MODEL_TEAM_LIST:
case Response::MODEL_MEMBERSHIP_LIST:
case Response::MODEL_PLATFORM_LIST:
case Response::MODEL_PROJECT_LIST:
case Response::MODEL_USER_LIST:
case Response::MODEL_WEBHOOK_LIST:
case Response::MODEL_TEAM:
case Response::MODEL_EXECUTION:
case Response::MODEL_FILE:
case Response::MODEL_TEAM_LIST:
case Response::MODEL_EXECUTION_LIST:
case Response::MODEL_FILE_LIST:
case Response::MODEL_FUNCTION:
case Response::MODEL_DEPLOYMENT:
case Response::MODEL_BUCKET:
case Response::MODEL_FUNCTION_LIST:
case Response::MODEL_DEPLOYMENT_LIST:
case Response::MODEL_BUCKET_LIST:
$parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'registration', 'passwordUpdate']);
$parsedResponse = $this->handleUser($parsedResponse);
break;
case Response::MODEL_METRIC:
$parsedResponse = $this->handleMetricAttributes($content);
break;
case Response::MODEL_BUILD:
$parsedResponse = $this->handleDatetimeAttributes($content, ['startTime', 'endTime']);
break;
case Response::MODEL_BUCKET:
case Response::MODEL_COLLECTION:
case Response::MODEL_DEPLOYMENT:
case Response::MODEL_DOCUMENT:
case Response::MODEL_EXECUTION:
case Response::MODEL_PLATFORM:
case Response::MODEL_PROJECT:
case Response::MODEL_TEAM:
case Response::MODEL_FILE:
case Response::MODEL_WEBHOOK:
$parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', '$updatedAt']);
break;
case Response::MODEL_FUNCTION:
$parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'scheduleNext', 'schedulePrevious']);
break;
case Response::MODEL_KEY:
$parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'expire']);
break;
case Response::MODEL_LOG:
$parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'time']);
break;
case Response::MODEL_MEMBERSHIP:
$parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', '$updatedAt', 'invited', 'joined']);
break;
case Response::MODEL_SESSION:
$parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', 'expire', 'providerAccessTokenExpiry']);
break;
case Response::MODEL_TOKEN:
$parsedResponse = $this->handleDatetimeAttributes($content, ['$createdAt', 'expire']);
break;
}
// Downgrade Permissions for all models
$parsedResponse = $this->handleDowngradePermissions($parsedResponse);
return $parsedResponse;
}
protected function handleDatetimeAttributes(array $content, array $attributes): array
{
foreach ($attributes as $attribute) {
if (isset($content[$attribute])) {
$content[$attribute] = strtotime($content[$attribute]);
}
}
return $content;
}
protected function handleUser(array $content): array
{
unset($content['password']);
return $content;
}
protected function handleMetricAttributes(array $content)
{
$content['timestamp'] = $content['date'];
unset($content['date']);
}
protected function handleDowngradePermissions(array $content)
{
if (!isset($content['$permissions'])) {
return $content;
}
$content = array_merge($content, $this->downgradePermissions($content['permissions']));
unset($content['permissions']);
return $content;
}
protected function downgradePermissionSelector(string $permSelector)
{
switch ($permSelector)
@ -77,8 +111,8 @@ class V15 extends Filter
protected function downgradePermissions(array $permissions)
{
$result = [
'read' => [],
'write' => []
'$read' => [],
'$write' => []
];
$splitPermissions = [];
@ -92,7 +126,8 @@ class V15 extends Filter
// downgrade the permissions
foreach ($permissions as $permission) {
// permission = "read('any')" = ["read" => "role:all"]
//TODO: Replace with Permission class
// permission = "read('any')" = ["$read" => "role:all"]
$permission_type = explode('(', $permission)[0];
$permission_value = explode(')', explode('(', $permission)[1])[0];
@ -103,13 +138,13 @@ class V15 extends Filter
case 'delete':
case 'write':
case 'create':
if (!in_array(downgradePermissionSelector($permission_value), $result['write'])) {
$result['write'][] = downgradePermissionSelector($permission_value);
if (!in_array($this->downgradePermissionSelector($permission_value), $result['write'])) {
$result['$write'][] = $this->downgradePermissionSelector($permission_value);
}
break;
case 'read':
if (!in_array(downgradePermissionSelector($permission_value), $result['read'])) {
$result['read'][] = downgradePermissionSelector($permission_value);
if (!in_array($this->downgradePermissionSelector($permission_value), $result['read'])) {
$result['$read'][] = $this->downgradePermissionSelector($permission_value);
}
break;
}