Merge branch '1.5.x' into fix-mgiration-1.5.x
This commit is contained in:
commit
c55e38b39a
24 changed files with 268 additions and 4906 deletions
|
@ -8,18 +8,9 @@ use Appwrite\Event\Usage;
|
||||||
use Appwrite\Extend\Exception as AppwriteException;
|
use Appwrite\Extend\Exception as AppwriteException;
|
||||||
use Appwrite\Network\Validator\Origin;
|
use Appwrite\Network\Validator\Origin;
|
||||||
use Appwrite\Utopia\Request;
|
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\V16 as RequestV16;
|
||||||
use Appwrite\Utopia\Request\Filters\V17 as RequestV17;
|
use Appwrite\Utopia\Request\Filters\V17 as RequestV17;
|
||||||
use Appwrite\Utopia\Response;
|
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\V16 as ResponseV16;
|
||||||
use Appwrite\Utopia\Response\Filters\V17 as ResponseV17;
|
use Appwrite\Utopia\Response\Filters\V17 as ResponseV17;
|
||||||
use Appwrite\Utopia\View;
|
use Appwrite\Utopia\View;
|
||||||
|
@ -405,32 +396,14 @@ App::init()
|
||||||
return $response->setStatusCode(404)->send('Not Found');
|
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) {
|
if ($requestFormat) {
|
||||||
switch ($requestFormat) {
|
if (version_compare($requestFormat, '1.4.0', '<')) {
|
||||||
case version_compare($requestFormat, '0.12.0', '<'):
|
$request->addFilter(new RequestV16());
|
||||||
Request::setFilter(new RequestV12());
|
}
|
||||||
break;
|
if (version_compare($requestFormat, '1.5.0', '<')) {
|
||||||
case version_compare($requestFormat, '0.13.0', '<'):
|
$request->addFilter(new RequestV17());
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Request::setFilter(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$domain = $request->getHostname();
|
$domain = $request->getHostname();
|
||||||
|
@ -539,35 +512,14 @@ App::init()
|
||||||
/*
|
/*
|
||||||
* Response format
|
* Response format
|
||||||
*/
|
*/
|
||||||
$responseFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', ''));
|
$responseFormat = $request->getHeader('x-appwrite-response-format', App::getEnv('_APP_SYSTEM_RESPONSE_FORMAT', null));
|
||||||
if ($responseFormat) {
|
if ($responseFormat) {
|
||||||
switch ($responseFormat) {
|
if (version_compare($responseFormat, '1.4.0', '<')) {
|
||||||
case version_compare($responseFormat, '0.11.2', '<='):
|
$response->addFilter(new ResponseV16());
|
||||||
Response::setFilter(new ResponseV11());
|
}
|
||||||
break;
|
if (version_compare($responseFormat, '1.5.0', '<')) {
|
||||||
case version_compare($responseFormat, '0.12.4', '<='):
|
$response->addFilter(new ResponseV17());
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Response::setFilter(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -9,7 +9,10 @@ use Utopia\Swoole\Request as UtopiaRequest;
|
||||||
|
|
||||||
class Request extends UtopiaRequest
|
class Request extends UtopiaRequest
|
||||||
{
|
{
|
||||||
private static ?Filter $filter = null;
|
/**
|
||||||
|
* @var array<Filter>
|
||||||
|
*/
|
||||||
|
private array $filters = [];
|
||||||
private static ?Route $route = null;
|
private static ?Route $route = null;
|
||||||
|
|
||||||
public function __construct(SwooleRequest $request)
|
public function __construct(SwooleRequest $request)
|
||||||
|
@ -24,35 +27,48 @@ class Request extends UtopiaRequest
|
||||||
{
|
{
|
||||||
$parameters = parent::getParams();
|
$parameters = parent::getParams();
|
||||||
|
|
||||||
if (self::hasFilter() && self::hasRoute()) {
|
if ($this->hasFilters() && self::hasRoute()) {
|
||||||
$method = self::getRoute()->getLabel('sdk.method', 'unknown');
|
$method = self::getRoute()->getLabel('sdk.method', 'unknown');
|
||||||
$endpointIdentifier = self::getRoute()->getLabel('sdk.namespace', 'unknown') . '.' . $method;
|
$endpointIdentifier = self::getRoute()->getLabel('sdk.namespace', 'unknown') . '.' . $method;
|
||||||
$parameters = self::getFilter()->parse($parameters, $endpointIdentifier);
|
|
||||||
|
foreach ($this->getFilters() as $filter) {
|
||||||
|
$parameters = $filter->parse($parameters, $endpointIdentifier);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $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
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function setFilter(?Filter $filter): void
|
public function addFilter(Filter $filter): void
|
||||||
{
|
{
|
||||||
self::$filter = $filter;
|
$this->filters[] = $filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the currently set filter
|
* Return the currently set filter
|
||||||
*
|
*
|
||||||
* @return Filter|null
|
* @return array<Filter>
|
||||||
*/
|
*/
|
||||||
public static function getFilter(): ?Filter
|
public function getFilters(): array
|
||||||
{
|
{
|
||||||
return self::$filter;
|
return $this->filters;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset filters
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function resetFilters(): void
|
||||||
|
{
|
||||||
|
$this->filters = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,9 +76,9 @@ class Request extends UtopiaRequest
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function hasFilter(): bool
|
public function hasFilters(): bool
|
||||||
{
|
{
|
||||||
return self::$filter != null;
|
return !empty($this->filters);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -94,7 +110,7 @@ class Request extends UtopiaRequest
|
||||||
*/
|
*/
|
||||||
public static function hasRoute(): bool
|
public static function hasRoute(): bool
|
||||||
{
|
{
|
||||||
return self::$route != null;
|
return self::$route !== null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,171 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Appwrite\Utopia\Request\Filters;
|
|
||||||
|
|
||||||
use Appwrite\Utopia\Request\Filter;
|
|
||||||
|
|
||||||
class V12 extends Filter
|
|
||||||
{
|
|
||||||
// Convert 0.11 params format to 0.12 format
|
|
||||||
public function parse(array $content, string $model): array
|
|
||||||
{
|
|
||||||
switch ($model) {
|
|
||||||
// No IDs -> 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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Appwrite\Utopia\Request\Filters;
|
|
||||||
|
|
||||||
use Appwrite\Utopia\Request\Filter;
|
|
||||||
|
|
||||||
class V13 extends Filter
|
|
||||||
{
|
|
||||||
// Convert 0.12 params format to 0.13 format
|
|
||||||
public function parse(array $content, string $model): array
|
|
||||||
{
|
|
||||||
switch ($model) {
|
|
||||||
// Replaced Types
|
|
||||||
case "database.createIntegerAttribute":
|
|
||||||
case "database.createFloatAttribute":
|
|
||||||
$content = $this->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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Appwrite\Utopia\Request\Filters;
|
|
||||||
|
|
||||||
use Appwrite\Migration\Version\V13 as MigrationV13;
|
|
||||||
use Appwrite\Utopia\Request\Filter;
|
|
||||||
|
|
||||||
class V14 extends Filter
|
|
||||||
{
|
|
||||||
// Convert 0.13 params format to 0.14 format
|
|
||||||
public function parse(array $content, string $model): array
|
|
||||||
{
|
|
||||||
switch ($model) {
|
|
||||||
case "functions.create":
|
|
||||||
case "functions.update":
|
|
||||||
case "projects.createWebhook":
|
|
||||||
case "projects.updateWebhook":
|
|
||||||
$content = $this->convertEvents($content);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $content;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function convertEvents($content)
|
|
||||||
{
|
|
||||||
$migration = new MigrationV13();
|
|
||||||
|
|
||||||
$events = $content['events'] ?? [];
|
|
||||||
$content['events'] = $migration->migrateEvents($events);
|
|
||||||
|
|
||||||
return $content;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,275 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Appwrite\Utopia\Request\Filters;
|
|
||||||
|
|
||||||
use Appwrite\Utopia\Request\Filter;
|
|
||||||
use Utopia\Database\Database;
|
|
||||||
use Utopia\Database\Helpers\Permission;
|
|
||||||
use Utopia\Database\Helpers\Role;
|
|
||||||
use Utopia\Database\Query;
|
|
||||||
|
|
||||||
class V15 extends Filter
|
|
||||||
{
|
|
||||||
// Convert 0.15 params format to 0.16 format
|
|
||||||
public function parse(array $content, string $model): array
|
|
||||||
{
|
|
||||||
switch ($model) {
|
|
||||||
case 'account.listLogs':
|
|
||||||
case 'databases.listLogs':
|
|
||||||
case 'databases.listCollectionLogs':
|
|
||||||
case 'databases.listDocumentLogs':
|
|
||||||
case 'teams.listLogs':
|
|
||||||
case 'users.listLogs':
|
|
||||||
$content = $this->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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -299,9 +299,9 @@ class Response extends SwooleResponse
|
||||||
public const MODEL_MOCK = 'mock';
|
public const MODEL_MOCK = 'mock';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Filter
|
* @var array<Filter>
|
||||||
*/
|
*/
|
||||||
private static $filter = null;
|
protected array $filters = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array
|
* @var array
|
||||||
|
@ -511,6 +511,15 @@ class Response extends SwooleResponse
|
||||||
return $this->models;
|
return $this->models;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function applyFilters(array $data, string $model): array
|
||||||
|
{
|
||||||
|
foreach ($this->filters as $filter) {
|
||||||
|
$data = $filter->parse($data, $model);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validate response objects and outputs
|
* Validate response objects and outputs
|
||||||
* the response according to given format type
|
* the response according to given format type
|
||||||
|
@ -524,11 +533,7 @@ class Response extends SwooleResponse
|
||||||
public function dynamic(Document $document, string $model): void
|
public function dynamic(Document $document, string $model): void
|
||||||
{
|
{
|
||||||
$output = $this->output(clone $document, $model);
|
$output = $this->output(clone $document, $model);
|
||||||
|
$output = $this->applyFilters($output, $model);
|
||||||
// If filter is set, parse the output
|
|
||||||
if (self::hasFilter()) {
|
|
||||||
$output = self::getFilter()->parse($output, $model);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ($this->getContentType()) {
|
switch ($this->getContentType()) {
|
||||||
case self::CONTENT_TYPE_JSON:
|
case self::CONTENT_TYPE_JSON:
|
||||||
|
@ -682,15 +687,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
|
* @param $filter the response filter to set
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function setFilter(?Filter $filter)
|
public function addFilter(Filter $filter): void
|
||||||
{
|
{
|
||||||
self::$filter = $filter;
|
$this->filters[] = $filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -698,9 +703,19 @@ class Response extends SwooleResponse
|
||||||
*
|
*
|
||||||
* @return Filter
|
* @return Filter
|
||||||
*/
|
*/
|
||||||
public static function getFilter(): ?Filter
|
public function getFilters(): array
|
||||||
{
|
{
|
||||||
return self::$filter;
|
return $this->filters;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset filters
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function resetFilters(): void
|
||||||
|
{
|
||||||
|
$this->filters = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -708,9 +723,9 @@ class Response extends SwooleResponse
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function hasFilter(): bool
|
public function hasFilters(): bool
|
||||||
{
|
{
|
||||||
return self::$filter != null;
|
return !empty($this->filters);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -13,4 +13,25 @@ abstract class Filter
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
abstract public function parse(array $content, string $model): 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,401 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Appwrite\Utopia\Response\Filters;
|
|
||||||
|
|
||||||
use Appwrite\Utopia\Response;
|
|
||||||
use Appwrite\Utopia\Response\Filter;
|
|
||||||
|
|
||||||
class V11 extends Filter
|
|
||||||
{
|
|
||||||
// Convert 0.12 Data format to 0.11 format
|
|
||||||
public function parse(array $content, string $model): array
|
|
||||||
{
|
|
||||||
$parsedResponse = $content;
|
|
||||||
|
|
||||||
switch ($model) {
|
|
||||||
// Update permissions
|
|
||||||
case Response::MODEL_DOCUMENT:
|
|
||||||
$parsedResponse = $this->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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,269 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Appwrite\Utopia\Response\Filters;
|
|
||||||
|
|
||||||
use Appwrite\Utopia\Response;
|
|
||||||
use Appwrite\Utopia\Response\Filter;
|
|
||||||
|
|
||||||
class V12 extends Filter
|
|
||||||
{
|
|
||||||
// Convert 0.13 Data format to 0.12 format
|
|
||||||
public function parse(array $content, string $model): array
|
|
||||||
{
|
|
||||||
$parsedResponse = $content;
|
|
||||||
|
|
||||||
switch ($model) {
|
|
||||||
case Response::MODEL_ERROR_DEV:
|
|
||||||
case Response::MODEL_ERROR:
|
|
||||||
$parsedResponse = $this->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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,103 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Appwrite\Utopia\Response\Filters;
|
|
||||||
|
|
||||||
use Appwrite\Utopia\Response;
|
|
||||||
use Appwrite\Utopia\Response\Filter;
|
|
||||||
|
|
||||||
class V13 extends Filter
|
|
||||||
{
|
|
||||||
// Convert 0.14 Data format to 0.13 format
|
|
||||||
public function parse(array $content, string $model): array
|
|
||||||
{
|
|
||||||
$parsedResponse = $content;
|
|
||||||
|
|
||||||
switch ($model) {
|
|
||||||
case Response::MODEL_PROJECT:
|
|
||||||
$parsedResponse = $this->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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,176 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Appwrite\Utopia\Response\Filters;
|
|
||||||
|
|
||||||
use Appwrite\Utopia\Response;
|
|
||||||
use Appwrite\Utopia\Response\Filter;
|
|
||||||
|
|
||||||
class V14 extends Filter
|
|
||||||
{
|
|
||||||
// Convert 0.15 Data format to 0.14 format
|
|
||||||
public function parse(array $content, string $model): array
|
|
||||||
{
|
|
||||||
$parsedResponse = $content;
|
|
||||||
|
|
||||||
switch ($model) {
|
|
||||||
case Response::MODEL_SESSION:
|
|
||||||
case Response::MODEL_TOKEN:
|
|
||||||
$parsedResponse = $this->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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,591 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Appwrite\Utopia\Response\Filters;
|
|
||||||
|
|
||||||
use Appwrite\Utopia\Response;
|
|
||||||
use Appwrite\Utopia\Response\Filter;
|
|
||||||
use Utopia\Database\Database;
|
|
||||||
use Utopia\Database\Helpers\Permission;
|
|
||||||
use Utopia\Database\Helpers\Role;
|
|
||||||
|
|
||||||
class V15 extends Filter
|
|
||||||
{
|
|
||||||
// Convert 0.16 Data format to 0.15 format
|
|
||||||
public function parse(array $content, string $model): array
|
|
||||||
{
|
|
||||||
$parsedResponse = $content;
|
|
||||||
|
|
||||||
switch ($model) {
|
|
||||||
case Response::MODEL_ACCOUNT:
|
|
||||||
case Response::MODEL_USER:
|
|
||||||
$parsedResponse = $this->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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -14,27 +14,19 @@ class V16 extends Filter
|
||||||
{
|
{
|
||||||
$parsedResponse = $content;
|
$parsedResponse = $content;
|
||||||
|
|
||||||
switch ($model) {
|
$parsedResponse = match($model) {
|
||||||
case Response::MODEL_DEPLOYMENT:
|
Response::MODEL_DEPLOYMENT => $this->parseDeployment($parsedResponse),
|
||||||
$parsedResponse = $this->parseDeployment($parsedResponse);
|
Response::MODEL_DEPLOYMENT_LIST => $this->handleList($content, 'deployments', fn ($item) => $this->parseDeployment($item)),
|
||||||
break;
|
Response::MODEL_EXECUTION => $this->parseExecution($parsedResponse),
|
||||||
case Response::MODEL_PROXY_RULE:
|
Response::MODEL_EXECUTION_LIST => $this->handleList($content, 'executions', fn ($item) => $this->parseExecution($item)),
|
||||||
// We won't be supporting the domain endpoints for older SDKs
|
Response::MODEL_FUNCTION => $this->parseFunction($parsedResponse),
|
||||||
// since these APIs are internal. As such, no filtering required
|
Response::MODEL_FUNCTION_LIST => $this->handleList($content, 'functions', fn ($item) => $this->parseFunction($item)),
|
||||||
break;
|
Response::MODEL_PROJECT => $this->parseProject($parsedResponse),
|
||||||
case Response::MODEL_EXECUTION:
|
Response::MODEL_PROJECT_LIST => $this->handleList($content, 'projects', fn ($item) => $this->parseProject($item)),
|
||||||
$parsedResponse = $this->parseExecution($parsedResponse);
|
Response::MODEL_VARIABLE => $this->parseVariable($parsedResponse),
|
||||||
break;
|
Response::MODEL_VARIABLE_LIST => $this->handleList($content, 'variables', fn ($item) => $this->parseVariable($item)),
|
||||||
case Response::MODEL_FUNCTION:
|
default => $parsedResponse,
|
||||||
$parsedResponse = $this->parseFunction($parsedResponse);
|
};
|
||||||
break;
|
|
||||||
case Response::MODEL_PROJECT:
|
|
||||||
$parsedResponse = $this->parseProject($parsedResponse);
|
|
||||||
break;
|
|
||||||
case Response::MODEL_VARIABLE:
|
|
||||||
$parsedResponse = $this->parseVariable($parsedResponse);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $parsedResponse;
|
return $parsedResponse;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,26 +12,20 @@ class V17 extends Filter
|
||||||
{
|
{
|
||||||
$parsedResponse = $content;
|
$parsedResponse = $content;
|
||||||
|
|
||||||
switch ($model) {
|
$parsedResponse = match($model) {
|
||||||
case Response::MODEL_PROJECT:
|
Response::MODEL_PROJECT => $this->parseProject($parsedResponse),
|
||||||
$parsedResponse = $this->parseProject($parsedResponse);
|
Response::MODEL_PROJECT_LIST => $this->handleList($content, 'projects', fn ($item) => $this->parseProject($item)),
|
||||||
break;
|
Response::MODEL_USER => $this->parseUser($parsedResponse),
|
||||||
case Response::MODEL_USER:
|
Response::MODEL_USER_LIST => $this->handleList($content, 'users', fn ($item) => $this->parseUser($item)),
|
||||||
$parsedResponse = $this->parseUser($parsedResponse);
|
Response::MODEL_MEMBERSHIP => $this->parseMembership($parsedResponse),
|
||||||
break;
|
Response::MODEL_MEMBERSHIP_LIST => $this->handleList($content, 'memberships', fn ($item) => $this->parseMembership($item)),
|
||||||
case Response::MODEL_TOKEN:
|
Response::MODEL_SESSION => $this->parseSession($parsedResponse),
|
||||||
$parsedResponse = $this->parseToken($parsedResponse);
|
Response::MODEL_SESSION_LIST => $this->handleList($content, 'sessions', fn ($item) => $this->parseSession($item)),
|
||||||
break;
|
Response::MODEL_WEBHOOK => $this->parseWebhook($parsedResponse),
|
||||||
case Response::MODEL_MEMBERSHIP:
|
Response::MODEL_WEBHOOK_LIST => $this->handleList($content, 'webhooks', fn ($item) => $this->parseWebhook($item)),
|
||||||
$parsedResponse = $this->parseMembership($parsedResponse);
|
Response::MODEL_TOKEN => $this->parseToken($parsedResponse),
|
||||||
break;
|
default => $parsedResponse,
|
||||||
case Response::MODEL_SESSION:
|
};
|
||||||
$parsedResponse = $this->parseSession($parsedResponse);
|
|
||||||
break;
|
|
||||||
case Response::MODEL_WEBHOOK:
|
|
||||||
$parsedResponse = $this->parseWebhook($parsedResponse);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $parsedResponse;
|
return $parsedResponse;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ use Tests\E2E\Client;
|
||||||
use Tests\E2E\Scopes\ProjectConsole;
|
use Tests\E2E\Scopes\ProjectConsole;
|
||||||
use Tests\E2E\Scopes\Scope;
|
use Tests\E2E\Scopes\Scope;
|
||||||
use Tests\E2E\Scopes\SideClient;
|
use Tests\E2E\Scopes\SideClient;
|
||||||
use Utopia\Database\Helpers\ID;
|
|
||||||
|
|
||||||
class TeamsConsoleClientTest extends Scope
|
class TeamsConsoleClientTest extends Scope
|
||||||
{
|
{
|
||||||
|
@ -15,55 +14,6 @@ class TeamsConsoleClientTest extends Scope
|
||||||
use ProjectConsole;
|
use ProjectConsole;
|
||||||
use SideClient;
|
use SideClient;
|
||||||
|
|
||||||
public function testRequestHeader()
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Test without header
|
|
||||||
*/
|
|
||||||
$response = $this->client->call(Client::METHOD_POST, '/teams', \array_merge([
|
|
||||||
'content-type' => 'application/json',
|
|
||||||
'x-appwrite-project' => 'console'
|
|
||||||
], $this->getHeaders()), [
|
|
||||||
'name' => 'Latest version Team',
|
|
||||||
'teamId' => ID::unique()
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->assertEquals(201, $response['headers']['status-code']);
|
|
||||||
$team1Id = $response['body']['$id'];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test with header
|
|
||||||
*/
|
|
||||||
$response = $this->client->call(Client::METHOD_POST, '/teams', \array_merge([
|
|
||||||
'content-type' => 'application/json',
|
|
||||||
'x-appwrite-project' => 'console',
|
|
||||||
'x-appwrite-response-format' => '0.11.0'
|
|
||||||
], $this->getHeaders()), [
|
|
||||||
'name' => 'Latest version Team'
|
|
||||||
// Notice "teamId' is not defined
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->assertEquals(201, $response['headers']['status-code']);
|
|
||||||
$team2Id = $response['body']['$id'];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cleanup, so I don't invalidate some listTeams requests by mistake
|
|
||||||
*/
|
|
||||||
$response = $this->client->call(Client::METHOD_DELETE, '/teams/' . $team1Id, \array_merge([
|
|
||||||
'content-type' => 'application/json',
|
|
||||||
'x-appwrite-project' => 'console',
|
|
||||||
], $this->getHeaders()));
|
|
||||||
|
|
||||||
$this->assertEquals(204, $response['headers']['status-code']);
|
|
||||||
|
|
||||||
$response = $this->client->call(Client::METHOD_DELETE, '/teams/' . $team2Id, \array_merge([
|
|
||||||
'content-type' => 'application/json',
|
|
||||||
'x-appwrite-project' => 'console',
|
|
||||||
], $this->getHeaders()));
|
|
||||||
|
|
||||||
$this->assertEquals(204, $response['headers']['status-code']);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @depends testCreateTeam
|
* @depends testCreateTeam
|
||||||
*/
|
*/
|
||||||
|
|
19
tests/unit/Utopia/Request/Filters/First.php
Normal file
19
tests/unit/Utopia/Request/Filters/First.php
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit\Utopia\Request\Filters;
|
||||||
|
|
||||||
|
use Appwrite\Utopia\Request\Filter;
|
||||||
|
|
||||||
|
class First extends Filter
|
||||||
|
{
|
||||||
|
public function parse(array $content, string $model): array
|
||||||
|
{
|
||||||
|
if ($model === 'namespace.method') {
|
||||||
|
$content['first'] = true;
|
||||||
|
$content['second'] = false;
|
||||||
|
$content['removed'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
}
|
18
tests/unit/Utopia/Request/Filters/Second.php
Normal file
18
tests/unit/Utopia/Request/Filters/Second.php
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit\Utopia\Request\Filters;
|
||||||
|
|
||||||
|
use Appwrite\Utopia\Request\Filter;
|
||||||
|
|
||||||
|
class Second extends Filter
|
||||||
|
{
|
||||||
|
public function parse(array $content, string $model): array
|
||||||
|
{
|
||||||
|
if ($model === "namespace.method") {
|
||||||
|
$content["second"] = true;
|
||||||
|
unset($content["removed"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,742 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace Tests\Unit\Utopia\Request\Filters;
|
|
||||||
|
|
||||||
use Appwrite\Utopia\Request\Filter;
|
|
||||||
use Appwrite\Utopia\Request\Filters\V15;
|
|
||||||
use Appwrite\Utopia\Response\Model;
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
class V15Test extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var Filter
|
|
||||||
*/
|
|
||||||
protected $filter = null;
|
|
||||||
|
|
||||||
public function setUp(): void
|
|
||||||
{
|
|
||||||
$this->filter = new V15();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function tearDown(): void
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function limitOffsetProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'basic test' => [
|
|
||||||
['limit' => '12', 'offset' => '0'],
|
|
||||||
['queries' => ['limit(12)', 'offset(0)']]
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
*/
|
|
||||||
public function testListAccountLogs(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'account.listLogs';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetAccountInitials(): void
|
|
||||||
{
|
|
||||||
$model = 'account.initials';
|
|
||||||
|
|
||||||
$content = ['color' => 'deadbeef'];
|
|
||||||
$expected = [];
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function limitOffsetCursorOrderTypeProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'basic test' => [
|
|
||||||
[
|
|
||||||
'limit' => '12',
|
|
||||||
'offset' => '0',
|
|
||||||
'cursor' => 'abcd',
|
|
||||||
'cursorDirection' => 'before',
|
|
||||||
'orderType' => 'asc',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'queries' => [
|
|
||||||
'limit(12)',
|
|
||||||
'offset(0)',
|
|
||||||
'cursorBefore("abcd")',
|
|
||||||
'orderAsc("")'
|
|
||||||
]
|
|
||||||
],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function cursorProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'cursorDirection after' => [
|
|
||||||
[
|
|
||||||
'cursor' => 'abcd',
|
|
||||||
'cursorDirection' => 'after',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'queries' => [
|
|
||||||
'cursorAfter("abcd")',
|
|
||||||
]
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'cursorDirection invalid' => [
|
|
||||||
[
|
|
||||||
'cursor' => 'abcd',
|
|
||||||
'cursorDirection' => 'invalid',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'queries' => [
|
|
||||||
'cursorAfter("abcd")',
|
|
||||||
]
|
|
||||||
],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function orderTypeProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'orderType desc' => [
|
|
||||||
[
|
|
||||||
'orderType' => 'DESC',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'queries' => [
|
|
||||||
'orderDesc("")',
|
|
||||||
]
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'orderType invalid' => [
|
|
||||||
[
|
|
||||||
'orderType' => 'invalid',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'queries' => [
|
|
||||||
'orderAsc("")',
|
|
||||||
]
|
|
||||||
],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetCursorOrderTypeProvider
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
* @dataProvider cursorProvider
|
|
||||||
* @dataProvider orderTypeProvider
|
|
||||||
*/
|
|
||||||
public function testListDatabases(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'databases.list';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
*/
|
|
||||||
public function testListDatabaseLogs(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'databases.listLogs';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function collectionPermissionProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'permission collection' => [
|
|
||||||
['permission' => 'collection'],
|
|
||||||
['documentSecurity' => false],
|
|
||||||
],
|
|
||||||
'permission document' => [
|
|
||||||
['permission' => 'document'],
|
|
||||||
['documentSecurity' => true],
|
|
||||||
],
|
|
||||||
'permission empty' => [
|
|
||||||
[],
|
|
||||||
[],
|
|
||||||
],
|
|
||||||
'permission invalid' => [
|
|
||||||
['permission' => 'invalid'],
|
|
||||||
['documentSecurity' => false],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function readWriteProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'read all types' => [
|
|
||||||
[
|
|
||||||
'read' => [
|
|
||||||
'role:all',
|
|
||||||
'role:guest',
|
|
||||||
'role:member',
|
|
||||||
'user:a',
|
|
||||||
'team:b',
|
|
||||||
'team:c/member',
|
|
||||||
'member:z',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'permissions' => [
|
|
||||||
'read("any")',
|
|
||||||
'read("guests")',
|
|
||||||
'read("users")',
|
|
||||||
'read("user:a")',
|
|
||||||
'read("team:b")',
|
|
||||||
'read("team:c/member")',
|
|
||||||
'read("member:z")',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'read invalid' => [
|
|
||||||
['read' => ['invalid', 'invalid:a']],
|
|
||||||
['permissions' => ['read("invalid:a")']],
|
|
||||||
],
|
|
||||||
'write all types' => [
|
|
||||||
[
|
|
||||||
'write' => [
|
|
||||||
'role:all',
|
|
||||||
'role:guest',
|
|
||||||
'role:member',
|
|
||||||
'user:a',
|
|
||||||
'team:b',
|
|
||||||
'team:c/member',
|
|
||||||
'member:z',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'permissions' => [
|
|
||||||
'write("users")',
|
|
||||||
'write("users")',
|
|
||||||
'write("user:a")',
|
|
||||||
'write("team:b")',
|
|
||||||
'write("team:c/member")',
|
|
||||||
'write("member:z")',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'write invalid' => [
|
|
||||||
['write' => ['invalid', 'invalid:a']],
|
|
||||||
['permissions' => ['write("invalid:a")']],
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider collectionPermissionProvider
|
|
||||||
* @dataProvider readWriteProvider
|
|
||||||
*/
|
|
||||||
public function testCreateCollection(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'databases.createCollection';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetCursorOrderTypeProvider
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
* @dataProvider cursorProvider
|
|
||||||
* @dataProvider orderTypeProvider
|
|
||||||
*/
|
|
||||||
public function testListCollections(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'databases.listCollections';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
*/
|
|
||||||
public function testListCollectionLogs(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'databases.listCollectionLogs';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider collectionPermissionProvider
|
|
||||||
* @dataProvider readWriteProvider
|
|
||||||
*/
|
|
||||||
public function testUpdateCollection(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'databases.updateCollection';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider readWriteProvider
|
|
||||||
*/
|
|
||||||
public function testCreateDocument(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'databases.createDocument';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function ordersProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'basic test' => [
|
|
||||||
[
|
|
||||||
'orderAttributes' => ['lastName', 'firstName'],
|
|
||||||
'orderTypes' => ['DESC', 'ASC'],
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'queries' => [
|
|
||||||
'orderDesc("lastName")',
|
|
||||||
'orderAsc("firstName")',
|
|
||||||
]
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'orderType only' => [
|
|
||||||
[
|
|
||||||
'orderTypes' => ['DESC'],
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'queries' => [
|
|
||||||
'orderDesc("")',
|
|
||||||
]
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'orderType invalid' => [
|
|
||||||
[
|
|
||||||
'orderAttributes' => ['lastName'],
|
|
||||||
'orderTypes' => ['invalid'],
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'queries' => [
|
|
||||||
'orderAsc("lastName")',
|
|
||||||
]
|
|
||||||
],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function filtersProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'all filters' => [
|
|
||||||
[
|
|
||||||
'queries' => [
|
|
||||||
'lastName.equal("Smith", "Jackson")',
|
|
||||||
'firstName.notEqual("John")',
|
|
||||||
'age.lesser(50)',
|
|
||||||
'age.lesserEqual(51)',
|
|
||||||
'age.greater(20)',
|
|
||||||
'age.greaterEqual(21)',
|
|
||||||
'address.search("pla")',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'queries' => [
|
|
||||||
'equal("lastName", ["Smith", "Jackson"])',
|
|
||||||
'notEqual("firstName", ["John"])',
|
|
||||||
'lessThan("age", [50])',
|
|
||||||
'lessThanEqual("age", [51])',
|
|
||||||
'greaterThan("age", [20])',
|
|
||||||
'greaterThanEqual("age", [21])',
|
|
||||||
'search("address", ["pla"])',
|
|
||||||
]
|
|
||||||
],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
* @dataProvider cursorProvider
|
|
||||||
* @dataProvider ordersProvider
|
|
||||||
* @dataProvider filtersProvider
|
|
||||||
*/
|
|
||||||
public function testListDocuments(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'databases.listDocuments';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
*/
|
|
||||||
public function testListDocumentLogs(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'databases.listDocumentLogs';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider readWriteProvider
|
|
||||||
*/
|
|
||||||
public function testUpdateDocument(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'databases.updateDocument';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function executeProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'all roles' => [
|
|
||||||
[
|
|
||||||
'execute' => [
|
|
||||||
'role:all',
|
|
||||||
'role:guest',
|
|
||||||
'role:member',
|
|
||||||
'user:a',
|
|
||||||
'team:b',
|
|
||||||
'team:c/member',
|
|
||||||
'member:z',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'execute' => [
|
|
||||||
'users',
|
|
||||||
'users',
|
|
||||||
'user:a',
|
|
||||||
'team:b',
|
|
||||||
'team:c/member',
|
|
||||||
'member:z',
|
|
||||||
]
|
|
||||||
],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider executeProvider
|
|
||||||
*/
|
|
||||||
public function testCreateFunction(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'functions.create';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetCursorOrderTypeProvider
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
* @dataProvider cursorProvider
|
|
||||||
* @dataProvider orderTypeProvider
|
|
||||||
*/
|
|
||||||
public function testListFunctions(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'functions.list';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider executeProvider
|
|
||||||
*/
|
|
||||||
public function testUpdateFunction(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'functions.update';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetCursorOrderTypeProvider
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
* @dataProvider cursorProvider
|
|
||||||
* @dataProvider orderTypeProvider
|
|
||||||
*/
|
|
||||||
public function testListDeployments(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'functions.listDeployments';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
* @dataProvider cursorProvider
|
|
||||||
*/
|
|
||||||
public function testListExecutions(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'functions.listExecutions';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetCursorOrderTypeProvider
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
* @dataProvider cursorProvider
|
|
||||||
* @dataProvider orderTypeProvider
|
|
||||||
*/
|
|
||||||
public function testListProjects(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'projects.list';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function expireProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'empty' => [
|
|
||||||
[],
|
|
||||||
[],
|
|
||||||
],
|
|
||||||
'zero' => [
|
|
||||||
['expire' => '0'],
|
|
||||||
['expire' => null],
|
|
||||||
],
|
|
||||||
'value' => [
|
|
||||||
['expire' => '1602743880'],
|
|
||||||
['expire' => Model::TYPE_DATETIME_EXAMPLE],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider expireProvider
|
|
||||||
*/
|
|
||||||
public function testCreateKey(array $content, array $expected)
|
|
||||||
{
|
|
||||||
$model = 'projects.createKey';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider expireProvider
|
|
||||||
*/
|
|
||||||
public function testUpdateKey(array $content, array $expected)
|
|
||||||
{
|
|
||||||
$model = 'projects.updateKey';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function bucketPermissionProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'permission bucket' => [
|
|
||||||
['permission' => 'bucket'],
|
|
||||||
['fileSecurity' => false],
|
|
||||||
],
|
|
||||||
'permission document' => [
|
|
||||||
['permission' => 'file'],
|
|
||||||
['fileSecurity' => true],
|
|
||||||
],
|
|
||||||
'permission empty' => [
|
|
||||||
[],
|
|
||||||
[],
|
|
||||||
],
|
|
||||||
'permission invalid' => [
|
|
||||||
['permission' => 'invalid'],
|
|
||||||
['fileSecurity' => false],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider bucketPermissionProvider
|
|
||||||
* @dataProvider readWriteProvider
|
|
||||||
*/
|
|
||||||
public function testCreateBucket(array $content, array $expected)
|
|
||||||
{
|
|
||||||
$model = 'storage.createBucket';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetCursorOrderTypeProvider
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
* @dataProvider cursorProvider
|
|
||||||
* @dataProvider orderTypeProvider
|
|
||||||
*/
|
|
||||||
public function testListBuckets(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'storage.listBuckets';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider bucketPermissionProvider
|
|
||||||
* @dataProvider readWriteProvider
|
|
||||||
*/
|
|
||||||
public function testUpdateBucket(array $content, array $expected)
|
|
||||||
{
|
|
||||||
$model = 'storage.updateBucket';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider readWriteProvider
|
|
||||||
*/
|
|
||||||
public function testCreateFile(array $content, array $expected)
|
|
||||||
{
|
|
||||||
$model = 'storage.createFile';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetCursorOrderTypeProvider
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
* @dataProvider cursorProvider
|
|
||||||
* @dataProvider orderTypeProvider
|
|
||||||
*/
|
|
||||||
public function testListFiles(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'storage.listFiles';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider readWriteProvider
|
|
||||||
*/
|
|
||||||
public function testUpdateFile(array $content, array $expected)
|
|
||||||
{
|
|
||||||
$model = 'storage.updateFile';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetCursorOrderTypeProvider
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
* @dataProvider cursorProvider
|
|
||||||
* @dataProvider orderTypeProvider
|
|
||||||
*/
|
|
||||||
public function testListTeams(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'teams.list';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetCursorOrderTypeProvider
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
* @dataProvider cursorProvider
|
|
||||||
* @dataProvider orderTypeProvider
|
|
||||||
*/
|
|
||||||
public function testListTeamMemberships(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'teams.listMemberships';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
*/
|
|
||||||
public function testListTeamLogs(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'teams.listLogs';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetCursorOrderTypeProvider
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
* @dataProvider cursorProvider
|
|
||||||
* @dataProvider orderTypeProvider
|
|
||||||
*/
|
|
||||||
public function testListUsers(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'users.list';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider limitOffsetProvider
|
|
||||||
*/
|
|
||||||
public function testListUserLogs(array $content, array $expected): void
|
|
||||||
{
|
|
||||||
$model = 'users.listLogs';
|
|
||||||
|
|
||||||
$result = $this->filter->parse($content, $model);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $result);
|
|
||||||
}
|
|
||||||
}
|
|
53
tests/unit/Utopia/RequestTest.php
Normal file
53
tests/unit/Utopia/RequestTest.php
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit\Utopia;
|
||||||
|
|
||||||
|
use Appwrite\Utopia\Request;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use Swoole\Http\Request as SwooleRequest;
|
||||||
|
use Tests\Unit\Utopia\Request\Filters\First;
|
||||||
|
use Tests\Unit\Utopia\Request\Filters\Second;
|
||||||
|
use Utopia\Route;
|
||||||
|
|
||||||
|
class RequestTest extends TestCase
|
||||||
|
{
|
||||||
|
protected ?Request $request = null;
|
||||||
|
|
||||||
|
public function setUp(): void
|
||||||
|
{
|
||||||
|
$this->request = new Request(new SwooleRequest());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFilters(): void
|
||||||
|
{
|
||||||
|
$this->assertFalse($this->request->hasFilters());
|
||||||
|
$this->assertIsArray($this->request->getFilters());
|
||||||
|
$this->assertEmpty($this->request->getFilters());
|
||||||
|
|
||||||
|
$this->request->addFilter(new First());
|
||||||
|
$this->request->addFilter(new Second());
|
||||||
|
|
||||||
|
$this->assertTrue($this->request->hasFilters());
|
||||||
|
$this->assertCount(2, $this->request->getFilters());
|
||||||
|
|
||||||
|
$route = new Route(Request::METHOD_GET, '/test');
|
||||||
|
$route->label('sdk.method', 'method');
|
||||||
|
$route->label('sdk.namespace', 'namespace');
|
||||||
|
// set test header to prevent header populaten inside the request class
|
||||||
|
$this->request->addHeader('EXAMPLE', 'VALUE');
|
||||||
|
$this->request->setRoute($route);
|
||||||
|
$this->request->setQueryString([
|
||||||
|
'initial' => true,
|
||||||
|
'first' => false
|
||||||
|
]);
|
||||||
|
$output = $this->request->getParams();
|
||||||
|
|
||||||
|
$this->assertArrayHasKey('initial', $output);
|
||||||
|
$this->assertTrue($output['initial']);
|
||||||
|
$this->assertArrayHasKey('first', $output);
|
||||||
|
$this->assertTrue($output['first']);
|
||||||
|
$this->assertArrayHasKey('second', $output);
|
||||||
|
$this->assertTrue($output['second']);
|
||||||
|
$this->assertArrayNotHasKey('deleted', $output);
|
||||||
|
}
|
||||||
|
}
|
19
tests/unit/Utopia/Response/Filters/First.php
Normal file
19
tests/unit/Utopia/Response/Filters/First.php
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit\Utopia\Response\Filters;
|
||||||
|
|
||||||
|
use Appwrite\Utopia\Response\Filter;
|
||||||
|
|
||||||
|
class First extends Filter
|
||||||
|
{
|
||||||
|
public function parse(array $content, string $model): array
|
||||||
|
{
|
||||||
|
if ($model === 'test') {
|
||||||
|
$content['first'] = true;
|
||||||
|
$content['second'] = false;
|
||||||
|
$content['removed'] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
}
|
18
tests/unit/Utopia/Response/Filters/Second.php
Normal file
18
tests/unit/Utopia/Response/Filters/Second.php
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit\Utopia\Response\Filters;
|
||||||
|
|
||||||
|
use Appwrite\Utopia\Response\Filter;
|
||||||
|
|
||||||
|
class Second extends Filter
|
||||||
|
{
|
||||||
|
public function parse(array $content, string $model): array
|
||||||
|
{
|
||||||
|
if ($model === "test") {
|
||||||
|
$content["second"] = true;
|
||||||
|
unset($content["removed"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load diff
|
@ -3,10 +3,11 @@
|
||||||
namespace Tests\Unit\Utopia;
|
namespace Tests\Unit\Utopia;
|
||||||
|
|
||||||
use Appwrite\Utopia\Response;
|
use Appwrite\Utopia\Response;
|
||||||
use Appwrite\Utopia\Response\Filters\V11;
|
|
||||||
use Exception;
|
use Exception;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Swoole\Http\Response as SwooleResponse;
|
use Swoole\Http\Response as SwooleResponse;
|
||||||
|
use Tests\Unit\Utopia\Response\Filters\First;
|
||||||
|
use Tests\Unit\Utopia\Response\Filters\Second;
|
||||||
use Utopia\Database\Document;
|
use Utopia\Database\Document;
|
||||||
|
|
||||||
class ResponseTest extends TestCase
|
class ResponseTest extends TestCase
|
||||||
|
@ -21,16 +22,30 @@ class ResponseTest extends TestCase
|
||||||
$this->response->setModel(new Nested());
|
$this->response->setModel(new Nested());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSetFilter(): void
|
public function testFilters(): void
|
||||||
{
|
{
|
||||||
$this->assertEquals($this->response->hasFilter(), false);
|
$this->assertFalse($this->response->hasFilters());
|
||||||
$this->assertEquals($this->response->getFilter(), null);
|
$this->assertIsArray($this->response->getFilters());
|
||||||
|
$this->assertEmpty($this->response->getFilters());
|
||||||
|
|
||||||
$filter = new V11();
|
$this->response->addFilter(new First());
|
||||||
$this->response->setFilter($filter);
|
$this->response->addFilter(new Second());
|
||||||
|
|
||||||
$this->assertEquals($this->response->hasFilter(), true);
|
$this->assertTrue($this->response->hasFilters());
|
||||||
$this->assertEquals($this->response->getFilter(), $filter);
|
$this->assertCount(2, $this->response->getFilters());
|
||||||
|
|
||||||
|
$output = $this->response->applyFilters([
|
||||||
|
'initial' => true,
|
||||||
|
'first' => false
|
||||||
|
], 'test');
|
||||||
|
|
||||||
|
$this->assertArrayHasKey('initial', $output);
|
||||||
|
$this->assertTrue($output['initial']);
|
||||||
|
$this->assertArrayHasKey('first', $output);
|
||||||
|
$this->assertTrue($output['first']);
|
||||||
|
$this->assertArrayHasKey('second', $output);
|
||||||
|
$this->assertTrue($output['second']);
|
||||||
|
$this->assertArrayNotHasKey('deleted', $output);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testResponseModel(): void
|
public function testResponseModel(): void
|
||||||
|
|
Loading…
Reference in a new issue