Compare commits

..
Author SHA1 Message Date
Prem Palanisamy f4ce9b1d6a Add documentsdb/vectorsdb shared tables env vars to CI steps 2026-04-06 03:05:39 +01:00
Prem Palanisamy e95c256c1e Include db_main in shared tables lists 2026-04-06 02:54:23 +01:00
Prem Palanisamy e4bac5a5f7 Fix shared mode routing for documentsdb/vectorsdb pools 2026-04-06 02:36:44 +01:00
Prem Palanisamy a56f5ecef5 Remove all (int) casts from setTenant, TEMP: run only failing MongoDB shared tests 2026-04-06 02:21:38 +01:00
Prem Palanisamy 4840333e4f TEMP: only run 14 failing MongoDB shared tests 2026-04-06 02:21:17 +01:00
premtsd-codeandGitHub 190b760052 Merge branch '1.9.x' into bump-database-version4 2026-04-05 23:10:58 +05:30
Prem Palanisamy 660fd86142 Restore original 1.9.x matrix logic and realtime test 2026-04-05 18:40:16 +01:00
Prem Palanisamy a85b0957ee Restore full CI: remove all temp restrictions 2026-04-05 17:52:53 +01:00
Prem Palanisamy 0f8d4bb5ad TEMP: remove include block to fix phantom matrix entries 2026-04-05 17:50:11 +01:00
Prem Palanisamy 2267469d00 TEMP: skip non-essential jobs, only run 4 failing tests 2026-04-05 17:27:33 +01:00
Prem Palanisamy acf21bb22d Match cloud: only cast setTenant to (int) for getDatabasesDB and worker sync 2026-04-05 17:26:21 +01:00
Prem Palanisamy 070cc38b6c TEMP: limit CI to only failing tests for validation 2026-04-05 17:09:56 +01:00
Prem Palanisamy 6f9b530d75 Add documentsdb/vectorsdb env vars to all worker services 2026-04-05 17:08:13 +01:00
Prem Palanisamy 8fa94e98d9 Add connection and keys env vars for documentsdb/vectorsdb to compose 2026-04-05 16:05:36 +01:00
premtsd-codeandGitHub 0e3ad4f677 Merge branch '1.9.x' into bump-database-version4 2026-04-05 20:27:49 +05:30
Prem Palanisamy 9e31e4c64f Move documentsdb/vectorsdb shared tables config to .env.tests 2026-04-05 15:56:08 +01:00
Prem Palanisamy cb4bf473bc Add shared tables test infrastructure for documentsdb/vectorsdb
Add docker-compose.tests.yml with separate MongoDB and PostgreSQL
containers for shared tables v1/v2 testing, .env.tests with multi-pool
connection strings, and update CI workflow to pass documentsdb/vectorsdb
shared tables env vars based on the test matrix mode.
2026-04-05 15:52:49 +01:00
Prem Palanisamy 5fb857f0b2 bump utopia-php/database to 5.3.19 (MariaDB only) 2026-04-03 19:27:31 +02:00
Prem Palanisamy a7fb3d91e1 bump utopia-php/database to 5.3.19 2026-04-03 19:23:56 +02:00
15 changed files with 459 additions and 153 deletions
+12
View File
@@ -0,0 +1,12 @@
# Environment variable overrides for CI tests
# Provides multi-pool connections for documentsdb and vectorsdb shared tables testing
_APP_CONNECTIONS_DATABASE_DOCUMENTSDB=db_main=mongodb://user:password@mongodb:27017/appwrite,db_shared_v1=mongodb://user:password@mongodb-shared-tables-v1:27017/appwrite,db_shared_v2=mongodb://user:password@mongodb-shared-tables-v2:27017/appwrite
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES=documentsdb_db_main,documentsdb_db_shared_v1,documentsdb_db_shared_v2
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1=documentsdb_db_main,documentsdb_db_shared_v1
_APP_DATABASE_DOCUMENTSDB_KEYS=documentsdb_db_main,documentsdb_db_shared_v1,documentsdb_db_shared_v2
_APP_CONNECTIONS_DATABASE_VECTORSDB=db_main=postgresql://user:password@postgresql:5432/appwrite,db_shared_v1=postgresql://user:password@postgresql-shared-tables-v1:5432/appwrite,db_shared_v2=postgresql://user:password@postgresql-shared-tables-v2:5432/appwrite
_APP_DATABASE_VECTORSDB_SHARED_TABLES=vectorsdb_db_main,vectorsdb_db_shared_v1,vectorsdb_db_shared_v2
_APP_DATABASE_VECTORSDB_SHARED_TABLES_V1=vectorsdb_db_main,vectorsdb_db_shared_v1
_APP_DATABASE_VECTORSDB_KEYS=vectorsdb_db_main,vectorsdb_db_shared_v1,vectorsdb_db_shared_v2
+26 -40
View File
@@ -5,7 +5,7 @@ concurrency:
cancel-in-progress: true
env:
COMPOSE_FILE: docker-compose.yml
COMPOSE_FILE: docker-compose.yml:docker-compose.tests.yml
IMAGE: appwrite-dev
on:
@@ -218,8 +218,9 @@ jobs:
const decode = (content) => JSON.parse(Buffer.from(content, 'base64').toString());
const databaseChanged = getDbVersion(decode(base.content)) !== getDbVersion(decode(head.content));
core.setOutput('databases', JSON.stringify(databaseChanged ? allDatabases : defaultDatabases));
core.setOutput('modes', JSON.stringify(databaseChanged ? allModes : defaultModes));
// TEMP: only run failing MongoDB shared tests
core.setOutput('databases', JSON.stringify(['MongoDB']));
core.setOutput('modes', JSON.stringify(['shared_v1', 'shared_v2']));
build:
name: Build
@@ -379,45 +380,16 @@ jobs:
matrix:
database: ${{ fromJSON(needs.matrix.outputs.databases) }}
mode: ${{ fromJSON(needs.matrix.outputs.modes) }}
# TEMP: only the 14 failing services
service: [
Account,
Avatars,
Console,
Databases,
TablesDB,
Functions,
FunctionsSchedule,
GraphQL,
Health,
Locale,
Projects,
Realtime,
Sites,
Proxy,
Storage,
Tokens,
Teams,
Users,
ProjectWebhooks,
Webhooks,
VCS,
Messaging,
Migrations,
Project
Migrations
]
include:
- service: Databases
runner: blacksmith-4vcpu-ubuntu-2404
- service: Sites
runner: blacksmith-4vcpu-ubuntu-2404
- service: Functions
runner: blacksmith-4vcpu-ubuntu-2404
- service: Avatars
runner: blacksmith-4vcpu-ubuntu-2404
- service: Realtime
runner: blacksmith-4vcpu-ubuntu-2404
- service: TablesDB
runner: blacksmith-4vcpu-ubuntu-2404
steps:
- name: Checkout repository
uses: actions/checkout@v6
@@ -459,10 +431,14 @@ jobs:
_APP_BROWSER_HOST: http://invalid-browser/v1
_APP_DATABASE_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'database_db_main' || '' }}
_APP_DATABASE_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'database_db_main' || '' }}
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'documentsdb_db_main' || '' }}
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'documentsdb_db_main' || '' }}
_APP_DATABASE_VECTORSDB_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'vectorsdb_db_main' || '' }}
_APP_DATABASE_VECTORSDB_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'vectorsdb_db_main' || '' }}
run: |
docker load --input /tmp/${{ env.IMAGE }}.tar
docker compose pull --quiet --ignore-buildable
docker compose up -d --quiet-pull --wait
docker compose --env-file .env --env-file .env.tests pull --quiet --ignore-buildable
docker compose --env-file .env --env-file .env.tests up -d --quiet-pull --wait
- name: Wait for Open Runtimes
timeout-minutes: 3
@@ -533,10 +509,14 @@ jobs:
_APP_OPTIONS_ABUSE: enabled
_APP_DATABASE_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'database_db_main' || '' }}
_APP_DATABASE_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'database_db_main' || '' }}
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'documentsdb_db_main' || '' }}
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'documentsdb_db_main' || '' }}
_APP_DATABASE_VECTORSDB_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'vectorsdb_db_main' || '' }}
_APP_DATABASE_VECTORSDB_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'vectorsdb_db_main' || '' }}
run: |
docker load --input /tmp/${{ env.IMAGE }}.tar
docker compose pull --quiet --ignore-buildable
docker compose up -d --quiet-pull --wait
docker compose --env-file .env --env-file .env.tests pull --quiet --ignore-buildable
docker compose --env-file .env --env-file .env.tests up -d --quiet-pull --wait
- name: Run tests
uses: itznotabug/php-retry@v3
@@ -590,10 +570,14 @@ jobs:
env:
_APP_DATABASE_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'database_db_main' || '' }}
_APP_DATABASE_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'database_db_main' || '' }}
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'documentsdb_db_main' || '' }}
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'documentsdb_db_main' || '' }}
_APP_DATABASE_VECTORSDB_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'vectorsdb_db_main' || '' }}
_APP_DATABASE_VECTORSDB_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'vectorsdb_db_main' || '' }}
run: |
docker load --input /tmp/${{ env.IMAGE }}.tar
docker compose pull --quiet --ignore-buildable
docker compose up -d --quiet-pull --wait
docker compose --env-file .env --env-file .env.tests pull --quiet --ignore-buildable
docker compose --env-file .env --env-file .env.tests up -d --quiet-pull --wait
- name: Wait for Open Runtimes
timeout-minutes: 3
@@ -667,6 +651,8 @@ jobs:
run: docker compose down -v
- name: Installing latest version
env:
COMPOSE_FILE: docker-compose.yml
run: |
rm docker-compose.yml
rm .env
+4 -4
View File
@@ -3937,7 +3937,7 @@ Http::post('/v1/account/recovery')
->setParam('userId', $profile->getId())
->setParam('tokenId', $recovery->getId())
->setUser($profile)
->setPayload($response->showSensitive(fn () => $response->output($recovery, Response::MODEL_TOKEN)), sensitive: ['secret']);
->setPayload(Response::showSensitive(fn () => $response->output($recovery, Response::MODEL_TOKEN)), sensitive: ['secret']);
$response
->setStatusCode(Response::STATUS_CODE_CREATED)
@@ -4038,7 +4038,7 @@ Http::put('/v1/account/recovery')
$queueForEvents
->setParam('userId', $profile->getId())
->setParam('tokenId', $recoveryDocument->getId())
->setPayload($response->showSensitive(fn () => $response->output($recoveryDocument, Response::MODEL_TOKEN)), sensitive: ['secret']);
->setPayload(Response::showSensitive(fn () => $response->output($recoveryDocument, Response::MODEL_TOKEN)), sensitive: ['secret']);
$response->dynamic($recoveryDocument, Response::MODEL_TOKEN);
});
@@ -4268,7 +4268,7 @@ Http::post('/v1/account/verifications/email')
$queueForEvents
->setParam('userId', $user->getId())
->setParam('tokenId', $verification->getId())
->setPayload($response->showSensitive(fn () => $response->output($verification, Response::MODEL_TOKEN)), sensitive: ['secret']);
->setPayload(Response::showSensitive(fn () => $response->output($verification, Response::MODEL_TOKEN)), sensitive: ['secret']);
$response
->setStatusCode(Response::STATUS_CODE_CREATED)
@@ -4360,7 +4360,7 @@ Http::put('/v1/account/verifications/email')
$queueForEvents
->setParam('userId', $userId)
->setParam('tokenId', $verification->getId())
->setPayload($response->showSensitive(fn () => $response->output($verification, Response::MODEL_TOKEN)), sensitive: ['secret']);
->setPayload(Response::showSensitive(fn () => $response->output($verification, Response::MODEL_TOKEN)), sensitive: ['secret']);
$response->dynamic($verification, Response::MODEL_TOKEN);
});
+2 -15
View File
@@ -868,7 +868,7 @@ Http::init()
* Request format
*/
$route = $utopia->getRoute();
$request->setRoute($route);
Request::setRoute($route);
if ($route === null) {
$response->setStatusCode(404);
@@ -1019,7 +1019,7 @@ Http::init()
return;
}
$route = $request->getRoute();
if ($route?->getLabel('origin', false) === '*') {
if ($route->getLabel('origin', false) === '*') {
return;
}
if (!$originValidator->isValid($origin)) {
@@ -1493,19 +1493,6 @@ Http::error()
'type' => $type,
];
// Add CORS headers to error responses so browsers can read the error.
// Wrapped in try-catch: if the error itself is a DB failure, resolving
// the cors resource (which depends on rule -> DB) would cascade.
// Uses override:true to avoid duplicate headers if init() already set them.
try {
$cors = $utopia->getResource('cors');
foreach ($cors->headers($request->getOrigin()) as $name => $value) {
$response->addHeader($name, $value, override: true);
}
} catch (Throwable) {
// Degrade gracefully - error response without CORS is no worse than before.
}
$response
->addHeader('Cache-Control', 'no-cache, no-store, must-revalidate')
->addHeader('Expires', '0')
+26 -4
View File
@@ -907,11 +907,12 @@ Http::setResource('getDatabasesDB', function (Group $pools, Cache $cache, Docume
$dsn = new DSN('mysql://' . $project->getAttribute('database'));
}
$pool = $pools->get($databaseDSN->getHost());
$databaseHost = $databaseDSN->getHost();
$pool = $pools->get($databaseHost);
$adapter = new DatabasePool($pool);
$database = new Database($adapter, $cache);
$sharedTables = \explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', ''));
$sharedTables = \array_filter(\explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', '')));
$database
->setDatabase(APP_DATABASE)
@@ -922,10 +923,31 @@ Http::setResource('getDatabasesDB', function (Group $pools, Cache $cache, Docume
->setMaxQueryValues(APP_DATABASE_QUERY_MAX_VALUES);
// inside pools authorization needs to be set first
$database->getAdapter()->setSupportForAttributes($databaseType !== DOCUMENTSDB);
if (\in_array($dsn->getHost(), $sharedTables)) {
// For separate pools (documentsdb/vectorsdb), check their own shared tables config.
// If not configured, use dedicated mode to avoid cross-engine tenant type mismatches.
if ($databaseHost !== $dsn->getHost()) {
$dbTypeSharedTables = match ($databaseType) {
DOCUMENTSDB => \array_filter(\explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES', ''))),
VECTORSDB => \array_filter(\explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES', ''))),
default => [],
};
if (\in_array($databaseHost, $dbTypeSharedTables)) {
$database
->setSharedTables(true)
->setTenant($project->getSequence())
->setNamespace($dsn->getParam('namespace'));
} else {
$database
->setSharedTables(false)
->setTenant(null)
->setNamespace('_' . $project->getSequence());
}
} elseif (\in_array($dsn->getHost(), $sharedTables)) {
$database
->setSharedTables(true)
->setTenant((int)$project->getSequence())
->setTenant($project->getSequence())
->setNamespace($dsn->getParam('namespace'));
} else {
$database
-19
View File
@@ -383,22 +383,6 @@ $server->onStart(function () use ($stats, $containerId, &$statsDocument) {
}
});
function cloudRealtimeLogConnectionHostnames(Http $app, Document $project, Request $request): void
{
try {
/** @var array<int, string> $allowed */
$allowed = $app->getResource('allowedHostnames');
Console::info(sprintf(
'[Realtime] project=%s origin=%s allowedHostnames=%s',
$project->getId(),
$request->getOrigin(),
json_encode(array_values($allowed))
));
} catch (Throwable $e) {
Console::error('[Realtime] allowedHostnames log failed: ' . $e->getMessage());
}
}
$server->onWorkerStart(function (int $workerId) use ($server, $register, $stats, $realtime) {
Console::success('Worker ' . $workerId . ' started successfully');
@@ -704,9 +688,6 @@ $server->onOpen(function (int $connection, SwooleRequest $request) use ($server,
*/
$origin = $request->getOrigin();
$originValidator = $app->getResource('originValidator');
cloudRealtimeLogConnectionHostnames($app, $project, $request);
if (!empty($origin) && !$originValidator->isValid($origin) && $project->getId() !== 'console') {
throw new Exception(Exception::REALTIME_POLICY_VIOLATION, $originValidator->getDescription());
+23 -4
View File
@@ -245,7 +245,8 @@ Server::setResource('getDatabasesDB', function (Cache $cache, Registry $register
}
$pools = $register->get('pools');
$pool = $pools->get($databaseDSN->getHost());
$databaseHost = $databaseDSN->getHost();
$pool = $pools->get($databaseHost);
$adapter = new DatabasePool($pool);
$database = new Database($adapter, $cache);
@@ -254,12 +255,30 @@ Server::setResource('getDatabasesDB', function (Cache $cache, Registry $register
->setAuthorization($authorization);
$database->getAdapter()->setSupportForAttributes($databaseType !== DOCUMENTSDB);
$sharedTables = \explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', ''));
$sharedTables = \array_filter(\explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', '')));
if (\in_array($dsn->getHost(), $sharedTables, true)) {
if ($databaseHost !== $dsn->getHost()) {
$dbTypeSharedTables = match ($databaseType) {
DOCUMENTSDB => \array_filter(\explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES', ''))),
VECTORSDB => \array_filter(\explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES', ''))),
default => [],
};
if (\in_array($databaseHost, $dbTypeSharedTables)) {
$database
->setSharedTables(true)
->setTenant($projectDocument->getSequence())
->setNamespace($dsn->getParam('namespace'));
} else {
$database
->setSharedTables(false)
->setTenant(null)
->setNamespace('_' . $projectDocument->getSequence());
}
} elseif (\in_array($dsn->getHost(), $sharedTables, true)) {
$database
->setSharedTables(true)
->setTenant((int) $projectDocument->getSequence())
->setTenant($projectDocument->getSequence())
->setNamespace($dsn->getParam('namespace'));
} else {
$database
Generated
+6 -6
View File
@@ -3850,16 +3850,16 @@
},
{
"name": "utopia-php/database",
"version": "5.3.17",
"version": "5.3.19",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/database.git",
"reference": "cff2b6ed63d3291b74110d086e16ff089fe05993"
"reference": "72ee1614c37e37c7fdd9d4dc87f1f7cdfa1ca691"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/database/zipball/cff2b6ed63d3291b74110d086e16ff089fe05993",
"reference": "cff2b6ed63d3291b74110d086e16ff089fe05993",
"url": "https://api.github.com/repos/utopia-php/database/zipball/72ee1614c37e37c7fdd9d4dc87f1f7cdfa1ca691",
"reference": "72ee1614c37e37c7fdd9d4dc87f1f7cdfa1ca691",
"shasum": ""
},
"require": {
@@ -3903,9 +3903,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/database/issues",
"source": "https://github.com/utopia-php/database/tree/5.3.17"
"source": "https://github.com/utopia-php/database/tree/5.3.19"
},
"time": "2026-03-20T01:18:52+00:00"
"time": "2026-03-31T15:52:08+00:00"
},
{
"name": "utopia-php/detector",
+160
View File
@@ -0,0 +1,160 @@
# Test-specific containers for shared tables testing
# Provides separate MongoDB and PostgreSQL instances for documentsdb/vectorsdb shared tables
x-logging: &x-logging
logging:
driver: "json-file"
options:
max-file: "5"
max-size: "10m"
services:
appwrite:
depends_on:
mongodb-shared-tables-v1:
condition: service_healthy
mongodb-shared-tables-v2:
condition: service_healthy
postgresql-shared-tables-v1:
condition: service_healthy
postgresql-shared-tables-v2:
condition: service_healthy
appwrite-realtime:
depends_on:
mongodb-shared-tables-v1:
condition: service_healthy
mongodb-shared-tables-v2:
condition: service_healthy
postgresql-shared-tables-v1:
condition: service_healthy
postgresql-shared-tables-v2:
condition: service_healthy
mongodb-shared-tables-v1:
image: mongo:8.2.5
container_name: appwrite-mongodb-shared-tables-v1
<<: *x-logging
networks:
- appwrite
volumes:
- appwrite-mongodb-shared-tables-v1:/data/db
- appwrite-mongodb-shared-tables-v1-keyfile:/data/keyfile
- ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
- ./mongo-entrypoint.sh:/mongo-entrypoint.sh:ro
ports:
- "27018:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=${_APP_DB_ROOT_PASS}
- MONGO_INITDB_DATABASE=${_APP_DB_SCHEMA}
- MONGO_INITDB_USERNAME=${_APP_DB_USER}
- MONGO_INITDB_PASSWORD=${_APP_DB_PASS}
entrypoint: ["/bin/bash", "/mongo-entrypoint.sh"]
healthcheck:
test: |
bash -c "
if mongosh -u root -p ${_APP_DB_ROOT_PASS} --authenticationDatabase admin --quiet --eval 'rs.status().ok' 2>/dev/null | grep -q 1; then
exit 0
else
mongosh -u root -p ${_APP_DB_ROOT_PASS} --authenticationDatabase admin --quiet --eval \"
rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'appwrite-mongodb-shared-tables-v1:27017'}]})
\" 2>/dev/null || exit 1
fi
"
interval: 10s
timeout: 10s
retries: 10
start_period: 30s
mongodb-shared-tables-v2:
image: mongo:8.2.5
container_name: appwrite-mongodb-shared-tables-v2
<<: *x-logging
networks:
- appwrite
volumes:
- appwrite-mongodb-shared-tables-v2:/data/db
- appwrite-mongodb-shared-tables-v2-keyfile:/data/keyfile
- ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
- ./mongo-entrypoint.sh:/mongo-entrypoint.sh:ro
ports:
- "27019:27017"
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=${_APP_DB_ROOT_PASS}
- MONGO_INITDB_DATABASE=${_APP_DB_SCHEMA}
- MONGO_INITDB_USERNAME=${_APP_DB_USER}
- MONGO_INITDB_PASSWORD=${_APP_DB_PASS}
entrypoint: ["/bin/bash", "/mongo-entrypoint.sh"]
healthcheck:
test: |
bash -c "
if mongosh -u root -p ${_APP_DB_ROOT_PASS} --authenticationDatabase admin --quiet --eval 'rs.status().ok' 2>/dev/null | grep -q 1; then
exit 0
else
mongosh -u root -p ${_APP_DB_ROOT_PASS} --authenticationDatabase admin --quiet --eval \"
rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'appwrite-mongodb-shared-tables-v2:27017'}]})
\" 2>/dev/null || exit 1
fi
"
interval: 10s
timeout: 10s
retries: 10
start_period: 30s
postgresql-shared-tables-v1:
image: appwrite/postgres:0.1.0
container_name: appwrite-postgresql-shared-tables-v1
<<: *x-logging
networks:
- appwrite
volumes:
- appwrite-postgresql-shared-tables-v1:/var/lib/postgresql/18/data:rw
ports:
- "5433:5432"
environment:
- POSTGRES_DB=${_APP_DB_SCHEMA}
- POSTGRES_USER=${_APP_DB_USER}
- POSTGRES_PASSWORD=${_APP_DB_PASS}
command: postgres -c 'max_connections=500'
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${_APP_DB_USER} -d ${_APP_DB_SCHEMA}"]
interval: 5s
timeout: 5s
retries: 30
start_period: 30s
postgresql-shared-tables-v2:
image: appwrite/postgres:0.1.0
container_name: appwrite-postgresql-shared-tables-v2
<<: *x-logging
networks:
- appwrite
volumes:
- appwrite-postgresql-shared-tables-v2:/var/lib/postgresql/18/data:rw
ports:
- "5434:5432"
environment:
- POSTGRES_DB=${_APP_DB_SCHEMA}
- POSTGRES_USER=${_APP_DB_USER}
- POSTGRES_PASSWORD=${_APP_DB_PASS}
command: postgres -c 'max_connections=500'
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${_APP_DB_USER} -d ${_APP_DB_SCHEMA}"]
interval: 5s
timeout: 5s
retries: 30
start_period: 30s
networks:
appwrite:
name: appwrite
volumes:
appwrite-mongodb-shared-tables-v1:
appwrite-mongodb-shared-tables-v1-keyfile:
appwrite-mongodb-shared-tables-v2:
appwrite-mongodb-shared-tables-v2-keyfile:
appwrite-postgresql-shared-tables-v1:
appwrite-postgresql-shared-tables-v2:
+176
View File
@@ -244,6 +244,14 @@ services:
- _APP_DATABASE_SHARED_TABLES
- _APP_DATABASE_SHARED_TABLES_V1
- _APP_DATABASE_SHARED_NAMESPACE
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
- _APP_FUNCTIONS_CREATION_ABUSE_LIMIT
- _APP_CUSTOM_DOMAIN_DENY_LIST
- _APP_TRUSTED_HEADERS
@@ -330,6 +338,14 @@ services:
- _APP_LOGGING_CONFIG
- _APP_LOGGING_CONFIG_REALTIME
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
- _APP_POOL_ADAPTER=swoole
appwrite-worker-audits:
@@ -363,6 +379,14 @@ services:
- _APP_DB_PASS
- _APP_LOGGING_CONFIG
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-worker-webhooks:
entrypoint: worker-webhooks
@@ -399,6 +423,14 @@ services:
- _APP_LOGGING_CONFIG
- _APP_WEBHOOK_MAX_FAILED_ATTEMPTS
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-worker-deletes:
entrypoint: worker-deletes
@@ -463,6 +495,14 @@ services:
- _APP_EXECUTOR_HOST
- _APP_DATABASE_SHARED_TABLES
- _APP_DATABASE_SHARED_TABLES_V1
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
- _APP_EMAIL_CERTIFICATES
- _APP_MAINTENANCE_RETENTION_AUDIT
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE
@@ -507,6 +547,14 @@ services:
- _APP_WORKERS_NUM
- _APP_QUEUE_NAME
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-worker-builds:
entrypoint: worker-builds
@@ -580,6 +628,14 @@ services:
- _APP_STORAGE_WASABI_REGION
- _APP_STORAGE_WASABI_BUCKET
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
- _APP_DOMAIN_SITES
extra_hosts:
- "host.docker.internal:host-gateway"
@@ -621,6 +677,14 @@ services:
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
# Storage
- _APP_STORAGE_DEVICE
- _APP_STORAGE_S3_ACCESS_KEY
@@ -689,6 +753,14 @@ services:
- _APP_DB_PASS
- _APP_LOGGING_CONFIG
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-worker-executions:
entrypoint: worker-executions
@@ -719,6 +791,14 @@ services:
- _APP_DB_PASS
- _APP_LOGGING_CONFIG
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-worker-functions:
entrypoint: worker-functions
@@ -763,6 +843,14 @@ services:
- _APP_LOGGING_CONFIG
- _APP_LOGGING_PROVIDER
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-worker-mails:
entrypoint: worker-mails
@@ -805,6 +893,14 @@ services:
- _APP_DOMAIN
- _APP_OPTIONS_FORCE_HTTPS
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-worker-messaging:
entrypoint: worker-messaging
@@ -862,6 +958,14 @@ services:
- _APP_STORAGE_WASABI_REGION
- _APP_STORAGE_WASABI_BUCKET
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-worker-migrations:
entrypoint: worker-migrations
@@ -906,6 +1010,14 @@ services:
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
- _APP_OPTIONS_FORCE_HTTPS
- _APP_MIGRATION_HOST
@@ -954,6 +1066,14 @@ services:
- _APP_MAINTENANCE_RETENTION_SCHEDULES
- _APP_MAINTENANCE_START_TIME
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-task-interval:
entrypoint: interval
@@ -992,6 +1112,14 @@ services:
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
- _APP_INTERVAL_DOMAIN_VERIFICATION
- _APP_INTERVAL_CLEANUP_STALE_EXECUTIONS
@@ -1026,6 +1154,14 @@ services:
- _APP_USAGE_STATS
- _APP_LOGGING_CONFIG
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
- _APP_STATS_RESOURCES_INTERVAL
appwrite-worker-stats-resources:
@@ -1060,6 +1196,14 @@ services:
- _APP_LOGGING_CONFIG
- _APP_USAGE_AGGREGATION_INTERVAL
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-worker-stats-usage:
entrypoint: worker-stats-usage
@@ -1094,6 +1238,14 @@ services:
- _APP_LOGGING_CONFIG
- _APP_USAGE_AGGREGATION_INTERVAL
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-task-scheduler-functions:
entrypoint: schedule-functions
@@ -1125,6 +1277,14 @@ services:
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-task-scheduler-executions:
entrypoint: schedule-executions
@@ -1156,6 +1316,14 @@ services:
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-task-scheduler-messages:
entrypoint: schedule-messages
@@ -1187,6 +1355,14 @@ services:
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
- _APP_DATABASE_DOCUMENTSDB_KEYS
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
- _APP_DATABASE_VECTORSDB_KEYS
appwrite-assistant:
container_name: appwrite-assistant
@@ -61,16 +61,16 @@ class Create extends Action
$databaseKeys = System::getEnv('_APP_DATABASE_DOCUMENTSDB_KEYS', '');
$databaseOverride = System::getEnv('_APP_DATABASE_DOCUMENTSDB_OVERRIDE');
$dbScheme = System::getEnv('_APP_DB_HOST_DOCUMENTSDB', 'mongodb');
$databaseSharedTables = \explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES', ''));
$databaseSharedTablesV1 = \explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1', ''));
$databaseSharedTables = \array_filter(\explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES', '')));
$databaseSharedTablesV1 = \array_filter(\explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1', '')));
break;
case VECTORSDB:
$databases = Config::getParam('pools-vectorsdb', []);
$databaseKeys = System::getEnv('_APP_DATABASE_VECTORSDB_KEYS', '');
$databaseOverride = System::getEnv('_APP_DATABASE_VECTORSDB_OVERRIDE');
$dbScheme = System::getEnv('_APP_DB_HOST_VECTORSDB', 'postgresql');
$databaseSharedTables = \explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES', ''));
$databaseSharedTablesV1 = \explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES_V1', ''));
$databaseSharedTables = \array_filter(\explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES', '')));
$databaseSharedTablesV1 = \array_filter(\explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES_V1', '')));
break;
default:
// legacy/tablesdb
@@ -108,7 +108,7 @@ class Create extends Action
if ($index !== false) {
$selectedDsn = $databases[$index];
} else {
if (!empty($dsn)) {
if (!empty($dsn) && !empty($databaseSharedTables)) {
$beforeFilter = \array_values($databases);
if ($isSharedTablesV1) {
$databases = array_filter($databases, fn ($value) => \in_array($value, $databaseSharedTablesV1));
@@ -118,7 +118,10 @@ class Create extends Action
$databases = array_filter($databases, fn ($value) => !\in_array($value, $databaseSharedTables));
}
}
$selectedDsn = !empty($databases) ? $databases[array_rand($databases)] : '';
if (empty($databases)) {
throw new Exception(Exception::GENERAL_SERVER_ERROR, "No {$databasetype} database pool available for the current shared-tables mode");
}
$selectedDsn = $databases[array_rand($databases)];
}
if (\in_array($selectedDsn, $databaseSharedTables)) {
+9 -9
View File
@@ -17,7 +17,7 @@ class Request extends UtopiaRequest
* @var array<Filter>
*/
private array $filters = [];
private ?Route $route = null;
private static ?Route $route = null;
public function __construct(SwooleRequest $request)
{
@@ -34,11 +34,11 @@ class Request extends UtopiaRequest
{
$parameters = parent::getParams();
if (!$this->hasFilters() || !$this->hasRoute()) {
if (!$this->hasFilters() || !self::hasRoute()) {
return $parameters;
}
$methods = $this->getRoute()?->getLabel('sdk', null);
$methods = self::getRoute()->getLabel('sdk', null);
if (empty($methods)) {
return $parameters;
@@ -131,9 +131,9 @@ class Request extends UtopiaRequest
*
* @return void
*/
public function setRoute(?Route $route): void
public static function setRoute(?Route $route): void
{
$this->route = $route;
self::$route = $route;
}
/**
@@ -141,9 +141,9 @@ class Request extends UtopiaRequest
*
* @return Route|null
*/
public function getRoute(): ?Route
public static function getRoute(): ?Route
{
return $this->route;
return self::$route;
}
/**
@@ -151,9 +151,9 @@ class Request extends UtopiaRequest
*
* @return bool
*/
public function hasRoute(): bool
public static function hasRoute(): bool
{
return $this->route !== null;
return self::$route !== null;
}
/**
+6 -8
View File
@@ -299,7 +299,7 @@ class Response extends SwooleResponse
/**
* @var bool
*/
protected bool $showSensitive = false;
protected static bool $showSensitive = false;
/**
* @var array<string, Model>
@@ -509,7 +509,7 @@ class Response extends SwooleResponse
$isPrivilegedUser = $user->isPrivileged($roles);
$isAppUser = $user->isApp($roles);
if ((!$isPrivilegedUser && !$isAppUser) && !$this->showSensitive) {
if ((!$isPrivilegedUser && !$isAppUser) && !self::$showSensitive) {
$data->setAttribute($key, '');
}
}
@@ -659,20 +659,18 @@ class Response extends SwooleResponse
}
/**
* Wrapper to show sensitive data in response
* Static wrapper to show sensitive data in response
*
* @param callable(): array $callback The callback to show sensitive information for
* @return array
*/
public function showSensitive(callable $callback): array
public static function showSensitive(callable $callback): array
{
$previous = $this->showSensitive;
try {
$this->showSensitive = true;
self::$showSensitive = true;
return $callback();
} finally {
$this->showSensitive = $previous;
self::$showSensitive = false;
}
}
-15
View File
@@ -147,21 +147,6 @@ class RequestTest extends TestCase
$this->assertSame('unexpected', $params['extra']);
}
public function testRouteIsScopedToRequestInstance(): void
{
$firstRequest = new Request(new SwooleRequest());
$secondRequest = new Request(new SwooleRequest());
$firstRoute = new Route(Request::METHOD_GET, '/first');
$secondRoute = new Route(Request::METHOD_GET, '/second');
$firstRequest->setRoute($firstRoute);
$secondRequest->setRoute($secondRoute);
$this->assertSame($firstRoute, $firstRequest->getRoute());
$this->assertSame($secondRoute, $secondRequest->getRoute());
}
/**
* Helper to attach a route with multiple SDK methods to the request.
*/
-23
View File
@@ -5,7 +5,6 @@ namespace Tests\Unit\Utopia;
use Appwrite\Utopia\Response;
use Exception;
use PHPUnit\Framework\TestCase;
use ReflectionProperty;
use Swoole\Http\Response as SwooleResponse;
use Tests\Unit\Utopia\Response\Filters\First;
use Tests\Unit\Utopia\Response\Filters\Second;
@@ -177,26 +176,4 @@ class ResponseTest extends TestCase
$this->assertArrayHasKey('required', $single);
$this->assertArrayNotHasKey('hidden', $singleFromArray);
}
public function testShowSensitiveRestoresPreviousState(): void
{
$isShowingSensitive = new ReflectionProperty(Response::class, 'showSensitive');
$this->assertFalse($isShowingSensitive->getValue($this->response));
$payload = $this->response->showSensitive(function () use ($isShowingSensitive) {
return [
'outer' => $isShowingSensitive->getValue($this->response),
'inner' => $this->response->showSensitive(fn () => [
'state' => $isShowingSensitive->getValue($this->response),
]),
'afterInner' => $isShowingSensitive->getValue($this->response),
];
});
$this->assertTrue($payload['outer']);
$this->assertTrue($payload['inner']['state']);
$this->assertTrue($payload['afterInner']);
$this->assertFalse($isShowingSensitive->getValue($this->response));
}
}