Compare commits

...
Author SHA1 Message Date
Matej Bačo 5a7c43ab32 Introduce code analysis 2024-03-07 10:59:08 +01:00
Matej Bačo 8a8638a817 Formatting fix 2024-03-07 10:20:24 +01:00
Matej Bačo ee065bc64c Merge branch '1.5.x' into feat-database-proxy 2024-03-07 10:18:49 +01:00
Matej Bačo 27e995eb53 Reomve leftpover 2024-03-06 22:31:23 +01:00
Matej Bačo 1b65c5fbc9 linter fix 2024-03-06 22:26:14 +01:00
Matej Bačo 4fa9ccd9e4 upgrade libs 2024-03-06 22:25:43 +01:00
Matej Bačo f83d6e61ae PR review changes 2024-03-06 17:01:43 +01:00
Matej Bačo 882d8e5a88 Fix database tests 2024-03-06 16:19:23 +01:00
Matej Bačo a9731cd5bc Fix account tests 2024-03-06 12:38:51 +01:00
Matej Bačo e807a5d20a Upgrade DB proxy 2024-03-05 13:41:26 +00:00
Matej Bačo d8996b47b5 Implement DB proxy 2024-03-05 11:37:47 +01:00
26 changed files with 259 additions and 108 deletions
+6 -3
View File
@@ -22,8 +22,9 @@ _APP_REDIS_HOST=redis
_APP_REDIS_PORT=6379
_APP_REDIS_PASS=
_APP_REDIS_USER=
_APP_DB_HOST=mariadb
_APP_DB_PORT=3306
_APP_DB_ADAPTER=mariadb-proxy
_APP_DB_HOST=database-proxy
_APP_DB_PORT=80
_APP_DB_SCHEMA=appwrite
_APP_DB_USER=user
_APP_DB_PASS=password
@@ -103,4 +104,6 @@ _APP_MESSAGE_SMS_TEST_DSN=
_APP_MESSAGE_EMAIL_TEST_DSN=
_APP_MESSAGE_PUSH_TEST_DSN=
_APP_WEBHOOK_MAX_FAILED_ATTEMPTS=10
_APP_PROJECT_REGIONS=default
_APP_PROJECT_REGIONS=default
_APP_DATABASE_PROXY_SECRET=password
_APP_DATABASE_PROXY_CONNECTION=mariadb://user:password@mariadb:3306/appwrite?pool_size=128
+16
View File
@@ -0,0 +1,16 @@
name: "CodeQL"
on: [pull_request]
jobs:
lint:
name: CodeQL
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Run CodeQL
run: |
docker run --rm -v $PWD:/app composer sh -c \
"composer install --profile --ignore-platform-reqs && composer check"
+2
View File
@@ -23,6 +23,8 @@ use Utopia\Pools\Group;
use Utopia\Queue\Connection;
use Utopia\Registry\Registry;
global $register;
Authorization::disable();
CLI::setResource('register', fn () => $register);
+8 -7
View File
@@ -775,15 +775,16 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect')
'accessedAt' => DateTime::now(),
]);
$user->removeAttribute('$internalId');
$userDoc = Authorization::skip(fn () => $dbForProject->createDocument('users', $user));
$user = Authorization::skip(fn () => $dbForProject->createDocument('users', $user));
$dbForProject->createDocument('targets', new Document([
'$permissions' => [
Permission::read(Role::user($user->getId())),
Permission::update(Role::user($user->getId())),
Permission::delete(Role::user($user->getId())),
],
'userId' => $userDoc->getId(),
'userInternalId' => $userDoc->getInternalId(),
'userId' => $user->getId(),
'userInternalId' => $user->getInternalId(),
'providerType' => MESSAGE_TYPE_EMAIL,
'identifier' => $email,
]));
@@ -1162,7 +1163,7 @@ App::post('/v1/account/tokens/magic-url')
]);
$user->removeAttribute('$internalId');
Authorization::skip(fn () => $dbForProject->createDocument('users', $user));
$user = Authorization::skip(fn () => $dbForProject->createDocument('users', $user));
}
$tokenSecret = Auth::tokenGenerator(Auth::TOKEN_LENGTH_MAGIC_URL);
@@ -1401,7 +1402,7 @@ App::post('/v1/account/tokens/email')
]);
$user->removeAttribute('$internalId');
Authorization::skip(fn () => $dbForProject->createDocument('users', $user));
$user = Authorization::skip(fn () => $dbForProject->createDocument('users', $user));
}
$tokenSecret = Auth::codeGenerator(6);
@@ -1813,7 +1814,7 @@ App::post('/v1/account/tokens/phone')
]);
$user->removeAttribute('$internalId');
Authorization::skip(fn () => $dbForProject->createDocument('users', $user));
$user = Authorization::skip(fn () => $dbForProject->createDocument('users', $user));
try {
$target = Authorization::skip(fn () => $dbForProject->createDocument('targets', new Document([
'$permissions' => [
@@ -1980,7 +1981,7 @@ App::post('/v1/account/sessions/anonymous')
'accessedAt' => DateTime::now(),
]);
$user->removeAttribute('$internalId');
Authorization::skip(fn () => $dbForProject->createDocument('users', $user));
$user = Authorization::skip(fn () => $dbForProject->createDocument('users', $user));
// Create session token
$duration = $project->getAttribute('auths', [])['duration'] ?? Auth::TOKEN_EXPIRATION_LOGIN_LONG;
+3
View File
@@ -536,6 +536,9 @@ App::shutdown()
->inject('mode')
->inject('dbForConsole')
->action(function (App $utopia, Request $request, Response $response, Document $project, Document $user, Event $queueForEvents, Audit $queueForAudits, Usage $queueForUsage, Delete $queueForDeletes, EventDatabase $queueForDatabase, Build $queueForBuilds, Messaging $queueForMessaging, Database $dbForProject, Func $queueForFunctions, string $mode, Database $dbForConsole) use ($parseLabel) {
if (!empty($user) && !$user->isEmpty() && empty($user->getInternalId())) {
$user = Authorization::skip(fn () => $dbForProject->getDocument('users', $user->getId()));
}
$responsePayload = $response->getPayload();
+1
View File
@@ -77,6 +77,7 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg
try {
$attempts++;
$dbForConsole = $app->getResource('dbForConsole');
$dbForConsole->ping();
/** @var Utopia\Database\Database $dbForConsole */
break; // leave the do-while if successful
} catch (\Throwable $e) {
+18 -3
View File
@@ -50,6 +50,7 @@ use Utopia\Cache\Cache;
use Utopia\CLI\Console;
use Utopia\Config\Config;
use Utopia\Database\Adapter\MariaDB;
use Utopia\Database\Adapter\MariaDBProxy;
use Utopia\Database\Adapter\MySQL;
use Utopia\Database\Adapter\SQL;
use Utopia\Database\Database;
@@ -738,7 +739,7 @@ $register->set('pools', function () {
$group = new Group();
$fallbackForDB = 'db_main=' . AppwriteURL::unparse([
'scheme' => 'mariadb',
'scheme' => App::getEnv('_APP_DB_ADAPTER', 'mariadb'),
'host' => App::getEnv('_APP_DB_HOST', 'mariadb'),
'port' => App::getEnv('_APP_DB_PORT', '3306'),
'user' => App::getEnv('_APP_DB_USER', ''),
@@ -758,13 +759,13 @@ $register->set('pools', function () {
'type' => 'database',
'dsns' => App::getEnv('_APP_CONNECTIONS_DB_CONSOLE', $fallbackForDB),
'multiple' => false,
'schemes' => ['mariadb', 'mysql'],
'schemes' => ['mariadb', 'mysql', 'mariadb-proxy'],
],
'database' => [
'type' => 'database',
'dsns' => App::getEnv('_APP_CONNECTIONS_DB_PROJECT', $fallbackForDB),
'multiple' => true,
'schemes' => ['mariadb', 'mysql'],
'schemes' => ['mariadb', 'mysql', 'mariadb-proxy'],
],
'queue' => [
'type' => 'queue',
@@ -840,6 +841,19 @@ $register->set('pools', function () {
* Resource assignment to an adapter will happen below.
*/
switch ($dsnScheme) {
case 'mariadb-proxy':
$host = $dsnHost;
if ($dsnPort) {
$host .= ':' . $dsnPort;
}
// Ignore port and password (user = password)
$resource = [
'endpoint' => 'http://' . $host . '/v1',
'secret' => $dsnPass,
'database' => $dsnDatabase
];
break;
case 'mysql':
case 'mariadb':
$resource = function () use ($dsnHost, $dsnPort, $dsnUser, $dsnPass, $dsnDatabase) {
@@ -879,6 +893,7 @@ $register->set('pools', function () {
$adapter = match ($dsn->getScheme()) {
'mariadb' => new MariaDB($resource()),
'mysql' => new MySQL($resource()),
'mariadb-proxy' => new MariaDBProxy($resource['endpoint'], $resource['secret'], $resource['database']),
default => null
};
+2
View File
@@ -36,6 +36,8 @@ use Utopia\Queue\Server;
use Utopia\Registry\Registry;
use Utopia\Storage\Device\Local;
global $register;
Authorization::disable();
Runtime::enableCoroutine(SWOOLE_HOOK_ALL);
+7 -5
View File
@@ -13,7 +13,8 @@
"scripts": {
"test": "vendor/bin/phpunit",
"lint": "vendor/bin/pint --test",
"format": "vendor/bin/pint"
"format": "vendor/bin/pint",
"check": "./vendor/bin/phpstan analyse -c phpstan.neon --memory-limit 1G app src tests"
},
"autoload": {
"psr-4": {
@@ -44,13 +45,13 @@
"ext-sockets": "*",
"appwrite/php-runtimes": "0.13.*",
"appwrite/php-clamav": "2.0.*",
"utopia-php/abuse": "0.36.*",
"utopia-php/abuse": "0.37.*",
"utopia-php/analytics": "0.10.*",
"utopia-php/audit": "0.38.*",
"utopia-php/audit": "0.39.*",
"utopia-php/cache": "0.9.*",
"utopia-php/cli": "0.15.*",
"utopia-php/config": "0.2.*",
"utopia-php/database": "0.48.*",
"utopia-php/database": "0.49.*",
"utopia-php/domains": "0.5.*",
"utopia-php/dsn": "0.2.*",
"utopia-php/framework": "0.33.*",
@@ -84,7 +85,8 @@
"swoole/ide-helper": "5.0.2",
"textalk/websocket": "1.5.7",
"utopia-php/fetch": "0.1.*",
"laravel/pint": "^1.14"
"laravel/pint": "^1.14",
"phpstan/phpstan": "1.8.*"
},
"provide": {
"ext-phpiredis": "*"
Generated
+121 -61
View File
@@ -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": "427cda6539f0edab82485bf43a257ad4",
"content-hash": "1c3c0b518e1486c5770b57519da2a797",
"packages": [
{
"name": "adhocore/jwt",
@@ -1260,23 +1260,23 @@
},
{
"name": "utopia-php/abuse",
"version": "0.36.0",
"version": "0.37.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/abuse.git",
"reference": "d3d09b4fa0db75935110714ad4b2a87f3ace31ed"
"reference": "2de5c12886cbd516e511e559afdd9e615d871062"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/abuse/zipball/d3d09b4fa0db75935110714ad4b2a87f3ace31ed",
"reference": "d3d09b4fa0db75935110714ad4b2a87f3ace31ed",
"url": "https://api.github.com/repos/utopia-php/abuse/zipball/2de5c12886cbd516e511e559afdd9e615d871062",
"reference": "2de5c12886cbd516e511e559afdd9e615d871062",
"shasum": ""
},
"require": {
"ext-curl": "*",
"ext-pdo": "*",
"php": ">=8.0",
"utopia-php/database": "0.48.*"
"utopia-php/database": "0.49.*"
},
"require-dev": {
"laravel/pint": "1.5.*",
@@ -1303,9 +1303,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/abuse/issues",
"source": "https://github.com/utopia-php/abuse/tree/0.36.0"
"source": "https://github.com/utopia-php/abuse/tree/0.37.0"
},
"time": "2024-01-19T09:32:56+00:00"
"time": "2024-03-06T21:20:27+00:00"
},
{
"name": "utopia-php/analytics",
@@ -1355,21 +1355,21 @@
},
{
"name": "utopia-php/audit",
"version": "0.38.0",
"version": "0.39.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/audit.git",
"reference": "a9067f4af76e8787f1d29850a8ec94fc32bb6539"
"reference": "f0bc15012e05cc0b9dde012ab27d25f193768a2c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/audit/zipball/a9067f4af76e8787f1d29850a8ec94fc32bb6539",
"reference": "a9067f4af76e8787f1d29850a8ec94fc32bb6539",
"url": "https://api.github.com/repos/utopia-php/audit/zipball/f0bc15012e05cc0b9dde012ab27d25f193768a2c",
"reference": "f0bc15012e05cc0b9dde012ab27d25f193768a2c",
"shasum": ""
},
"require": {
"php": ">=8.0",
"utopia-php/database": "0.48.*"
"utopia-php/database": "0.49.*"
},
"require-dev": {
"laravel/pint": "1.5.*",
@@ -1396,9 +1396,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/audit/issues",
"source": "https://github.com/utopia-php/audit/tree/0.38.0"
"source": "https://github.com/utopia-php/audit/tree/0.39.0"
},
"time": "2024-01-19T09:33:05+00:00"
"time": "2024-03-06T21:20:37+00:00"
},
{
"name": "utopia-php/cache",
@@ -1552,16 +1552,16 @@
},
{
"name": "utopia-php/database",
"version": "0.48.4",
"version": "0.49.1",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/database.git",
"reference": "02f20bd901b8fab26d7dc2c58f7da1d6a08d21c0"
"reference": "4199fe8f00f4e181c7782c4a6862845d591c1f03"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/database/zipball/02f20bd901b8fab26d7dc2c58f7da1d6a08d21c0",
"reference": "02f20bd901b8fab26d7dc2c58f7da1d6a08d21c0",
"url": "https://api.github.com/repos/utopia-php/database/zipball/4199fe8f00f4e181c7782c4a6862845d591c1f03",
"reference": "4199fe8f00f4e181c7782c4a6862845d591c1f03",
"shasum": ""
},
"require": {
@@ -1569,6 +1569,7 @@
"ext-pdo": "*",
"php": ">=8.0",
"utopia-php/cache": "0.9.*",
"utopia-php/fetch": "0.1.*",
"utopia-php/framework": "0.33.*",
"utopia-php/mongo": "0.3.*"
},
@@ -1602,9 +1603,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/database/issues",
"source": "https://github.com/utopia-php/database/tree/0.48.4"
"source": "https://github.com/utopia-php/database/tree/0.49.1"
},
"time": "2024-02-23T03:22:55+00:00"
"time": "2024-03-06T11:35:53+00:00"
},
{
"name": "utopia-php/domains",
@@ -1713,6 +1714,45 @@
},
"time": "2023-11-02T12:01:43+00:00"
},
{
"name": "utopia-php/fetch",
"version": "0.1.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/fetch.git",
"reference": "2fa214b9262acd1a3583515a364da4f35929d5c5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/fetch/zipball/2fa214b9262acd1a3583515a364da4f35929d5c5",
"reference": "2fa214b9262acd1a3583515a364da4f35929d5c5",
"shasum": ""
},
"require": {
"php": ">=8.0"
},
"require-dev": {
"laravel/pint": "^1.5.0",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^9.5"
},
"type": "library",
"autoload": {
"psr-4": {
"Utopia\\Fetch\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "A simple library that provides an interface for making HTTP Requests.",
"support": {
"issues": "https://github.com/utopia-php/fetch/issues",
"source": "https://github.com/utopia-php/fetch/tree/0.1.0"
},
"time": "2023-10-10T11:58:32+00:00"
},
{
"name": "utopia-php/framework",
"version": "0.33.2",
@@ -3602,6 +3642,65 @@
},
"time": "2024-02-23T16:05:55+00:00"
},
{
"name": "phpstan/phpstan",
"version": "1.8.11",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "46e223dd68a620da18855c23046ddb00940b4014"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/46e223dd68a620da18855c23046ddb00940b4014",
"reference": "46e223dd68a620da18855c23046ddb00940b4014",
"shasum": ""
},
"require": {
"php": "^7.2|^8.0"
},
"conflict": {
"phpstan/phpstan-shim": "*"
},
"bin": [
"phpstan",
"phpstan.phar"
],
"type": "library",
"autoload": {
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHPStan - PHP Static Analysis Tool",
"keywords": [
"dev",
"static analysis"
],
"support": {
"issues": "https://github.com/phpstan/phpstan/issues",
"source": "https://github.com/phpstan/phpstan/tree/1.8.11"
},
"funding": [
{
"url": "https://github.com/ondrejmirtes",
"type": "github"
},
{
"url": "https://github.com/phpstan",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
"type": "tidelift"
}
],
"time": "2022-10-24T15:45:13+00:00"
},
{
"name": "phpunit/php-code-coverage",
"version": "9.2.31",
@@ -5399,45 +5498,6 @@
}
],
"time": "2023-11-21T18:54:41+00:00"
},
{
"name": "utopia-php/fetch",
"version": "0.1.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/fetch.git",
"reference": "2fa214b9262acd1a3583515a364da4f35929d5c5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/fetch/zipball/2fa214b9262acd1a3583515a364da4f35929d5c5",
"reference": "2fa214b9262acd1a3583515a364da4f35929d5c5",
"shasum": ""
},
"require": {
"php": ">=8.0"
},
"require-dev": {
"laravel/pint": "^1.5.0",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^9.5"
},
"type": "library",
"autoload": {
"psr-4": {
"Utopia\\Fetch\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "A simple library that provides an interface for making HTTP Requests.",
"support": {
"issues": "https://github.com/utopia-php/fetch/issues",
"source": "https://github.com/utopia-php/fetch/tree/0.1.0"
},
"time": "2023-10-10T11:58:32+00:00"
}
],
"aliases": [],
@@ -5468,5 +5528,5 @@
"platform-overrides": {
"php": "8.2"
},
"plugin-api-version": "2.6.0"
"plugin-api-version": "2.3.0"
}
+37 -2
View File
@@ -116,6 +116,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -229,6 +230,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -259,6 +261,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -286,6 +289,7 @@ services:
- _APP_WORKER_PER_CORE
- _APP_OPENSSL_KEY_V1
- _APP_SYSTEM_SECURITY_EMAIL_ADDRESS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -325,6 +329,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -377,6 +382,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -412,6 +418,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -479,6 +486,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -509,6 +517,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -581,6 +590,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -617,6 +627,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -650,6 +661,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -681,6 +693,7 @@ services:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_OPENSSL_KEY_V1
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -712,6 +725,7 @@ services:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_OPENSSL_KEY_V1
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -747,6 +761,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -774,6 +789,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -805,6 +821,7 @@ services:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_OPENSSL_KEY_V1
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -837,6 +854,7 @@ services:
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
@@ -918,12 +936,27 @@ services:
- OPR_PROXY_MAX_TIMEOUT=600
- OPR_PROXY_HEALTHCHECK=enabled
database-proxy:
container_name: database-proxy
image: appwrite/database-proxy:0.1.5
networks:
- appwrite
- database-proxy
ports:
- 9520:80
environment:
- UTOPIA_DATA_API_ENV=$_APP_ENV
- UTOPIA_DATA_API_SECRET=$_APP_DATABASE_PROXY_SECRET
- UTOPIA_DATA_API_SECRET_CONNECTION=$_APP_DATABASE_PROXY_CONNECTION
- UTOPIA_DATA_API_LOGGING_PROVIDER=$_APP_LOGGING_PROVIDER
- UTOPIA_DATA_API_LOGGING_CONFIG=$_APP_LOGGING_CONFIG
mariadb:
image: mariadb:10.11 # fix issues when upgrading using: mysql_upgrade -u root -p
container_name: appwrite-mariadb
<<: *x-logging
networks:
- appwrite
- database-proxy
volumes:
- appwrite-mariadb:/var/lib/mysql:rw
ports:
@@ -1009,7 +1042,7 @@ services:
ports:
- 9506:8080
networks:
- appwrite
- database-proxy
redis-insight:
image: redis/redisinsight:latest
@@ -1039,6 +1072,8 @@ networks:
name: gateway
appwrite:
name: appwrite
database-proxy:
name: database-proxy
runtimes:
name: runtimes
+11
View File
@@ -0,0 +1,11 @@
parameters:
level: 0
scanDirectories:
- vendor/swoole/ide-helper
excludePaths:
- tests/resources
ignoreErrors:
- '#Parameter \$geodb of anonymous function has invalid type MaxMind\\Db\\Reader\.#'
- '#Parameter \$geodb of function router\(\) has invalid type MaxMind\\Db\\Reader\.#'
- '#Instantiated class MaxMind\\Db\\Reader not found.#'
- '#Function scrypt not found\.#'
+1 -1
View File
@@ -88,7 +88,7 @@ class Autodesk extends OAuth2
'client_id' => $this->appID,
'client_secret' => $this->appSecret,
'grant_type' => 'refresh_token',
'code' => $code,
'code' => $refreshToken,
'redirect_uri' => $this->callback,
])
);
+2 -2
View File
@@ -152,9 +152,9 @@ class Func extends Event
*
* @return string
*/
public function getData(): string
public function getBody(): string
{
return $this->data;
return $this->body;
}
/**
+2 -2
View File
@@ -50,7 +50,7 @@ class SDKs extends Action
$message = ($git) ? Console::confirm('Please enter your commit message:') : '';
if (!in_array($version, ['0.6.x', '0.7.x', '0.8.x', '0.9.x', '0.10.x', '0.11.x', '0.12.x', '0.13.x', '0.14.x', '0.15.x', '1.0.x', '1.1.x', '1.2.x', '1.3.x', '1.4.x', '1.5.x', 'latest'])) {
throw new Exception('Unknown version given');
throw new \Exception('Unknown version given');
}
foreach ($platforms as $key => $platform) {
@@ -196,7 +196,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
$config = new REST();
break;
default:
throw new Exception('Language "' . $language['key'] . '" not supported');
throw new \Exception('Language "' . $language['key'] . '" not supported');
}
Console::info("Generating {$language['name']} SDK...");
+7 -7
View File
@@ -73,7 +73,7 @@ class Builds extends Action
$payload = $message->getPayload() ?? [];
if (empty($payload)) {
throw new Exception('Missing payload');
throw new \Exception('Missing payload');
}
$type = $payload['type'] ?? '';
@@ -124,7 +124,7 @@ class Builds extends Action
$function = $dbForProject->getDocument('functions', $functionId);
if ($function->isEmpty()) {
throw new Exception('Function not found', 404);
throw new \Exception('Function not found', 404);
}
$deploymentId = $deployment->getId();
@@ -132,11 +132,11 @@ class Builds extends Action
$deployment = $dbForProject->getDocument('deployments', $deploymentId);
if ($deployment->isEmpty()) {
throw new Exception('Deployment not found', 404);
throw new \Exception('Deployment not found', 404);
}
if (empty($deployment->getAttribute('entrypoint', ''))) {
throw new Exception('Entrypoint for your Appwrite Function is missing. Please specify it when making deployment or update the entrypoint under your function\'s "Settings" > "Configuration" > "Entrypoint".', 500);
throw new \Exception('Entrypoint for your Appwrite Function is missing. Please specify it when making deployment or update the entrypoint under your function\'s "Settings" > "Configuration" > "Entrypoint".', 500);
}
$version = $function->getAttribute('version', 'v2');
@@ -144,7 +144,7 @@ class Builds extends Action
$key = $function->getAttribute('runtime');
$runtime = $runtimes[$key] ?? null;
if (\is_null($runtime)) {
throw new Exception('Runtime "' . $function->getAttribute('runtime', '') . '" is not supported');
throw new \Exception('Runtime "' . $function->getAttribute('runtime', '') . '" is not supported');
}
// Realtime preparation
@@ -306,7 +306,7 @@ class Builds extends Action
$directorySize = $localDevice->getDirectorySize($tmpDirectory);
$functionsSizeLimit = (int) App::getEnv('_APP_FUNCTIONS_SIZE_LIMIT', '30000000');
if ($directorySize > $functionsSizeLimit) {
throw new Exception('Repository directory size should be less than ' . number_format($functionsSizeLimit / 1048576, 2) . ' MBs.');
throw new \Exception('Repository directory size should be less than ' . number_format($functionsSizeLimit / 1048576, 2) . ' MBs.');
}
Console::execute('tar --exclude code.tar.gz -czf ' . $tmpPathFile . ' -C /tmp/builds/' . \escapeshellcmd($buildId) . '/code' . (empty($rootDirectory) ? '' : '/' . $rootDirectory) . ' .', '', $stdout, $stderr);
@@ -431,7 +431,7 @@ class Builds extends Action
$build = $dbForProject->getDocument('builds', $build->getId());
if ($build->isEmpty()) {
throw new Exception('Build not found', 404);
throw new \Exception('Build not found', 404);
}
$build = $build->setAttribute('logs', $build->getAttribute('logs', '') . $logs);
+2 -2
View File
@@ -25,7 +25,7 @@ use Utopia\Messaging\Adapter\SMS as SMSAdapter;
use Utopia\Messaging\Adapter\SMS\Mock;
use Utopia\Messaging\Adapter\SMS\Msg91;
use Utopia\Messaging\Adapter\SMS\Telesign;
use Utopia\Messaging\Adapter\SMS\Textmagic;
use Utopia\Messaging\Adapter\SMS\TextMagic;
use Utopia\Messaging\Adapter\SMS\Twilio;
use Utopia\Messaging\Adapter\SMS\Vonage;
use Utopia\Messaging\Messages\Email;
@@ -456,7 +456,7 @@ class Messaging extends Action
return match ($provider->getAttribute('provider')) {
'mock' => new Mock('username', 'password'),
'twilio' => new Twilio($credentials['accountSid'], $credentials['authToken']),
'textmagic' => new Textmagic($credentials['username'], $credentials['apiKey']),
'textmagic' => new TextMagic($credentials['username'], $credentials['apiKey']),
'telesign' => new Telesign($credentials['customerId'], $credentials['apiKey']),
'msg91' => new Msg91($credentials['senderId'], $credentials['authKey'], $credentials['templateId']),
'vonage' => new Vonage($credentials['apiKey'], $credentials['apiSecret']),
+1 -1
View File
@@ -12,7 +12,7 @@ abstract class Promise
private mixed $result;
public function __construct(?callable $executor = null)
final public function __construct(?callable $executor = null)
{
if (\is_null($executor)) {
return;
-5
View File
@@ -6,11 +6,6 @@ use Swoole\Coroutine\Channel;
class Swoole extends Promise
{
public function __construct(?callable $executor = null)
{
parent::__construct($executor);
}
protected function execute(
callable $executor,
callable $resolve,
@@ -238,8 +238,11 @@ class OpenAPI3 extends Format
}
if ($route->getLabel('sdk.response.code', 500) === 204) {
$temp['responses'][(string)$route->getLabel('sdk.response.code', '500')]['description'] = 'No content';
unset($temp['responses'][(string)$route->getLabel('sdk.response.code', '500')]['schema']);
$labelCode = (string)$route->getLabel('sdk.response.code', '500');
$temp['responses'][$labelCode]['description'] = 'No content';
if(isset($temp['responses'][$labelCode]['schema'])) {
unset($temp['responses'][$labelCode]['schema']);
}
}
if ((!empty($scope))) { // && 'public' != $scope
@@ -24,11 +24,14 @@ class V14 extends Filter
private function convertEvents($content)
{
// TODO: If nessessary, implement V13 and use following code:
/*
$migration = new MigrationV13();
$events = $content['events'] ?? [];
$content['events'] = $migration->migrateEvents($events);
return $content;
*/
}
}
@@ -2,6 +2,7 @@
namespace Appwrite\Utopia\Response\Filters;
use Appwrite\ID;
use Appwrite\Utopia\Response;
use Appwrite\Utopia\Response\Filter;
@@ -209,8 +209,6 @@ class V12 extends Filter
unset($content['bucketsRead']);
unset($content['bucketsUpdate']);
unset($content['bucketsDelete']);
unset($content['filesCount']);
unset($content['bucketsDelete']);
unset($content['filesCreate']);
unset($content['filesRead']);
unset($content['filesUpdate']);
@@ -64,9 +64,10 @@ class DatabasesCustomClientTest extends Scope
'required' => true,
]);
$this->assertEquals(202, $response['headers']['status-code']);
sleep(1);
$this->assertEquals(202, $response['headers']['status-code']);
// Document aliases write to update, delete
$document1 = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $moviesId . '/documents', array_merge([
@@ -82,6 +83,7 @@ class DatabasesCustomClientTest extends Scope
]
]);
$this->assertEquals(201, $document1['headers']['status-code']);
$this->assertNotContains(Permission::create(Role::user($this->getUser()['$id'])), $document1['body']['$permissions']);
$this->assertContains(Permission::update(Role::user($this->getUser()['$id'])), $document1['body']['$permissions']);
$this->assertContains(Permission::delete(Role::user($this->getUser()['$id'])), $document1['body']['$permissions']);
@@ -183,7 +183,6 @@ class StorageClientTest extends Scope
/**
* @depends testCreateFile
* @param $file
* @return array
* @throws \Exception
*/
public function testGetFileDownload($file)
@@ -232,7 +232,6 @@ class StorageServerTest extends Scope
/**
* @depends testCreateFile
* @param $file
* @return array
* @throws \Exception
*/
public function testGetFileDownload($file)