```
## Tutorials
From time to time, our team will add tutorials that will help contributors find their way in the Appwrite source code. Below is a list of currently available tutorials:
-* [Adding Support for a New OAuth2 Provider](./docs/tutorials/add-oauth2-provider.md)
-* [Appwrite Environment Variables](./docs/tutorials/environment-variables.md)
-* [Running in Production](./docs/tutorials/running-in-production.md)
-* [Adding Storage Adapter](./docs/tutorials/add-storage-adapter.md)
+- [Adding Support for a New OAuth2 Provider](./docs/tutorials/add-oauth2-provider.md)
+- [Appwrite Environment Variables](./docs/tutorials/environment-variables.md)
+- [Running in Production](./docs/tutorials/running-in-production.md)
+- [Adding Storage Adapter](./docs/tutorials/add-storage-adapter.md)
## Other Ways to Help
-Pull requests are great, but there are many other areas where you can help Appwrite.
+Pull requests are great, but there are many other areas where you can help Appwrite.
### Blogging & Speaking
@@ -437,4 +463,3 @@ Submitting documentation updates, enhancements, designs, or bug fixes. Spelling
### Helping Someone
Searching for Appwrite on Discord, GitHub, or StackOverflow and helping someone else who needs help. You can also help by teaching others how to contribute to Appwrite's repo!
-
diff --git a/app/config/scopes.php b/app/config/scopes.php
index c1d3bb73f..0b9879b64 100644
--- a/app/config/scopes.php
+++ b/app/config/scopes.php
@@ -71,4 +71,3 @@ return [ // List of publicly visible scopes
'description' => 'Access to read your project\'s health status',
],
];
-
diff --git a/app/config/storage/logos.php b/app/config/storage/logos.php
index fdbe37b3b..9db909653 100644
--- a/app/config/storage/logos.php
+++ b/app/config/storage/logos.php
@@ -5,8 +5,10 @@ return [ // Based on this list @see http://stackoverflow.com/a/4212908/2299554
'default_image' => __DIR__ . '/logos/image.png',
// Video Files
+
'video/mp4' => __DIR__ . '/logos/video.png',
'video/x-flv' => __DIR__ . '/logos/video.png',
+ 'video/webm' => __DIR__ . '/logos/video.png',
'application/x-mpegURL' => __DIR__ . '/logos/video.png',
'video/MP2T' => __DIR__ . '/logos/video.png',
'video/3gpp' => __DIR__ . '/logos/video.png',
@@ -14,6 +16,8 @@ return [ // Based on this list @see http://stackoverflow.com/a/4212908/2299554
'video/x-msvideo' => __DIR__ . '/logos/video.png',
'video/x-ms-wmv' => __DIR__ . '/logos/video.png',
+
+
// // Microsoft Word
// 'application/msword' => __DIR__.'/logos/word.png',
// 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => __DIR__.'/logos/word.png',
diff --git a/app/config/storage/mimes.php b/app/config/storage/mimes.php
index 16f078ae1..3e3cad369 100644
--- a/app/config/storage/mimes.php
+++ b/app/config/storage/mimes.php
@@ -10,6 +10,7 @@ return [
// Video Files
'video/mp4',
'video/x-flv',
+ 'video/webm',
'application/x-mpegURL',
'video/MP2T',
'video/3gpp',
diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php
index 7244c4e24..a983745a9 100644
--- a/app/controllers/api/teams.php
+++ b/app/controllers/api/teams.php
@@ -295,13 +295,13 @@ App::post('/v1/teams/:teamId/memberships')
->inject('events')
->action(function (string $teamId, string $email, array $roles, string $url, string $name, Response $response, Document $project, Document $user, Database $dbForProject, Locale $locale, EventAudit $audits, Mail $mails, Event $events) {
- if (empty(App::getEnv('_APP_SMTP_HOST'))) {
- throw new Exception('SMTP Disabled', 503, Exception::GENERAL_SMTP_DISABLED);
- }
-
$isPrivilegedUser = Auth::isPrivilegedUser(Authorization::getRoles());
$isAppUser = Auth::isAppUser(Authorization::getRoles());
+ if (!$isPrivilegedUser && !$isAppUser && empty(App::getEnv('_APP_SMTP_HOST'))) {
+ throw new Exception('SMTP Disabled', 503, Exception::GENERAL_SMTP_DISABLED);
+ }
+
$email = \strtolower($email);
$name = (empty($name)) ? $email : $name;
$team = $dbForProject->getDocument('teams', $teamId);
@@ -380,7 +380,7 @@ App::post('/v1/teams/:teamId/memberships')
try {
$membership = Authorization::skip(fn() => $dbForProject->createDocument('memberships', $membership));
} catch (Duplicate $th) {
- throw new Exception('User has already been invited or is already a member of this team', 409, Exception::TEAM_INVITE_ALREADY_EXISTS);
+ throw new Exception('User is already a member of this team', 409, Exception::TEAM_INVITE_ALREADY_EXISTS);
}
$team->setAttribute('total', $team->getAttribute('total', 0) + 1);
$team = Authorization::skip(fn() => $dbForProject->updateDocument('teams', $team->getId(), $team));
diff --git a/app/controllers/general.php b/app/controllers/general.php
index 84d158714..747799e36 100644
--- a/app/controllers/general.php
+++ b/app/controllers/general.php
@@ -292,10 +292,11 @@ App::init(function (App $utopia, Request $request, Response $response, Document
$service = $route->getLabel('sdk.namespace', '');
if (!empty($service)) {
+ $roles = Authorization::getRoles();
if (
array_key_exists($service, $project->getAttribute('services', []))
&& !$project->getAttribute('services', [])[$service]
- && !Auth::isPrivilegedUser(Authorization::getRoles())
+ && !(Auth::isPrivilegedUser($roles) || Auth::isAppUser($roles))
) {
throw new AppwriteException('Service is disabled', 503, AppwriteException::GENERAL_SERVICE_DISABLED);
}
diff --git a/app/http.php b/app/http.php
index 47f3cde2b..a7d10b9e0 100644
--- a/app/http.php
+++ b/app/http.php
@@ -211,7 +211,6 @@ $http->on('start', function (Server $http) use ($payloadSize, $register) {
});
Console::success('Server started successfully (max payload is ' . number_format($payloadSize) . ' bytes)');
-
Console::info("Master pid {$http->master_pid}, manager pid {$http->manager_pid}");
// listen ctrl + c
diff --git a/app/init.php b/app/init.php
index 5f609174e..0e1848b2c 100644
--- a/app/init.php
+++ b/app/init.php
@@ -78,6 +78,7 @@ const APP_LIMIT_ANTIVIRUS = 20000000; //20MB
const APP_LIMIT_ENCRYPTION = 20000000; //20MB
const APP_LIMIT_COMPRESSION = 20000000; //20MB
const APP_LIMIT_ARRAY_PARAMS_SIZE = 100; // Default maximum of how many elements can there be in API parameter that expects array value
+const APP_LIMIT_SUBQUERY = 1000;
const APP_CACHE_BUSTER = 305;
const APP_VERSION_STABLE = '0.14.2';
const APP_DATABASE_ATTRIBUTE_EMAIL = 'email';
@@ -191,46 +192,50 @@ if (!empty($user) || !empty($pass)) {
*/
Database::addFilter(
'casting',
- function ($value) {
+ function (mixed $value) {
return json_encode(['value' => $value], JSON_PRESERVE_ZERO_FRACTION);
},
- function ($value) {
+ function (mixed $value) {
if (is_null($value)) {
return null;
}
+
return json_decode($value, true)['value'];
}
);
Database::addFilter(
'enum',
- function ($value, Document $attribute) {
+ function (mixed $value, Document $attribute) {
if ($attribute->isSet('elements')) {
$attribute->removeAttribute('elements');
}
+
return $value;
},
- function ($value, Document $attribute) {
+ function (mixed $value, Document $attribute) {
$formatOptions = json_decode($attribute->getAttribute('formatOptions', '[]'), true);
if (isset($formatOptions['elements'])) {
$attribute->setAttribute('elements', $formatOptions['elements']);
}
+
return $value;
}
);
Database::addFilter(
'range',
- function ($value, Document $attribute) {
+ function (mixed $value, Document $attribute) {
if ($attribute->isSet('min')) {
$attribute->removeAttribute('min');
}
if ($attribute->isSet('max')) {
$attribute->removeAttribute('max');
}
+
return $value;
},
- function ($value, Document $attribute) {
+ function (mixed $value, Document $attribute) {
$formatOptions = json_decode($attribute->getAttribute('formatOptions', '[]'), true);
if (isset($formatOptions['min']) || isset($formatOptions['max'])) {
$attribute
@@ -238,134 +243,134 @@ Database::addFilter(
->setAttribute('max', $formatOptions['max'])
;
}
+
return $value;
}
);
Database::addFilter(
'subQueryAttributes',
- function ($value) {
+ function (mixed $value) {
return null;
},
- function ($value, Document $document, Database $database) {
+ function (mixed $value, Document $document, Database $database) {
return $database
->find('attributes', [
new Query('collectionId', Query::TYPE_EQUAL, [$document->getId()])
- ], $database->getAttributeLimit(), 0, []);
+ ], $database->getAttributeLimit());
}
);
Database::addFilter(
'subQueryIndexes',
- function ($value) {
+ function (mixed $value) {
return null;
},
- function ($value, Document $document, Database $database) {
+ function (mixed $value, Document $document, Database $database) {
return $database
->find('indexes', [
new Query('collectionId', Query::TYPE_EQUAL, [$document->getId()])
- ], 64, 0, []);
+ ], 64);
}
);
Database::addFilter(
'subQueryPlatforms',
- function ($value) {
+ function (mixed $value) {
return null;
},
- function ($value, Document $document, Database $database) {
+ function (mixed $value, Document $document, Database $database) {
return $database
->find('platforms', [
new Query('projectId', Query::TYPE_EQUAL, [$document->getId()])
- ], $database->getIndexLimit(), 0, []);
+ ], APP_LIMIT_SUBQUERY);
}
);
Database::addFilter(
'subQueryDomains',
- function ($value) {
+ function (mixed $value) {
return null;
},
- function ($value, Document $document, Database $database) {
+ function (mixed $value, Document $document, Database $database) {
return $database
->find('domains', [
new Query('projectId', Query::TYPE_EQUAL, [$document->getId()])
- ], $database->getIndexLimit(), 0, []);
+ ], APP_LIMIT_SUBQUERY);
}
);
Database::addFilter(
'subQueryKeys',
- function ($value) {
+ function (mixed $value) {
return null;
},
- function ($value, Document $document, Database $database) {
+ function (mixed $value, Document $document, Database $database) {
return $database
->find('keys', [
new Query('projectId', Query::TYPE_EQUAL, [$document->getId()])
- ], $database->getIndexLimit(), 0, []);
+ ], APP_LIMIT_SUBQUERY);
}
);
Database::addFilter(
'subQueryWebhooks',
- function ($value) {
+ function (mixed $value) {
return null;
},
- function ($value, Document $document, Database $database) {
+ function (mixed $value, Document $document, Database $database) {
return $database
->find('webhooks', [
new Query('projectId', Query::TYPE_EQUAL, [$document->getId()])
- ], $database->getIndexLimit(), 0, []);
+ ], APP_LIMIT_SUBQUERY);
}
);
Database::addFilter(
'subQuerySessions',
- function ($value) {
+ function (mixed $value) {
return null;
},
- function ($value, Document $document, Database $database) {
- $sessions = Authorization::skip(fn () => $database->find('sessions', [
+ function (mixed $value, Document $document, Database $database) {
+ return Authorization::skip(fn () => $database->find('sessions', [
new Query('userId', Query::TYPE_EQUAL, [$document->getId()])
- ], $database->getIndexLimit(), 0, []));
-
- return $sessions;
+ ], APP_LIMIT_SUBQUERY));
}
);
Database::addFilter(
'subQueryTokens',
- function ($value) {
+ function (mixed $value) {
return null;
},
- function ($value, Document $document, Database $database) {
+ function (mixed $value, Document $document, Database $database) {
return Authorization::skip(fn() => $database
->find('tokens', [
new Query('userId', Query::TYPE_EQUAL, [$document->getId()])
- ], $database->getIndexLimit(), 0, []));
+ ], APP_LIMIT_SUBQUERY));
}
);
Database::addFilter(
'subQueryMemberships',
- function ($value) {
+ function (mixed $value) {
return null;
},
- function ($value, Document $document, Database $database) {
+ function (mixed $value, Document $document, Database $database) {
return Authorization::skip(fn() => $database
->find('memberships', [
new Query('userId', Query::TYPE_EQUAL, [$document->getId()])
- ], $database->getIndexLimit(), 0, []));
+ ], APP_LIMIT_SUBQUERY));
}
);
Database::addFilter(
'encrypt',
- function ($value) {
+ function (mixed $value) {
$key = App::getEnv('_APP_OPENSSL_KEY_V1');
$iv = OpenSSL::randomPseudoBytes(OpenSSL::cipherIVLength(OpenSSL::CIPHER_AES_128_GCM));
$tag = null;
+
return json_encode([
'data' => OpenSSL::encrypt($value, OpenSSL::CIPHER_AES_128_GCM, $key, 0, $iv, $tag),
'method' => OpenSSL::CIPHER_AES_128_GCM,
@@ -374,7 +379,7 @@ Database::addFilter(
'version' => '1',
]);
},
- function ($value) {
+ function (mixed $value) {
if (is_null($value)) {
return null;
}
diff --git a/app/realtime.php b/app/realtime.php
index 0a6cf4f48..7f3264f31 100644
--- a/app/realtime.php
+++ b/app/realtime.php
@@ -187,7 +187,7 @@ $server->onStart(function () use ($stats, $register, $containerId, &$statsDocume
});
$server->onWorkerStart(function (int $workerId) use ($server, $register, $stats, $realtime, $logError) {
- Console::success('Worker ' . $workerId . ' started succefully');
+ Console::success('Worker ' . $workerId . ' started successfully');
$attempts = 0;
$start = time();
diff --git a/app/views/console/functions/function.phtml b/app/views/console/functions/function.phtml
index 68779e886..17bb873ee 100644
--- a/app/views/console/functions/function.phtml
+++ b/app/views/console/functions/function.phtml
@@ -703,7 +703,7 @@ sort($patterns);
--functionId={{project-function.$id}} \
--activate=true \
--entrypoint='scriptFile' \
- --code='/myrepo/myfunction'" data-forms-code="bash" data-lang="bash" data-lang-label="Bash">
+ --code='.'" data-forms-code="bash" data-lang="bash" data-lang-label="Bash">
PowerShell
@@ -713,7 +713,7 @@ sort($patterns);
--functionId={{project-function.$id}} `
--activate=true `
--entrypoint='scriptFile' `
- --code='/myrepo/myfunction'" data-forms-code="powershell" data-lang="powershell" data-lang-label="PowerShell">
+ --code='.'" data-forms-code="powershell" data-lang="powershell" data-lang-label="PowerShell">
Learn more about creating deployments , installing and using the Appwrite CLI .
diff --git a/app/views/console/users/team.phtml b/app/views/console/users/team.phtml
index c7c3f84b8..1fbe5d622 100644
--- a/app/views/console/users/team.phtml
+++ b/app/views/console/users/team.phtml
@@ -137,12 +137,12 @@
data-analytics-label="Create Team Membership"
data-service="teams.createMembership"
data-event="submit"
- data-loading="Sending invitation, please wait..."
+ data-loading="Adding user, please wait..."
data-success="alert,trigger,reset"
- data-success-param-alert-text="Invitation sent successfully"
+ data-success-param-alert-text="User added successfully"
data-success-param-trigger-events="teams.createMembership"
data-failure="alert"
- data-failure-param-alert-text="Failed to send invite"
+ data-failure-param-alert-text="Failed to add user"
data-failure-param-alert-classname="error">
diff --git a/composer.json b/composer.json
index 0c2919129..6ce1bd218 100644
--- a/composer.json
+++ b/composer.json
@@ -75,8 +75,7 @@
"appwrite/sdk-generator": "0.18.8",
"phpunit/phpunit": "9.5.20",
"swoole/ide-helper": "4.8.9",
- "textalk/websocket": "1.5.7",
- "vimeo/psalm": "4.13.1"
+ "textalk/websocket": "1.5.7"
},
"provide": {
"ext-phpiredis": "*"
diff --git a/composer.lock b/composer.lock
index 8bef73637..f9dcd577c 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "33d139681a16da8436756e9b5a27f745",
+ "content-hash": "9450d0e08c0f21141af8d99232d37df9",
"packages": [
{
"name": "adhocore/jwt",
@@ -481,16 +481,16 @@
},
{
"name": "guzzlehttp/guzzle",
- "version": "7.4.2",
+ "version": "7.4.3",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "ac1ec1cd9b5624694c3a40be801d94137afb12b4"
+ "reference": "74a8602c6faec9ef74b7a9391ac82c5e65b1cdab"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ac1ec1cd9b5624694c3a40be801d94137afb12b4",
- "reference": "ac1ec1cd9b5624694c3a40be801d94137afb12b4",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/74a8602c6faec9ef74b7a9391ac82c5e65b1cdab",
+ "reference": "74a8602c6faec9ef74b7a9391ac82c5e65b1cdab",
"shasum": ""
},
"require": {
@@ -585,7 +585,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
- "source": "https://github.com/guzzle/guzzle/tree/7.4.2"
+ "source": "https://github.com/guzzle/guzzle/tree/7.4.3"
},
"funding": [
{
@@ -601,7 +601,7 @@
"type": "tidelift"
}
],
- "time": "2022-03-20T14:16:28+00:00"
+ "time": "2022-05-25T13:24:33+00:00"
},
{
"name": "guzzlehttp/promises",
@@ -1639,25 +1639,25 @@
},
{
"name": "symfony/deprecation-contracts",
- "version": "v3.0.1",
+ "version": "v3.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
+ "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
- "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918",
+ "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918",
"shasum": ""
},
"require": {
- "php": ">=8.0.2"
+ "php": ">=8.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-main": "3.1-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -1686,7 +1686,7 @@
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.1"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.0"
},
"funding": [
{
@@ -1702,20 +1702,20 @@
"type": "tidelift"
}
],
- "time": "2022-01-02T09:55:41+00:00"
+ "time": "2022-02-25T11:15:52+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.25.0",
+ "version": "v1.26.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "30885182c981ab175d4d034db0f6f469898070ab"
+ "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab",
- "reference": "30885182c981ab175d4d034db0f6f469898070ab",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
+ "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
"shasum": ""
},
"require": {
@@ -1730,7 +1730,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.23-dev"
+ "dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1768,7 +1768,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0"
},
"funding": [
{
@@ -1784,20 +1784,20 @@
"type": "tidelift"
}
],
- "time": "2021-10-20T20:35:02+00:00"
+ "time": "2022-05-24T11:49:31+00:00"
},
{
"name": "symfony/polyfill-php80",
- "version": "v1.25.0",
+ "version": "v1.26.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c"
+ "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c",
- "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+ "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace",
"shasum": ""
},
"require": {
@@ -1806,7 +1806,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.23-dev"
+ "dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1851,7 +1851,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0"
},
"funding": [
{
@@ -1867,7 +1867,7 @@
"type": "tidelift"
}
],
- "time": "2022-03-04T08:16:47+00:00"
+ "time": "2022-05-10T07:21:04+00:00"
},
{
"name": "utopia-php/abuse",
@@ -2963,172 +2963,6 @@
}
],
"packages-dev": [
- {
- "name": "amphp/amp",
- "version": "v2.6.2",
- "source": {
- "type": "git",
- "url": "https://github.com/amphp/amp.git",
- "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb",
- "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "require-dev": {
- "amphp/php-cs-fixer-config": "dev-master",
- "amphp/phpunit-util": "^1",
- "ext-json": "*",
- "jetbrains/phpstorm-stubs": "^2019.3",
- "phpunit/phpunit": "^7 | ^8 | ^9",
- "psalm/phar": "^3.11@dev",
- "react/promise": "^2"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.x-dev"
- }
- },
- "autoload": {
- "files": [
- "lib/functions.php",
- "lib/Internal/functions.php"
- ],
- "psr-4": {
- "Amp\\": "lib"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Daniel Lowrey",
- "email": "rdlowrey@php.net"
- },
- {
- "name": "Aaron Piotrowski",
- "email": "aaron@trowski.com"
- },
- {
- "name": "Bob Weinand",
- "email": "bobwei9@hotmail.com"
- },
- {
- "name": "Niklas Keller",
- "email": "me@kelunik.com"
- }
- ],
- "description": "A non-blocking concurrency framework for PHP applications.",
- "homepage": "https://amphp.org/amp",
- "keywords": [
- "async",
- "asynchronous",
- "awaitable",
- "concurrency",
- "event",
- "event-loop",
- "future",
- "non-blocking",
- "promise"
- ],
- "support": {
- "irc": "irc://irc.freenode.org/amphp",
- "issues": "https://github.com/amphp/amp/issues",
- "source": "https://github.com/amphp/amp/tree/v2.6.2"
- },
- "funding": [
- {
- "url": "https://github.com/amphp",
- "type": "github"
- }
- ],
- "time": "2022-02-20T17:52:18+00:00"
- },
- {
- "name": "amphp/byte-stream",
- "version": "v1.8.1",
- "source": {
- "type": "git",
- "url": "https://github.com/amphp/byte-stream.git",
- "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd",
- "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd",
- "shasum": ""
- },
- "require": {
- "amphp/amp": "^2",
- "php": ">=7.1"
- },
- "require-dev": {
- "amphp/php-cs-fixer-config": "dev-master",
- "amphp/phpunit-util": "^1.4",
- "friendsofphp/php-cs-fixer": "^2.3",
- "jetbrains/phpstorm-stubs": "^2019.3",
- "phpunit/phpunit": "^6 || ^7 || ^8",
- "psalm/phar": "^3.11.4"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.x-dev"
- }
- },
- "autoload": {
- "files": [
- "lib/functions.php"
- ],
- "psr-4": {
- "Amp\\ByteStream\\": "lib"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Aaron Piotrowski",
- "email": "aaron@trowski.com"
- },
- {
- "name": "Niklas Keller",
- "email": "me@kelunik.com"
- }
- ],
- "description": "A stream abstraction to make working with non-blocking I/O simple.",
- "homepage": "http://amphp.org/byte-stream",
- "keywords": [
- "amp",
- "amphp",
- "async",
- "io",
- "non-blocking",
- "stream"
- ],
- "support": {
- "irc": "irc://irc.freenode.org/amphp",
- "issues": "https://github.com/amphp/byte-stream/issues",
- "source": "https://github.com/amphp/byte-stream/tree/v1.8.1"
- },
- "funding": [
- {
- "url": "https://github.com/amphp",
- "type": "github"
- }
- ],
- "time": "2021-03-30T17:13:30+00:00"
- },
{
"name": "appwrite/sdk-generator",
"version": "0.18.8",
@@ -3179,261 +3013,6 @@
},
"time": "2022-05-19T10:34:06+00:00"
},
- {
- "name": "composer/pcre",
- "version": "1.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/pcre.git",
- "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560",
- "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560",
- "shasum": ""
- },
- "require": {
- "php": "^5.3.2 || ^7.0 || ^8.0"
- },
- "require-dev": {
- "phpstan/phpstan": "^1.3",
- "phpstan/phpstan-strict-rules": "^1.1",
- "symfony/phpunit-bridge": "^4.2 || ^5"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Composer\\Pcre\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- }
- ],
- "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
- "keywords": [
- "PCRE",
- "preg",
- "regex",
- "regular expression"
- ],
- "support": {
- "issues": "https://github.com/composer/pcre/issues",
- "source": "https://github.com/composer/pcre/tree/1.0.1"
- },
- "funding": [
- {
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://github.com/composer",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
- }
- ],
- "time": "2022-01-21T20:24:37+00:00"
- },
- {
- "name": "composer/semver",
- "version": "3.3.2",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/semver.git",
- "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
- "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
- "shasum": ""
- },
- "require": {
- "php": "^5.3.2 || ^7.0 || ^8.0"
- },
- "require-dev": {
- "phpstan/phpstan": "^1.4",
- "symfony/phpunit-bridge": "^4.2 || ^5"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "3.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Composer\\Semver\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nils Adermann",
- "email": "naderman@naderman.de",
- "homepage": "http://www.naderman.de"
- },
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- },
- {
- "name": "Rob Bast",
- "email": "rob.bast@gmail.com",
- "homepage": "http://robbast.nl"
- }
- ],
- "description": "Semver library that offers utilities, version constraint parsing and validation.",
- "keywords": [
- "semantic",
- "semver",
- "validation",
- "versioning"
- ],
- "support": {
- "irc": "irc://irc.freenode.org/composer",
- "issues": "https://github.com/composer/semver/issues",
- "source": "https://github.com/composer/semver/tree/3.3.2"
- },
- "funding": [
- {
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://github.com/composer",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
- }
- ],
- "time": "2022-04-01T19:23:25+00:00"
- },
- {
- "name": "composer/xdebug-handler",
- "version": "2.0.5",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/xdebug-handler.git",
- "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/9e36aeed4616366d2b690bdce11f71e9178c579a",
- "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a",
- "shasum": ""
- },
- "require": {
- "composer/pcre": "^1",
- "php": "^5.3.2 || ^7.0 || ^8.0",
- "psr/log": "^1 || ^2 || ^3"
- },
- "require-dev": {
- "phpstan/phpstan": "^1.0",
- "phpstan/phpstan-strict-rules": "^1.1",
- "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Composer\\XdebugHandler\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "John Stevenson",
- "email": "john-stevenson@blueyonder.co.uk"
- }
- ],
- "description": "Restarts a process without Xdebug.",
- "keywords": [
- "Xdebug",
- "performance"
- ],
- "support": {
- "irc": "irc://irc.freenode.org/composer",
- "issues": "https://github.com/composer/xdebug-handler/issues",
- "source": "https://github.com/composer/xdebug-handler/tree/2.0.5"
- },
- "funding": [
- {
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://github.com/composer",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
- }
- ],
- "time": "2022-02-24T20:20:32+00:00"
- },
- {
- "name": "dnoegel/php-xdg-base-dir",
- "version": "v0.1.1",
- "source": {
- "type": "git",
- "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
- "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
- "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.2"
- },
- "require-dev": {
- "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "XdgBaseDir\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "implementation of xdg base directory specification for php",
- "support": {
- "issues": "https://github.com/dnoegel/php-xdg-base-dir/issues",
- "source": "https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1"
- },
- "time": "2019-12-04T15:06:13+00:00"
- },
{
"name": "doctrine/instantiator",
"version": "1.4.1",
@@ -3504,107 +3083,6 @@
],
"time": "2022-03-03T08:28:38+00:00"
},
- {
- "name": "felixfbecker/advanced-json-rpc",
- "version": "v3.2.1",
- "source": {
- "type": "git",
- "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
- "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447",
- "reference": "b5f37dbff9a8ad360ca341f3240dc1c168b45447",
- "shasum": ""
- },
- "require": {
- "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
- "php": "^7.1 || ^8.0",
- "phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^7.0 || ^8.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "AdvancedJsonRpc\\": "lib/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "ISC"
- ],
- "authors": [
- {
- "name": "Felix Becker",
- "email": "felix.b@outlook.com"
- }
- ],
- "description": "A more advanced JSONRPC implementation",
- "support": {
- "issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues",
- "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1"
- },
- "time": "2021-06-11T22:34:44+00:00"
- },
- {
- "name": "felixfbecker/language-server-protocol",
- "version": "v1.5.2",
- "source": {
- "type": "git",
- "url": "https://github.com/felixfbecker/php-language-server-protocol.git",
- "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/6e82196ffd7c62f7794d778ca52b69feec9f2842",
- "reference": "6e82196ffd7c62f7794d778ca52b69feec9f2842",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "require-dev": {
- "phpstan/phpstan": "*",
- "squizlabs/php_codesniffer": "^3.1",
- "vimeo/psalm": "^4.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "LanguageServerProtocol\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "ISC"
- ],
- "authors": [
- {
- "name": "Felix Becker",
- "email": "felix.b@outlook.com"
- }
- ],
- "description": "PHP classes for the Language Server Protocol",
- "keywords": [
- "language",
- "microsoft",
- "php",
- "server"
- ],
- "support": {
- "issues": "https://github.com/felixfbecker/php-language-server-protocol/issues",
- "source": "https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.2"
- },
- "time": "2022-03-02T22:36:06+00:00"
- },
{
"name": "matthiasmullie/minify",
"version": "1.3.68",
@@ -3787,69 +3265,18 @@
],
"time": "2022-03-03T13:19:32+00:00"
},
- {
- "name": "netresearch/jsonmapper",
- "version": "v4.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/cweiske/jsonmapper.git",
- "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/cweiske/jsonmapper/zipball/8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d",
- "reference": "8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "ext-pcre": "*",
- "ext-reflection": "*",
- "ext-spl": "*",
- "php": ">=7.1"
- },
- "require-dev": {
- "phpunit/phpunit": "~7.5 || ~8.0 || ~9.0",
- "squizlabs/php_codesniffer": "~3.5"
- },
- "type": "library",
- "autoload": {
- "psr-0": {
- "JsonMapper": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "OSL-3.0"
- ],
- "authors": [
- {
- "name": "Christian Weiske",
- "email": "cweiske@cweiske.de",
- "homepage": "http://github.com/cweiske/jsonmapper/",
- "role": "Developer"
- }
- ],
- "description": "Map nested JSON structures onto PHP classes",
- "support": {
- "email": "cweiske@cweiske.de",
- "issues": "https://github.com/cweiske/jsonmapper/issues",
- "source": "https://github.com/cweiske/jsonmapper/tree/v4.0.0"
- },
- "time": "2020-12-01T19:48:11+00:00"
- },
{
"name": "nikic/php-parser",
- "version": "v4.13.2",
+ "version": "v4.14.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "210577fe3cf7badcc5814d99455df46564f3c077"
+ "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
- "reference": "210577fe3cf7badcc5814d99455df46564f3c077",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1",
+ "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1",
"shasum": ""
},
"require": {
@@ -3890,62 +3317,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0"
},
- "time": "2021-11-30T19:35:32+00:00"
- },
- {
- "name": "openlss/lib-array2xml",
- "version": "1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/nullivex/lib-array2xml.git",
- "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/a91f18a8dfc69ffabe5f9b068bc39bb202c81d90",
- "reference": "a91f18a8dfc69ffabe5f9b068bc39bb202c81d90",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.2"
- },
- "type": "library",
- "autoload": {
- "psr-0": {
- "LSS": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Bryan Tong",
- "email": "bryan@nullivex.com",
- "homepage": "https://www.nullivex.com"
- },
- {
- "name": "Tony Butler",
- "email": "spudz76@gmail.com",
- "homepage": "https://www.nullivex.com"
- }
- ],
- "description": "Array2XML conversion library credit to lalit.org",
- "homepage": "https://www.nullivex.com",
- "keywords": [
- "array",
- "array conversion",
- "xml",
- "xml conversion"
- ],
- "support": {
- "issues": "https://github.com/nullivex/lib-array2xml/issues",
- "source": "https://github.com/nullivex/lib-array2xml/tree/master"
- },
- "time": "2019-03-29T20:06:56+00:00"
+ "time": "2022-05-31T20:59:12+00:00"
},
{
"name": "phar-io/manifest",
@@ -4706,59 +4080,6 @@
],
"time": "2022-04-01T12:37:26+00:00"
},
- {
- "name": "psr/container",
- "version": "2.0.2",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/container.git",
- "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
- "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
- "shasum": ""
- },
- "require": {
- "php": ">=7.4.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Container\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
- }
- ],
- "description": "Common Container Interface (PHP FIG PSR-11)",
- "homepage": "https://github.com/php-fig/container",
- "keywords": [
- "PSR-11",
- "container",
- "container-interface",
- "container-interop",
- "psr"
- ],
- "support": {
- "issues": "https://github.com/php-fig/container/issues",
- "source": "https://github.com/php-fig/container/tree/2.0.2"
- },
- "time": "2021-11-05T16:47:00+00:00"
- },
{
"name": "sebastian/cli-parser",
"version": "1.0.1",
@@ -5765,278 +5086,18 @@
],
"time": "2022-04-18T20:38:04+00:00"
},
- {
- "name": "symfony/console",
- "version": "v6.0.8",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/console.git",
- "reference": "0d00aa289215353aa8746a31d101f8e60826285c"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/0d00aa289215353aa8746a31d101f8e60826285c",
- "reference": "0d00aa289215353aa8746a31d101f8e60826285c",
- "shasum": ""
- },
- "require": {
- "php": ">=8.0.2",
- "symfony/polyfill-mbstring": "~1.0",
- "symfony/service-contracts": "^1.1|^2|^3",
- "symfony/string": "^5.4|^6.0"
- },
- "conflict": {
- "symfony/dependency-injection": "<5.4",
- "symfony/dotenv": "<5.4",
- "symfony/event-dispatcher": "<5.4",
- "symfony/lock": "<5.4",
- "symfony/process": "<5.4"
- },
- "provide": {
- "psr/log-implementation": "1.0|2.0|3.0"
- },
- "require-dev": {
- "psr/log": "^1|^2|^3",
- "symfony/config": "^5.4|^6.0",
- "symfony/dependency-injection": "^5.4|^6.0",
- "symfony/event-dispatcher": "^5.4|^6.0",
- "symfony/lock": "^5.4|^6.0",
- "symfony/process": "^5.4|^6.0",
- "symfony/var-dumper": "^5.4|^6.0"
- },
- "suggest": {
- "psr/log": "For using the console logger",
- "symfony/event-dispatcher": "",
- "symfony/lock": "",
- "symfony/process": ""
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Console\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Eases the creation of beautiful and testable command line interfaces",
- "homepage": "https://symfony.com",
- "keywords": [
- "cli",
- "command line",
- "console",
- "terminal"
- ],
- "support": {
- "source": "https://github.com/symfony/console/tree/v6.0.8"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2022-04-20T15:01:42+00:00"
- },
- {
- "name": "symfony/polyfill-intl-grapheme",
- "version": "v1.25.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "81b86b50cf841a64252b439e738e97f4a34e2783"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783",
- "reference": "81b86b50cf841a64252b439e738e97f4a34e2783",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "suggest": {
- "ext-intl": "For best performance"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "autoload": {
- "files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for intl's grapheme_* functions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "grapheme",
- "intl",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2021-11-23T21:10:46+00:00"
- },
- {
- "name": "symfony/polyfill-intl-normalizer",
- "version": "v1.25.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8",
- "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1"
- },
- "suggest": {
- "ext-intl": "For best performance"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "1.23-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "autoload": {
- "files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
- },
- "classmap": [
- "Resources/stubs"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for intl's Normalizer class and related functions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "intl",
- "normalizer",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2021-02-19T12:13:01+00:00"
- },
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.25.0",
+ "version": "v1.26.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825"
+ "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825",
- "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+ "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"shasum": ""
},
"require": {
@@ -6051,7 +5112,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "1.23-dev"
+ "dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -6090,7 +5151,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
},
"funding": [
{
@@ -6106,174 +5167,7 @@
"type": "tidelift"
}
],
- "time": "2021-11-30T18:21:41+00:00"
- },
- {
- "name": "symfony/service-contracts",
- "version": "v3.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/service-contracts.git",
- "reference": "e517458f278c2131ca9f262f8fbaf01410f2c65c"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e517458f278c2131ca9f262f8fbaf01410f2c65c",
- "reference": "e517458f278c2131ca9f262f8fbaf01410f2c65c",
- "shasum": ""
- },
- "require": {
- "php": ">=8.0.2",
- "psr/container": "^2.0"
- },
- "conflict": {
- "ext-psr": "<1.1|>=2"
- },
- "suggest": {
- "symfony/service-implementation": ""
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "3.0-dev"
- },
- "thanks": {
- "name": "symfony/contracts",
- "url": "https://github.com/symfony/contracts"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Contracts\\Service\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Generic abstractions related to writing services",
- "homepage": "https://symfony.com",
- "keywords": [
- "abstractions",
- "contracts",
- "decoupling",
- "interfaces",
- "interoperability",
- "standards"
- ],
- "support": {
- "source": "https://github.com/symfony/service-contracts/tree/v3.0.1"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2022-03-13T20:10:05+00:00"
- },
- {
- "name": "symfony/string",
- "version": "v6.0.8",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/string.git",
- "reference": "ac0aa5c2282e0de624c175b68d13f2c8f2e2649d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/ac0aa5c2282e0de624c175b68d13f2c8f2e2649d",
- "reference": "ac0aa5c2282e0de624c175b68d13f2c8f2e2649d",
- "shasum": ""
- },
- "require": {
- "php": ">=8.0.2",
- "symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-intl-grapheme": "~1.0",
- "symfony/polyfill-intl-normalizer": "~1.0",
- "symfony/polyfill-mbstring": "~1.0"
- },
- "conflict": {
- "symfony/translation-contracts": "<2.0"
- },
- "require-dev": {
- "symfony/error-handler": "^5.4|^6.0",
- "symfony/http-client": "^5.4|^6.0",
- "symfony/translation-contracts": "^2.0|^3.0",
- "symfony/var-exporter": "^5.4|^6.0"
- },
- "type": "library",
- "autoload": {
- "files": [
- "Resources/functions.php"
- ],
- "psr-4": {
- "Symfony\\Component\\String\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
- "homepage": "https://symfony.com",
- "keywords": [
- "grapheme",
- "i18n",
- "string",
- "unicode",
- "utf-8",
- "utf8"
- ],
- "support": {
- "source": "https://github.com/symfony/string/tree/v6.0.8"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2022-04-22T08:18:02+00:00"
+ "time": "2022-05-24T11:49:31+00:00"
},
{
"name": "textalk/websocket",
@@ -6449,163 +5343,6 @@
}
],
"time": "2022-05-17T05:48:52+00:00"
- },
- {
- "name": "vimeo/psalm",
- "version": "4.13.1",
- "source": {
- "type": "git",
- "url": "https://github.com/vimeo/psalm.git",
- "reference": "5cf660f63b548ccd4a56f62d916ee4d6028e01a3"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/vimeo/psalm/zipball/5cf660f63b548ccd4a56f62d916ee4d6028e01a3",
- "reference": "5cf660f63b548ccd4a56f62d916ee4d6028e01a3",
- "shasum": ""
- },
- "require": {
- "amphp/amp": "^2.4.2",
- "amphp/byte-stream": "^1.5",
- "composer/package-versions-deprecated": "^1.8.0",
- "composer/semver": "^1.4 || ^2.0 || ^3.0",
- "composer/xdebug-handler": "^1.1 || ^2.0",
- "dnoegel/php-xdg-base-dir": "^0.1.1",
- "ext-ctype": "*",
- "ext-dom": "*",
- "ext-json": "*",
- "ext-libxml": "*",
- "ext-mbstring": "*",
- "ext-simplexml": "*",
- "ext-tokenizer": "*",
- "felixfbecker/advanced-json-rpc": "^3.0.3",
- "felixfbecker/language-server-protocol": "^1.5",
- "netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
- "nikic/php-parser": "^4.13",
- "openlss/lib-array2xml": "^1.0",
- "php": "^7.1|^8",
- "sebastian/diff": "^3.0 || ^4.0",
- "symfony/console": "^3.4.17 || ^4.1.6 || ^5.0 || ^6.0",
- "webmozart/path-util": "^2.3"
- },
- "provide": {
- "psalm/psalm": "self.version"
- },
- "require-dev": {
- "bamarni/composer-bin-plugin": "^1.2",
- "brianium/paratest": "^4.0||^6.0",
- "ext-curl": "*",
- "php-parallel-lint/php-parallel-lint": "^1.2",
- "phpdocumentor/reflection-docblock": "^5",
- "phpmyadmin/sql-parser": "5.1.0||dev-master",
- "phpspec/prophecy": ">=1.9.0",
- "phpunit/phpunit": "^9.0",
- "psalm/plugin-phpunit": "^0.16",
- "slevomat/coding-standard": "^7.0",
- "squizlabs/php_codesniffer": "^3.5",
- "symfony/process": "^4.3 || ^5.0 || ^6.0",
- "weirdan/prophecy-shim": "^1.0 || ^2.0"
- },
- "suggest": {
- "ext-curl": "In order to send data to shepherd",
- "ext-igbinary": "^2.0.5 is required, used to serialize caching data"
- },
- "bin": [
- "psalm",
- "psalm-language-server",
- "psalm-plugin",
- "psalm-refactor",
- "psalter"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "4.x-dev",
- "dev-3.x": "3.x-dev",
- "dev-2.x": "2.x-dev",
- "dev-1.x": "1.x-dev"
- }
- },
- "autoload": {
- "files": [
- "src/functions.php",
- "src/spl_object_id.php"
- ],
- "psr-4": {
- "Psalm\\": "src/Psalm/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Matthew Brown"
- }
- ],
- "description": "A static analysis tool for finding errors in PHP applications",
- "keywords": [
- "code",
- "inspection",
- "php"
- ],
- "support": {
- "issues": "https://github.com/vimeo/psalm/issues",
- "source": "https://github.com/vimeo/psalm/tree/4.13.1"
- },
- "time": "2021-11-23T23:52:49+00:00"
- },
- {
- "name": "webmozart/path-util",
- "version": "2.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/webmozart/path-util.git",
- "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
- "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3",
- "webmozart/assert": "~1.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.6",
- "sebastian/version": "^1.0.1"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.3-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Webmozart\\PathUtil\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Bernhard Schussek",
- "email": "bschussek@gmail.com"
- }
- ],
- "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.",
- "support": {
- "issues": "https://github.com/webmozart/path-util/issues",
- "source": "https://github.com/webmozart/path-util/tree/2.3.0"
- },
- "abandoned": "symfony/filesystem",
- "time": "2015-12-17T08:42:14+00:00"
}
],
"aliases": [],
@@ -6632,5 +5369,5 @@
"platform-overrides": {
"php": "8.0"
},
- "plugin-api-version": "2.2.0"
+ "plugin-api-version": "2.3.0"
}
diff --git a/docker-compose.yml b/docker-compose.yml
index fd34920d6..b6e1ed68b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -101,7 +101,6 @@ services:
- appwrite-certificates:/storage/certificates:rw
- appwrite-functions:/storage/functions:rw
- ./phpunit.xml:/usr/src/code/phpunit.xml
- - ./psalm.xml:/usr/src/code/psalm.xml
- ./tests:/usr/src/code/tests
- ./app:/usr/src/code/app
# - ./vendor:/usr/src/code/vendor
diff --git a/docs/sdks/flutter/GETTING_STARTED.md b/docs/sdks/flutter/GETTING_STARTED.md
index 78fa4f93b..0a83ae67b 100644
--- a/docs/sdks/flutter/GETTING_STARTED.md
+++ b/docs/sdks/flutter/GETTING_STARTED.md
@@ -10,11 +10,14 @@ If you are building your Flutter application for multiple devices, you have to f
### Android
For **Android** first add your app name and package name , Your package name is generally the **applicationId** in your app-level build.gradle file. By registering your new app platform, you are allowing your app to communicate with the Appwrite API.
-In order to capture the Appwrite OAuth callback url, the following activity needs to be added to your [AndroidManifest.xml](https://github.com/appwrite/playground-for-flutter/blob/master/android/app/src/main/AndroidManifest.xml). Be sure to replace the **[PROJECT_ID]** string with your actual Appwrite project ID. You can find your Appwrite project ID in your project settings screen in the console.
+In order to capture the Appwrite OAuth callback url, the following activity needs to be added inside the `` tag, along side the existing `` tags in your [AndroidManifest.xml](https://github.com/appwrite/playground-for-flutter/blob/master/android/app/src/main/AndroidManifest.xml). Be sure to replace the **[PROJECT_ID]** string with your actual Appwrite project ID. You can find your Appwrite project ID in your project settings screen in the console.
```xml
-
-
+
+ ....
+
+ ....
+
diff --git a/docs/services/storage.md b/docs/services/storage.md
index 97f8b10da..02f1ff430 100644
--- a/docs/services/storage.md
+++ b/docs/services/storage.md
@@ -4,4 +4,6 @@ Files are managed using buckets. Storage buckets are similar to Collections we h
Using Appwrite permissions architecture, you can assign read or write access to each bucket or file in your project for either a specific user, team, user role, or even grant it with public access (`role:all`). You can learn more about [how Appwrite handles permissions and access control](/docs/permissions).
-The preview endpoint allows you to generate preview images for your files. Using the preview endpoint, you can also manipulate the resulting image so that it will fit perfectly inside your app in terms of dimensions, file size, and style. The preview endpoint also allows you to change the resulting image file format for better compression or image quality for better delivery over the network.
\ No newline at end of file
+The preview endpoint allows you to generate preview images for your files. Using the preview endpoint, you can also manipulate the resulting image so that it will fit perfectly inside your app in terms of dimensions, file size, and style. The preview endpoint also allows you to change the resulting image file format for better compression or image quality for better delivery over the network.
+
+The maximum file size allowed for file upload is controlled by the `_APP_STORAGE_LIMIT` environment variable, which defaults to 30 MB. See [Environment Variables](/docs/environment-variables#storage) for more information.
diff --git a/phpcs.xml b/phpcs.xml
new file mode 100644
index 000000000..cb31d549e
--- /dev/null
+++ b/phpcs.xml
@@ -0,0 +1,22 @@
+
+
+
+ ./app
+ ./src
+ ./tests
+
+
+ ./app/sdks
+
+
+ *
+
+
+
+ *
+
+
+
+ ./app
+
+
\ No newline at end of file
diff --git a/psalm.xml b/psalm.xml
deleted file mode 100644
index 30258a709..000000000
--- a/psalm.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/public/images/runtimes/dotnet.png b/public/images/runtimes/dotnet.png
index 824721f20..aa003d5c3 100644
Binary files a/public/images/runtimes/dotnet.png and b/public/images/runtimes/dotnet.png differ
diff --git a/src/Appwrite/Auth/Auth.php b/src/Appwrite/Auth/Auth.php
index 8b1687102..40560371f 100644
--- a/src/Appwrite/Auth/Auth.php
+++ b/src/Appwrite/Auth/Auth.php
@@ -10,38 +10,38 @@ class Auth
/**
* User Roles.
*/
- const USER_ROLE_ALL = 'all';
- const USER_ROLE_GUEST = 'guest';
- const USER_ROLE_MEMBER = 'member';
- const USER_ROLE_ADMIN = 'admin';
- const USER_ROLE_DEVELOPER = 'developer';
- const USER_ROLE_OWNER = 'owner';
- const USER_ROLE_APP = 'app';
- const USER_ROLE_SYSTEM = 'system';
+ public const USER_ROLE_ALL = 'all';
+ public const USER_ROLE_GUEST = 'guest';
+ public const USER_ROLE_MEMBER = 'member';
+ public const USER_ROLE_ADMIN = 'admin';
+ public const USER_ROLE_DEVELOPER = 'developer';
+ public const USER_ROLE_OWNER = 'owner';
+ public const USER_ROLE_APP = 'app';
+ public const USER_ROLE_SYSTEM = 'system';
/**
* Token Types.
*/
- const TOKEN_TYPE_LOGIN = 1; // Deprecated
- const TOKEN_TYPE_VERIFICATION = 2;
- const TOKEN_TYPE_RECOVERY = 3;
- const TOKEN_TYPE_INVITE = 4;
- const TOKEN_TYPE_MAGIC_URL = 5;
+ public const TOKEN_TYPE_LOGIN = 1; // Deprecated
+ public const TOKEN_TYPE_VERIFICATION = 2;
+ public const TOKEN_TYPE_RECOVERY = 3;
+ public const TOKEN_TYPE_INVITE = 4;
+ public const TOKEN_TYPE_MAGIC_URL = 5;
/**
* Session Providers.
*/
- const SESSION_PROVIDER_EMAIL = 'email';
- const SESSION_PROVIDER_ANONYMOUS = 'anonymous';
- const SESSION_PROVIDER_MAGIC_URL = 'magic-url';
+ public const SESSION_PROVIDER_EMAIL = 'email';
+ public const SESSION_PROVIDER_ANONYMOUS = 'anonymous';
+ public const SESSION_PROVIDER_MAGIC_URL = 'magic-url';
/**
* Token Expiration times.
*/
- const TOKEN_EXPIRATION_LOGIN_LONG = 31536000; /* 1 year */
- const TOKEN_EXPIRATION_LOGIN_SHORT = 3600; /* 1 hour */
- const TOKEN_EXPIRATION_RECOVERY = 3600; /* 1 hour */
- const TOKEN_EXPIRATION_CONFIRM = 3600 * 24 * 7; /* 7 days */
+ public const TOKEN_EXPIRATION_LOGIN_LONG = 31536000; /* 1 year */
+ public const TOKEN_EXPIRATION_LOGIN_SHORT = 3600; /* 1 hour */
+ public const TOKEN_EXPIRATION_RECOVERY = 3600; /* 1 hour */
+ public const TOKEN_EXPIRATION_CONFIRM = 3600 * 24 * 7; /* 7 days */
/**
* @var string
diff --git a/src/Appwrite/Auth/OAuth2/Tradeshift.php b/src/Appwrite/Auth/OAuth2/Tradeshift.php
index fb12493d4..8d0bfa878 100644
--- a/src/Appwrite/Auth/OAuth2/Tradeshift.php
+++ b/src/Appwrite/Auth/OAuth2/Tradeshift.php
@@ -9,8 +9,8 @@ use Appwrite\Auth\OAuth2;
class Tradeshift extends OAuth2
{
- const TRADESHIFT_SANDBOX_API_DOMAIN = 'api-sandbox.tradeshift.com';
- const TRADESHIFT_API_DOMAIN = 'api.tradeshift.com';
+ public const TRADESHIFT_SANDBOX_API_DOMAIN = 'api-sandbox.tradeshift.com';
+ public const TRADESHIFT_API_DOMAIN = 'api.tradeshift.com';
private array $apiDomain = [
'sandbox' => self::TRADESHIFT_SANDBOX_API_DOMAIN,
diff --git a/src/Appwrite/Auth/OAuth2/Twitter.php b/src/Appwrite/Auth/OAuth2/Twitter.php
deleted file mode 100644
index e69de29bb..000000000
diff --git a/src/Appwrite/Event/Event.php b/src/Appwrite/Event/Event.php
index 45fefb3b1..629a058fe 100644
--- a/src/Appwrite/Event/Event.php
+++ b/src/Appwrite/Event/Event.php
@@ -8,29 +8,29 @@ use Utopia\Database\Document;
class Event
{
- const DATABASE_QUEUE_NAME = 'v1-database';
- const DATABASE_CLASS_NAME = 'DatabaseV1';
+ public const DATABASE_QUEUE_NAME = 'v1-database';
+ public const DATABASE_CLASS_NAME = 'DatabaseV1';
- const DELETE_QUEUE_NAME = 'v1-deletes';
- const DELETE_CLASS_NAME = 'DeletesV1';
+ public const DELETE_QUEUE_NAME = 'v1-deletes';
+ public const DELETE_CLASS_NAME = 'DeletesV1';
- const AUDITS_QUEUE_NAME = 'v1-audits';
- const AUDITS_CLASS_NAME = 'AuditsV1';
+ public const AUDITS_QUEUE_NAME = 'v1-audits';
+ public const AUDITS_CLASS_NAME = 'AuditsV1';
- const MAILS_QUEUE_NAME = 'v1-mails';
- const MAILS_CLASS_NAME = 'MailsV1';
+ public const MAILS_QUEUE_NAME = 'v1-mails';
+ public const MAILS_CLASS_NAME = 'MailsV1';
- const FUNCTIONS_QUEUE_NAME = 'v1-functions';
- const FUNCTIONS_CLASS_NAME = 'FunctionsV1';
+ public const FUNCTIONS_QUEUE_NAME = 'v1-functions';
+ public const FUNCTIONS_CLASS_NAME = 'FunctionsV1';
- const WEBHOOK_QUEUE_NAME = 'v1-webhooks';
- const WEBHOOK_CLASS_NAME = 'WebhooksV1';
+ public const WEBHOOK_QUEUE_NAME = 'v1-webhooks';
+ public const WEBHOOK_CLASS_NAME = 'WebhooksV1';
- const CERTIFICATES_QUEUE_NAME = 'v1-certificates';
- const CERTIFICATES_CLASS_NAME = 'CertificatesV1';
+ public const CERTIFICATES_QUEUE_NAME = 'v1-certificates';
+ public const CERTIFICATES_CLASS_NAME = 'CertificatesV1';
- const BUILDS_QUEUE_NAME = 'v1-builds';
- const BUILDS_CLASS_NAME = 'BuildsV1';
+ public const BUILDS_QUEUE_NAME = 'v1-builds';
+ public const BUILDS_CLASS_NAME = 'BuildsV1';
protected string $queue = '';
protected string $class = '';
@@ -332,7 +332,7 @@ class Event
* @return array
* @throws \InvalidArgumentException
*/
- static function generateEvents(string $pattern, array $params = []): array
+ public static function generateEvents(string $pattern, array $params = []): array
{
// $params = \array_filter($params, fn($param) => !\is_array($param));
$paramKeys = \array_keys($params);
diff --git a/src/Appwrite/Extend/Exception.php b/src/Appwrite/Extend/Exception.php
index a74ec609d..62695742f 100644
--- a/src/Appwrite/Extend/Exception.php
+++ b/src/Appwrite/Extend/Exception.php
@@ -32,135 +32,135 @@ class Exception extends \Exception
*/
/** General */
- const GENERAL_UNKNOWN = 'general_unknown';
- const GENERAL_MOCK = 'general_mock';
- const GENERAL_ACCESS_FORBIDDEN = 'general_access_forbidden';
- const GENERAL_UNKNOWN_ORIGIN = 'general_unknown_origin';
- const GENERAL_SERVICE_DISABLED = 'general_service_disabled';
- const GENERAL_UNAUTHORIZED_SCOPE = 'general_unauthorized_scope';
- const GENERAL_RATE_LIMIT_EXCEEDED = 'general_rate_limit_exceeded';
- const GENERAL_SMTP_DISABLED = 'general_smtp_disabled';
- const GENERAL_ARGUMENT_INVALID = 'general_argument_invalid';
- const GENERAL_QUERY_LIMIT_EXCEEDED = 'general_query_limit_exceeded';
- const GENERAL_QUERY_INVALID = 'general_query_invalid';
- const GENERAL_ROUTE_NOT_FOUND = 'general_route_not_found';
- const GENERAL_CURSOR_NOT_FOUND = 'general_cursor_not_found';
- const GENERAL_SERVER_ERROR = 'general_server_error';
- const GENERAL_PROTOCOL_UNSUPPORTED = 'general_protocol_unsupported';
+ public const GENERAL_UNKNOWN = 'general_unknown';
+ public const GENERAL_MOCK = 'general_mock';
+ public const GENERAL_ACCESS_FORBIDDEN = 'general_access_forbidden';
+ public const GENERAL_UNKNOWN_ORIGIN = 'general_unknown_origin';
+ public const GENERAL_SERVICE_DISABLED = 'general_service_disabled';
+ public const GENERAL_UNAUTHORIZED_SCOPE = 'general_unauthorized_scope';
+ public const GENERAL_RATE_LIMIT_EXCEEDED = 'general_rate_limit_exceeded';
+ public const GENERAL_SMTP_DISABLED = 'general_smtp_disabled';
+ public const GENERAL_ARGUMENT_INVALID = 'general_argument_invalid';
+ public const GENERAL_QUERY_LIMIT_EXCEEDED = 'general_query_limit_exceeded';
+ public const GENERAL_QUERY_INVALID = 'general_query_invalid';
+ public const GENERAL_ROUTE_NOT_FOUND = 'general_route_not_found';
+ public const GENERAL_CURSOR_NOT_FOUND = 'general_cursor_not_found';
+ public const GENERAL_SERVER_ERROR = 'general_server_error';
+ public const GENERAL_PROTOCOL_UNSUPPORTED = 'general_protocol_unsupported';
/** Users */
- const USER_COUNT_EXCEEDED = 'user_count_exceeded';
- const USER_JWT_INVALID = 'user_jwt_invalid';
- const USER_ALREADY_EXISTS = 'user_already_exists';
- const USER_BLOCKED = 'user_blocked';
- const USER_INVALID_TOKEN = 'user_invalid_token';
- const USER_PASSWORD_RESET_REQUIRED = 'user_password_reset_required';
- const USER_EMAIL_NOT_WHITELISTED = 'user_email_not_whitelisted';
- const USER_IP_NOT_WHITELISTED = 'user_ip_not_whitelisted';
- const USER_INVALID_CREDENTIALS = 'user_invalid_credentials';
- const USER_ANONYMOUS_CONSOLE_PROHIBITED = 'user_anonymous_console_prohibited';
- const USER_SESSION_ALREADY_EXISTS = 'user_session_already_exists';
- const USER_NOT_FOUND = 'user_not_found';
- const USER_EMAIL_ALREADY_EXISTS = 'user_email_already_exists';
- const USER_PASSWORD_MISMATCH = 'user_password_mismatch';
- const USER_SESSION_NOT_FOUND = 'user_session_not_found';
- const USER_UNAUTHORIZED = 'user_unauthorized';
- const USER_AUTH_METHOD_UNSUPPORTED = 'user_auth_method_unsupported';
+ public const USER_COUNT_EXCEEDED = 'user_count_exceeded';
+ public const USER_JWT_INVALID = 'user_jwt_invalid';
+ public const USER_ALREADY_EXISTS = 'user_already_exists';
+ public const USER_BLOCKED = 'user_blocked';
+ public const USER_INVALID_TOKEN = 'user_invalid_token';
+ public const USER_PASSWORD_RESET_REQUIRED = 'user_password_reset_required';
+ public const USER_EMAIL_NOT_WHITELISTED = 'user_email_not_whitelisted';
+ public const USER_IP_NOT_WHITELISTED = 'user_ip_not_whitelisted';
+ public const USER_INVALID_CREDENTIALS = 'user_invalid_credentials';
+ public const USER_ANONYMOUS_CONSOLE_PROHIBITED = 'user_anonymous_console_prohibited';
+ public const USER_SESSION_ALREADY_EXISTS = 'user_session_already_exists';
+ public const USER_NOT_FOUND = 'user_not_found';
+ public const USER_EMAIL_ALREADY_EXISTS = 'user_email_already_exists';
+ public const USER_PASSWORD_MISMATCH = 'user_password_mismatch';
+ public const USER_SESSION_NOT_FOUND = 'user_session_not_found';
+ public const USER_UNAUTHORIZED = 'user_unauthorized';
+ public const USER_AUTH_METHOD_UNSUPPORTED = 'user_auth_method_unsupported';
/** Teams */
- const TEAM_NOT_FOUND = 'team_not_found';
- const TEAM_INVITE_ALREADY_EXISTS = 'team_invite_already_exists';
- const TEAM_INVITE_NOT_FOUND = 'team_invite_not_found';
- const TEAM_INVALID_SECRET = 'team_invalid_secret';
- const TEAM_MEMBERSHIP_MISMATCH = 'team_membership_mismatch';
- const TEAM_INVITE_MISMATCH = 'team_invite_mismatch';
+ public const TEAM_NOT_FOUND = 'team_not_found';
+ public const TEAM_INVITE_ALREADY_EXISTS = 'team_invite_already_exists';
+ public const TEAM_INVITE_NOT_FOUND = 'team_invite_not_found';
+ public const TEAM_INVALID_SECRET = 'team_invalid_secret';
+ public const TEAM_MEMBERSHIP_MISMATCH = 'team_membership_mismatch';
+ public const TEAM_INVITE_MISMATCH = 'team_invite_mismatch';
/** Membership */
- const MEMBERSHIP_NOT_FOUND = 'membership_not_found';
+ public const MEMBERSHIP_NOT_FOUND = 'membership_not_found';
/** Avatars */
- const AVATAR_SET_NOT_FOUND = 'avatar_set_not_found';
- const AVATAR_NOT_FOUND = 'avatar_not_found';
- const AVATAR_IMAGE_NOT_FOUND = 'avatar_image_not_found';
- const AVATAR_REMOTE_URL_FAILED = 'avatar_remote_url_failed';
- const AVATAR_ICON_NOT_FOUND = 'avatar_icon_not_found';
+ public const AVATAR_SET_NOT_FOUND = 'avatar_set_not_found';
+ public const AVATAR_NOT_FOUND = 'avatar_not_found';
+ public const AVATAR_IMAGE_NOT_FOUND = 'avatar_image_not_found';
+ public const AVATAR_REMOTE_URL_FAILED = 'avatar_remote_url_failed';
+ public const AVATAR_ICON_NOT_FOUND = 'avatar_icon_not_found';
/** Storage */
- const STORAGE_FILE_NOT_FOUND = 'storage_file_not_found';
- const STORAGE_DEVICE_NOT_FOUND = 'storage_device_not_found';
- const STORAGE_FILE_EMPTY = 'storage_file_empty';
- const STORAGE_FILE_TYPE_UNSUPPORTED = 'storage_file_type_unsupported';
- const STORAGE_INVALID_FILE_SIZE = 'storage_invalid_file_size';
- const STORAGE_INVALID_FILE = 'storage_invalid_file';
- const STORAGE_BUCKET_ALREADY_EXISTS = 'storage_bucket_already_exists';
- const STORAGE_BUCKET_NOT_FOUND = 'storage_bucket_not_found';
- const STORAGE_INVALID_CONTENT_RANGE = 'storage_invalid_content_range';
- const STORAGE_INVALID_RANGE = 'storage_invalid_range';
+ public const STORAGE_FILE_NOT_FOUND = 'storage_file_not_found';
+ public const STORAGE_DEVICE_NOT_FOUND = 'storage_device_not_found';
+ public const STORAGE_FILE_EMPTY = 'storage_file_empty';
+ public const STORAGE_FILE_TYPE_UNSUPPORTED = 'storage_file_type_unsupported';
+ public const STORAGE_INVALID_FILE_SIZE = 'storage_invalid_file_size';
+ public const STORAGE_INVALID_FILE = 'storage_invalid_file';
+ public const STORAGE_BUCKET_ALREADY_EXISTS = 'storage_bucket_already_exists';
+ public const STORAGE_BUCKET_NOT_FOUND = 'storage_bucket_not_found';
+ public const STORAGE_INVALID_CONTENT_RANGE = 'storage_invalid_content_range';
+ public const STORAGE_INVALID_RANGE = 'storage_invalid_range';
/** Functions */
- const FUNCTION_NOT_FOUND = 'function_not_found';
- const FUNCTION_RUNTIME_UNSUPPORTED = 'function_runtime_unsupported';
+ public const FUNCTION_NOT_FOUND = 'function_not_found';
+ public const FUNCTION_RUNTIME_UNSUPPORTED = 'function_runtime_unsupported';
/** Deployments */
- const DEPLOYMENT_NOT_FOUND = 'deployment_not_found';
+ public const DEPLOYMENT_NOT_FOUND = 'deployment_not_found';
/** Builds */
- const BUILD_NOT_FOUND = 'build_not_found';
- const BUILD_NOT_READY = 'build_not_ready';
- const BUILD_IN_PROGRESS = 'build_in_progress';
+ public const BUILD_NOT_FOUND = 'build_not_found';
+ public const BUILD_NOT_READY = 'build_not_ready';
+ public const BUILD_IN_PROGRESS = 'build_in_progress';
/** Execution */
- const EXECUTION_NOT_FOUND = 'execution_not_found';
+ public const EXECUTION_NOT_FOUND = 'execution_not_found';
/** Collections */
- const COLLECTION_NOT_FOUND = 'collection_not_found';
- const COLLECTION_ALREADY_EXISTS = 'collection_already_exists';
- const COLLECTION_LIMIT_EXCEEDED = 'collection_limit_exceeded';
+ public const COLLECTION_NOT_FOUND = 'collection_not_found';
+ public const COLLECTION_ALREADY_EXISTS = 'collection_already_exists';
+ public const COLLECTION_LIMIT_EXCEEDED = 'collection_limit_exceeded';
/** Documents */
- const DOCUMENT_NOT_FOUND = 'document_not_found';
- const DOCUMENT_INVALID_STRUCTURE = 'document_invalid_structure';
- const DOCUMENT_MISSING_PAYLOAD = 'document_missing_payload';
- const DOCUMENT_ALREADY_EXISTS = 'document_already_exists';
+ public const DOCUMENT_NOT_FOUND = 'document_not_found';
+ public const DOCUMENT_INVALID_STRUCTURE = 'document_invalid_structure';
+ public const DOCUMENT_MISSING_PAYLOAD = 'document_missing_payload';
+ public const DOCUMENT_ALREADY_EXISTS = 'document_already_exists';
/** Attribute */
- const ATTRIBUTE_NOT_FOUND = 'attribute_not_found';
- const ATTRIBUTE_UNKNOWN = 'attribute_unknown';
- const ATTRIBUTE_NOT_AVAILABLE = 'attribute_not_available';
- const ATTRIBUTE_FORMAT_UNSUPPORTED = 'attribute_format_unsupported';
- const ATTRIBUTE_DEFAULT_UNSUPPORTED = 'attribute_default_unsupported';
- const ATTRIBUTE_ALREADY_EXISTS = 'attribute_already_exists';
- const ATTRIBUTE_LIMIT_EXCEEDED = 'attribute_limit_exceeded';
- const ATTRIBUTE_VALUE_INVALID = 'attribute_value_invalid';
+ public const ATTRIBUTE_NOT_FOUND = 'attribute_not_found';
+ public const ATTRIBUTE_UNKNOWN = 'attribute_unknown';
+ public const ATTRIBUTE_NOT_AVAILABLE = 'attribute_not_available';
+ public const ATTRIBUTE_FORMAT_UNSUPPORTED = 'attribute_format_unsupported';
+ public const ATTRIBUTE_DEFAULT_UNSUPPORTED = 'attribute_default_unsupported';
+ public const ATTRIBUTE_ALREADY_EXISTS = 'attribute_already_exists';
+ public const ATTRIBUTE_LIMIT_EXCEEDED = 'attribute_limit_exceeded';
+ public const ATTRIBUTE_VALUE_INVALID = 'attribute_value_invalid';
/** Indexes */
- const INDEX_NOT_FOUND = 'index_not_found';
- const INDEX_LIMIT_EXCEEDED = 'index_limit_exceeded';
- const INDEX_ALREADY_EXISTS = 'index_already_exists';
+ public const INDEX_NOT_FOUND = 'index_not_found';
+ public const INDEX_LIMIT_EXCEEDED = 'index_limit_exceeded';
+ public const INDEX_ALREADY_EXISTS = 'index_already_exists';
/** Projects */
- const PROJECT_NOT_FOUND = 'project_not_found';
- const PROJECT_UNKNOWN = 'project_unknown';
- const PROJECT_PROVIDER_DISABLED = 'project_provider_disabled';
- const PROJECT_PROVIDER_UNSUPPORTED = 'project_provider_unsupported';
- const PROJECT_INVALID_SUCCESS_URL = 'project_invalid_success_url';
- const PROJECT_INVALID_FAILURE_URL = 'project_invalid_failure_url';
- const PROJECT_MISSING_USER_ID = 'project_missing_user_id';
- const PROJECT_RESERVED_PROJECT = 'project_reserved_project';
+ public const PROJECT_NOT_FOUND = 'project_not_found';
+ public const PROJECT_UNKNOWN = 'project_unknown';
+ public const PROJECT_PROVIDER_DISABLED = 'project_provider_disabled';
+ public const PROJECT_PROVIDER_UNSUPPORTED = 'project_provider_unsupported';
+ public const PROJECT_INVALID_SUCCESS_URL = 'project_invalid_success_url';
+ public const PROJECT_INVALID_FAILURE_URL = 'project_invalid_failure_url';
+ public const PROJECT_MISSING_USER_ID = 'project_missing_user_id';
+ public const PROJECT_RESERVED_PROJECT = 'project_reserved_project';
/** Webhooks */
- const WEBHOOK_NOT_FOUND = 'webhook_not_found';
+ public const WEBHOOK_NOT_FOUND = 'webhook_not_found';
/** Keys */
- const KEY_NOT_FOUND = 'key_not_found';
+ public const KEY_NOT_FOUND = 'key_not_found';
/** Platform */
- const PLATFORM_NOT_FOUND = 'platform_not_found';
+ public const PLATFORM_NOT_FOUND = 'platform_not_found';
/** Domain */
- const DOMAIN_NOT_FOUND = 'domain_not_found';
- const DOMAIN_ALREADY_EXISTS = 'domain_already_exists';
- const DOMAIN_VERIFICATION_FAILED = 'domain_verification_failed';
+ public const DOMAIN_NOT_FOUND = 'domain_not_found';
+ public const DOMAIN_ALREADY_EXISTS = 'domain_already_exists';
+ public const DOMAIN_VERIFICATION_FAILED = 'domain_verification_failed';
private $type = '';
diff --git a/src/Appwrite/Migration/Version/V13.php b/src/Appwrite/Migration/Version/V13.php
index 277b84ae9..d204be84f 100644
--- a/src/Appwrite/Migration/Version/V13.php
+++ b/src/Appwrite/Migration/Version/V13.php
@@ -319,7 +319,7 @@ class V13 extends Migration
return 'buckets.*.' . implode('.', $parts);
case 'files':
return 'buckets.*.' . $second . '.*.' . implode('.', $parts);
- }
+ } // intentional fallthrough
case 'database':
$second = array_shift($parts);
switch ($second) {
diff --git a/src/Appwrite/Resque/Worker.php b/src/Appwrite/Resque/Worker.php
index 0b3e4db1a..84feb0f96 100644
--- a/src/Appwrite/Resque/Worker.php
+++ b/src/Appwrite/Resque/Worker.php
@@ -81,8 +81,8 @@ abstract class Worker
throw new Exception("Please implement shutdown method in worker");
}
- const DATABASE_PROJECT = 'project';
- const DATABASE_CONSOLE = 'console';
+ public const DATABASE_PROJECT = 'project';
+ public const DATABASE_CONSOLE = 'console';
/**
* A wrapper around 'init' function with non-worker-specific code
diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php
index baef255d4..8a876ecb4 100644
--- a/src/Appwrite/Utopia/Response.php
+++ b/src/Appwrite/Utopia/Response.php
@@ -76,116 +76,116 @@ use Appwrite\Utopia\Response\Model\UsageUsers;
class Response extends SwooleResponse
{
// General
- const MODEL_NONE = 'none';
- const MODEL_ANY = 'any';
- const MODEL_LOG = 'log';
- const MODEL_LOG_LIST = 'logList';
- const MODEL_ERROR = 'error';
- const MODEL_METRIC = 'metric';
- const MODEL_METRIC_LIST = 'metricList';
- const MODEL_ERROR_DEV = 'errorDev';
- const MODEL_BASE_LIST = 'baseList';
- const MODEL_USAGE_DATABASE = 'usageDatabase';
- const MODEL_USAGE_COLLECTION = 'usageCollection';
- const MODEL_USAGE_USERS = 'usageUsers';
- const MODEL_USAGE_BUCKETS = 'usageBuckets';
- const MODEL_USAGE_STORAGE = 'usageStorage';
- const MODEL_USAGE_FUNCTIONS = 'usageFunctions';
- const MODEL_USAGE_PROJECT = 'usageProject';
+ public const MODEL_NONE = 'none';
+ public const MODEL_ANY = 'any';
+ public const MODEL_LOG = 'log';
+ public const MODEL_LOG_LIST = 'logList';
+ public const MODEL_ERROR = 'error';
+ public const MODEL_METRIC = 'metric';
+ public const MODEL_METRIC_LIST = 'metricList';
+ public const MODEL_ERROR_DEV = 'errorDev';
+ public const MODEL_BASE_LIST = 'baseList';
+ public const MODEL_USAGE_DATABASE = 'usageDatabase';
+ public const MODEL_USAGE_COLLECTION = 'usageCollection';
+ public const MODEL_USAGE_USERS = 'usageUsers';
+ public const MODEL_USAGE_BUCKETS = 'usageBuckets';
+ public const MODEL_USAGE_STORAGE = 'usageStorage';
+ public const MODEL_USAGE_FUNCTIONS = 'usageFunctions';
+ public const MODEL_USAGE_PROJECT = 'usageProject';
// Database
- const MODEL_COLLECTION = 'collection';
- const MODEL_COLLECTION_LIST = 'collectionList';
- const MODEL_INDEX = 'index';
- const MODEL_INDEX_LIST = 'indexList';
- const MODEL_DOCUMENT = 'document';
- const MODEL_DOCUMENT_LIST = 'documentList';
+ public const MODEL_COLLECTION = 'collection';
+ public const MODEL_COLLECTION_LIST = 'collectionList';
+ public const MODEL_INDEX = 'index';
+ public const MODEL_INDEX_LIST = 'indexList';
+ public const MODEL_DOCUMENT = 'document';
+ public const MODEL_DOCUMENT_LIST = 'documentList';
// Database Attributes
- const MODEL_ATTRIBUTE = 'attribute';
- const MODEL_ATTRIBUTE_LIST = 'attributeList';
- const MODEL_ATTRIBUTE_STRING = 'attributeString';
- const MODEL_ATTRIBUTE_INTEGER = 'attributeInteger';
- const MODEL_ATTRIBUTE_FLOAT = 'attributeFloat';
- const MODEL_ATTRIBUTE_BOOLEAN = 'attributeBoolean';
- const MODEL_ATTRIBUTE_EMAIL = 'attributeEmail';
- const MODEL_ATTRIBUTE_ENUM = 'attributeEnum';
- const MODEL_ATTRIBUTE_IP = 'attributeIp';
- const MODEL_ATTRIBUTE_URL = 'attributeUrl';
+ public const MODEL_ATTRIBUTE = 'attribute';
+ public const MODEL_ATTRIBUTE_LIST = 'attributeList';
+ public const MODEL_ATTRIBUTE_STRING = 'attributeString';
+ public const MODEL_ATTRIBUTE_INTEGER = 'attributeInteger';
+ public const MODEL_ATTRIBUTE_FLOAT = 'attributeFloat';
+ public const MODEL_ATTRIBUTE_BOOLEAN = 'attributeBoolean';
+ public const MODEL_ATTRIBUTE_EMAIL = 'attributeEmail';
+ public const MODEL_ATTRIBUTE_ENUM = 'attributeEnum';
+ public const MODEL_ATTRIBUTE_IP = 'attributeIp';
+ public const MODEL_ATTRIBUTE_URL = 'attributeUrl';
// Users
- const MODEL_USER = 'user';
- const MODEL_USER_LIST = 'userList';
- const MODEL_SESSION = 'session';
- const MODEL_SESSION_LIST = 'sessionList';
- const MODEL_TOKEN = 'token';
- const MODEL_JWT = 'jwt';
- const MODEL_PREFERENCES = 'preferences';
+ public const MODEL_USER = 'user';
+ public const MODEL_USER_LIST = 'userList';
+ public const MODEL_SESSION = 'session';
+ public const MODEL_SESSION_LIST = 'sessionList';
+ public const MODEL_TOKEN = 'token';
+ public const MODEL_JWT = 'jwt';
+ public const MODEL_PREFERENCES = 'preferences';
// Storage
- const MODEL_FILE = 'file';
- const MODEL_FILE_LIST = 'fileList';
- const MODEL_BUCKET = 'bucket';
- const MODEL_BUCKET_LIST = 'bucketList';
+ public const MODEL_FILE = 'file';
+ public const MODEL_FILE_LIST = 'fileList';
+ public const MODEL_BUCKET = 'bucket';
+ public const MODEL_BUCKET_LIST = 'bucketList';
// Locale
- const MODEL_LOCALE = 'locale';
- const MODEL_COUNTRY = 'country';
- const MODEL_COUNTRY_LIST = 'countryList';
- const MODEL_CONTINENT = 'continent';
- const MODEL_CONTINENT_LIST = 'continentList';
- const MODEL_CURRENCY = 'currency';
- const MODEL_CURRENCY_LIST = 'currencyList';
- const MODEL_LANGUAGE = 'language';
- const MODEL_LANGUAGE_LIST = 'languageList';
- const MODEL_PHONE = 'phone';
- const MODEL_PHONE_LIST = 'phoneList';
+ public const MODEL_LOCALE = 'locale';
+ public const MODEL_COUNTRY = 'country';
+ public const MODEL_COUNTRY_LIST = 'countryList';
+ public const MODEL_CONTINENT = 'continent';
+ public const MODEL_CONTINENT_LIST = 'continentList';
+ public const MODEL_CURRENCY = 'currency';
+ public const MODEL_CURRENCY_LIST = 'currencyList';
+ public const MODEL_LANGUAGE = 'language';
+ public const MODEL_LANGUAGE_LIST = 'languageList';
+ public const MODEL_PHONE = 'phone';
+ public const MODEL_PHONE_LIST = 'phoneList';
// Teams
- const MODEL_TEAM = 'team';
- const MODEL_TEAM_LIST = 'teamList';
- const MODEL_MEMBERSHIP = 'membership';
- const MODEL_MEMBERSHIP_LIST = 'membershipList';
+ public const MODEL_TEAM = 'team';
+ public const MODEL_TEAM_LIST = 'teamList';
+ public const MODEL_MEMBERSHIP = 'membership';
+ public const MODEL_MEMBERSHIP_LIST = 'membershipList';
// Functions
- const MODEL_FUNCTION = 'function';
- const MODEL_FUNCTION_LIST = 'functionList';
- const MODEL_RUNTIME = 'runtime';
- const MODEL_RUNTIME_LIST = 'runtimeList';
- const MODEL_DEPLOYMENT = 'deployment';
- const MODEL_DEPLOYMENT_LIST = 'deploymentList';
- const MODEL_EXECUTION = 'execution';
- const MODEL_EXECUTION_LIST = 'executionList';
- const MODEL_BUILD = 'build';
- const MODEL_BUILD_LIST = 'buildList'; // Not used anywhere yet
- const MODEL_FUNC_PERMISSIONS = 'funcPermissions';
+ public const MODEL_FUNCTION = 'function';
+ public const MODEL_FUNCTION_LIST = 'functionList';
+ public const MODEL_RUNTIME = 'runtime';
+ public const MODEL_RUNTIME_LIST = 'runtimeList';
+ public const MODEL_DEPLOYMENT = 'deployment';
+ public const MODEL_DEPLOYMENT_LIST = 'deploymentList';
+ public const MODEL_EXECUTION = 'execution';
+ public const MODEL_EXECUTION_LIST = 'executionList';
+ public const MODEL_BUILD = 'build';
+ public const MODEL_BUILD_LIST = 'buildList'; // Not used anywhere yet
+ public const MODEL_FUNC_PERMISSIONS = 'funcPermissions';
// Project
- const MODEL_PROJECT = 'project';
- const MODEL_PROJECT_LIST = 'projectList';
- const MODEL_WEBHOOK = 'webhook';
- const MODEL_WEBHOOK_LIST = 'webhookList';
- const MODEL_KEY = 'key';
- const MODEL_KEY_LIST = 'keyList';
- const MODEL_PLATFORM = 'platform';
- const MODEL_PLATFORM_LIST = 'platformList';
- const MODEL_DOMAIN = 'domain';
- const MODEL_DOMAIN_LIST = 'domainList';
+ public const MODEL_PROJECT = 'project';
+ public const MODEL_PROJECT_LIST = 'projectList';
+ public const MODEL_WEBHOOK = 'webhook';
+ public const MODEL_WEBHOOK_LIST = 'webhookList';
+ public const MODEL_KEY = 'key';
+ public const MODEL_KEY_LIST = 'keyList';
+ public const MODEL_PLATFORM = 'platform';
+ public const MODEL_PLATFORM_LIST = 'platformList';
+ public const MODEL_DOMAIN = 'domain';
+ public const MODEL_DOMAIN_LIST = 'domainList';
// Health
- const MODEL_HEALTH_STATUS = 'healthStatus';
- const MODEL_HEALTH_VERSION = 'healthVersion';
- const MODEL_HEALTH_QUEUE = 'healthQueue';
- const MODEL_HEALTH_TIME = 'healthTime';
- const MODEL_HEALTH_ANTIVIRUS = 'healthAntivirus';
+ public const MODEL_HEALTH_STATUS = 'healthStatus';
+ public const MODEL_HEALTH_VERSION = 'healthVersion';
+ public const MODEL_HEALTH_QUEUE = 'healthQueue';
+ public const MODEL_HEALTH_TIME = 'healthTime';
+ public const MODEL_HEALTH_ANTIVIRUS = 'healthAntivirus';
// Deprecated
- const MODEL_PERMISSIONS = 'permissions';
- const MODEL_RULE = 'rule';
- const MODEL_TASK = 'task';
+ public const MODEL_PERMISSIONS = 'permissions';
+ public const MODEL_RULE = 'rule';
+ public const MODEL_TASK = 'task';
// Tests (keep last)
- const MODEL_MOCK = 'mock';
+ public const MODEL_MOCK = 'mock';
/**
* @var Filter
@@ -302,7 +302,7 @@ class Response extends SwooleResponse
/**
* HTTP content types
*/
- const CONTENT_TYPE_YAML = 'application/x-yaml';
+ public const CONTENT_TYPE_YAML = 'application/x-yaml';
/**
* List of defined output objects
diff --git a/src/Appwrite/Utopia/Response/Model.php b/src/Appwrite/Utopia/Response/Model.php
index 6aefe1fc9..6407c8511 100644
--- a/src/Appwrite/Utopia/Response/Model.php
+++ b/src/Appwrite/Utopia/Response/Model.php
@@ -6,11 +6,11 @@ use Utopia\Database\Document;
abstract class Model
{
- const TYPE_STRING = 'string';
- const TYPE_INTEGER = 'integer';
- const TYPE_FLOAT = 'double';
- const TYPE_BOOLEAN = 'boolean';
- const TYPE_JSON = 'json';
+ public const TYPE_STRING = 'string';
+ public const TYPE_INTEGER = 'integer';
+ public const TYPE_FLOAT = 'double';
+ public const TYPE_BOOLEAN = 'boolean';
+ public const TYPE_JSON = 'json';
/**
* @var bool
diff --git a/src/Executor/Executor.php b/src/Executor/Executor.php
index a85a184ad..ba6d67df0 100644
--- a/src/Executor/Executor.php
+++ b/src/Executor/Executor.php
@@ -8,15 +8,15 @@ use Swoole\Table;
class Executor
{
- const METHOD_GET = 'GET';
- const METHOD_POST = 'POST';
- const METHOD_PUT = 'PUT';
- const METHOD_PATCH = 'PATCH';
- const METHOD_DELETE = 'DELETE';
- const METHOD_HEAD = 'HEAD';
- const METHOD_OPTIONS = 'OPTIONS';
- const METHOD_CONNECT = 'CONNECT';
- const METHOD_TRACE = 'TRACE';
+ public const METHOD_GET = 'GET';
+ public const METHOD_POST = 'POST';
+ public const METHOD_PUT = 'PUT';
+ public const METHOD_PATCH = 'PATCH';
+ public const METHOD_DELETE = 'DELETE';
+ public const METHOD_HEAD = 'HEAD';
+ public const METHOD_OPTIONS = 'OPTIONS';
+ public const METHOD_CONNECT = 'CONNECT';
+ public const METHOD_TRACE = 'TRACE';
private $endpoint;
private $runtimeQueue;
diff --git a/tests/e2e/Client.php b/tests/e2e/Client.php
index 63b6f3019..226556b78 100644
--- a/tests/e2e/Client.php
+++ b/tests/e2e/Client.php
@@ -6,15 +6,15 @@ use Exception;
class Client
{
- const METHOD_GET = 'GET';
- const METHOD_POST = 'POST';
- const METHOD_PUT = 'PUT';
- const METHOD_PATCH = 'PATCH';
- const METHOD_DELETE = 'DELETE';
- const METHOD_HEAD = 'HEAD';
- const METHOD_OPTIONS = 'OPTIONS';
- const METHOD_CONNECT = 'CONNECT';
- const METHOD_TRACE = 'TRACE';
+ public const METHOD_GET = 'GET';
+ public const METHOD_POST = 'POST';
+ public const METHOD_PUT = 'PUT';
+ public const METHOD_PATCH = 'PATCH';
+ public const METHOD_DELETE = 'DELETE';
+ public const METHOD_HEAD = 'HEAD';
+ public const METHOD_OPTIONS = 'OPTIONS';
+ public const METHOD_CONNECT = 'CONNECT';
+ public const METHOD_TRACE = 'TRACE';
/**
* Is Self Signed Certificates Allowed?
diff --git a/tests/e2e/Services/Account/AccountBase.php b/tests/e2e/Services/Account/AccountBase.php
index 301ffff8a..7ffa9eb7c 100644
--- a/tests/e2e/Services/Account/AccountBase.php
+++ b/tests/e2e/Services/Account/AccountBase.php
@@ -6,9 +6,9 @@ use Tests\E2E\Client;
trait AccountBase
{
- public function testCreateAccount():array
+ public function testCreateAccount(): array
{
- $email = uniqid().'user@localhost.test';
+ $email = uniqid() . 'user@localhost.test';
$password = 'password';
$name = 'User Name';
@@ -98,7 +98,7 @@ trait AccountBase
/**
* @depends testCreateAccount
*/
- public function testCreateAccountSession($data):array
+ public function testCreateAccountSession($data): array
{
$email = $data['email'] ?? '';
$password = $data['password'] ?? '';
@@ -118,7 +118,7 @@ trait AccountBase
$this->assertEquals($response['headers']['status-code'], 201);
$sessionId = $response['body']['$id'];
- $session = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_'.$this->getProject()['$id']];
+ $session = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_' . $this->getProject()['$id']];
/**
* Test for FAILURE
@@ -128,7 +128,7 @@ trait AccountBase
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
]), [
- 'email' => $email.'x',
+ 'email' => $email . 'x',
'password' => $password,
]);
@@ -140,7 +140,7 @@ trait AccountBase
'x-appwrite-project' => $this->getProject()['$id'],
]), [
'email' => $email,
- 'password' => $password.'x',
+ 'password' => $password . 'x',
]);
$this->assertEquals($response['headers']['status-code'], 401);
@@ -165,7 +165,7 @@ trait AccountBase
/**
* @depends testCreateAccountSession
*/
- public function testGetAccount($data):array
+ public function testGetAccount($data): array
{
$email = $data['email'] ?? '';
$name = $data['name'] ?? '';
@@ -178,7 +178,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]));
$this->assertEquals($response['headers']['status-code'], 200);
@@ -200,7 +200,7 @@ trait AccountBase
$response = $this->client->call(Client::METHOD_GET, '/account', [
'content-type' => 'application/json',
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session.'xx',
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session . 'xx',
'x-appwrite-project' => $this->getProject()['$id'],
]);
@@ -212,7 +212,7 @@ trait AccountBase
/**
* @depends testCreateAccountSession
*/
- public function testGetAccountPrefs($data):array
+ public function testGetAccountPrefs($data): array
{
$session = $data['session'] ?? '';
@@ -223,7 +223,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]));
$this->assertEquals($response['headers']['status-code'], 200);
@@ -248,7 +248,7 @@ trait AccountBase
/**
* @depends testCreateAccountSession
*/
- public function testGetAccountSessions($data):array
+ public function testGetAccountSessions($data): array
{
$session = $data['session'] ?? '';
$sessionId = $data['sessionId'] ?? '';
@@ -260,7 +260,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]));
$this->assertEquals($response['headers']['status-code'], 200);
@@ -269,7 +269,7 @@ trait AccountBase
$this->assertCount(2, $response['body']);
$this->assertEquals(1, $response['body']['total']);
$this->assertEquals($sessionId, $response['body']['sessions'][0]['$id']);
-
+
$this->assertEquals('Windows', $response['body']['sessions'][0]['osName']);
$this->assertEquals('WIN', $response['body']['sessions'][0]['osCode']);
$this->assertEquals('10', $response['body']['sessions'][0]['osVersion']);
@@ -306,7 +306,7 @@ trait AccountBase
/**
* @depends testCreateAccountSession
*/
- public function testGetAccountLogs($data):array
+ public function testGetAccountLogs($data): array
{
sleep(10);
$session = $data['session'] ?? '';
@@ -319,7 +319,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]));
$this->assertEquals($response['headers']['status-code'], 200);
@@ -375,7 +375,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'limit' => 1
]);
@@ -392,7 +392,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'offset' => 1
]);
@@ -409,7 +409,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'limit' => 1,
'offset' => 1
@@ -441,7 +441,7 @@ trait AccountBase
/**
* @depends testCreateAccountSession
*/
- public function testUpdateAccountName($data):array
+ public function testUpdateAccountName($data): array
{
$email = $data['email'] ?? '';
$session = $data['session'] ?? '';
@@ -454,7 +454,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'name' => $newName
]);
@@ -482,7 +482,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
]);
@@ -492,7 +492,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'name' => 'ocSRq1d3QphHivJyUmYY7WMnrxyjdk5YvVwcDqx2zS0coxESN8RmsQwLWw5Whnf0WbVohuFWTRAaoKgCOO0Y0M7LwgFnZmi8881Y72222222222222222222222222222'
]);
@@ -507,7 +507,7 @@ trait AccountBase
/**
* @depends testUpdateAccountName
*/
- public function testUpdateAccountPassword($data):array
+ public function testUpdateAccountPassword($data): array
{
$email = $data['email'] ?? '';
$password = $data['password'] ?? '';
@@ -520,7 +520,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'password' => 'new-password',
'oldPassword' => $password,
@@ -554,15 +554,14 @@ trait AccountBase
]));
$this->assertEquals($response['headers']['status-code'], 401);
-
$response = $this->client->call(Client::METHOD_PATCH, '/account/password', array_merge([
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
]);
-
+
$this->assertEquals($response['headers']['status-code'], 400);
/**
@@ -572,7 +571,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'password' => 'new-password',
'oldPassword' => $password,
@@ -580,13 +579,13 @@ trait AccountBase
$this->assertEquals($response['headers']['status-code'], 401);
/**
- * Existing user tries to update password without passing old password -> SHOULD FAIL
+ * Existing user tries to update password without passing old password -> SHOULD FAIL
*/
$response = $this->client->call(Client::METHOD_PATCH, '/account/password', array_merge([
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'password' => 'new-password'
]);
@@ -600,9 +599,9 @@ trait AccountBase
/**
* @depends testUpdateAccountPassword
*/
- public function testUpdateAccountEmail($data):array
+ public function testUpdateAccountEmail($data): array
{
- $newEmail = uniqid().'new@localhost.test';
+ $newEmail = uniqid() . 'new@localhost.test';
$session = $data['session'] ?? '';
/**
@@ -612,7 +611,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'email' => $newEmail,
'password' => 'new-password',
@@ -640,7 +639,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
]);
@@ -667,8 +666,8 @@ trait AccountBase
$this->assertNotEmpty($response['body']['$id']);
$this->assertIsNumeric($response['body']['registration']);
$this->assertEquals($response['body']['email'], $data['email']);
- $this->assertEquals($response['body']['name'], $data['name'],);
-
+ $this->assertEquals($response['body']['name'], $data['name']);
+
$data['email'] = $newEmail;
@@ -678,9 +677,9 @@ trait AccountBase
/**
* @depends testUpdateAccountEmail
*/
- public function testUpdateAccountPrefs($data):array
+ public function testUpdateAccountPrefs($data): array
{
- $newEmail = uniqid().'new@localhost.test';
+ $newEmail = uniqid() . 'new@localhost.test';
$session = $data['session'] ?? '';
/**
@@ -690,7 +689,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'prefs' => [
'prefKey1' => 'prefValue1',
@@ -714,35 +713,35 @@ trait AccountBase
]));
$this->assertEquals($response['headers']['status-code'], 401);
-
+
$response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', array_merge([
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'prefs' => '{}'
]);
$this->assertEquals($response['headers']['status-code'], 400);
-
-
+
+
$response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', array_merge([
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'prefs' => '[]'
]);
$this->assertEquals($response['headers']['status-code'], 400);
-
+
$response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', array_merge([
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'prefs' => '{"test": "value"}'
]);
@@ -758,7 +757,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'prefs' => $prefsObject
]);
@@ -772,7 +771,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'prefs' => $prefsObject
]);
@@ -785,7 +784,7 @@ trait AccountBase
/**
* @depends testUpdateAccountPrefs
*/
- public function testCreateAccountVerification($data):array
+ public function testCreateAccountVerification($data): array
{
$email = $data['email'] ?? '';
$name = $data['name'] ?? '';
@@ -798,8 +797,8 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
-
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
+
]), [
'url' => 'http://localhost/verification',
]);
@@ -817,15 +816,15 @@ trait AccountBase
$verification = substr($lastEmail['text'], strpos($lastEmail['text'], '&secret=', 0) + 8, 256);
- $expireTime = strpos($lastEmail['text'], 'expire='.$response['body']['expire'], 0);
+ $expireTime = strpos($lastEmail['text'], 'expire=' . $response['body']['expire'], 0);
$this->assertNotFalse($expireTime);
-
- $secretTest = strpos($lastEmail['text'], 'secret='.$response['body']['secret'], 0);
+
+ $secretTest = strpos($lastEmail['text'], 'secret=' . $response['body']['secret'], 0);
$this->assertNotFalse($secretTest);
- $userIDTest = strpos($lastEmail['text'], 'userId='.$response['body']['userId'], 0);
+ $userIDTest = strpos($lastEmail['text'], 'userId=' . $response['body']['userId'], 0);
$this->assertNotFalse($userIDTest);
@@ -836,7 +835,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'url' => 'localhost/verification',
]);
@@ -847,7 +846,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'url' => 'http://remotehost/verification',
]);
@@ -862,12 +861,12 @@ trait AccountBase
/**
* @depends testCreateAccountVerification
*/
- public function testUpdateAccountVerification($data):array
+ public function testUpdateAccountVerification($data): array
{
$id = $data['id'] ?? '';
$session = $data['session'] ?? '';
$verification = $data['verification'] ?? '';
-
+
/**
* Test for SUCCESS
*/
@@ -875,14 +874,14 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'userId' => $id,
'secret' => $verification,
]);
$this->assertEquals(200, $response['headers']['status-code']);
-
+
/**
* Test for FAILURE
*/
@@ -890,7 +889,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'userId' => 'ewewe',
'secret' => $verification,
@@ -902,7 +901,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'userId' => $id,
'secret' => 'sdasdasdasd',
@@ -916,7 +915,7 @@ trait AccountBase
/**
* @depends testUpdateAccountVerification
*/
- public function testDeleteAccountSession($data):array
+ public function testDeleteAccountSession($data): array
{
$email = $data['email'] ?? '';
$password = $data['password'] ?? '';
@@ -935,7 +934,7 @@ trait AccountBase
]);
$sessionNewId = $response['body']['$id'];
- $sessionNew = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_'.$this->getProject()['$id']];
+ $sessionNew = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_' . $this->getProject()['$id']];
$this->assertEquals($response['headers']['status-code'], 201);
@@ -943,16 +942,16 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $sessionNew,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $sessionNew,
]);
$this->assertEquals($response['headers']['status-code'], 200);
- $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/'.$sessionNewId, array_merge([
+ $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/' . $sessionNewId, array_merge([
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $sessionNew,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $sessionNew,
]));
$this->assertEquals($response['headers']['status-code'], 204);
@@ -961,7 +960,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]));
$this->assertEquals($response['headers']['status-code'], 200);
@@ -973,7 +972,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $sessionNew,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $sessionNew,
]);
$this->assertEquals($response['headers']['status-code'], 401);
@@ -984,7 +983,7 @@ trait AccountBase
/**
* @depends testUpdateAccountVerification
*/
- public function testDeleteAccountSessionCurrent($data):array
+ public function testDeleteAccountSessionCurrent($data): array
{
$email = $data['email'] ?? '';
$password = $data['password'] ?? '';
@@ -1001,14 +1000,14 @@ trait AccountBase
'password' => $password,
]);
- $sessionNew = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_'.$this->getProject()['$id']];
+ $sessionNew = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_' . $this->getProject()['$id']];
$this->assertEquals($response['headers']['status-code'], 201);
$response = $this->client->call(Client::METHOD_GET, '/account', [
'origin' => 'http://localhost',
'content-type' => 'application/json',
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $sessionNew,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $sessionNew,
'x-appwrite-project' => $this->getProject()['$id'],
]);
@@ -1017,7 +1016,7 @@ trait AccountBase
$response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/current', [
'origin' => 'http://localhost',
'content-type' => 'application/json',
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $sessionNew,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $sessionNew,
'x-appwrite-project' => $this->getProject()['$id'],
]);
@@ -1029,7 +1028,7 @@ trait AccountBase
$response = $this->client->call(Client::METHOD_GET, '/account', [
'origin' => 'http://localhost',
'content-type' => 'application/json',
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $sessionNew,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $sessionNew,
'x-appwrite-project' => $this->getProject()['$id'],
]);
@@ -1041,7 +1040,7 @@ trait AccountBase
/**
* @depends testUpdateAccountVerification
*/
- public function testDeleteAccountSessions($data):array
+ public function testDeleteAccountSessions($data): array
{
$session = $data['session'] ?? '';
@@ -1052,7 +1051,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]));
$this->assertEquals($response['headers']['status-code'], 204);
@@ -1083,7 +1082,7 @@ trait AccountBase
'password' => $password,
]);
- $data['session'] = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_'.$this->getProject()['$id']];
+ $data['session'] = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_' . $this->getProject()['$id']];
return $data;
}
@@ -1091,7 +1090,7 @@ trait AccountBase
/**
* @depends testDeleteAccountSession
*/
- public function testCreateAccountRecovery($data):array
+ public function testCreateAccountRecovery($data): array
{
$email = $data['email'] ?? '';
$name = $data['name'] ?? '';
@@ -1121,15 +1120,15 @@ trait AccountBase
$recovery = substr($lastEmail['text'], strpos($lastEmail['text'], '&secret=', 0) + 8, 256);
- $expireTime = strpos($lastEmail['text'], 'expire='.$response['body']['expire'], 0);
+ $expireTime = strpos($lastEmail['text'], 'expire=' . $response['body']['expire'], 0);
$this->assertNotFalse($expireTime);
-
- $secretTest = strpos($lastEmail['text'], 'secret='.$response['body']['secret'], 0);
+
+ $secretTest = strpos($lastEmail['text'], 'secret=' . $response['body']['secret'], 0);
$this->assertNotFalse($secretTest);
- $userIDTest = strpos($lastEmail['text'], 'userId='.$response['body']['userId'], 0);
+ $userIDTest = strpos($lastEmail['text'], 'userId=' . $response['body']['userId'], 0);
$this->assertNotFalse($userIDTest);
@@ -1177,12 +1176,12 @@ trait AccountBase
/**
* @depends testCreateAccountRecovery
*/
- public function testUpdateAccountRecovery($data):array
+ public function testUpdateAccountRecovery($data): array
{
$id = $data['id'] ?? '';
$recovery = $data['recovery'] ?? '';
$newPassowrd = 'test-recovery';
-
+
/**
* Test for SUCCESS
*/
@@ -1198,7 +1197,7 @@ trait AccountBase
]);
$this->assertEquals(200, $response['headers']['status-code']);
-
+
/**
* Test for FAILURE
*/
@@ -1235,18 +1234,18 @@ trait AccountBase
]), [
'userId' => $id,
'secret' => $recovery,
- 'password' => $newPassowrd.'x',
+ 'password' => $newPassowrd . 'x',
'passwordAgain' => $newPassowrd,
]);
$this->assertEquals(400, $response['headers']['status-code']);
-
+
return $data;
}
- public function testCreateMagicUrl():array
+ public function testCreateMagicUrl(): array
{
- $email = \time().'user@appwrite.io';
+ $email = \time() . 'user@appwrite.io';
/**
* Test for SUCCESS
@@ -1274,15 +1273,15 @@ trait AccountBase
$token = substr($lastEmail['text'], strpos($lastEmail['text'], '&secret=', 0) + 8, 256);
- $expireTime = strpos($lastEmail['text'], 'expire='.$response['body']['expire'], 0);
+ $expireTime = strpos($lastEmail['text'], 'expire=' . $response['body']['expire'], 0);
$this->assertNotFalse($expireTime);
- $secretTest = strpos($lastEmail['text'], 'secret='.$response['body']['secret'], 0);
+ $secretTest = strpos($lastEmail['text'], 'secret=' . $response['body']['secret'], 0);
$this->assertNotFalse($secretTest);
- $userIDTest = strpos($lastEmail['text'], 'userId='.$response['body']['userId'], 0);
+ $userIDTest = strpos($lastEmail['text'], 'userId=' . $response['body']['userId'], 0);
$this->assertNotFalse($userIDTest);
@@ -1333,7 +1332,7 @@ trait AccountBase
/**
* @depends testCreateMagicUrl
*/
- public function testCreateSessionWithMagicUrl($data):array
+ public function testCreateSessionWithMagicUrl($data): array
{
$id = $data['id'] ?? '';
$token = $data['token'] ?? '';
@@ -1358,13 +1357,13 @@ trait AccountBase
$this->assertNotEmpty($response['body']['userId']);
$sessionId = $response['body']['$id'];
- $session = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_'.$this->getProject()['$id']];
+ $session = $this->client->parseCookie((string)$response['headers']['set-cookie'])['a_session_' . $this->getProject()['$id']];
$response = $this->client->call(Client::METHOD_GET, '/account', array_merge([
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]));
$this->assertEquals($response['headers']['status-code'], 200);
@@ -1409,7 +1408,7 @@ trait AccountBase
/**
* @depends testCreateSessionWithMagicUrl
*/
- public function testUpdateAccountPasswordWithMagicUrl($data):array
+ public function testUpdateAccountPasswordWithMagicUrl($data): array
{
$email = $data['email'] ?? '';
$session = $data['session'] ?? '';
@@ -1421,7 +1420,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'password' => 'new-password'
]);
@@ -1454,15 +1453,15 @@ trait AccountBase
]));
$this->assertEquals($response['headers']['status-code'], 401);
-
+
$response = $this->client->call(Client::METHOD_PATCH, '/account/password', array_merge([
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
]);
-
+
$this->assertEquals($response['headers']['status-code'], 400);
/**
@@ -1472,7 +1471,7 @@ trait AccountBase
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'password' => 'new-password',
'oldPassword' => 'wrong-password',
@@ -1480,13 +1479,13 @@ trait AccountBase
$this->assertEquals($response['headers']['status-code'], 401);
/**
- * Existing user tries to update password without passing old password -> SHOULD FAIL
+ * Existing user tries to update password without passing old password -> SHOULD FAIL
*/
$response = $this->client->call(Client::METHOD_PATCH, '/account/password', array_merge([
'origin' => 'http://localhost',
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
- 'cookie' => 'a_session_'.$this->getProject()['$id'].'=' . $session,
+ 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
]), [
'password' => 'new-password'
]);
@@ -1496,5 +1495,4 @@ trait AccountBase
return $data;
}
-
-}
\ No newline at end of file
+}
diff --git a/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php b/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php
index 115451564..b55045669 100644
--- a/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php
+++ b/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php
@@ -786,6 +786,104 @@ class ProjectsConsoleClientTest extends Scope
}
}
+ /** @depends testUpdateProjectServiceStatusAdmin */
+ public function testUpdateProjectServiceStatusServer($data): void
+ {
+ $id = $data['projectId'];
+
+ $services = require('app/config/services.php');
+
+ /**
+ * Test for Disabled
+ */
+ foreach ($services as $service) {
+ if (!$service['optional']) {
+ continue;
+ }
+
+ $key = $service['key'] ?? '';
+
+ $response = $this->client->call(Client::METHOD_PATCH, '/projects/' . $id . '/service', array_merge([
+ 'content-type' => 'application/json',
+ 'x-appwrite-project' => $this->getProject()['$id'],
+ 'cookie' => 'a_session_console=' . $this->getRoot()['session'],
+ ]), [
+ 'service' => $key,
+ 'status' => false,
+ ]);
+
+ $this->assertEquals(200, $response['headers']['status-code']);
+ $this->assertNotEmpty($response['body']['$id']);
+
+ $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id, array_merge([
+ 'content-type' => 'application/json',
+ 'x-appwrite-project' => $this->getProject()['$id'],
+ 'cookie' => 'a_session_console=' . $this->getRoot()['session'],
+ ]));
+
+ $this->assertEquals(200, $response['headers']['status-code']);
+ $this->assertNotEmpty($response['body']['$id']);
+ $this->assertEquals(false, $response['body']['serviceStatusFor' . ucfirst($key)]);
+ }
+
+ // Create API Key
+ $response = $this->client->call(Client::METHOD_POST, '/projects/' . $id . '/keys', array_merge([
+ 'content-type' => 'application/json',
+ 'x-appwrite-project' => $this->getProject()['$id'],
+ 'cookie' => 'a_session_console=' . $this->getRoot()['session'],
+ ]), [
+ 'name' => 'Key Test',
+ 'scopes' => ['functions.read', 'teams.write'],
+ ]);
+
+ $this->assertEquals(201, $response['headers']['status-code']);
+
+ $keyId = $response['body']['$id'];
+ $keySecret = $response['body']['secret'];
+
+ /**
+ * Request with API Key must succeed
+ */
+ $response = $this->client->call(Client::METHOD_GET, '/functions', array_merge([
+ 'content-type' => 'application/json',
+ 'x-appwrite-project' => $id,
+ 'x-appwrite-key' => $keySecret,
+ ]));
+
+ $this->assertEquals(200, $response['headers']['status-code']);
+
+ $response = $this->client->call(Client::METHOD_POST, '/teams', array_merge([
+ 'content-type' => 'application/json',
+ 'x-appwrite-project' => $id,
+ 'x-appwrite-key' => $keySecret,
+ ]), [
+ 'teamId' => 'unique()',
+ 'name' => 'Arsenal'
+ ]);
+
+ $this->assertEquals(201, $response['headers']['status-code']);
+
+ // Cleanup
+
+ $response = $this->client->call(Client::METHOD_DELETE, '/projects/' . $id . '/keys/' . $keyId, array_merge([
+ 'content-type' => 'application/json',
+ 'x-appwrite-project' => $this->getProject()['$id'],
+ 'cookie' => 'a_session_console=' . $this->getRoot()['session'],
+ ]), []);
+
+ $this->assertEquals(204, $response['headers']['status-code']);
+
+ foreach ($services as $service) {
+ $response = $this->client->call(Client::METHOD_PATCH, '/projects/' . $id . '/service/', array_merge([
+ 'content-type' => 'application/json',
+ 'x-appwrite-project' => $this->getProject()['$id'],
+ ], $this->getHeaders()), [
+ 'service' => $service,
+ 'status' => true,
+ ]);
+ }
+ }
+
/**
* @depends testCreateProject
*/
diff --git a/tests/e2e/Services/Webhooks/WebhooksCustomClientTest.php b/tests/e2e/Services/Webhooks/WebhooksCustomClientTest.php
index 6290c6e76..211dff937 100644
--- a/tests/e2e/Services/Webhooks/WebhooksCustomClientTest.php
+++ b/tests/e2e/Services/Webhooks/WebhooksCustomClientTest.php
@@ -45,7 +45,7 @@ class WebhooksCustomClientTest extends Scope
$this->assertEquals($webhook['headers']['User-Agent'], 'Appwrite-Server vdev. Please report abuse at security@appwrite.io');
$this->assertStringContainsString('users.*', $webhook['headers']['X-Appwrite-Webhook-Events']);
$this->assertStringContainsString('users.*.create', $webhook['headers']['X-Appwrite-Webhook-Events']);
- $this->assertStringContainsString("users.{$id}", $webhook['headers']['X-Appwrite-Webhook-Events'],);
+ $this->assertStringContainsString("users.{$id}", $webhook['headers']['X-Appwrite-Webhook-Events']);
$this->assertStringContainsString("users.{$id}.create", $webhook['headers']['X-Appwrite-Webhook-Events']);
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Signature'], 'not-yet-implemented');
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Id'] ?? '', $this->getProject()['webhookId']);
diff --git a/tests/e2e/Services/Webhooks/WebhooksCustomServerTest.php b/tests/e2e/Services/Webhooks/WebhooksCustomServerTest.php
index 7c815595f..aa9d0fbd2 100644
--- a/tests/e2e/Services/Webhooks/WebhooksCustomServerTest.php
+++ b/tests/e2e/Services/Webhooks/WebhooksCustomServerTest.php
@@ -173,7 +173,7 @@ class WebhooksCustomServerTest extends Scope
$this->assertEquals($webhook['headers']['User-Agent'], 'Appwrite-Server vdev. Please report abuse at security@appwrite.io');
$this->assertStringContainsString('collections.*', $webhook['headers']['X-Appwrite-Webhook-Events']);
$this->assertStringContainsString('collections.*.delete', $webhook['headers']['X-Appwrite-Webhook-Events']);
- $this->assertStringContainsString("collections.{$id}", $webhook['headers']['X-Appwrite-Webhook-Events'],);
+ $this->assertStringContainsString("collections.{$id}", $webhook['headers']['X-Appwrite-Webhook-Events']);
$this->assertStringContainsString("collections.{$id}.delete", $webhook['headers']['X-Appwrite-Webhook-Events']);
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Signature'], 'not-yet-implemented');
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Id'] ?? '', $this->getProject()['webhookId']);
@@ -220,7 +220,7 @@ class WebhooksCustomServerTest extends Scope
$this->assertEquals($webhook['headers']['User-Agent'], 'Appwrite-Server vdev. Please report abuse at security@appwrite.io');
$this->assertStringContainsString('users.*', $webhook['headers']['X-Appwrite-Webhook-Events']);
$this->assertStringContainsString('users.*.create', $webhook['headers']['X-Appwrite-Webhook-Events']);
- $this->assertStringContainsString("users.{$id}", $webhook['headers']['X-Appwrite-Webhook-Events'],);
+ $this->assertStringContainsString("users.{$id}", $webhook['headers']['X-Appwrite-Webhook-Events']);
$this->assertStringContainsString("users.{$id}.create", $webhook['headers']['X-Appwrite-Webhook-Events']);
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Signature'], 'not-yet-implemented');
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Id'] ?? '', $this->getProject()['webhookId']);
@@ -402,7 +402,7 @@ class WebhooksCustomServerTest extends Scope
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Project-Id'] ?? '', $this->getProject()['$id']);
/**
- * Test for FAILURE
+ * Test for FAILURE
*/
return [
@@ -542,7 +542,7 @@ class WebhooksCustomServerTest extends Scope
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Project-Id'] ?? '', $this->getProject()['$id']);
/**
- * Test for FAILURE
+ * Test for FAILURE
*/
return $data;
@@ -610,14 +610,14 @@ class WebhooksCustomServerTest extends Scope
$this->assertEquals($webhook['headers']['X-Appwrite-Webhook-Project-Id'] ?? '', $this->getProject()['$id']);
/**
- * Test for FAILURE
+ * Test for FAILURE
*/
return $data;
}
/**
- * @depends testExecutions
+ * @depends testExecutions
*/
public function testDeleteDeployment($data): array
{