From d422f693f75e4ac882f3f53e1841c1649e20caeb Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Thu, 13 Mar 2025 09:48:39 +0000 Subject: [PATCH 001/124] feat: add query by role to memberships --- app/config/collections/common.php | 7 +++++++ app/controllers/api/users.php | 20 +++++++++++++++++-- src/Appwrite/Migration/Version/V22.php | 8 ++++++++ .../Validator/Queries/Memberships.php | 4 ++-- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/app/config/collections/common.php b/app/config/collections/common.php index f68400e226..866d7b6d5b 100644 --- a/app/config/collections/common.php +++ b/app/config/collections/common.php @@ -1417,6 +1417,13 @@ return [ 'lengths' => [], 'orders' => [Database::ORDER_ASC], ], + [ + '$id' => ID::custom('_key_roles'), + 'type' => Database::INDEX_KEY, + 'attributes' => ['roles'], + 'lengths' => [128], + 'orders' => [], + ], ], ], diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 4a551b7478..17096731fa 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -21,6 +21,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\CustomId; use Appwrite\Utopia\Database\Validator\Queries\Identities; +use Appwrite\Utopia\Database\Validator\Queries\Memberships; use Appwrite\Utopia\Database\Validator\Queries\Targets; use Appwrite\Utopia\Database\Validator\Queries\Users; use Appwrite\Utopia\Request; @@ -799,9 +800,11 @@ App::get('/v1/users/:userId/memberships') ] )) ->param('userId', '', new UID(), 'User ID.') + ->param('queries', [], new Memberships(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Memberships::ALLOWED_ATTRIBUTES), true) + ->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true) ->inject('response') ->inject('dbForProject') - ->action(function (string $userId, Response $response, Database $dbForProject) { + ->action(function (string $userId, array $queries, string $search, Response $response, Database $dbForProject) { $user = $dbForProject->getDocument('users', $userId); @@ -809,6 +812,19 @@ App::get('/v1/users/:userId/memberships') throw new Exception(Exception::USER_NOT_FOUND); } + try { + $queries = Query::parseQueries($queries); + } catch (QueryException $e) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); + } + + if (!empty($search)) { + $queries[] = Query::search('search', $search); + } + + // Set internal queries + $queries[] = Query::equal('userInternalId', [$user->getInternalId()]); + $memberships = array_map(function ($membership) use ($dbForProject, $user) { $team = $dbForProject->getDocument('teams', $membership->getAttribute('teamId')); @@ -818,7 +834,7 @@ App::get('/v1/users/:userId/memberships') ->setAttribute('userEmail', $user->getAttribute('email')); return $membership; - }, $user->getAttribute('memberships', [])); + }, $dbForProject->find('memberships', $queries)); $response->dynamic(new Document([ 'memberships' => $memberships, diff --git a/src/Appwrite/Migration/Version/V22.php b/src/Appwrite/Migration/Version/V22.php index 4d15662112..c5fdfc9ed6 100644 --- a/src/Appwrite/Migration/Version/V22.php +++ b/src/Appwrite/Migration/Version/V22.php @@ -75,6 +75,14 @@ class V22 extends Migration Console::warning("'personalRefreshToken' from {$id}: {$th->getMessage()}"); } break; + case 'memberships': + // Create roles index + try { + $this->createIndexFromCollection($this->projectDB, $id, '_key_roles'); + } catch (Throwable $th) { + Console::warning("'_key_roles' from {$id}: {$th->getMessage()}"); + } + break; } usleep(50000); diff --git a/src/Appwrite/Utopia/Database/Validator/Queries/Memberships.php b/src/Appwrite/Utopia/Database/Validator/Queries/Memberships.php index 5ff0098662..cef562ba2c 100644 --- a/src/Appwrite/Utopia/Database/Validator/Queries/Memberships.php +++ b/src/Appwrite/Utopia/Database/Validator/Queries/Memberships.php @@ -9,12 +9,12 @@ class Memberships extends Base 'teamId', 'invited', 'joined', - 'confirm' + 'confirm', + 'roles', ]; /** * Expression constructor - * */ public function __construct() { From 33ab1513d0b1b7673a30aafb29f4f3cfd6a87d35 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Thu, 13 Mar 2025 10:46:55 +0000 Subject: [PATCH 002/124] chore: update specs --- app/config/specs/open-api3-latest-client.json | 4 +-- .../specs/open-api3-latest-console.json | 28 +++++++++++++++++-- app/config/specs/open-api3-latest-server.json | 28 +++++++++++++++++-- app/config/specs/swagger2-latest-client.json | 4 +-- app/config/specs/swagger2-latest-console.json | 25 +++++++++++++++-- app/config/specs/swagger2-latest-server.json | 25 +++++++++++++++-- 6 files changed, 102 insertions(+), 12 deletions(-) diff --git a/app/config/specs/open-api3-latest-client.json b/app/config/specs/open-api3-latest-client.json index 316fe13116..e0b4e18e99 100644 --- a/app/config/specs/open-api3-latest-client.json +++ b/app/config/specs/open-api3-latest-client.json @@ -1,7 +1,7 @@ { "openapi": "3.0.0", "info": { - "version": "1.6.1", + "version": "1.6.2", "title": "Appwrite", "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)", "termsOfService": "https:\/\/appwrite.io\/policy\/terms", @@ -6859,7 +6859,7 @@ }, { "name": "queries", - "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles", "required": false, "schema": { "type": "array", diff --git a/app/config/specs/open-api3-latest-console.json b/app/config/specs/open-api3-latest-console.json index 54161c4262..53a8962172 100644 --- a/app/config/specs/open-api3-latest-console.json +++ b/app/config/specs/open-api3-latest-console.json @@ -1,7 +1,7 @@ { "openapi": "3.0.0", "info": { - "version": "1.6.1", + "version": "1.6.2", "title": "Appwrite", "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)", "termsOfService": "https:\/\/appwrite.io\/policy\/terms", @@ -25889,7 +25889,7 @@ }, { "name": "queries", - "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles", "required": false, "schema": { "type": "array", @@ -27982,6 +27982,30 @@ "x-example": "" }, "in": "path" + }, + { + "name": "queries", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "in": "query" + }, + { + "name": "search", + "description": "Search term to filter your list results. Max length: 256 chars.", + "required": false, + "schema": { + "type": "string", + "x-example": "", + "default": "" + }, + "in": "query" } ] } diff --git a/app/config/specs/open-api3-latest-server.json b/app/config/specs/open-api3-latest-server.json index 3d32d3e978..7fd174b6e0 100644 --- a/app/config/specs/open-api3-latest-server.json +++ b/app/config/specs/open-api3-latest-server.json @@ -1,7 +1,7 @@ { "openapi": "3.0.0", "info": { - "version": "1.6.1", + "version": "1.6.2", "title": "Appwrite", "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)", "termsOfService": "https:\/\/appwrite.io\/policy\/terms", @@ -18099,7 +18099,7 @@ }, { "name": "queries", - "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles", "required": false, "schema": { "type": "array", @@ -20153,6 +20153,30 @@ "x-example": "" }, "in": "path" + }, + { + "name": "queries", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "in": "query" + }, + { + "name": "search", + "description": "Search term to filter your list results. Max length: 256 chars.", + "required": false, + "schema": { + "type": "string", + "x-example": "", + "default": "" + }, + "in": "query" } ] } diff --git a/app/config/specs/swagger2-latest-client.json b/app/config/specs/swagger2-latest-client.json index 8960bfaa5c..2ea4847792 100644 --- a/app/config/specs/swagger2-latest-client.json +++ b/app/config/specs/swagger2-latest-client.json @@ -1,7 +1,7 @@ { "swagger": "2.0", "info": { - "version": "1.6.1", + "version": "1.6.2", "title": "Appwrite", "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)", "termsOfService": "https:\/\/appwrite.io\/policy\/terms", @@ -7069,7 +7069,7 @@ }, { "name": "queries", - "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles", "required": false, "type": "array", "collectionFormat": "multi", diff --git a/app/config/specs/swagger2-latest-console.json b/app/config/specs/swagger2-latest-console.json index 8fc7e7daf3..6e6b1317ee 100644 --- a/app/config/specs/swagger2-latest-console.json +++ b/app/config/specs/swagger2-latest-console.json @@ -1,7 +1,7 @@ { "swagger": "2.0", "info": { - "version": "1.6.1", + "version": "1.6.2", "title": "Appwrite", "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)", "termsOfService": "https:\/\/appwrite.io\/policy\/terms", @@ -26371,7 +26371,7 @@ }, { "name": "queries", - "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles", "required": false, "type": "array", "collectionFormat": "multi", @@ -28514,6 +28514,27 @@ "type": "string", "x-example": "", "in": "path" + }, + { + "name": "queries", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles", + "required": false, + "type": "array", + "collectionFormat": "multi", + "items": { + "type": "string" + }, + "default": [], + "in": "query" + }, + { + "name": "search", + "description": "Search term to filter your list results. Max length: 256 chars.", + "required": false, + "type": "string", + "x-example": "", + "default": "", + "in": "query" } ] } diff --git a/app/config/specs/swagger2-latest-server.json b/app/config/specs/swagger2-latest-server.json index 83757c94f4..7c65c89764 100644 --- a/app/config/specs/swagger2-latest-server.json +++ b/app/config/specs/swagger2-latest-server.json @@ -1,7 +1,7 @@ { "swagger": "2.0", "info": { - "version": "1.6.1", + "version": "1.6.2", "title": "Appwrite", "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https:\/\/appwrite.io\/docs](https:\/\/appwrite.io\/docs)", "termsOfService": "https:\/\/appwrite.io\/policy\/terms", @@ -18565,7 +18565,7 @@ }, { "name": "queries", - "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles", "required": false, "type": "array", "collectionFormat": "multi", @@ -20669,6 +20669,27 @@ "type": "string", "x-example": "", "in": "path" + }, + { + "name": "queries", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: userId, teamId, invited, joined, confirm, roles", + "required": false, + "type": "array", + "collectionFormat": "multi", + "items": { + "type": "string" + }, + "default": [], + "in": "query" + }, + { + "name": "search", + "description": "Search term to filter your list results. Max length: 256 chars.", + "required": false, + "type": "string", + "x-example": "", + "default": "", + "in": "query" } ] } From e80bc2bb398af17e755d3bd1fe5cdbac02195509 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sat, 15 Mar 2025 13:36:08 +0000 Subject: [PATCH 003/124] chore: shifted migration to 1.7.0 --- src/Appwrite/Migration/Migration.php | 1 + src/Appwrite/Migration/Version/V22.php | 8 --- src/Appwrite/Migration/Version/V23.php | 69 ++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 src/Appwrite/Migration/Version/V23.php diff --git a/src/Appwrite/Migration/Migration.php b/src/Appwrite/Migration/Migration.php index 56016f1057..17e93f43f5 100644 --- a/src/Appwrite/Migration/Migration.php +++ b/src/Appwrite/Migration/Migration.php @@ -93,6 +93,7 @@ abstract class Migration '1.6.0' => 'V21', '1.6.1' => 'V21', '1.6.2' => 'V22', + '1.7.0' => 'V23', ]; /** diff --git a/src/Appwrite/Migration/Version/V22.php b/src/Appwrite/Migration/Version/V22.php index c5fdfc9ed6..4d15662112 100644 --- a/src/Appwrite/Migration/Version/V22.php +++ b/src/Appwrite/Migration/Version/V22.php @@ -75,14 +75,6 @@ class V22 extends Migration Console::warning("'personalRefreshToken' from {$id}: {$th->getMessage()}"); } break; - case 'memberships': - // Create roles index - try { - $this->createIndexFromCollection($this->projectDB, $id, '_key_roles'); - } catch (Throwable $th) { - Console::warning("'_key_roles' from {$id}: {$th->getMessage()}"); - } - break; } usleep(50000); diff --git a/src/Appwrite/Migration/Version/V23.php b/src/Appwrite/Migration/Version/V23.php new file mode 100644 index 0000000000..dec7e8e9d3 --- /dev/null +++ b/src/Appwrite/Migration/Version/V23.php @@ -0,0 +1,69 @@ + null, + fn () => [] + ); + } + + Console::info('Migrating Collections'); + $this->migrateCollections(); + } + + /** + * Migrate Collections. + * + * @return void + * @throws Exception|Throwable + */ + private function migrateCollections(): void + { + $internalProjectId = $this->project->getInternalId(); + $collectionType = match ($internalProjectId) { + 'console' => 'console', + default => 'projects', + }; + + $collections = $this->collections[$collectionType]; + foreach ($collections as $collection) { + $id = $collection['$id']; + + Console::log("Migrating Collection \"{$id}\""); + + $this->projectDB->setNamespace("_$internalProjectId"); + + switch ($id) { + case 'memberships': + // Create roles index + try { + $this->createIndexFromCollection($this->projectDB, $id, '_key_roles'); + } catch (Throwable $th) { + Console::warning("'_key_roles' from {$id}: {$th->getMessage()}"); + } + break; + } + + usleep(50000); + } + } +} From bbfd22ce2e68c86ee862ff450ee294d442554dec Mon Sep 17 00:00:00 2001 From: fogelito Date: Mon, 17 Mar 2025 17:05:40 +0200 Subject: [PATCH 004/124] Index check for delete worker --- src/Appwrite/Platform/Workers/Deletes.php | 147 +++++++++++++++++----- 1 file changed, 113 insertions(+), 34 deletions(-) diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 9b0590181a..3c8bcdd635 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -248,7 +248,8 @@ class Deletes extends Action $this->deleteByGroup( 'subscribers', [ - Query::equal('topicInternalId', [$topic->getInternalId()]) + Query::equal('topicInternalId', [$topic->getInternalId()]), + Query::orderAsc(), ], $getProjectDB($project) ); @@ -269,7 +270,8 @@ class Deletes extends Action $this->deleteByGroup( 'subscribers', [ - Query::equal('targetInternalId', [$target->getInternalId()]) + Query::equal('targetInternalId', [$target->getInternalId()]), + Query::orderAsc(), ], $dbForProject, function (Document $subscriber) use ($dbForProject, $target) { @@ -303,10 +305,14 @@ class Deletes extends Action */ private function deleteExpiredTargets(Document $project, callable $getProjectDB): void { + /** + * todo: No index found for `expired` attribute + */ $this->deleteByGroup( 'targets', [ - Query::equal('expired', [true]) + Query::equal('expired', [true]), + Query::orderAsc(), ], $getProjectDB($project), function (Document $target) use ($getProjectDB, $project) { @@ -317,10 +323,14 @@ class Deletes extends Action private function deleteSessionTargets(Document $project, callable $getProjectDB, Document $session): void { + /** + * todo: No index found for `sessionInternalId` attribute + */ $this->deleteByGroup( 'targets', [ - Query::equal('sessionInternalId', [$session->getInternalId()]) + Query::equal('sessionInternalId', [$session->getInternalId()]), + Query::orderAsc(), ], $getProjectDB($project), function (Document $target) use ($getProjectDB, $project) { @@ -348,10 +358,17 @@ class Deletes extends Action ); $query[] = Query::equal('resource', [$resource]); + if (!empty($resourceType)) { $query[] = Query::equal('resourceType', [$resourceType]); } + $query[] = Query::orderAsc(); + + /** + * todo: missing index on `resource`, `resourceType` + */ + $this->deleteByGroup( 'cache', $query, @@ -388,7 +405,7 @@ class Deletes extends Action $query = [ Query::lessThan('accessedAt', $datetime), Query::orderDesc('accessedAt'), - Query::orderDesc('$internalId'), + Query::orderDesc(), ]; $this->deleteByGroup( @@ -421,10 +438,10 @@ class Deletes extends Action // Delete Usage stats from projectDB $this->deleteByGroup('stats', [ + Query::equal('period', ['1h']), Query::lessThan('time', $hourlyUsageRetentionDatetime), Query::orderDesc('time'), - Query::orderDesc('$internalId'), - Query::equal('period', ['1h']), + Query::orderDesc(), // _key_period_time `period` ASC, `time `ASC ], $dbForProject); if ($project->getId() !== 'console') { @@ -433,10 +450,10 @@ class Deletes extends Action // Delete Usage stats from logsDB $this->deleteByGroup('stats', [ + Query::equal('period', ['1h']), Query::lessThan('time', $hourlyUsageRetentionDatetime), Query::orderDesc('time'), - Query::orderDesc('$internalId'), - Query::equal('period', ['1h']), + Query::orderDesc(), // _key_period_time `period` ASC, `time `ASC ], $dbForLogs); } } @@ -457,7 +474,8 @@ class Deletes extends Action $this->deleteByGroup( 'memberships', [ - Query::equal('teamInternalId', [$teamInternalId]) + Query::equal('teamInternalId', [$teamInternalId]), + Query::orderAsc() ], $dbForProject, function (Document $membership) use ($dbForProject) { @@ -547,7 +565,13 @@ class Deletes extends Action if ($projectTables || !\in_array($collection->getId(), $projectCollectionIds)) { $dbForProject->deleteCollection($collection->getId()); } else { - $this->deleteByGroup($collection->getId(), [], database: $dbForProject); + $this->deleteByGroup( + $collection->getId(), + [ + Query::orderAsc() + ], + database: $dbForProject + ); } } catch (Throwable $e) { Console::error('Error deleting '.$collection->getId().' '.$e->getMessage()); @@ -567,58 +591,82 @@ class Deletes extends Action // Delete Platforms $this->deleteByGroup('platforms', [ - Query::equal('projectInternalId', [$projectInternalId]) + Query::equal('projectInternalId', [$projectInternalId]), + Query::orderAsc() ], $dbForPlatform); // Delete project and function rules $this->deleteByGroup('rules', [ - Query::equal('projectInternalId', [$projectInternalId]) + Query::equal('projectInternalId', [$projectInternalId]), + Query::orderAsc() ], $dbForPlatform, function (Document $document) use ($dbForPlatform, $certificates) { $this->deleteRule($dbForPlatform, $document, $certificates); }); // Delete Keys $this->deleteByGroup('keys', [ - Query::equal('projectInternalId', [$projectInternalId]) + Query::equal('projectInternalId', [$projectInternalId]), + Query::orderAsc() ], $dbForPlatform); // Delete Webhooks $this->deleteByGroup('webhooks', [ - Query::equal('projectInternalId', [$projectInternalId]) + Query::equal('projectInternalId', [$projectInternalId]), + Query::orderAsc() ], $dbForPlatform); // Delete VCS Installations $this->deleteByGroup('installations', [ - Query::equal('projectInternalId', [$projectInternalId]) + Query::equal('projectInternalId', [$projectInternalId]), + Query::orderAsc() ], $dbForPlatform); // Delete VCS Repositories $this->deleteByGroup('repositories', [ Query::equal('projectInternalId', [$projectInternalId]), + Query::orderAsc() ], $dbForPlatform); // Delete VCS comments $this->deleteByGroup('vcsComments', [ Query::equal('projectInternalId', [$projectInternalId]), + Query::orderAsc() ], $dbForPlatform); - // Delete Schedules (No projectInternalId in this collection) + /** + * No projectInternalId in this collection + * todo: No index for `projectId` attribute + */ + // Delete Schedules () $this->deleteByGroup('schedules', [ Query::equal('projectId', [$projectId]), + Query::orderAsc() ], $dbForPlatform); // Delete metadata table if ($projectTables) { $dbForProject->deleteCollection(Database::METADATA); } elseif ($sharedTablesV1) { - $this->deleteByGroup(Database::METADATA, [], $dbForProject); + $this->deleteByGroup( + Database::METADATA, + [ + Query::orderAsc() + ], + $dbForProject + ); } elseif ($sharedTablesV2) { $queries = \array_map( fn ($id) => Query::notEqual('$id', $id), $projectCollectionIds ); - $this->deleteByGroup(Database::METADATA, $queries, $dbForProject); + $queries[] = Query::orderAsc(); + + $this->deleteByGroup( + Database::METADATA, + $queries, + $dbForProject + ); } // Delete all storage directories @@ -643,14 +691,16 @@ class Deletes extends Action // Delete all sessions of this user from the sessions table and update the sessions field of the user record $this->deleteByGroup('sessions', [ - Query::equal('userInternalId', [$userInternalId]) + Query::equal('userInternalId', [$userInternalId]), + Query::orderAsc() ], $dbForProject); $dbForProject->purgeCachedDocument('users', $userId); // Delete Memberships and decrement team membership counts $this->deleteByGroup('memberships', [ - Query::equal('userInternalId', [$userInternalId]) + Query::equal('userInternalId', [$userInternalId]), + Query::orderAsc() ], $dbForProject, function (Document $document) use ($dbForProject) { if ($document->getAttribute('confirm')) { // Count only confirmed members $teamId = $document->getAttribute('teamId'); @@ -663,19 +713,25 @@ class Deletes extends Action // Delete tokens $this->deleteByGroup('tokens', [ - Query::equal('userInternalId', [$userInternalId]) + Query::equal('userInternalId', [$userInternalId]), + Query::orderAsc() ], $dbForProject); // Delete identities + /** + * todo: Remove Duplication index `_key_userInternalId` + */ $this->deleteByGroup('identities', [ - Query::equal('userInternalId', [$userInternalId]) + Query::equal('userInternalId', [$userInternalId]), + Query::orderAsc() ], $dbForProject); // Delete targets $this->deleteByGroup( 'targets', [ - Query::equal('userInternalId', [$userInternalId]) + Query::equal('userInternalId', [$userInternalId]), + Query::orderAsc() ], $dbForProject, function (Document $target) use ($getProjectDB, $project) { @@ -699,7 +755,7 @@ class Deletes extends Action $this->deleteByGroup('executions', [ Query::lessThan('$createdAt', $datetime), Query::orderDesc('$createdAt'), - Query::orderDesc('$internalId'), + Query::orderDesc(), ], $dbForProject); } @@ -719,7 +775,7 @@ class Deletes extends Action $this->deleteByGroup('sessions', [ Query::lessThan('$createdAt', $expired), Query::orderDesc('$createdAt'), - Query::orderDesc('$internalId'), + Query::orderDesc(), ], $dbForProject); } @@ -735,7 +791,7 @@ class Deletes extends Action $this->deleteByGroup('realtime', [ Query::lessThan('timestamp', $datetime), Query::orderDesc('timestamp'), - Query::orderDesc('$internalId'), + Query::orderAsc(), // KEY "_key_timestamp" ("timestamp" DESC), ], $dbForPlatform); } @@ -755,7 +811,7 @@ class Deletes extends Action $this->deleteByGroup(Audit::COLLECTION, [ Query::lessThan('time', $auditRetention), Query::orderDesc('time'), - Query::orderDesc('$internalId'), + Query::orderAsc(), // KEY "index-time" ("time" DESC) ], $dbForProject); } catch (DatabaseException $e) { Console::error('Failed to delete audit logs for project ' . $projectId . ': ' . $e->getMessage()); @@ -780,33 +836,39 @@ class Deletes extends Action /** * Delete rules + * todo: No index for this query */ Console::info("Deleting rules for function " . $functionId); $this->deleteByGroup('rules', [ Query::equal('resourceType', ['function']), Query::equal('resourceInternalId', [$functionInternalId]), - Query::equal('projectInternalId', [$project->getInternalId()]) + Query::equal('projectInternalId', [$project->getInternalId()]), + Query::orderAsc() ], $dbForPlatform, function (Document $document) use ($project, $dbForPlatform, $certificates) { $this->deleteRule($dbForPlatform, $document, $certificates); }); /** * Delete Variables + * todo: No index for this query */ Console::info("Deleting variables for function " . $functionId); $this->deleteByGroup('variables', [ Query::equal('resourceType', ['function']), - Query::equal('resourceInternalId', [$functionInternalId]) + Query::equal('resourceInternalId', [$functionInternalId]), + Query::orderAsc() ], $dbForProject); /** * Delete Deployments + * todo: No index for `resourceInternalId`, perhaps use resourceId until fixed */ Console::info("Deleting deployments for function " . $functionId); $deploymentInternalIds = []; $this->deleteByGroup('deployments', [ - Query::equal('resourceInternalId', [$functionInternalId]) + Query::equal('resourceInternalId', [$functionInternalId]), + Query::orderAsc() ], $dbForProject, function (Document $document) use ($deviceForFunctions, &$deploymentInternalIds) { $deploymentInternalIds[] = $document->getInternalId(); $this->deleteDeploymentFiles($deviceForFunctions, $document); @@ -814,12 +876,14 @@ class Deletes extends Action /** * Delete builds + * todo: No index for `deploymentInternalId`, perhaps use deploymentId until fixed */ Console::info("Deleting builds for function " . $functionId); foreach ($deploymentInternalIds as $deploymentInternalId) { $this->deleteByGroup('builds', [ - Query::equal('deploymentInternalId', [$deploymentInternalId]) + Query::equal('deploymentInternalId', [$deploymentInternalId]), + Query::orderAsc() ], $dbForProject, function (Document $document) use ($deviceForBuilds) { $this->deleteBuildFiles($deviceForBuilds, $document); }); @@ -827,26 +891,35 @@ class Deletes extends Action /** * Delete Executions + * todo: No index for `functionInternalId` , perhaps use functionId until fixed */ Console::info("Deleting executions for function " . $functionId); $this->deleteByGroup('executions', [ - Query::equal('functionInternalId', [$functionInternalId]) + Query::equal('functionInternalId', [$functionInternalId]), + Query::orderAsc() ], $dbForProject); /** * Delete VCS Repositories and VCS Comments + * todo: no index for this query */ Console::info("Deleting VCS repositories and comments linked to function " . $functionId); $this->deleteByGroup('repositories', [ Query::equal('projectInternalId', [$project->getInternalId()]), Query::equal('resourceInternalId', [$functionInternalId]), Query::equal('resourceType', ['function']), + Query::orderAsc() ], $dbForPlatform, function (Document $document) use ($dbForPlatform) { $providerRepositoryId = $document->getAttribute('providerRepositoryId', ''); $projectInternalId = $document->getAttribute('projectInternalId', ''); + + /** + * todo: add index to this query + */ $this->deleteByGroup('vcsComments', [ Query::equal('providerRepositoryId', [$providerRepositoryId]), Query::equal('projectInternalId', [$projectInternalId]), + Query::orderAsc() ], $dbForPlatform); }); @@ -942,11 +1015,13 @@ class Deletes extends Action /** * Delete builds + * todo: no index for `deploymentInternalId` change to temporary to deploymentId? */ Console::info("Deleting builds for deployment " . $deploymentId); $this->deleteByGroup('builds', [ - Query::equal('deploymentInternalId', [$deploymentInternalId]) + Query::equal('deploymentInternalId', [$deploymentInternalId]), + Query::orderAsc() ], $dbForProject, function (Document $document) use ($deviceForBuilds) { $this->deleteBuildFiles($deviceForBuilds, $document); }); @@ -974,6 +1049,10 @@ class Deletes extends Action ): void { $start = \microtime(true); + /** + * deleteDocuments uses a cursor, we need to add a unique order by field or use default + */ + try { $documents = $database->deleteDocuments($collection, $queries); } catch (Throwable $th) { From 5f7ceecb30e64f11fa6bb0a5cb746007cc983b8d Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 18 Mar 2025 03:46:14 +0000 Subject: [PATCH 005/124] chore: stop tests on failure --- phpunit.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpunit.xml b/phpunit.xml index 4c4e55ea4e..598b730908 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -6,7 +6,7 @@ convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" - stopOnFailure="false" + stopOnFailure="true" > From 20e3597a273635284a9c99d51297f2aff9e8014b Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Tue, 18 Mar 2025 13:04:44 +0530 Subject: [PATCH 006/124] WIP: Add test for empty source --- .../Services/Sites/SitesCustomServerTest.php | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index 6ecb35d5a9..e6321bad32 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -2243,4 +2243,40 @@ class SitesCustomServerTest extends Scope $this->cleanupSite($siteId); } + + public function testEmptySiteSource(): void + { + $siteId = $this->setupSite([ + 'siteId' => ID::unique(), + 'name' => 'Empty source site', + 'framework' => 'other', + 'buildRuntime' => 'node-22', + 'outputDirectory' => './', + ]); + $this->assertNotEmpty($siteId); + + $site = $this->getSite($siteId); + $this->assertEquals('200', $site['headers']['status-code']); + $this->assertArrayHasKey('adapter', $site['body']); + $this->assertEmpty($site['body']['adapter']); + + $domain = $this->setupSiteDomain($siteId); + $this->assertNotEmpty($domain); + + $deploymentId = $this->setupDeployment($siteId, [ + 'code' => $this->packageSite('empty'), + 'activate' => 'true' + ]); + $this->assertNotEmpty($deploymentId); + + $site = $this->getSite($siteId); + $this->assertEquals('200', $site['headers']['status-code']); + + $proxyClient = new Client(); + $proxyClient->setEndpoint('http://' . $domain); + $response = $proxyClient->call(Client::METHOD_GET, '/'); + $this->assertEquals(200, $response['headers']['status-code']); + + $this->cleanupSite($siteId); + } } From 795928a037644ca8aca6a3ad6fd07b2f6ffffef5 Mon Sep 17 00:00:00 2001 From: fogelito Date: Tue, 18 Mar 2025 16:59:05 +0200 Subject: [PATCH 007/124] Fix $id --- src/Appwrite/Platform/Workers/Deletes.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 3c8bcdd635..a14e54caab 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -1045,7 +1045,8 @@ class Deletes extends Action string $collection, array $queries, Database $database, - ?callable $callback = null + ?callable $callback = null, + bool $shortSelect = false ): void { $start = \microtime(true); @@ -1053,6 +1054,12 @@ class Deletes extends Action * deleteDocuments uses a cursor, we need to add a unique order by field or use default */ + if (!\is_callable($callback) && $shortSelect) { + $queries = array_merge($queries, [ + Query::select(['$internalId', '$id', '$permissions', '$updatedAt']) + ]); + } + try { $documents = $database->deleteDocuments($collection, $queries); } catch (Throwable $th) { From 18022d680ba32c348e1895e8ba469a4257cc2dad Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Wed, 19 Mar 2025 16:22:38 +0530 Subject: [PATCH 008/124] Assert exception --- .../Services/Sites/SitesCustomServerTest.php | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index 8c2a1c3970..ac6a74aeb5 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -2320,19 +2320,20 @@ class SitesCustomServerTest extends Scope $domain = $this->setupSiteDomain($siteId); $this->assertNotEmpty($domain); - $deploymentId = $this->setupDeployment($siteId, [ + $deployment = $this->createDeployment($siteId, [ 'code' => $this->packageSite('empty'), - 'activate' => 'true' + 'activate' => true ]); + $this->assertEquals(202, $deployment['headers']['status-code']); + + $deploymentId = $deployment['body']['$id']; $this->assertNotEmpty($deploymentId); - $site = $this->getSite($siteId); - $this->assertEquals('200', $site['headers']['status-code']); - - $proxyClient = new Client(); - $proxyClient->setEndpoint('http://' . $domain); - $response = $proxyClient->call(Client::METHOD_GET, '/'); - $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEventually(function () use ($siteId, $deploymentId) { + $deployment = $this->getDeployment($siteId, $deploymentId); + $this->assertEquals('failed', $deployment['body']['status'], 'Deployment status is failed, deployment: ' . json_encode($deployment['body'], JSON_PRETTY_PRINT)); + $this->assertStringContainsString("ERROR: No source code found. Please ensure your source directory exists and isn't empty.", $deployment['body']['buildLogs']); + }, 100000, 500); $this->cleanupSite($siteId); } From cc0a97b10e30290fce85fc1a84cf5f9948c8f391 Mon Sep 17 00:00:00 2001 From: fogelito Date: Wed, 19 Mar 2025 16:37:15 +0200 Subject: [PATCH 009/124] Fixes --- app/config/collections/common.php | 6 +++--- src/Appwrite/Platform/Workers/Deletes.php | 24 ++++++++++++----------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/app/config/collections/common.php b/app/config/collections/common.php index f68400e226..3f6245dfdd 100644 --- a/app/config/collections/common.php +++ b/app/config/collections/common.php @@ -1038,7 +1038,7 @@ return [ '$id' => ID::custom('providerUid'), 'type' => Database::VAR_STRING, 'format' => '', - 'size' => 2048, + 'size' => 2048, // Decrease to 128 as in index length? 'signed' => true, 'required' => false, 'default' => null, @@ -1107,14 +1107,14 @@ return [ '$id' => ID::custom('_key_userInternalId_provider_providerUid'), 'type' => Database::INDEX_UNIQUE, 'attributes' => ['userInternalId', 'provider', 'providerUid'], - 'lengths' => [11, 128, 128], + 'lengths' => [11, 128, 128], // providerUid is length 2000! 'orders' => [Database::ORDER_ASC, Database::ORDER_ASC], ], [ '$id' => ID::custom('_key_provider_providerUid'), 'type' => Database::INDEX_UNIQUE, 'attributes' => ['provider', 'providerUid'], - 'lengths' => [128, 128], + 'lengths' => [128, 128], // providerUid is length 2000! 'orders' => [Database::ORDER_ASC, Database::ORDER_ASC], ], [ diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index a14e54caab..27ff27fe31 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -357,21 +357,23 @@ class Deletes extends Action new Filesystem(APP_STORAGE_CACHE . DIRECTORY_SEPARATOR . 'app-' . $projectId) ); - $query[] = Query::equal('resource', [$resource]); + $queries = [ + Query::equal('resource', [$resource]) + ]; if (!empty($resourceType)) { - $query[] = Query::equal('resourceType', [$resourceType]); + $queries[] = Query::equal('resourceType', [$resourceType]); } - $query[] = Query::orderAsc(); + $queries[] = Query::orderAsc(); /** - * todo: missing index on `resource`, `resourceType` + * todo: No index on `resource`, `resourceType`, But it is fine since resource index is a strong index! */ $this->deleteByGroup( 'cache', - $query, + $queries, $dbForProject, function (Document $document) use ($cache, $projectId) { $path = APP_STORAGE_CACHE . DIRECTORY_SEPARATOR . 'app-' . $projectId . DIRECTORY_SEPARATOR . $document->getId(); @@ -719,7 +721,7 @@ class Deletes extends Action // Delete identities /** - * todo: Remove Duplication index `_key_userInternalId` + * todo: Remove Duplication index `_key_userInternalId` , But lets leave because of index length issue in unique index */ $this->deleteByGroup('identities', [ Query::equal('userInternalId', [$userInternalId]), @@ -836,13 +838,13 @@ class Deletes extends Action /** * Delete rules - * todo: No index for this query + * todo: No index for this query, drop _key_projectInternalId and create _key_projectInternalId, resourceInternalId, resourceType */ Console::info("Deleting rules for function " . $functionId); $this->deleteByGroup('rules', [ - Query::equal('resourceType', ['function']), - Query::equal('resourceInternalId', [$functionInternalId]), Query::equal('projectInternalId', [$project->getInternalId()]), + Query::equal('resourceInternalId', [$functionInternalId]), + Query::equal('resourceType', ['function']), Query::orderAsc() ], $dbForPlatform, function (Document $document) use ($project, $dbForPlatform, $certificates) { $this->deleteRule($dbForPlatform, $document, $certificates); @@ -850,12 +852,12 @@ class Deletes extends Action /** * Delete Variables - * todo: No index for this query + * todo: No index for this query , drop _key_resourceInternalId and create new one with {resourceInternalId, resourceType} */ Console::info("Deleting variables for function " . $functionId); $this->deleteByGroup('variables', [ - Query::equal('resourceType', ['function']), Query::equal('resourceInternalId', [$functionInternalId]), + Query::equal('resourceType', ['function']), Query::orderAsc() ], $dbForProject); From 9c54cce5bd8c61d26a549273dfe30b6bcfd94751 Mon Sep 17 00:00:00 2001 From: fogelito Date: Thu, 20 Mar 2025 09:07:32 +0200 Subject: [PATCH 010/124] Queries fixes --- src/Appwrite/Platform/Workers/Deletes.php | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 27ff27fe31..b7fce0405d 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -365,6 +365,7 @@ class Deletes extends Action $queries[] = Query::equal('resourceType', [$resourceType]); } + $queries[] = Query::select(['$internalId', '$id', '$updatedAt']); $queries[] = Query::orderAsc(); /** @@ -404,7 +405,8 @@ class Deletes extends Action new Filesystem(APP_STORAGE_CACHE . DIRECTORY_SEPARATOR . 'app-' . $projectId) ); - $query = [ + $queries = [ + Query::select(['$internalId', '$id', '$updatedAt']), Query::lessThan('accessedAt', $datetime), Query::orderDesc('accessedAt'), Query::orderDesc(), @@ -412,7 +414,7 @@ class Deletes extends Action $this->deleteByGroup( 'cache', - $query, + $queries, $dbForProject, function (Document $document) use ($cache, $projectId) { $path = APP_STORAGE_CACHE . DIRECTORY_SEPARATOR . 'app-' . $projectId . DIRECTORY_SEPARATOR . $document->getId(); @@ -440,6 +442,7 @@ class Deletes extends Action // Delete Usage stats from projectDB $this->deleteByGroup('stats', [ + Query::select(['$internalId', '$id', '$updatedAt']), Query::equal('period', ['1h']), Query::lessThan('time', $hourlyUsageRetentionDatetime), Query::orderDesc('time'), @@ -452,6 +455,7 @@ class Deletes extends Action // Delete Usage stats from logsDB $this->deleteByGroup('stats', [ + Query::select(['$internalId', '$id', '$updatedAt']), Query::equal('period', ['1h']), Query::lessThan('time', $hourlyUsageRetentionDatetime), Query::orderDesc('time'), @@ -755,6 +759,7 @@ class Deletes extends Action // Delete Executions $this->deleteByGroup('executions', [ + Query::select(['$internalId', '$id', '$updatedAt']), Query::lessThan('$createdAt', $datetime), Query::orderDesc('$createdAt'), Query::orderDesc(), @@ -775,6 +780,7 @@ class Deletes extends Action // Delete Sessions $this->deleteByGroup('sessions', [ + Query::select(['$internalId', '$id', '$updatedAt']), Query::lessThan('$createdAt', $expired), Query::orderDesc('$createdAt'), Query::orderDesc(), @@ -811,6 +817,7 @@ class Deletes extends Action try { $this->deleteByGroup(Audit::COLLECTION, [ + Query::select(['$internalId', '$id', '$updatedAt']), Query::lessThan('time', $auditRetention), Query::orderDesc('time'), Query::orderAsc(), // KEY "index-time" ("time" DESC) @@ -897,6 +904,7 @@ class Deletes extends Action */ Console::info("Deleting executions for function " . $functionId); $this->deleteByGroup('executions', [ + Query::select(['$internalId', '$id', '$updatedAt']), Query::equal('functionInternalId', [$functionInternalId]), Query::orderAsc() ], $dbForProject); @@ -1017,7 +1025,7 @@ class Deletes extends Action /** * Delete builds - * todo: no index for `deploymentInternalId` change to temporary to deploymentId? + * todo: no index for `deploymentInternalId` Same as above index , no need to handle again... */ Console::info("Deleting builds for deployment " . $deploymentId); @@ -1047,8 +1055,7 @@ class Deletes extends Action string $collection, array $queries, Database $database, - ?callable $callback = null, - bool $shortSelect = false + ?callable $callback = null ): void { $start = \microtime(true); @@ -1056,12 +1063,6 @@ class Deletes extends Action * deleteDocuments uses a cursor, we need to add a unique order by field or use default */ - if (!\is_callable($callback) && $shortSelect) { - $queries = array_merge($queries, [ - Query::select(['$internalId', '$id', '$permissions', '$updatedAt']) - ]); - } - try { $documents = $database->deleteDocuments($collection, $queries); } catch (Throwable $th) { From 5eb7c36f50e2713aee76beaff1bb207eca130116 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Thu, 20 Mar 2025 10:32:36 +0000 Subject: [PATCH 011/124] chore: add console audit retention --- .env | 2 +- app/worker.php | 2 +- docker-compose.yml | 1 + src/Appwrite/Platform/Workers/Deletes.php | 9 ++++++++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.env b/.env index 1893e023ba..c68f0a0d52 100644 --- a/.env +++ b/.env @@ -85,7 +85,7 @@ _APP_MAINTENANCE_DELAY= _APP_MAINTENANCE_RETENTION_CACHE=2592000 _APP_MAINTENANCE_RETENTION_EXECUTION=1209600 _APP_MAINTENANCE_RETENTION_ABUSE=86400 -_APP_MAINTENANCE_RETENTION_AUDIT=1209600 +_APP_MAINTENANCE_RETENTION_AUDIT=project=1209600,console=15778800 _APP_USAGE_AGGREGATION_INTERVAL=30 _APP_STATS_RESOURCES_INTERVAL=3600 _APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000 diff --git a/app/worker.php b/app/worker.php index eeefe80000..5d7bd4de41 100644 --- a/app/worker.php +++ b/app/worker.php @@ -219,7 +219,7 @@ Server::setResource('abuseRetention', function () { }); Server::setResource('auditRetention', function () { - return DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', 1209600)); + return System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', 'project=1209600,console=15778800'); // project = 14 days, console = 6 months }); Server::setResource('executionRetention', function () { diff --git a/docker-compose.yml b/docker-compose.yml index b6dc80df6a..af6a323ec8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -389,6 +389,7 @@ services: - _APP_DATABASE_SHARED_TABLES - _APP_DATABASE_SHARED_TABLES_V1 - _APP_EMAIL_CERTIFICATES + - _APP_MAINTENANCE_RETENTION_AUDIT appwrite-worker-databases: entrypoint: worker-databases diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 9b0590181a..75380ed3fe 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -751,9 +751,16 @@ class Deletes extends Action $projectId = $project->getId(); $dbForProject = $getProjectDB($project); + [$projectAuditRetention, $consoleAuditRetention] = array_map( + function ($part) { + return DateTime::addSeconds(new \DateTime(), -1 * (int)explode('=', $part)[1]); + }, + explode(',', $auditRetention) + ); + try { $this->deleteByGroup(Audit::COLLECTION, [ - Query::lessThan('time', $auditRetention), + Query::lessThan('time', ($projectId === 'console' ? $consoleAuditRetention : $projectAuditRetention)), Query::orderDesc('time'), Query::orderDesc('$internalId'), ], $dbForProject); From 9d8289221925ddf7eeebbd42f56ba9be311dd2a0 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Thu, 20 Mar 2025 11:32:06 +0000 Subject: [PATCH 012/124] chore: update logic --- app/worker.php | 10 +++++++++- src/Appwrite/Platform/Workers/Deletes.php | 15 ++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/worker.php b/app/worker.php index 5d7bd4de41..18b51eda25 100644 --- a/app/worker.php +++ b/app/worker.php @@ -219,7 +219,15 @@ Server::setResource('abuseRetention', function () { }); Server::setResource('auditRetention', function () { - return System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', 'project=1209600,console=15778800'); // project = 14 days, console = 6 months + return array_map( + function ($part) { + [$key, $value] = explode('=', $part); + return [ + $key => DateTime::addSeconds(new \DateTime(), -1 * (int)$value) + ]; + }, + explode(',', System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', 'project=1209600,console=15778800')) + ); }); Server::setResource('executionRetention', function () { diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 75380ed3fe..93f8748e49 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -57,7 +57,7 @@ class Deletes extends Action ->inject('auditRetention') ->inject('log') ->callback( - fn ($message, Document $project, Database $dbForPlatform, callable $getProjectDB, callable $getLogsDB, Device $deviceForFiles, Device $deviceForFunctions, Device $deviceForBuilds, Device $deviceForCache, CertificatesAdapter $certificates, string $executionRetention, string $auditRetention, Log $log) => + fn ($message, Document $project, Database $dbForPlatform, callable $getProjectDB, callable $getLogsDB, Device $deviceForFiles, Device $deviceForFunctions, Device $deviceForBuilds, Device $deviceForCache, CertificatesAdapter $certificates, string $executionRetention, array $auditRetention, Log $log) => $this->action($message, $project, $dbForPlatform, $getProjectDB, $getLogsDB, $deviceForFiles, $deviceForFunctions, $deviceForBuilds, $deviceForCache, $certificates, $executionRetention, $auditRetention, $log) ); } @@ -66,7 +66,7 @@ class Deletes extends Action * @throws Exception * @throws Throwable */ - public function action(Message $message, Document $project, Database $dbForPlatform, callable $getProjectDB, callable $getLogsDB, Device $deviceForFiles, Device $deviceForFunctions, Device $deviceForBuilds, Device $deviceForCache, CertificatesAdapter $certificates, string $executionRetention, string $auditRetention, Log $log): void + public function action(Message $message, Document $project, Database $dbForPlatform, callable $getProjectDB, callable $getLogsDB, Device $deviceForFiles, Device $deviceForFunctions, Device $deviceForBuilds, Device $deviceForCache, CertificatesAdapter $certificates, string $executionRetention, array $auditRetention, Log $log): void { $payload = $message->getPayload() ?? []; @@ -746,21 +746,14 @@ class Deletes extends Action * @return void * @throws Exception */ - private function deleteAuditLogs(Document $project, callable $getProjectDB, string $auditRetention): void + private function deleteAuditLogs(Document $project, callable $getProjectDB, array $auditRetention): void { $projectId = $project->getId(); $dbForProject = $getProjectDB($project); - [$projectAuditRetention, $consoleAuditRetention] = array_map( - function ($part) { - return DateTime::addSeconds(new \DateTime(), -1 * (int)explode('=', $part)[1]); - }, - explode(',', $auditRetention) - ); - try { $this->deleteByGroup(Audit::COLLECTION, [ - Query::lessThan('time', ($projectId === 'console' ? $consoleAuditRetention : $projectAuditRetention)), + Query::lessThan('time', ($projectId === 'console' ? $auditRetention['console'] : $auditRetention['project'])), Query::orderDesc('time'), Query::orderDesc('$internalId'), ], $dbForProject); From 7c3f8504bb65e598f50d07912b5d753c86f5e1f6 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Thu, 20 Mar 2025 13:15:14 +0000 Subject: [PATCH 013/124] chore: fix initialization --- app/worker.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/worker.php b/app/worker.php index 18b51eda25..e305ec42d6 100644 --- a/app/worker.php +++ b/app/worker.php @@ -219,14 +219,14 @@ Server::setResource('abuseRetention', function () { }); Server::setResource('auditRetention', function () { - return array_map( - function ($part) { + return array_reduce( + explode(',', System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', 'project=1209600,console=15778800')), + function ($carry, $part) { [$key, $value] = explode('=', $part); - return [ - $key => DateTime::addSeconds(new \DateTime(), -1 * (int)$value) - ]; + $carry[$key] = DateTime::addSeconds(new \DateTime(), -1 * (int)$value); + return $carry; }, - explode(',', System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', 'project=1209600,console=15778800')) + [] ); }); From b0b57935da0e54074766a3f9a144f41fe2081a55 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Thu, 20 Mar 2025 13:42:19 +0000 Subject: [PATCH 014/124] chore: add comments --- app/worker.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/worker.php b/app/worker.php index e305ec42d6..d0fa5cf4f8 100644 --- a/app/worker.php +++ b/app/worker.php @@ -215,12 +215,12 @@ Server::setResource('getLogsDB', function (Group $pools, Cache $cache) { }, ['pools', 'cache']); Server::setResource('abuseRetention', function () { - return time() - (int) System::getEnv('_APP_MAINTENANCE_RETENTION_ABUSE', 86400); + return time() - (int) System::getEnv('_APP_MAINTENANCE_RETENTION_ABUSE', 86400); // 1 day }); Server::setResource('auditRetention', function () { return array_reduce( - explode(',', System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', 'project=1209600,console=15778800')), + explode(',', System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', 'project=1209600,console=15778800')), // project = 14 days, console = 6 months function ($carry, $part) { [$key, $value] = explode('=', $part); $carry[$key] = DateTime::addSeconds(new \DateTime(), -1 * (int)$value); @@ -231,7 +231,7 @@ Server::setResource('auditRetention', function () { }); Server::setResource('executionRetention', function () { - return DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('_APP_MAINTENANCE_RETENTION_EXECUTION', 1209600)); + return DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('_APP_MAINTENANCE_RETENTION_EXECUTION', 1209600)); // 14 days }); Server::setResource('cache', function (Registry $register) { From 21f12879ef65960c557742c6e93b4ab962c8b669 Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Fri, 21 Mar 2025 12:11:29 +0530 Subject: [PATCH 015/124] Remove extra check --- tests/e2e/Services/Sites/SitesCustomServerTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index a6669d1e38..30bb73c40c 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -2363,7 +2363,6 @@ class SitesCustomServerTest extends Scope $this->assertEventually(function () use ($siteId, $deploymentId) { $deployment = $this->getDeployment($siteId, $deploymentId); $this->assertEquals('failed', $deployment['body']['status'], 'Deployment status is failed, deployment: ' . json_encode($deployment['body'], JSON_PRETTY_PRINT)); - $this->assertStringContainsString("ERROR: No source code found. Please ensure your source directory exists and isn't empty.", $deployment['body']['buildLogs']); }, 100000, 500); $this->cleanupSite($siteId); From 13750f7dbd5b5850075eefab4bacf3e782752004 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Fri, 21 Mar 2025 07:42:10 +0000 Subject: [PATCH 016/124] feat: introduce new env --- .env | 3 ++- app/config/variables.php | 11 ++++++++++- app/views/install/compose.phtml | 3 +++ app/worker.php | 13 ++++--------- docker-compose.yml | 3 +++ 5 files changed, 22 insertions(+), 11 deletions(-) diff --git a/.env b/.env index c68f0a0d52..c10c12613b 100644 --- a/.env +++ b/.env @@ -85,7 +85,8 @@ _APP_MAINTENANCE_DELAY= _APP_MAINTENANCE_RETENTION_CACHE=2592000 _APP_MAINTENANCE_RETENTION_EXECUTION=1209600 _APP_MAINTENANCE_RETENTION_ABUSE=86400 -_APP_MAINTENANCE_RETENTION_AUDIT=project=1209600,console=15778800 +_APP_MAINTENANCE_RETENTION_AUDIT=1209600 +_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE=15778800 _APP_USAGE_AGGREGATION_INTERVAL=30 _APP_STATS_RESOURCES_INTERVAL=3600 _APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000 diff --git a/app/config/variables.php b/app/config/variables.php index 98dd9ffec1..27463d2fee 100644 --- a/app/config/variables.php +++ b/app/config/variables.php @@ -1048,13 +1048,22 @@ return [ ], [ 'name' => '_APP_MAINTENANCE_RETENTION_AUDIT', - 'description' => 'IThe maximum duration (in seconds) upto which to retain audit logs. The default value is 1209600 seconds (14 days).', + 'description' => 'The maximum duration (in seconds) upto which to retain audit logs. The default value is 1209600 seconds (14 days).', 'introduction' => '0.7.0', 'default' => '1209600', 'required' => false, 'question' => '', 'filter' => '' ], + [ + 'name' => '_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE', + 'description' => 'The maximum duration (in seconds) upto which to retain console audit logs. The default value is 15778800 seconds (6 months).', + 'introduction' => '1.6.2', + 'default' => '15778800', + 'required' => false, + 'question' => '', + 'filter' => '' + ], [ 'name' => '_APP_MAINTENANCE_RETENTION_ABUSE', 'description' => 'The maximum duration (in seconds) upto which to retain abuse logs. The default value is 86400 seconds (1 day).', diff --git a/app/views/install/compose.phtml b/app/views/install/compose.phtml index fd05d2a0b6..7dfe14fcef 100644 --- a/app/views/install/compose.phtml +++ b/app/views/install/compose.phtml @@ -148,6 +148,7 @@ $image = $this->getParam('image', ''); - _APP_MAINTENANCE_RETENTION_CACHE - _APP_MAINTENANCE_RETENTION_ABUSE - _APP_MAINTENANCE_RETENTION_AUDIT + - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE - _APP_MAINTENANCE_RETENTION_USAGE_HOURLY - _APP_MAINTENANCE_RETENTION_SCHEDULES - _APP_SMS_PROVIDER @@ -340,6 +341,7 @@ $image = $this->getParam('image', ''); - _APP_EXECUTOR_HOST - _APP_MAINTENANCE_RETENTION_ABUSE - _APP_MAINTENANCE_RETENTION_AUDIT + - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE - _APP_MAINTENANCE_RETENTION_EXECUTION - _APP_SYSTEM_SECURITY_EMAIL_ADDRESS - _APP_EMAIL_CERTIFICATES @@ -651,6 +653,7 @@ $image = $this->getParam('image', ''); - _APP_MAINTENANCE_RETENTION_CACHE - _APP_MAINTENANCE_RETENTION_ABUSE - _APP_MAINTENANCE_RETENTION_AUDIT + - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE - _APP_MAINTENANCE_RETENTION_USAGE_HOURLY - _APP_MAINTENANCE_RETENTION_SCHEDULES diff --git a/app/worker.php b/app/worker.php index d0fa5cf4f8..3f99089eef 100644 --- a/app/worker.php +++ b/app/worker.php @@ -219,15 +219,10 @@ Server::setResource('abuseRetention', function () { }); Server::setResource('auditRetention', function () { - return array_reduce( - explode(',', System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', 'project=1209600,console=15778800')), // project = 14 days, console = 6 months - function ($carry, $part) { - [$key, $value] = explode('=', $part); - $carry[$key] = DateTime::addSeconds(new \DateTime(), -1 * (int)$value); - return $carry; - }, - [] - ); + return [ + 'project' => DateTime::addSeconds(new \DateTime(), -1 * (int) System::getEnv('APP_MAINTENANCE_RETENTION_AUDIT', '1209600')), + 'console' => DateTime::addSeconds(new \DateTime(), -1 * (int) System::getEnv('APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE', '15778800')) + ]; }); Server::setResource('executionRetention', function () { diff --git a/docker-compose.yml b/docker-compose.yml index af6a323ec8..05ddba967a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -171,6 +171,7 @@ services: - _APP_MAINTENANCE_RETENTION_CACHE - _APP_MAINTENANCE_RETENTION_ABUSE - _APP_MAINTENANCE_RETENTION_AUDIT + - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE - _APP_MAINTENANCE_RETENTION_USAGE_HOURLY - _APP_MAINTENANCE_RETENTION_SCHEDULES - _APP_SMS_PROVIDER @@ -390,6 +391,7 @@ services: - _APP_DATABASE_SHARED_TABLES_V1 - _APP_EMAIL_CERTIFICATES - _APP_MAINTENANCE_RETENTION_AUDIT + - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE appwrite-worker-databases: entrypoint: worker-databases @@ -722,6 +724,7 @@ services: - _APP_MAINTENANCE_RETENTION_CACHE - _APP_MAINTENANCE_RETENTION_ABUSE - _APP_MAINTENANCE_RETENTION_AUDIT + - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE - _APP_MAINTENANCE_RETENTION_USAGE_HOURLY - _APP_MAINTENANCE_RETENTION_SCHEDULES - _APP_MAINTENANCE_DELAY From 7c795da72fd7aa05b280f27012f87357a08d2814 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Fri, 21 Mar 2025 07:48:50 +0000 Subject: [PATCH 017/124] chore: fix type --- app/worker.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/worker.php b/app/worker.php index 3f99089eef..744c758c69 100644 --- a/app/worker.php +++ b/app/worker.php @@ -220,8 +220,8 @@ Server::setResource('abuseRetention', function () { Server::setResource('auditRetention', function () { return [ - 'project' => DateTime::addSeconds(new \DateTime(), -1 * (int) System::getEnv('APP_MAINTENANCE_RETENTION_AUDIT', '1209600')), - 'console' => DateTime::addSeconds(new \DateTime(), -1 * (int) System::getEnv('APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE', '15778800')) + 'project' => DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('APP_MAINTENANCE_RETENTION_AUDIT', 1209600)), + 'console' => DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE', 15778800)) ]; }); From c0c0c921dc249f2f235a9bd7e8efdce66ae3c137 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Fri, 21 Mar 2025 08:08:30 +0000 Subject: [PATCH 018/124] chore: fix naming --- app/worker.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/worker.php b/app/worker.php index 744c758c69..491f266a18 100644 --- a/app/worker.php +++ b/app/worker.php @@ -220,8 +220,8 @@ Server::setResource('abuseRetention', function () { Server::setResource('auditRetention', function () { return [ - 'project' => DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('APP_MAINTENANCE_RETENTION_AUDIT', 1209600)), - 'console' => DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE', 15778800)) + 'project' => DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', 1209600)), // 14 days + 'console' => DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE', 15778800)) // 6 months ]; }); From df943c62ca674d75278c8e00e43b4fe01cf14868 Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Fri, 21 Mar 2025 17:53:22 +0530 Subject: [PATCH 019/124] Add test for permanent redirect --- .../Services/Sites/SitesCustomServerTest.php | 37 +++++++++++++++++++ tests/resources/sites/subProjects/index.html | 17 +++++++++ .../sites/subProjects/project1/index.html | 13 +++++++ .../sites/subProjects/project2/index.html | 13 +++++++ 4 files changed, 80 insertions(+) create mode 100644 tests/resources/sites/subProjects/index.html create mode 100644 tests/resources/sites/subProjects/project1/index.html create mode 100644 tests/resources/sites/subProjects/project2/index.html diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index a95568c7ce..e4ff30f86e 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -2331,4 +2331,41 @@ class SitesCustomServerTest extends Scope $this->cleanupSite($siteId); } + + public function testSubProjects(): void + { + $siteId = $this->setupSite([ + 'siteId' => ID::unique(), + 'name' => 'Sub project site', + 'framework' => 'other', + 'buildRuntime' => 'node-22', + 'outputDirectory' => './' + ]); + $this->assertNotEmpty($siteId); + + $site = $this->getSite($siteId); + $this->assertEquals('200', $site['headers']['status-code']); + $this->assertArrayHasKey('adapter', $site['body']); + + $domain = $this->setupSiteDomain($siteId); + $this->assertNotEmpty($domain); + + $deploymentId = $this->setupDeployment($siteId, [ + 'code' => $this->packageSite('subProjects'), + 'activate' => 'true' + ]); + $this->assertNotEmpty($deploymentId); + + $site = $this->getSite($siteId); + + $proxyClient = new Client(); + $proxyClient->setEndpoint('http://' . $domain); + $response = $proxyClient->call(Client::METHOD_GET, '/'); + $this->assertEquals(200, $response['headers']['status-code']); + $response1 = $proxyClient->call(Client::METHOD_GET, '/project1'); + $this->assertEquals(200, $response1['headers']['status-code']); + $response2 = $proxyClient->call(Client::METHOD_GET, '/project1/'); + $this->assertEquals(308, $response2['headers']['status-code']); + $this->cleanupSite($siteId); + } } diff --git a/tests/resources/sites/subProjects/index.html b/tests/resources/sites/subProjects/index.html new file mode 100644 index 0000000000..cb9af4b5ac --- /dev/null +++ b/tests/resources/sites/subProjects/index.html @@ -0,0 +1,17 @@ + + + + + + Main Project Index + + +

Welcome to My Website

+

Select a project to explore:

+ + + + diff --git a/tests/resources/sites/subProjects/project1/index.html b/tests/resources/sites/subProjects/project1/index.html new file mode 100644 index 0000000000..43b5eae40b --- /dev/null +++ b/tests/resources/sites/subProjects/project1/index.html @@ -0,0 +1,13 @@ + + + + + + Project 1 + + +

Project 1

+

Welcome to Project 1!

+ Back to Main Page + + diff --git a/tests/resources/sites/subProjects/project2/index.html b/tests/resources/sites/subProjects/project2/index.html new file mode 100644 index 0000000000..5fea34c1ce --- /dev/null +++ b/tests/resources/sites/subProjects/project2/index.html @@ -0,0 +1,13 @@ + + + + + + Project 2 + + +

Project 2

+

Welcome to Project 2!

+ Back to Main Page + + From 65aa218aac1c742c232019e10f66d7107114369f Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Fri, 21 Mar 2025 17:54:07 +0530 Subject: [PATCH 020/124] Add test for permanent redirect --- tests/e2e/Services/Sites/SitesCustomServerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index e4ff30f86e..cc2e1f9bbb 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -2332,7 +2332,7 @@ class SitesCustomServerTest extends Scope $this->cleanupSite($siteId); } - public function testSubProjects(): void + public function testPermanentRedirect(): void { $siteId = $this->setupSite([ 'siteId' => ID::unique(), From d661195a5f4bf375f7b72e5629e1a1dfd3fe8d3d Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Fri, 21 Mar 2025 15:59:30 +0000 Subject: [PATCH 021/124] chore: only update total count for prviledged users --- app/controllers/api/teams.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index b45c9fd3b9..dfdccf5e99 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -615,7 +615,10 @@ App::post('/v1/teams/:teamId/memberships') $membership = ($isPrivilegedUser || $isAppUser) ? Authorization::skip(fn () => $dbForProject->createDocument('memberships', $membership)) : $dbForProject->createDocument('memberships', $membership); - Authorization::skip(fn () => $dbForProject->increaseDocumentAttribute('teams', $team->getId(), 'total', 1)); + + if ($isPrivilegedUser || $isAppUser) { + Authorization::skip(fn () => $dbForProject->increaseDocumentAttribute('teams', $team->getId(), 'total', 1)); + } } elseif ($membership->getAttribute('confirm') === false) { $membership->setAttribute('secret', Auth::hash($secret)); From 7c2ab4fcf652b2823a42c04daf8ce4c0233eb609 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sat, 22 Mar 2025 13:47:09 +0530 Subject: [PATCH 022/124] update: change sample rate for 4xx via env. --- app/controllers/general.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/general.php b/app/controllers/general.php index a374aa3c39..1423763cec 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -871,17 +871,18 @@ App::error() if (!empty($providerConfig) && $error->getCode() >= 400 && $error->getCode() < 500) { // Register error logger try { - $loggingProvider = new DSN($providerConfig ?? ''); + $loggingProvider = new DSN($providerConfig); $providerName = $loggingProvider->getScheme(); if (!empty($providerName) && $providerName === 'sentry') { $key = $loggingProvider->getPassword(); $projectId = $loggingProvider->getUser() ?? ''; $host = 'https://' . $loggingProvider->getHost(); + $sampleRate = $loggingProvider->getParam('sample', 0.01); $adapter = new Sentry($projectId, $key, $host); $logger = new Logger($adapter); - $logger->setSample(0.01); + $logger->setSample($sampleRate); $publish = true; } else { throw new \Exception('Invalid experimental logging provider'); From 86856bf87d1afa58543411eda105fb975009e5db Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sat, 22 Mar 2025 13:55:23 +0000 Subject: [PATCH 023/124] chore: update gitpod.yml config --- .gitpod.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.gitpod.yml b/.gitpod.yml index 478b62fc8d..e9c0928229 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -1,6 +1,7 @@ tasks: - name: Run Appwrite Docker Stack init: | + git config --global --add safe.directory /app git submodule update --init docker compose build docker compose pull @@ -23,11 +24,3 @@ vscode: extensions: - ms-azuretools.vscode-docker - zobo.php-intellisense - -github: - # https://www.gitpod.io/docs/prebuilds#github-specific-configuration - prebuilds: - # enable for pull requests coming from forks (defaults to false) - pullRequestsFromForks: true - # add a check to pull requests (defaults to true) - addCheck: false From 37dfe0d719b49f32b2540b3d6b3310fcd110e976 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sat, 22 Mar 2025 14:05:39 +0000 Subject: [PATCH 024/124] refactor: initialization of audit retention --- app/worker.php | 14 ++++++-------- src/Appwrite/Platform/Workers/Deletes.php | 10 +++++----- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/app/worker.php b/app/worker.php index 491f266a18..90496c0430 100644 --- a/app/worker.php +++ b/app/worker.php @@ -16,8 +16,6 @@ use Appwrite\Event\Migration; use Appwrite\Event\Realtime; use Appwrite\Event\StatsUsage; use Appwrite\Event\StatsUsageDump; -/** remove */ -/** /remove */ use Appwrite\Event\Webhook; use Appwrite\Platform\Appwrite; use Swoole\Runtime; @@ -218,12 +216,12 @@ Server::setResource('abuseRetention', function () { return time() - (int) System::getEnv('_APP_MAINTENANCE_RETENTION_ABUSE', 86400); // 1 day }); -Server::setResource('auditRetention', function () { - return [ - 'project' => DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', 1209600)), // 14 days - 'console' => DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE', 15778800)) // 6 months - ]; -}); +Server::setResource('auditRetention', function (Document $project) { + if ($project->getId() === 'console') { + return DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE', 15778800)); // 6 months + } + return DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', 1209600)); // 14 days +}, ['project']); Server::setResource('executionRetention', function () { return DateTime::addSeconds(new \DateTime(), -1 * System::getEnv('_APP_MAINTENANCE_RETENTION_EXECUTION', 1209600)); // 14 days diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 93f8748e49..bb5cc81fcc 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -57,7 +57,7 @@ class Deletes extends Action ->inject('auditRetention') ->inject('log') ->callback( - fn ($message, Document $project, Database $dbForPlatform, callable $getProjectDB, callable $getLogsDB, Device $deviceForFiles, Device $deviceForFunctions, Device $deviceForBuilds, Device $deviceForCache, CertificatesAdapter $certificates, string $executionRetention, array $auditRetention, Log $log) => + fn ($message, Document $project, Database $dbForPlatform, callable $getProjectDB, callable $getLogsDB, Device $deviceForFiles, Device $deviceForFunctions, Device $deviceForBuilds, Device $deviceForCache, CertificatesAdapter $certificates, string $executionRetention, string $auditRetention, Log $log) => $this->action($message, $project, $dbForPlatform, $getProjectDB, $getLogsDB, $deviceForFiles, $deviceForFunctions, $deviceForBuilds, $deviceForCache, $certificates, $executionRetention, $auditRetention, $log) ); } @@ -66,7 +66,7 @@ class Deletes extends Action * @throws Exception * @throws Throwable */ - public function action(Message $message, Document $project, Database $dbForPlatform, callable $getProjectDB, callable $getLogsDB, Device $deviceForFiles, Device $deviceForFunctions, Device $deviceForBuilds, Device $deviceForCache, CertificatesAdapter $certificates, string $executionRetention, array $auditRetention, Log $log): void + public function action(Message $message, Document $project, Database $dbForPlatform, callable $getProjectDB, callable $getLogsDB, Device $deviceForFiles, Device $deviceForFunctions, Device $deviceForBuilds, Device $deviceForCache, CertificatesAdapter $certificates, string $executionRetention, string $auditRetention, Log $log): void { $payload = $message->getPayload() ?? []; @@ -742,18 +742,18 @@ class Deletes extends Action /** * @param Database $dbForPlatform * @param callable $getProjectDB - * @param string $datetime + * @param string $auditRetention * @return void * @throws Exception */ - private function deleteAuditLogs(Document $project, callable $getProjectDB, array $auditRetention): void + private function deleteAuditLogs(Document $project, callable $getProjectDB, string $auditRetention): void { $projectId = $project->getId(); $dbForProject = $getProjectDB($project); try { $this->deleteByGroup(Audit::COLLECTION, [ - Query::lessThan('time', ($projectId === 'console' ? $auditRetention['console'] : $auditRetention['project'])), + Query::lessThan('time', $auditRetention), Query::orderDesc('time'), Query::orderDesc('$internalId'), ], $dbForProject); From 26821c83726db7506fbf2d0828f34a908cb5d1d3 Mon Sep 17 00:00:00 2001 From: fogelito Date: Mon, 24 Mar 2025 11:08:39 +0200 Subject: [PATCH 025/124] Bump database 0.62 --- composer.json | 2 +- composer.lock | 311 ++++---------------------------------------------- 2 files changed, 22 insertions(+), 291 deletions(-) diff --git a/composer.json b/composer.json index d7b8505b5c..b1b6aed539 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,7 @@ "utopia-php/cache": "0.12.*", "utopia-php/cli": "0.15.*", "utopia-php/config": "0.2.*", - "utopia-php/database": "0.61.*", + "utopia-php/database": "0.62.*", "utopia-php/domains": "0.5.*", "utopia-php/dsn": "0.2.1", "utopia-php/framework": "0.33.*", diff --git a/composer.lock b/composer.lock index cdba756c72..1ea887fdbc 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": "e0d7f21b681e4591144fec16c4f0d6aa", + "content-hash": "d2bec8137dcd84994121f89a29932d31", "packages": [ { "name": "adhocore/jwt", @@ -751,65 +751,6 @@ }, "time": "2025-03-13T21:08:17+00:00" }, - { - "name": "jean85/pretty-package-versions", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", - "reference": "3c4e5f62ba8d7de1734312e4fff32f67a8daaf10", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.1.0", - "php": "^7.4|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^7.5|^8.5|^9.6", - "vimeo/psalm": "^4.3 || ^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Jean85\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "A library to get pretty versions strings of installed dependencies", - "keywords": [ - "composer", - "package", - "release", - "versions" - ], - "support": { - "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.0" - }, - "time": "2024-11-18T16:19:46+00:00" - }, { "name": "league/csv", "version": "9.14.0", @@ -968,75 +909,6 @@ }, "time": "2023-10-02T10:01:54+00:00" }, - { - "name": "mongodb/mongodb", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/mongodb/mongo-php-library.git", - "reference": "b0bbd657f84219212487d01a8ffe93a789e1e488" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/b0bbd657f84219212487d01a8ffe93a789e1e488", - "reference": "b0bbd657f84219212487d01a8ffe93a789e1e488", - "shasum": "" - }, - "require": { - "ext-hash": "*", - "ext-json": "*", - "ext-mongodb": "^1.11.0", - "jean85/pretty-package-versions": "^1.2 || ^2.0.1", - "php": "^7.1 || ^8.0", - "symfony/polyfill-php80": "^1.19" - }, - "require-dev": { - "doctrine/coding-standard": "^9.0", - "squizlabs/php_codesniffer": "^3.6", - "symfony/phpunit-bridge": "^5.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10.x-dev" - } - }, - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "MongoDB\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Andreas Braun", - "email": "andreas.braun@mongodb.com" - }, - { - "name": "Jeremy Mikola", - "email": "jmikola@gmail.com" - } - ], - "description": "MongoDB driver library", - "homepage": "https://jira.mongodb.org/browse/PHPLIB", - "keywords": [ - "database", - "driver", - "mongodb", - "persistence" - ], - "support": { - "issues": "https://github.com/mongodb/mongo-php-library/issues", - "source": "https://github.com/mongodb/mongo-php-library/tree/1.10.0" - }, - "time": "2021-10-20T22:22:37+00:00" - }, { "name": "mustangostang/spyc", "version": "0.6.3", @@ -2371,16 +2243,16 @@ }, { "name": "ramsey/collection", - "version": "2.1.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109" + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", - "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", "shasum": "" }, "require": { @@ -2441,9 +2313,9 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.1.0" + "source": "https://github.com/ramsey/collection/tree/2.1.1" }, - "time": "2025-03-02T04:48:29+00:00" + "time": "2025-03-22T05:38:12+00:00" }, { "name": "ramsey/uuid", @@ -2932,86 +2804,6 @@ ], "time": "2024-09-09T11:45:10+00:00" }, - { - "name": "symfony/polyfill-php80", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.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": "2024-09-09T11:45:10+00:00" - }, { "name": "symfony/polyfill-php82", "version": "v1.31.0", @@ -3705,16 +3497,16 @@ }, { "name": "utopia-php/database", - "version": "0.61.2", + "version": "0.62.1", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "349fbdf4bc088f7775c7dfb8b80239a617a88436" + "reference": "65dc51466c12552add10395900cdbb4728da4068" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/349fbdf4bc088f7775c7dfb8b80239a617a88436", - "reference": "349fbdf4bc088f7775c7dfb8b80239a617a88436", + "url": "https://api.github.com/repos/utopia-php/database/zipball/65dc51466c12552add10395900cdbb4728da4068", + "reference": "65dc51466c12552add10395900cdbb4728da4068", "shasum": "" }, "require": { @@ -3722,8 +3514,7 @@ "ext-pdo": "*", "php": ">=8.1", "utopia-php/cache": "0.12.*", - "utopia-php/framework": "0.33.*", - "utopia-php/mongo": "0.3.*" + "utopia-php/framework": "0.33.*" }, "require-dev": { "fakerphp/faker": "1.23.*", @@ -3755,9 +3546,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/0.61.2" + "source": "https://github.com/utopia-php/database/tree/0.62.1" }, - "time": "2025-03-15T11:47:42+00:00" + "time": "2025-03-24T08:27:18+00:00" }, { "name": "utopia-php/domains", @@ -4159,16 +3950,16 @@ }, { "name": "utopia-php/migration", - "version": "0.8.1", + "version": "0.8.2", "source": { "type": "git", "url": "https://github.com/utopia-php/migration.git", - "reference": "36ec7af2e6bf78de5d86e1b0a953fd7dcdf69dab" + "reference": "aa3b7a508feb7090f487e7bf9cd71f5c92fbc7c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/migration/zipball/36ec7af2e6bf78de5d86e1b0a953fd7dcdf69dab", - "reference": "36ec7af2e6bf78de5d86e1b0a953fd7dcdf69dab", + "url": "https://api.github.com/repos/utopia-php/migration/zipball/aa3b7a508feb7090f487e7bf9cd71f5c92fbc7c1", + "reference": "aa3b7a508feb7090f487e7bf9cd71f5c92fbc7c1", "shasum": "" }, "require": { @@ -4176,7 +3967,7 @@ "ext-curl": "*", "ext-openssl": "*", "php": ">=8.1", - "utopia-php/database": "0.61.*", + "utopia-php/database": "0.62.*", "utopia-php/dsn": "0.2.*", "utopia-php/framework": "0.33.*", "utopia-php/storage": "0.18.*" @@ -4209,69 +4000,9 @@ ], "support": { "issues": "https://github.com/utopia-php/migration/issues", - "source": "https://github.com/utopia-php/migration/tree/0.8.1" + "source": "https://github.com/utopia-php/migration/tree/0.8.2" }, - "time": "2025-03-18T07:48:08+00:00" - }, - { - "name": "utopia-php/mongo", - "version": "0.3.1", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/mongo.git", - "reference": "52326a9a43e2d27ff0c15c48ba746dacbe9a7aee" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/mongo/zipball/52326a9a43e2d27ff0c15c48ba746dacbe9a7aee", - "reference": "52326a9a43e2d27ff0c15c48ba746dacbe9a7aee", - "shasum": "" - }, - "require": { - "ext-mongodb": "*", - "mongodb/mongodb": "1.10.0", - "php": ">=8.0" - }, - "require-dev": { - "fakerphp/faker": "^1.14", - "laravel/pint": "1.2.*", - "phpstan/phpstan": "1.8.*", - "phpunit/phpunit": "^9.4", - "swoole/ide-helper": "4.8.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Mongo\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eldad Fux", - "email": "eldad@appwrite.io" - }, - { - "name": "Wess", - "email": "wess@appwrite.io" - } - ], - "description": "A simple library to manage Mongo database", - "keywords": [ - "database", - "mongo", - "php", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/mongo/issues", - "source": "https://github.com/utopia-php/mongo/tree/0.3.1" - }, - "time": "2023-09-01T17:25:28+00:00" + "time": "2025-03-24T09:05:31+00:00" }, { "name": "utopia-php/orchestration", From 5479e6f8f1f51691e168564b2592d15df917a421 Mon Sep 17 00:00:00 2001 From: Fabian Gruber Date: Tue, 18 Mar 2025 12:29:32 +0100 Subject: [PATCH 026/124] chore(audits): return queue pre-fetch results --- src/Appwrite/Platform/Workers/Audits.php | 49 +++++++++++++----------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/Appwrite/Platform/Workers/Audits.php b/src/Appwrite/Platform/Workers/Audits.php index ed5ff8010a..962bc622d1 100644 --- a/src/Appwrite/Platform/Workers/Audits.php +++ b/src/Appwrite/Platform/Workers/Audits.php @@ -12,12 +12,12 @@ use Utopia\Database\Exception\Authorization; use Utopia\Database\Exception\Structure; use Utopia\Platform\Action; use Utopia\Queue\Message; +use Utopia\Queue\Result\Commit; +use Utopia\Queue\Result\NoCommit; use Utopia\System\System; class Audits extends Action { - protected const BATCH_SIZE_DEVELOPMENT = 1; // smaller batch size for development - protected const BATCH_SIZE_PRODUCTION = 5_000; protected const BATCH_AGGREGATION_INTERVAL = 60; // in seconds private int $lastTriggeredTime = 0; @@ -27,9 +27,7 @@ class Audits extends Action protected function getBatchSize(): int { - return System::getEnv('_APP_ENV', 'development') === 'development' - ? self::BATCH_SIZE_DEVELOPMENT - : self::BATCH_SIZE_PRODUCTION; + return intval(System::getEnv('_APP_QUEUE_PREFETCH_COUNT', 1)); } public static function getName(): string @@ -57,13 +55,13 @@ class Audits extends Action * @param Message $message * @param callable $getProjectDB * @param Document $project - * @return void + * @return Commit|NoCommit * @throws Throwable * @throws \Utopia\Database\Exception * @throws Authorization * @throws Structure */ - public function action(Message $message, callable $getProjectDB, Document $project): void + public function action(Message $message, callable $getProjectDB, Document $project): Commit|NoCommit { $payload = $message->getPayload() ?? []; @@ -119,29 +117,34 @@ class Audits extends Action // Check if we should process the batch by checking both for the batch size and the elapsed time $batchSize = $this->getBatchSize(); - $shouldProcessBatch = \count($this->logs) >= $batchSize; - if (!$shouldProcessBatch && \count($this->logs) > 0) { + $logCount = array_reduce($this->logs, fn (int $current, $logs) => $current + count($logs), 0); + $shouldProcessBatch = $logCount >= $batchSize; + if (!$shouldProcessBatch && $logCount > 0) { $shouldProcessBatch = (\time() - $this->lastTriggeredTime) >= self::BATCH_AGGREGATION_INTERVAL; } - if ($shouldProcessBatch) { - try { - foreach ($this->logs as $internalId => $projectLogs) { - $dbForProject = $getProjectDB($projectLogs['project']); + if (!$shouldProcessBatch) { + return new NoCommit(); + } - Console::log('Processing batch with ' . count($projectLogs['logs']) . ' events'); - $audit = new Audit($dbForProject); + try { + foreach ($this->logs as $internalId => $projectLogs) { + $dbForProject = $getProjectDB($projectLogs['project']); - $audit->logBatch($projectLogs['logs']); - Console::success('Audit logs processed successfully'); + Console::log('Processing batch with ' . count($projectLogs['logs']) . ' events'); + $audit = new Audit($dbForProject); - unset($this->logs[$internalId]); - } - } catch (Throwable $e) { - Console::error('Error processing audit logs: ' . $e->getMessage()); - } finally { - $this->lastTriggeredTime = time(); + $audit->logBatch($projectLogs['logs']); + Console::success('Audit logs processed successfully'); + + unset($this->logs[$internalId]); } + return new Commit(); + } catch (Throwable $e) { + Console::error('Error processing audit logs: ' . $e->getMessage()); + return new NoCommit(); + } finally { + $this->lastTriggeredTime = time(); } } } From bd18edc197af640253bc58cbf668ed2491c7d352 Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Mon, 24 Mar 2025 15:50:25 +0530 Subject: [PATCH 027/124] If build has failed, show correct error page --- app/config/errors.php | 5 +++++ app/controllers/general.php | 6 +++++- src/Appwrite/Extend/Exception.php | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/config/errors.php b/app/config/errors.php index 58e95cf5d4..c3b791f613 100644 --- a/app/config/errors.php +++ b/app/config/errors.php @@ -580,6 +580,11 @@ return [ 'description' => 'Build with the requested ID is already completed and cannot be canceled.', 'code' => 400, ], + Exception::BUILD_FAILED => [ + 'name' => Exception::BUILD_FAILED, + 'description' => 'Build with the requested ID failed. Please check the logs for more information.', + 'code' => 400, + ], /** Deployments */ Exception::DEPLOYMENT_NOT_FOUND => [ diff --git a/app/controllers/general.php b/app/controllers/general.php index 3afe1d8a3d..c378ba817a 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -269,10 +269,14 @@ function router(App $utopia, Database $dbForPlatform, callable $getProjectDB, Sw throw new AppwriteException(AppwriteException::FUNCTION_RUNTIME_UNSUPPORTED, 'Runtime "' . $resource->getAttribute('runtime', '') . '" is not supported'); } - if ($deployment->getAttribute('status') !== 'ready') { + if ($deployment->getAttribute('status') === 'waiting' || $deployment->getAttribute('status') === 'processing' || $deployment->getAttribute('status') === 'building') { throw new AppwriteException(AppwriteException::BUILD_NOT_READY); } + if ($deployment->getAttribute('status') === 'failed') { + throw new AppwriteException(AppwriteException::BUILD_FAILED); + } + if ($type === 'function') { $permissions = $resource->getAttribute('execute'); if (!(\in_array('any', $permissions)) && !(\in_array('guests', $permissions))) { diff --git a/src/Appwrite/Extend/Exception.php b/src/Appwrite/Extend/Exception.php index db8f5f7134..338da29403 100644 --- a/src/Appwrite/Extend/Exception.php +++ b/src/Appwrite/Extend/Exception.php @@ -174,6 +174,7 @@ class Exception extends \Exception public const BUILD_NOT_READY = 'build_not_ready'; public const BUILD_IN_PROGRESS = 'build_in_progress'; public const BUILD_ALREADY_COMPLETED = 'build_already_completed'; + public const BUILD_FAILED = 'build_failed'; /** Execution */ public const EXECUTION_NOT_FOUND = 'execution_not_found'; From 25b6d59e3071b6d223cb53c8e9453631d5f3ec43 Mon Sep 17 00:00:00 2001 From: fogelito Date: Mon, 24 Mar 2025 12:54:19 +0200 Subject: [PATCH 028/124] Add internalId --- src/Appwrite/Utopia/Database/Validator/Queries/Base.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Appwrite/Utopia/Database/Validator/Queries/Base.php b/src/Appwrite/Utopia/Database/Validator/Queries/Base.php index b8cff64214..d1b143ec9b 100644 --- a/src/Appwrite/Utopia/Database/Validator/Queries/Base.php +++ b/src/Appwrite/Utopia/Database/Validator/Queries/Base.php @@ -60,11 +60,19 @@ class Base extends Queries 'type' => Database::VAR_STRING, 'array' => false, ]); + + $attributes[] = new Document([ + 'key' => '$internalId', + 'type' => Database::VAR_STRING, + 'array' => false, + ]); + $attributes[] = new Document([ 'key' => '$createdAt', 'type' => Database::VAR_DATETIME, 'array' => false, ]); + $attributes[] = new Document([ 'key' => '$updatedAt', 'type' => Database::VAR_DATETIME, From 42f72b4477ef951aa131429f4f513579b2a4cf46 Mon Sep 17 00:00:00 2001 From: fogelito Date: Mon, 24 Mar 2025 13:33:36 +0200 Subject: [PATCH 029/124] Add internalId to orders --- .../Utopia/Database/Validator/Queries/Base.php | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Appwrite/Utopia/Database/Validator/Queries/Base.php b/src/Appwrite/Utopia/Database/Validator/Queries/Base.php index d1b143ec9b..85fbf43e66 100644 --- a/src/Appwrite/Utopia/Database/Validator/Queries/Base.php +++ b/src/Appwrite/Utopia/Database/Validator/Queries/Base.php @@ -61,12 +61,6 @@ class Base extends Queries 'array' => false, ]); - $attributes[] = new Document([ - 'key' => '$internalId', - 'type' => Database::VAR_STRING, - 'array' => false, - ]); - $attributes[] = new Document([ 'key' => '$createdAt', 'type' => Database::VAR_DATETIME, @@ -84,8 +78,15 @@ class Base extends Queries new Offset(), new Cursor(), new Filter($attributes, APP_DATABASE_QUERY_MAX_VALUES), - new Order($attributes), - ]; + new Order( + array_merge($attributes, [ + new Document([ + 'key' => '$internalId', + 'type' => Database::VAR_STRING, + 'array' => false, + ]) + ]) + )]; parent::__construct($validators); } From 0648de2046c3b7561d37877b3b06c8c811ddc06d Mon Sep 17 00:00:00 2001 From: fogelito Date: Mon, 24 Mar 2025 14:32:57 +0200 Subject: [PATCH 030/124] Revert Base --- .../Utopia/Database/Validator/Queries/Base.php | 13 ++----------- .../Databases/DatabasesCustomServerTest.php | 4 ++-- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/Appwrite/Utopia/Database/Validator/Queries/Base.php b/src/Appwrite/Utopia/Database/Validator/Queries/Base.php index 85fbf43e66..b8cff64214 100644 --- a/src/Appwrite/Utopia/Database/Validator/Queries/Base.php +++ b/src/Appwrite/Utopia/Database/Validator/Queries/Base.php @@ -60,13 +60,11 @@ class Base extends Queries 'type' => Database::VAR_STRING, 'array' => false, ]); - $attributes[] = new Document([ 'key' => '$createdAt', 'type' => Database::VAR_DATETIME, 'array' => false, ]); - $attributes[] = new Document([ 'key' => '$updatedAt', 'type' => Database::VAR_DATETIME, @@ -78,15 +76,8 @@ class Base extends Queries new Offset(), new Cursor(), new Filter($attributes, APP_DATABASE_QUERY_MAX_VALUES), - new Order( - array_merge($attributes, [ - new Document([ - 'key' => '$internalId', - 'type' => Database::VAR_STRING, - 'array' => false, - ]) - ]) - )]; + new Order($attributes), + ]; parent::__construct($validators); } diff --git a/tests/e2e/Services/Databases/DatabasesCustomServerTest.php b/tests/e2e/Services/Databases/DatabasesCustomServerTest.php index 57e0b93634..70f8bea4f2 100644 --- a/tests/e2e/Services/Databases/DatabasesCustomServerTest.php +++ b/tests/e2e/Services/Databases/DatabasesCustomServerTest.php @@ -120,7 +120,7 @@ class DatabasesCustomServerTest extends Scope 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ 'queries' => [ - Query::orderDesc()->toString(), + Query::orderDesc()->setAttribute('')->toString(), ], ]); @@ -453,7 +453,7 @@ class DatabasesCustomServerTest extends Scope 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ 'queries' => [ - Query::orderDesc()->toString(), + Query::orderDesc()->setAttribute('')->toString(), ], ]); From 9fd8c5ab9d70f28d70331b5db4363a5db816e9e2 Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Mon, 24 Mar 2025 20:04:02 +0530 Subject: [PATCH 031/124] Add fallbackfile and adapter to deployments collection --- app/config/collections/projects.php | 22 +++ app/config/templates/site.php | 134 +++++++++--------- app/controllers/api/vcs.php | 2 + app/controllers/general.php | 10 +- .../Platform/Modules/Compute/Base.php | 2 + .../Modules/Functions/Workers/Builds.php | 4 + .../Modules/Sites/Http/Deployments/Create.php | 8 +- .../Http/Deployments/Duplicate/Create.php | 2 + .../Http/Deployments/Template/Create.php | 2 + .../Services/Sites/SitesCustomServerTest.php | 69 +++++++++ 10 files changed, 181 insertions(+), 74 deletions(-) diff --git a/app/config/collections/projects.php b/app/config/collections/projects.php index b209a7ec32..8966a5abda 100644 --- a/app/config/collections/projects.php +++ b/app/config/collections/projects.php @@ -1725,6 +1725,28 @@ return [ 'default' => '', 'array' => false, 'filters' => [], + ], + [ + '$id' => ID::custom('adapter'), + 'type' => Database::VAR_STRING, + 'format' => '', + 'size' => 128, + 'signed' => true, + 'required' => false, + 'default' => '', + 'array' => false, + 'filters' => [], + ], + [ + '$id' => ID::custom('fallbackFile'), + 'type' => Database::VAR_STRING, + 'format' => '', + 'size' => Database::LENGTH_KEY, + 'signed' => true, + 'required' => false, + 'default' => null, + 'array' => false, + 'filters' => [], ] ], 'indexes' => [ diff --git a/app/config/templates/site.php b/app/config/templates/site.php index d21a7bc34f..1130d55fcf 100644 --- a/app/config/templates/site.php +++ b/app/config/templates/site.php @@ -143,80 +143,80 @@ function getFramework(string $frameworkEnum, array $overrides) } return [ -[ - 'key' => 'nxt-lnk', - 'name' => 'Nxt Lnk', - 'useCases' => ['portfolio'], - 'screenshotDark' => $url . '/images/sites/templates/nxt-lnk-dark.png', - 'screenshotLight' => $url . '/images/sites/templates/nxt-lnk-light.png', - 'frameworks' => [ - getFramework('NEXTJS', [ - 'providerRootDirectory' => './nextjs/nxtlnk', - ]), + [ + 'key' => 'nxt-lnk', + 'name' => 'Nxt Lnk', + 'useCases' => ['portfolio'], + 'screenshotDark' => $url . '/images/sites/templates/nxt-lnk-dark.png', + 'screenshotLight' => $url . '/images/sites/templates/nxt-lnk-light.png', + 'frameworks' => [ + getFramework('NEXTJS', [ + 'providerRootDirectory' => './nextjs/nxtlnk', + ]), + ], + 'vcsProvider' => 'github', + 'providerRepositoryId' => 'templates-for-sites', + 'providerOwner' => 'appwrite', + 'providerVersion' => '0.3.*', + 'variables' => [] ], - 'vcsProvider' => 'github', - 'providerRepositoryId' => 'templates-for-sites', - 'providerOwner' => 'appwrite', - 'providerVersion' => '0.3.*', - 'variables' => [] -], -[ - 'key' => 'magic-portfolio', - 'name' => 'Magic Portfolio', - 'useCases' => ['portfolio'], - 'screenshotDark' => $url . '/images/sites/templates/magic-portfolio-dark.png', - 'screenshotLight' => $url . '/images/sites/templates/magic-portfolio-light.png', - 'frameworks' => [ - getFramework('NEXTJS', [ - 'providerRootDirectory' => './nextjs/magic-portfolio', - ]), + [ + 'key' => 'magic-portfolio', + 'name' => 'Magic Portfolio', + 'useCases' => ['portfolio'], + 'screenshotDark' => $url . '/images/sites/templates/magic-portfolio-dark.png', + 'screenshotLight' => $url . '/images/sites/templates/magic-portfolio-light.png', + 'frameworks' => [ + getFramework('NEXTJS', [ + 'providerRootDirectory' => './nextjs/magic-portfolio', + ]), + ], + 'vcsProvider' => 'github', + 'providerRepositoryId' => 'templates-for-sites', + 'providerOwner' => 'appwrite', + 'providerVersion' => '0.3.*', + 'variables' => [] ], - 'vcsProvider' => 'github', - 'providerRepositoryId' => 'templates-for-sites', - 'providerOwner' => 'appwrite', - 'providerVersion' => '0.3.*', - 'variables' => [] -], -[ - 'key' => 'littlelink', - 'name' => 'LittleLink', - 'useCases' => ['portfolio'], - 'screenshotDark' => $url . '/images/sites/templates/littlelink-dark.png', - 'screenshotLight' => $url . '/images/sites/templates/littlelink-light.png', - 'frameworks' => [ - getFramework('OTHER', [ - 'providerRootDirectory' => './other/littlelink', - ]), + [ + 'key' => 'littlelink', + 'name' => 'LittleLink', + 'useCases' => ['portfolio'], + 'screenshotDark' => $url . '/images/sites/templates/littlelink-dark.png', + 'screenshotLight' => $url . '/images/sites/templates/littlelink-light.png', + 'frameworks' => [ + getFramework('OTHER', [ + 'providerRootDirectory' => './other/littlelink', + ]), + ], + 'vcsProvider' => 'github', + 'providerRepositoryId' => 'templates-for-sites', + 'providerOwner' => 'appwrite', + 'providerVersion' => '0.3.*', + 'variables' => [] ], - 'vcsProvider' => 'github', - 'providerRepositoryId' => 'templates-for-sites', - 'providerOwner' => 'appwrite', - 'providerVersion' => '0.3.*', - 'variables' => [] -], -[ - 'key' => 'logspot', - 'name' => 'Logspot', - 'useCases' => ['blog'], - 'screenshotDark' => $url . '/images/sites/templates/logspot-dark.png', - 'screenshotLight' => $url . '/images/sites/templates/logspot-light.png', - 'frameworks' => [ - getFramework('NUXT', [ - 'providerRootDirectory' => './nuxt/logspot', - 'buildCommand' => 'npm run generate', - 'outputDirectory' => './dist', - 'adapter' => 'static', - ]), + [ + 'key' => 'logspot', + 'name' => 'Logspot', + 'useCases' => ['blog'], + 'screenshotDark' => $url . '/images/sites/templates/logspot-dark.png', + 'screenshotLight' => $url . '/images/sites/templates/logspot-light.png', + 'frameworks' => [ + getFramework('NUXT', [ + 'providerRootDirectory' => './nuxt/logspot', + 'buildCommand' => 'npm run generate', + 'outputDirectory' => './dist', + 'adapter' => 'static', + ]), + ], + 'vcsProvider' => 'github', + 'providerRepositoryId' => 'templates-for-sites', + 'providerOwner' => 'appwrite', + 'providerVersion' => '0.3.*', + 'variables' => [] ], - 'vcsProvider' => 'github', - 'providerRepositoryId' => 'templates-for-sites', - 'providerOwner' => 'appwrite', - 'providerVersion' => '0.3.*', - 'variables' => [] -], [ 'key' => 'astro-nano', 'name' => 'Astro Nano', diff --git a/app/controllers/api/vcs.php b/app/controllers/api/vcs.php index 107be3d888..5b2cabdab2 100644 --- a/app/controllers/api/vcs.php +++ b/app/controllers/api/vcs.php @@ -232,6 +232,8 @@ $createGitDeployments = function (GitHub $github, string $providerInstallationId 'entrypoint' => $resource->getAttribute('entrypoint', ''), 'buildCommands' => \implode(' && ', $commands), 'buildOutput' => $resource->getAttribute('outputDirectory', ''), + 'adapter' => $resource->getAttribute('adapter', ''), + 'fallbackFile' => $resource->getAttribute('fallbackFile', ''), 'type' => 'vcs', 'installationId' => $installationId, 'installationInternalId' => $installationInternalId, diff --git a/app/controllers/general.php b/app/controllers/general.php index 3afe1d8a3d..3f105484e1 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -261,7 +261,7 @@ function router(App $utopia, Database $dbForPlatform, callable $getProjectDB, Sw }; // Static site enforced runtime - if ($resource->getAttribute('adapter', '') === 'static') { + if ($deployment->getAttribute('adapter', '') === 'static') { $runtime = $runtimes['static-1'] ?? null; } @@ -410,8 +410,8 @@ function router(App $utopia, Database $dbForPlatform, callable $getProjectDB, Sw ]); // SPA fallbackFile override - if ($resource->getAttribute('adapter', '') === 'static' && $resource->getAttribute('fallbackFile', '') !== '') { - $vars['OPEN_RUNTIMES_STATIC_FALLBACK'] = $resource->getAttribute('fallbackFile', ''); + if ($deployment->getAttribute('adapter', '') === 'static' && $deployment->getAttribute('fallbackFile', '') !== '') { + $vars['OPEN_RUNTIMES_STATIC_FALLBACK'] = $deployment->getAttribute('fallbackFile', ''); } /** Execute function */ @@ -438,7 +438,7 @@ function router(App $utopia, Database $dbForPlatform, callable $getProjectDB, Sw $startCommand = $runtime['startCommand']; if (!is_null($framework)) { - $adapter = ($framework['adapters'] ?? [])[$resource->getAttribute('adapter', '')] ?? null; + $adapter = ($framework['adapters'] ?? [])[$deployment->getAttribute('adapter', '')] ?? null; if (!is_null($adapter) && isset($adapter['startCommand'])) { $startCommand = $adapter['startCommand']; } @@ -473,7 +473,7 @@ function router(App $utopia, Database $dbForPlatform, callable $getProjectDB, Sw ); // Branded 404 override - if ($executionResponse['statusCode'] === 404 && $resource->getAttribute('adapter', '') === 'static') { + if ($executionResponse['statusCode'] === 404 && $deployment->getAttribute('adapter', '') === 'static') { $layout = new View(__DIR__ . '/../views/general/404.phtml'); $executionResponse['body'] = $layout->render(); $executionResponse['headers']['content-length'] = \strlen($executionResponse['body']); diff --git a/src/Appwrite/Platform/Modules/Compute/Base.php b/src/Appwrite/Platform/Modules/Compute/Base.php index 6d44be239d..542b29bcd5 100644 --- a/src/Appwrite/Platform/Modules/Compute/Base.php +++ b/src/Appwrite/Platform/Modules/Compute/Base.php @@ -171,6 +171,8 @@ class Base extends Action 'resourceType' => 'sites', 'buildCommands' => implode(' && ', $commands), 'buildOutput' => $site->getAttribute('outputDirectory', ''), + 'adapter' => $site->getAttribute('adapter', ''), + 'fallbackFile' => $site->getAttribute('fallbackFile', ''), 'type' => 'vcs', 'installationId' => $installation->getId(), 'installationInternalId' => $installation->getInternalId(), diff --git a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php index 9ea5638ac3..3f28e7a7ce 100644 --- a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php +++ b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php @@ -768,6 +768,10 @@ class Builds extends Action $resource->setAttribute('adapter', $detection->getName()); $resource->setAttribute('fallbackFile', $detection->getFallbackFile() ?? ''); $resource = $dbForProject->updateDocument('sites', $resource->getId(), $resource); + + $deployment->setAttribute('adapter', $detection->getName()); + $deployment->setAttribute('fallbackFile', $detection->getFallbackFile() ?? ''); + $deployment = $dbForProject->updateDocument('deployments', $deployment->getId(), $deployment); } elseif ($adapter === 'ssr' && $detection->getName() === 'static') { throw new \Exception('Adapter mismatch. Detected: ' . $detection->getName() . ' does not match with the set adapter: ' . $adapter); } diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Create.php index ab2d9282ac..0b45c42e4b 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Create.php @@ -241,13 +241,15 @@ class Create extends Action 'resourceType' => 'sites', 'buildCommands' => \implode(' && ', $commands), 'buildOutput' => $outputDirectory, + 'adapter' => $site->getAttribute('adapter', ''), + 'fallbackFile' => $site->getAttribute('fallbackFile', ''), 'sourcePath' => $path, 'sourceSize' => $fileSize, 'totalSize' => $fileSize, 'search' => implode(' ', [$deploymentId]), 'activate' => $activate, 'sourceMetadata' => $metadata, - 'type' => $type + 'type' => $type, ])); $site = $site @@ -306,6 +308,8 @@ class Create extends Action 'resourceType' => 'sites', 'buildCommands' => \implode(' && ', $commands), 'buildOutput' => $outputDirectory, + 'adapter' => $site->getAttribute('adapter', ''), + 'fallbackFile' => $site->getAttribute('fallbackFile', ''), 'sourcePath' => $path, 'sourceSize' => $fileSize, 'totalSize' => $fileSize, @@ -314,7 +318,7 @@ class Create extends Action 'search' => implode(' ', [$deploymentId]), 'activate' => $activate, 'sourceMetadata' => $metadata, - 'type' => $type + 'type' => $type, ])); $site = $site diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Duplicate/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Duplicate/Create.php index 9e33a6b839..1b3b08b7e3 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Duplicate/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Duplicate/Create.php @@ -114,6 +114,8 @@ class Create extends Action 'totalSize' => $deployment->getAttribute('sourceSize', 0), 'buildCommands' => \implode(' && ', $commands), 'buildOutput' => $site->getAttribute('outputDirectory', ''), + 'adapter' => $site->getAttribute('adapter', ''), + 'fallbackFile' => $site->getAttribute('fallbackFile', ''), 'search' => implode(' ', [$deploymentId]), 'screenshotLight' => '', 'screenshotDark' => '', diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Template/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Template/Create.php index c3a4b3ca96..a27ce4b2ba 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Template/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Template/Create.php @@ -156,6 +156,8 @@ class Create extends Base 'resourceType' => 'sites', 'buildCommands' => \implode(' && ', $commands), 'buildOutput' => $site->getAttribute('outputDirectory', ''), + 'adapter' => $site->getAttribute('adapter', ''), + 'fallbackFile' => $site->getAttribute('fallbackFile', ''), 'type' => 'manual', 'search' => implode(' ', [$deploymentId]), 'activate' => $activate, diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index a95568c7ce..5ce4ab350b 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -539,6 +539,75 @@ class SitesCustomServerTest extends Scope $this->cleanupSite($siteId); } + public function testSettingsForRollback(): void + { + $siteId = $this->setupSite([ + 'siteId' => ID::unique(), + 'name' => 'Static site', + 'framework' => 'other', + 'buildRuntime' => 'node-22', + 'outputDirectory' => '', + 'buildCommand' => '', + 'installCommand' => '', + ]); + $this->assertNotEmpty($siteId); + + $site = $this->getSite($siteId); + $this->assertEquals('200', $site['headers']['status-code']); + $this->assertArrayHasKey('adapter', $site['body']); + $this->assertArrayHasKey('fallbackFile', $site['body']); + $this->assertEmpty($site['body']['adapter']); + $this->assertEmpty($site['body']['fallbackFile']); + + $domain = $this->setupSiteDomain($siteId); + $this->assertNotEmpty($domain); + + $deploymentId1 = $this->setupDeployment($siteId, [ + 'code' => $this->packageSite('static-single-file'), + 'activate' => 'true' + ]); + $this->assertNotEmpty($deploymentId1); + + $site = $this->getSite($siteId); + $this->assertEquals('200', $site['headers']['status-code']); + $this->assertEquals('static', $site['body']['adapter']); + $this->assertEquals('main.html', $site['body']['fallbackFile']); + + $site = $this->updateSite([ + 'fallbackFile' => 'hello.html', + 'adapter' => 'ssr', + 'buildCommand' => 'npm run build', + 'installCommand' => 'npm install', + '$id' => $siteId + ]); + + $deploymentId2 = $this->setupDeployment($siteId, [ + 'code' => $this->packageSite('astro'), + 'activate' => 'true' + ]); + $this->assertNotEmpty($deploymentId2); + + $proxyClient = new Client(); + $proxyClient->setEndpoint('http://' . $domain); + $response = $proxyClient->call(Client::METHOD_GET, '/'); + $this->assertEquals(404, $response['headers']['status-code']); + + $response = $this->updateSiteDeployment($siteId, $deploymentId1); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + + $proxyClient = new Client(); + $proxyClient->setEndpoint('http://' . $domain); + $response = $proxyClient->call(Client::METHOD_GET, '/'); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertStringContainsString('Main page', $response['body']); + $response = $proxyClient->call(Client::METHOD_GET, '/something'); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertStringContainsString('Main page', $response['body']); + + $this->cleanupSite($siteId); + } + public function testListSites(): void { /** From e11e7e6780cbf8a3dc2ac10c4302360b7d4963c5 Mon Sep 17 00:00:00 2001 From: fogelito Date: Mon, 24 Mar 2025 17:33:02 +0200 Subject: [PATCH 032/124] Add internalId --- src/Appwrite/Utopia/Database/Validator/Queries/Base.php | 8 +++++++- .../e2e/Services/Databases/DatabasesCustomServerTest.php | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Utopia/Database/Validator/Queries/Base.php b/src/Appwrite/Utopia/Database/Validator/Queries/Base.php index b8cff64214..a13314ab2f 100644 --- a/src/Appwrite/Utopia/Database/Validator/Queries/Base.php +++ b/src/Appwrite/Utopia/Database/Validator/Queries/Base.php @@ -71,12 +71,18 @@ class Base extends Queries 'array' => false, ]); + $internalId = new Document([ + 'key' => '$internalId', + 'type' => Database::VAR_STRING, + 'array' => false, + ]); + $validators = [ new Limit(), new Offset(), new Cursor(), new Filter($attributes, APP_DATABASE_QUERY_MAX_VALUES), - new Order($attributes), + new Order(array_merge($attributes, [$internalId])), ]; parent::__construct($validators); diff --git a/tests/e2e/Services/Databases/DatabasesCustomServerTest.php b/tests/e2e/Services/Databases/DatabasesCustomServerTest.php index 70f8bea4f2..55cb17b9f8 100644 --- a/tests/e2e/Services/Databases/DatabasesCustomServerTest.php +++ b/tests/e2e/Services/Databases/DatabasesCustomServerTest.php @@ -123,7 +123,7 @@ class DatabasesCustomServerTest extends Scope Query::orderDesc()->setAttribute('')->toString(), ], ]); - + var_dump($databases); $this->assertEquals(2, $databases['body']['total']); $this->assertEquals($base[0]['$id'], $databases['body']['databases'][0]['$id']); $this->assertEquals($base[1]['$id'], $databases['body']['databases'][1]['$id']); From 5799ca1041b8f945c45285f557a35ef6b8633381 Mon Sep 17 00:00:00 2001 From: fogelito Date: Mon, 24 Mar 2025 17:37:34 +0200 Subject: [PATCH 033/124] remove var_dump --- tests/e2e/Services/Databases/DatabasesCustomServerTest.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/e2e/Services/Databases/DatabasesCustomServerTest.php b/tests/e2e/Services/Databases/DatabasesCustomServerTest.php index 55cb17b9f8..206567e789 100644 --- a/tests/e2e/Services/Databases/DatabasesCustomServerTest.php +++ b/tests/e2e/Services/Databases/DatabasesCustomServerTest.php @@ -120,10 +120,9 @@ class DatabasesCustomServerTest extends Scope 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ 'queries' => [ - Query::orderDesc()->setAttribute('')->toString(), + Query::orderDesc()->toString(), ], ]); - var_dump($databases); $this->assertEquals(2, $databases['body']['total']); $this->assertEquals($base[0]['$id'], $databases['body']['databases'][0]['$id']); $this->assertEquals($base[1]['$id'], $databases['body']['databases'][1]['$id']); @@ -453,7 +452,7 @@ class DatabasesCustomServerTest extends Scope 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ 'queries' => [ - Query::orderDesc()->setAttribute('')->toString(), + Query::orderDesc()->toString(), ], ]); From 2795505e8288074f8981edb90e5f3279bfaf9938 Mon Sep 17 00:00:00 2001 From: fogelito Date: Mon, 24 Mar 2025 17:38:01 +0200 Subject: [PATCH 034/124] line --- tests/e2e/Services/Databases/DatabasesCustomServerTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/e2e/Services/Databases/DatabasesCustomServerTest.php b/tests/e2e/Services/Databases/DatabasesCustomServerTest.php index 206567e789..57e0b93634 100644 --- a/tests/e2e/Services/Databases/DatabasesCustomServerTest.php +++ b/tests/e2e/Services/Databases/DatabasesCustomServerTest.php @@ -123,6 +123,7 @@ class DatabasesCustomServerTest extends Scope Query::orderDesc()->toString(), ], ]); + $this->assertEquals(2, $databases['body']['total']); $this->assertEquals($base[0]['$id'], $databases['body']['databases'][0]['$id']); $this->assertEquals($base[1]['$id'], $databases['body']['databases'][1]['$id']); From c0cb4b26a3ebf73822f0abea8c6aeae9dd4d8875 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 25 Mar 2025 15:51:47 +1300 Subject: [PATCH 035/124] Apply suggestions from code review --- src/Appwrite/Platform/Workers/Deletes.php | 35 ++++------------------- 1 file changed, 5 insertions(+), 30 deletions(-) diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 8deb227c78..0de79cd67e 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -305,9 +305,6 @@ class Deletes extends Action */ private function deleteExpiredTargets(Document $project, callable $getProjectDB): void { - /** - * todo: No index found for `expired` attribute - */ $this->deleteByGroup( 'targets', [ @@ -323,9 +320,6 @@ class Deletes extends Action private function deleteSessionTargets(Document $project, callable $getProjectDB, Document $session): void { - /** - * todo: No index found for `sessionInternalId` attribute - */ $this->deleteByGroup( 'targets', [ @@ -368,10 +362,6 @@ class Deletes extends Action $queries[] = Query::select(['$internalId', '$id', '$updatedAt']); $queries[] = Query::orderAsc(); - /** - * todo: No index on `resource`, `resourceType`, But it is fine since resource index is a strong index! - */ - $this->deleteByGroup( 'cache', $queries, @@ -446,7 +436,7 @@ class Deletes extends Action Query::equal('period', ['1h']), Query::lessThan('time', $hourlyUsageRetentionDatetime), Query::orderDesc('time'), - Query::orderDesc(), // _key_period_time `period` ASC, `time `ASC + Query::orderDesc(), ], $dbForProject); if ($project->getId() !== 'console') { @@ -459,7 +449,7 @@ class Deletes extends Action Query::equal('period', ['1h']), Query::lessThan('time', $hourlyUsageRetentionDatetime), Query::orderDesc('time'), - Query::orderDesc(), // _key_period_time `period` ASC, `time `ASC + Query::orderDesc(), ], $dbForLogs); } } @@ -639,11 +629,7 @@ class Deletes extends Action Query::orderAsc() ], $dbForPlatform); - /** - * No projectInternalId in this collection - * todo: No index for `projectId` attribute - */ - // Delete Schedules () + // Delete Schedules $this->deleteByGroup('schedules', [ Query::equal('projectId', [$projectId]), Query::orderAsc() @@ -724,9 +710,6 @@ class Deletes extends Action ], $dbForProject); // Delete identities - /** - * todo: Remove Duplication index `_key_userInternalId` , But lets leave because of index length issue in unique index - */ $this->deleteByGroup('identities', [ Query::equal('userInternalId', [$userInternalId]), Query::orderAsc() @@ -799,7 +782,7 @@ class Deletes extends Action $this->deleteByGroup('realtime', [ Query::lessThan('timestamp', $datetime), Query::orderDesc('timestamp'), - Query::orderAsc(), // KEY "_key_timestamp" ("timestamp" DESC), + Query::orderAsc(), ], $dbForPlatform); } @@ -820,7 +803,7 @@ class Deletes extends Action Query::select(['$internalId', '$id', '$updatedAt']), Query::lessThan('time', $auditRetention), Query::orderDesc('time'), - Query::orderAsc(), // KEY "index-time" ("time" DESC) + Query::orderAsc(), ], $dbForProject); } catch (DatabaseException $e) { Console::error('Failed to delete audit logs for project ' . $projectId . ': ' . $e->getMessage()); @@ -845,7 +828,6 @@ class Deletes extends Action /** * Delete rules - * todo: No index for this query, drop _key_projectInternalId and create _key_projectInternalId, resourceInternalId, resourceType */ Console::info("Deleting rules for function " . $functionId); $this->deleteByGroup('rules', [ @@ -859,7 +841,6 @@ class Deletes extends Action /** * Delete Variables - * todo: No index for this query , drop _key_resourceInternalId and create new one with {resourceInternalId, resourceType} */ Console::info("Deleting variables for function " . $functionId); $this->deleteByGroup('variables', [ @@ -885,7 +866,6 @@ class Deletes extends Action /** * Delete builds - * todo: No index for `deploymentInternalId`, perhaps use deploymentId until fixed */ Console::info("Deleting builds for function " . $functionId); @@ -900,7 +880,6 @@ class Deletes extends Action /** * Delete Executions - * todo: No index for `functionInternalId` , perhaps use functionId until fixed */ Console::info("Deleting executions for function " . $functionId); $this->deleteByGroup('executions', [ @@ -923,9 +902,6 @@ class Deletes extends Action $providerRepositoryId = $document->getAttribute('providerRepositoryId', ''); $projectInternalId = $document->getAttribute('projectInternalId', ''); - /** - * todo: add index to this query - */ $this->deleteByGroup('vcsComments', [ Query::equal('providerRepositoryId', [$providerRepositoryId]), Query::equal('projectInternalId', [$projectInternalId]), @@ -1025,7 +1001,6 @@ class Deletes extends Action /** * Delete builds - * todo: no index for `deploymentInternalId` Same as above index , no need to handle again... */ Console::info("Deleting builds for deployment " . $deploymentId); From a20140eb36dfc7238324cf40989bab9842e89abf Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 25 Mar 2025 15:52:54 +1300 Subject: [PATCH 036/124] Update src/Appwrite/Platform/Workers/Deletes.php --- src/Appwrite/Platform/Workers/Deletes.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 0de79cd67e..93dbaf501c 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -851,7 +851,6 @@ class Deletes extends Action /** * Delete Deployments - * todo: No index for `resourceInternalId`, perhaps use resourceId until fixed */ Console::info("Deleting deployments for function " . $functionId); From c9c9db564053523be084bb5a97832221eb6ee28c Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 25 Mar 2025 15:52:59 +1300 Subject: [PATCH 037/124] Update src/Appwrite/Platform/Workers/Deletes.php --- src/Appwrite/Platform/Workers/Deletes.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 93dbaf501c..6dff127784 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -889,7 +889,6 @@ class Deletes extends Action /** * Delete VCS Repositories and VCS Comments - * todo: no index for this query */ Console::info("Deleting VCS repositories and comments linked to function " . $functionId); $this->deleteByGroup('repositories', [ From 6bcdc8c769185b77dc9689ed691e53a4071b1453 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 25 Mar 2025 16:01:27 +1300 Subject: [PATCH 038/124] Update src/Appwrite/Utopia/Database/Validator/Queries/Base.php --- src/Appwrite/Utopia/Database/Validator/Queries/Base.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Utopia/Database/Validator/Queries/Base.php b/src/Appwrite/Utopia/Database/Validator/Queries/Base.php index a13314ab2f..664476af36 100644 --- a/src/Appwrite/Utopia/Database/Validator/Queries/Base.php +++ b/src/Appwrite/Utopia/Database/Validator/Queries/Base.php @@ -82,7 +82,7 @@ class Base extends Queries new Offset(), new Cursor(), new Filter($attributes, APP_DATABASE_QUERY_MAX_VALUES), - new Order(array_merge($attributes, [$internalId])), + new Order([...$attributes, $internalId])), ]; parent::__construct($validators); From 74d9a3c181ebf09b9a7b6da710b6431dcaac4097 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 25 Mar 2025 16:19:18 +1300 Subject: [PATCH 039/124] Fix syntax --- src/Appwrite/Utopia/Database/Validator/Queries/Base.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Utopia/Database/Validator/Queries/Base.php b/src/Appwrite/Utopia/Database/Validator/Queries/Base.php index 664476af36..e8eafba5a0 100644 --- a/src/Appwrite/Utopia/Database/Validator/Queries/Base.php +++ b/src/Appwrite/Utopia/Database/Validator/Queries/Base.php @@ -82,7 +82,7 @@ class Base extends Queries new Offset(), new Cursor(), new Filter($attributes, APP_DATABASE_QUERY_MAX_VALUES), - new Order([...$attributes, $internalId])), + new Order([...$attributes, $internalId]), ]; parent::__construct($validators); From 6195674611b22d8d65c83a038f2d28cdc662ba36 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 25 Mar 2025 21:20:26 +1300 Subject: [PATCH 040/124] Update database --- composer.json | 2 +- composer.lock | 27 ++++++++++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index b1b6aed539..5b0f26b883 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,7 @@ "utopia-php/cache": "0.12.*", "utopia-php/cli": "0.15.*", "utopia-php/config": "0.2.*", - "utopia-php/database": "0.62.*", + "utopia-php/database": "dev-feat-multi-tenant-insert as 0.62.1", "utopia-php/domains": "0.5.*", "utopia-php/dsn": "0.2.1", "utopia-php/framework": "0.33.*", diff --git a/composer.lock b/composer.lock index 1ea887fdbc..09b8250af6 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": "d2bec8137dcd84994121f89a29932d31", + "content-hash": "640d2a8be42ae521ea12d8a908873f2b", "packages": [ { "name": "adhocore/jwt", @@ -3497,16 +3497,16 @@ }, { "name": "utopia-php/database", - "version": "0.62.1", + "version": "dev-feat-multi-tenant-insert", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "65dc51466c12552add10395900cdbb4728da4068" + "reference": "2e01c999153a202a8bae9c21e4302e7a674442d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/65dc51466c12552add10395900cdbb4728da4068", - "reference": "65dc51466c12552add10395900cdbb4728da4068", + "url": "https://api.github.com/repos/utopia-php/database/zipball/2e01c999153a202a8bae9c21e4302e7a674442d0", + "reference": "2e01c999153a202a8bae9c21e4302e7a674442d0", "shasum": "" }, "require": { @@ -3546,9 +3546,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/0.62.1" + "source": "https://github.com/utopia-php/database/tree/feat-multi-tenant-insert" }, - "time": "2025-03-24T08:27:18+00:00" + "time": "2025-03-25T04:45:25+00:00" }, { "name": "utopia-php/domains", @@ -8132,9 +8132,18 @@ "time": "2024-03-07T20:33:40+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "utopia-php/database", + "version": "dev-feat-multi-tenant-insert", + "alias": "0.62.1", + "alias_normalized": "0.62.1.0" + } + ], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "utopia-php/database": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { From 81b3e81d83b0813c833aa9cc87cf60a218dc4d10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 25 Mar 2025 10:57:32 +0100 Subject: [PATCH 041/124] Add bash support --- app/config/frameworks.php | 52 +++++++++---------- app/config/templates/site.php | 4 +- .../Functions/FunctionsCustomServerTest.php | 2 +- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/app/config/frameworks.php b/app/config/frameworks.php index cc9e913523..82fd70bf5b 100644 --- a/app/config/frameworks.php +++ b/app/config/frameworks.php @@ -22,7 +22,7 @@ return [ 'screenshotSleep' => 3000, 'buildRuntime' => 'node-22', 'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'), - 'bundleCommand' => 'sh /usr/local/server/helpers/analog/bundle.sh', + 'bundleCommand' => 'bash /usr/local/server/helpers/analog/bundle.sh', 'envCommand' => 'source /usr/local/server/helpers/analog/env.sh', 'adapters' => [ 'ssr' => [ @@ -30,14 +30,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist/analog', - 'startCommand' => 'sh helpers/analog/server.sh', + 'startCommand' => 'bash helpers/analog/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist/analog/public', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', 'fallbackFile' => 'index.html' ] ] @@ -48,7 +48,7 @@ return [ 'screenshotSleep' => 3000, 'buildRuntime' => 'node-22', 'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'), - 'bundleCommand' => 'sh /usr/local/server/helpers/angular/bundle.sh', + 'bundleCommand' => 'bash /usr/local/server/helpers/angular/bundle.sh', 'envCommand' => 'source /usr/local/server/helpers/angular/env.sh', 'adapters' => [ 'ssr' => [ @@ -56,14 +56,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist/angular', - 'startCommand' => 'sh helpers/angular/server.sh', + 'startCommand' => 'bash helpers/angular/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist/angular/browser', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', 'fallbackFile' => 'index.csr.html' ] ] @@ -74,7 +74,7 @@ return [ 'screenshotSleep' => 3000, 'buildRuntime' => 'node-22', 'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'), - 'bundleCommand' => 'sh /usr/local/server/helpers/next-js/bundle.sh', + 'bundleCommand' => 'bash /usr/local/server/helpers/next-js/bundle.sh', 'envCommand' => 'source /usr/local/server/helpers/next-js/env.sh', 'adapters' => [ 'ssr' => [ @@ -82,14 +82,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './.next', - 'startCommand' => 'sh helpers/next-js/server.sh', + 'startCommand' => 'bash helpers/next-js/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './out', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ] ] ], @@ -105,7 +105,7 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', 'fallbackFile' => 'index.html' ] ] @@ -116,7 +116,7 @@ return [ 'screenshotSleep' => 3000, 'buildRuntime' => 'node-22', 'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'), - 'bundleCommand' => 'sh /usr/local/server/helpers/nuxt/bundle.sh', + 'bundleCommand' => 'bash /usr/local/server/helpers/nuxt/bundle.sh', 'envCommand' => 'source /usr/local/server/helpers/nuxt/env.sh', 'adapters' => [ 'ssr' => [ @@ -124,14 +124,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './.output', - 'startCommand' => 'sh helpers/nuxt/server.sh', + 'startCommand' => 'bash helpers/nuxt/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run generate', 'installCommand' => 'npm install', 'outputDirectory' => './output/public', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ] ] ], @@ -147,7 +147,7 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', 'fallbackFile' => 'index.html' ] ] @@ -158,7 +158,7 @@ return [ 'screenshotSleep' => 3000, 'buildRuntime' => 'node-22', 'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'), - 'bundleCommand' => 'sh /usr/local/server/helpers/sveltekit/bundle.sh', + 'bundleCommand' => 'bash /usr/local/server/helpers/sveltekit/bundle.sh', 'envCommand' => 'source /usr/local/server/helpers/sveltekit/env.sh', 'adapters' => [ 'ssr' => [ @@ -166,14 +166,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './build', - 'startCommand' => 'sh helpers/sveltekit/server.sh', + 'startCommand' => 'bash helpers/sveltekit/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './build', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ] ] ], @@ -183,7 +183,7 @@ return [ 'screenshotSleep' => 3000, 'buildRuntime' => 'node-22', 'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'), - 'bundleCommand' => 'sh /usr/local/server/helpers/astro/bundle.sh', + 'bundleCommand' => 'bash /usr/local/server/helpers/astro/bundle.sh', 'envCommand' => 'source /usr/local/server/helpers/astro/env.sh', 'adapters' => [ 'ssr' => [ @@ -191,14 +191,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist', - 'startCommand' => 'sh helpers/astro/server.sh', + 'startCommand' => 'bash helpers/astro/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ] ] ], @@ -208,7 +208,7 @@ return [ 'screenshotSleep' => 3000, 'buildRuntime' => 'node-22', 'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'), - 'bundleCommand' => 'sh /usr/local/server/helpers/remix/bundle.sh', + 'bundleCommand' => 'bash /usr/local/server/helpers/remix/bundle.sh', 'envCommand' => 'source /usr/local/server/helpers/remix/env.sh', 'adapters' => [ 'ssr' => [ @@ -216,14 +216,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './build', - 'startCommand' => 'sh helpers/remix/server.sh', + 'startCommand' => 'bash helpers/remix/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './build/client', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ] ] ], @@ -239,7 +239,7 @@ return [ 'buildCommand' => 'flutter build web', 'installCommand' => '', 'outputDirectory' => './build/web', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ], ], ], @@ -255,7 +255,7 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ], ] ], @@ -271,7 +271,7 @@ return [ 'buildCommand' => '', 'installCommand' => '', 'outputDirectory' => './', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ], ] ], diff --git a/app/config/templates/site.php b/app/config/templates/site.php index 1130d55fcf..736138bdd9 100644 --- a/app/config/templates/site.php +++ b/app/config/templates/site.php @@ -322,7 +322,7 @@ return [ 'frameworks' => [ getFramework('FLUTTER', [ 'providerRootDirectory' => './', - 'buildCommand' => 'sh build.sh', + 'buildCommand' => 'bash build.sh', ]), ], 'vcsProvider' => 'github', @@ -408,7 +408,7 @@ return [ getFramework('ANGULAR', [ 'providerRootDirectory' => './', 'outputDirectory' => './dist/angular-starter-kit-for-appwrite/browser', - 'buildCommand' => 'sh prepare-env.sh && npm run build' + 'buildCommand' => 'bash prepare-env.sh && npm run build' ]), ], 'vcsProvider' => 'github', diff --git a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php index 40d9ea5dba..c9a94987c9 100644 --- a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php +++ b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php @@ -1590,7 +1590,7 @@ class FunctionsCustomServerTest extends Scope $functionId = $this->setupFunction([ 'functionId' => ID::unique(), 'name' => 'Test PHP Scopes executions', - 'commands' => 'sh setup.sh && composer install', + 'commands' => 'bash setup.sh && composer install', 'runtime' => 'php-8.0', 'entrypoint' => 'index.php', 'scopes' => ['users.read'], From fe94717196ac8d2c1805992b482c8ce4ca4587bf Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Tue, 25 Mar 2025 18:31:14 +0530 Subject: [PATCH 042/124] Update tests --- .../Services/Sites/SitesCustomServerTest.php | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index 5ce4ab350b..ce37d61474 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -544,18 +544,16 @@ class SitesCustomServerTest extends Scope $siteId = $this->setupSite([ 'siteId' => ID::unique(), 'name' => 'Static site', - 'framework' => 'other', + 'framework' => 'astro', 'buildRuntime' => 'node-22', - 'outputDirectory' => '', - 'buildCommand' => '', - 'installCommand' => '', + 'outputDirectory' => './dist', + 'buildCommand' => 'npm run build', + 'installCommand' => 'npm install', ]); $this->assertNotEmpty($siteId); $site = $this->getSite($siteId); $this->assertEquals('200', $site['headers']['status-code']); - $this->assertArrayHasKey('adapter', $site['body']); - $this->assertArrayHasKey('fallbackFile', $site['body']); $this->assertEmpty($site['body']['adapter']); $this->assertEmpty($site['body']['fallbackFile']); @@ -563,7 +561,7 @@ class SitesCustomServerTest extends Scope $this->assertNotEmpty($domain); $deploymentId1 = $this->setupDeployment($siteId, [ - 'code' => $this->packageSite('static-single-file'), + 'code' => $this->packageSite('astro-static'), 'activate' => 'true' ]); $this->assertNotEmpty($deploymentId1); @@ -571,25 +569,40 @@ class SitesCustomServerTest extends Scope $site = $this->getSite($siteId); $this->assertEquals('200', $site['headers']['status-code']); $this->assertEquals('static', $site['body']['adapter']); - $this->assertEquals('main.html', $site['body']['fallbackFile']); + $this->assertEquals('index.html', $site['body']['fallbackFile']); $site = $this->updateSite([ - 'fallbackFile' => 'hello.html', - 'adapter' => 'ssr', + 'name' => 'SSR site', + 'framework' => 'astro', + 'buildRuntime' => 'node-22', + 'outputDirectory' => './dist', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', - '$id' => $siteId + 'adapter' => 'ssr', + 'fallbackFile' => '', + '$id' => $siteId, ]); + $this->assertEquals('200', $site['headers']['status-code']); + $this->assertEquals('ssr', $site['body']['adapter']); + $this->assertEmpty($site['body']['fallbackFile']); + $deploymentId2 = $this->setupDeployment($siteId, [ 'code' => $this->packageSite('astro'), 'activate' => 'true' ]); $this->assertNotEmpty($deploymentId2); + $site = $this->getSite($siteId); + $this->assertEquals('200', $site['headers']['status-code']); + $this->assertEquals('ssr', $site['body']['adapter']); + $proxyClient = new Client(); $proxyClient->setEndpoint('http://' . $domain); $response = $proxyClient->call(Client::METHOD_GET, '/'); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertStringContainsString("Astro SSR", $response['body']); + $response = $proxyClient->call(Client::METHOD_GET, '/not-found'); $this->assertEquals(404, $response['headers']['status-code']); $response = $this->updateSiteDeployment($siteId, $deploymentId1); @@ -600,10 +613,10 @@ class SitesCustomServerTest extends Scope $proxyClient->setEndpoint('http://' . $domain); $response = $proxyClient->call(Client::METHOD_GET, '/'); $this->assertEquals(200, $response['headers']['status-code']); - $this->assertStringContainsString('Main page', $response['body']); - $response = $proxyClient->call(Client::METHOD_GET, '/something'); + $this->assertStringContainsString("Astro static", $response['body']); + $response = $proxyClient->call(Client::METHOD_GET, '/not-found'); $this->assertEquals(200, $response['headers']['status-code']); - $this->assertStringContainsString('Main page', $response['body']); + $this->assertStringContainsString("Astro static", $response['body']); $this->cleanupSite($siteId); } From bf2b3b68e3666014f478e5b3b151bb936bd25651 Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Tue, 25 Mar 2025 19:14:14 +0530 Subject: [PATCH 043/124] Add logging param to sites --- app/config/collections/projects.php | 20 ++++---- .../Modules/Sites/Http/Sites/Create.php | 5 +- .../Modules/Sites/Http/Sites/Update.php | 5 +- src/Appwrite/Utopia/Response/Model/Site.php | 6 +++ .../Services/Sites/SitesCustomServerTest.php | 51 +++++++++++++++++++ 5 files changed, 75 insertions(+), 12 deletions(-) diff --git a/app/config/collections/projects.php b/app/config/collections/projects.php index b209a7ec32..5c5f02daee 100644 --- a/app/config/collections/projects.php +++ b/app/config/collections/projects.php @@ -971,16 +971,16 @@ return [ 'default' => false, 'array' => false, ], - // [ - // '$id' => ID::custom('logging'), - // 'type' => Database::VAR_BOOLEAN, - // 'signed' => true, - // 'size' => 0, - // 'format' => '', - // 'filters' => [], - // 'required' => true, - // 'array' => false, - // ], + [ + '$id' => ID::custom('logging'), + 'type' => Database::VAR_BOOLEAN, + 'signed' => true, + 'size' => 0, + 'format' => '', + 'filters' => [], + 'required' => true, + 'array' => false, + ], [ '$id' => ID::custom('framework'), 'type' => Database::VAR_STRING, diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php index ada665267a..bd76e19e3f 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php @@ -64,7 +64,8 @@ class Create extends Base ->param('siteId', '', new CustomId(), 'Site ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.') ->param('name', '', new Text(128), 'Site name. Max length: 128 chars.') ->param('framework', '', new WhiteList(\array_keys(Config::getParam('frameworks')), true), 'Sites framework.') - ->param('enabled', true, new Boolean(), 'Is site enabled? When set to \'disabled\', users cannot access the site but Server SDKs with and API key can still access the site. No data is lost when this is toggled.', true) // TODO: Add logging param later + ->param('enabled', true, new Boolean(), 'Is site enabled? When set to \'disabled\', users cannot access the site but Server SDKs with and API key can still access the site. No data is lost when this is toggled.', true) + ->param('logging', true, new Boolean(), 'Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.', true) ->param('timeout', 15, new Range(1, (int) System::getEnv('_APP_COMPUTE_TIMEOUT', 900)), 'Maximum request time in seconds.', true) ->param('installCommand', '', new Text(8192, 0), 'Install Command.', true) ->param('buildCommand', '', new Text(8192, 0), 'Build Command.', true) @@ -96,6 +97,7 @@ class Create extends Base string $name, string $framework, bool $enabled, + bool $logging, int $timeout, string $installCommand, string $buildCommand, @@ -140,6 +142,7 @@ class Create extends Base '$id' => $siteId, 'enabled' => $enabled, 'live' => true, + 'logging' => $logging, 'name' => $name, 'framework' => $framework, 'deploymentInternalId' => '', diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php index b971c4c4f3..1e82e83881 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php @@ -68,7 +68,8 @@ class Update extends Base ->param('siteId', '', new UID(), 'Site ID.') ->param('name', '', new Text(128), 'Site name. Max length: 128 chars.') ->param('framework', '', new WhiteList(\array_keys(Config::getParam('frameworks')), true), 'Sites framework.') - ->param('enabled', true, new Boolean(), 'Is site enabled? When set to \'disabled\', users cannot access the site but Server SDKs with and API key can still access the site. No data is lost when this is toggled.', true) // TODO: Add logging param later + ->param('enabled', true, new Boolean(), 'Is site enabled? When set to \'disabled\', users cannot access the site but Server SDKs with and API key can still access the site. No data is lost when this is toggled.', true) + ->param('logging', true, new Boolean(), 'Whether logs and errors will be logged. When set to false, logs and errors will not be logged, but will reduce resource used by your Appwrite project.', true) ->param('timeout', 15, new Range(1, (int) System::getEnv('_APP_COMPUTE_TIMEOUT', 900)), 'Maximum request time in seconds.', true) ->param('installCommand', '', new Text(8192, 0), 'Install Command.', true) ->param('buildCommand', '', new Text(8192, 0), 'Build Command.', true) @@ -103,6 +104,7 @@ class Update extends Base string $name, string $framework, bool $enabled, + bool $logging, int $timeout, string $installCommand, string $buildCommand, @@ -246,6 +248,7 @@ class Update extends Base 'name' => $name, 'framework' => $framework, 'enabled' => $enabled, + 'logging' => $logging, 'live' => $live, 'timeout' => $timeout, 'installCommand' => $installCommand, diff --git a/src/Appwrite/Utopia/Response/Model/Site.php b/src/Appwrite/Utopia/Response/Model/Site.php index 478b7881b3..8b28200de1 100644 --- a/src/Appwrite/Utopia/Response/Model/Site.php +++ b/src/Appwrite/Utopia/Response/Model/Site.php @@ -46,6 +46,12 @@ class Site extends Model 'default' => true, 'example' => false, ]) + ->addRule('logging', [ + 'type' => self::TYPE_BOOLEAN, + 'description' => 'Whether logs and errors will be logged. When set to false, logs and errors will not be logged, but will reduce resource used by your Appwrite project.', + 'default' => true, + 'example' => false, + ]) ->addRule('framework', [ 'type' => self::TYPE_STRING, 'description' => 'Site framework.', diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index a0880b0a4e..2cabaf88df 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -1905,6 +1905,57 @@ class SitesCustomServerTest extends Scope $this->assertNotEquals($log1Id, $log2Id); + $site = $this->updateSite( + [ + '$id' => $siteId, + 'name' => 'SSR site', + 'framework' => 'astro', + 'adapter' => 'ssr', + 'buildRuntime' => 'node-22', + 'outputDirectory' => './dist', + 'buildCommand' => 'npm run build', + 'installCommand' => 'npm install', + 'fallbackFile' => '', + 'logging' => false // set logging to false + ] + ); + $this->assertEquals(200, $site['headers']['status-code']); + $response = $proxyClient->call(Client::METHOD_GET, '/logs-inline'); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertStringContainsString("Inline logs printed.", $response['body']); + + $logs = $this->listLogs($siteId, [ + Query::orderDesc('$createdAt')->toString(), + Query::limit(1)->toString(), + ]); + $this->assertEquals(200, $logs['headers']['status-code']); + $this->assertStringContainsString("GET", $logs['body']['executions'][0]['requestMethod']); + $this->assertStringContainsString("/logs-inline", $logs['body']['executions'][0]['requestPath']); + $this->assertStringContainsString("", $logs['body']['executions'][0]['logs']); + $this->assertStringContainsString("", $logs['body']['executions'][0]['logs']); + $this->assertStringContainsString("", $logs['body']['executions'][0]['errors']); + $this->assertStringContainsString("", $logs['body']['executions'][0]['errors']); + $log1Id = $logs['body']['executions'][0]['$id']; + $this->assertNotEmpty($log1Id); + + $response = $proxyClient->call(Client::METHOD_GET, '/logs-action'); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertStringContainsString("Action logs printed.", $response['body']); + + $logs = $this->listLogs($siteId, [ + Query::orderDesc('$createdAt')->toString(), + Query::limit(1)->toString(), + ]); + $this->assertEquals(200, $logs['headers']['status-code']); + $this->assertStringContainsString("GET", $logs['body']['executions'][0]['requestMethod']); + $this->assertStringContainsString("/logs-action", $logs['body']['executions'][0]['requestPath']); + $this->assertStringContainsString("", $logs['body']['executions'][0]['logs']); + $this->assertStringContainsString("", $logs['body']['executions'][0]['logs']); + $this->assertStringContainsString("", $logs['body']['executions'][0]['errors']); + $this->assertStringContainsString("", $logs['body']['executions'][0]['errors']); + $log2Id = $logs['body']['executions'][0]['$id']; + $this->assertNotEmpty($log2Id); + $this->cleanupSite($siteId); } From abae54f72c8038ccc03f21879a127bbe9efcb8ed Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Tue, 25 Mar 2025 19:49:57 +0530 Subject: [PATCH 044/124] Update copy for logging --- .../Platform/Modules/Functions/Http/Functions/Create.php | 2 +- .../Platform/Modules/Functions/Http/Functions/Update.php | 2 +- src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php | 2 +- src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php | 2 +- src/Appwrite/Utopia/Response/Model/Func.php | 2 +- src/Appwrite/Utopia/Response/Model/Site.php | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php index 28f2c3cd1f..cf31d3d7d2 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php @@ -76,7 +76,7 @@ class Create extends Base ->param('schedule', '', new Cron(), 'Schedule CRON syntax.', true) ->param('timeout', 15, new Range(1, (int) System::getEnv('_APP_COMPUTE_TIMEOUT', 900)), 'Function maximum execution time in seconds.', true) ->param('enabled', true, new Boolean(), 'Is function enabled? When set to \'disabled\', users cannot access the function but Server SDKs with and API key can still access the function. No data is lost when this is toggled.', true) - ->param('logging', true, new Boolean(), 'Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.', true) + ->param('logging', true, new Boolean(), 'When disabled, executions will exclude logs and errors, and will be slightly faster.', true) ->param('entrypoint', '', new Text(1028, 0), 'Entrypoint File. This path is relative to the "providerRootDirectory".', true) ->param('commands', '', new Text(8192, 0), 'Build Commands.', true) ->param('scopes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('scopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of scopes allowed for API key auto-generated for every execution. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.', true) diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php index d1714685d8..3c876ed91e 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php @@ -80,7 +80,7 @@ class Update extends Base ->param('schedule', '', new Cron(), 'Schedule CRON syntax.', true) ->param('timeout', 15, new Range(1, (int) System::getEnv('_APP_COMPUTE_TIMEOUT', 900)), 'Maximum execution time in seconds.', true) ->param('enabled', true, new Boolean(), 'Is function enabled? When set to \'disabled\', users cannot access the function but Server SDKs with and API key can still access the function. No data is lost when this is toggled.', true) - ->param('logging', true, new Boolean(), 'Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.', true) + ->param('logging', true, new Boolean(), 'When disabled, executions will exclude logs and errors, and will be slightly faster.', true) ->param('entrypoint', '', new Text(1028, 0), 'Entrypoint File. This path is relative to the "providerRootDirectory".', true) ->param('commands', '', new Text(8192, 0), 'Build Commands.', true) ->param('scopes', [], new ArrayList(new WhiteList(array_keys(Config::getParam('scopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'List of scopes allowed for API Key auto-generated for every execution. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.', true) diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php index bd76e19e3f..1a39edea46 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php @@ -65,7 +65,7 @@ class Create extends Base ->param('name', '', new Text(128), 'Site name. Max length: 128 chars.') ->param('framework', '', new WhiteList(\array_keys(Config::getParam('frameworks')), true), 'Sites framework.') ->param('enabled', true, new Boolean(), 'Is site enabled? When set to \'disabled\', users cannot access the site but Server SDKs with and API key can still access the site. No data is lost when this is toggled.', true) - ->param('logging', true, new Boolean(), 'Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.', true) + ->param('logging', true, new Boolean(), 'When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.', true) ->param('timeout', 15, new Range(1, (int) System::getEnv('_APP_COMPUTE_TIMEOUT', 900)), 'Maximum request time in seconds.', true) ->param('installCommand', '', new Text(8192, 0), 'Install Command.', true) ->param('buildCommand', '', new Text(8192, 0), 'Build Command.', true) diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php index 1e82e83881..416062862a 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php @@ -69,7 +69,7 @@ class Update extends Base ->param('name', '', new Text(128), 'Site name. Max length: 128 chars.') ->param('framework', '', new WhiteList(\array_keys(Config::getParam('frameworks')), true), 'Sites framework.') ->param('enabled', true, new Boolean(), 'Is site enabled? When set to \'disabled\', users cannot access the site but Server SDKs with and API key can still access the site. No data is lost when this is toggled.', true) - ->param('logging', true, new Boolean(), 'Whether logs and errors will be logged. When set to false, logs and errors will not be logged, but will reduce resource used by your Appwrite project.', true) + ->param('logging', true, new Boolean(), 'When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.', true) ->param('timeout', 15, new Range(1, (int) System::getEnv('_APP_COMPUTE_TIMEOUT', 900)), 'Maximum request time in seconds.', true) ->param('installCommand', '', new Text(8192, 0), 'Install Command.', true) ->param('buildCommand', '', new Text(8192, 0), 'Build Command.', true) diff --git a/src/Appwrite/Utopia/Response/Model/Func.php b/src/Appwrite/Utopia/Response/Model/Func.php index e0929684fb..e33d7663fd 100644 --- a/src/Appwrite/Utopia/Response/Model/Func.php +++ b/src/Appwrite/Utopia/Response/Model/Func.php @@ -55,7 +55,7 @@ class Func extends Model ]) ->addRule('logging', [ 'type' => self::TYPE_BOOLEAN, - 'description' => 'Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.', + 'description' => 'When disabled, executions will exclude logs and errors, and will be slightly faster.', 'default' => true, 'example' => false, ]) diff --git a/src/Appwrite/Utopia/Response/Model/Site.php b/src/Appwrite/Utopia/Response/Model/Site.php index 8b28200de1..e6e205909b 100644 --- a/src/Appwrite/Utopia/Response/Model/Site.php +++ b/src/Appwrite/Utopia/Response/Model/Site.php @@ -48,7 +48,7 @@ class Site extends Model ]) ->addRule('logging', [ 'type' => self::TYPE_BOOLEAN, - 'description' => 'Whether logs and errors will be logged. When set to false, logs and errors will not be logged, but will reduce resource used by your Appwrite project.', + 'description' => 'When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.', 'default' => true, 'example' => false, ]) From c38a5177dd29fbdd464f9c5b13e4045b812b1f4b Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Tue, 25 Mar 2025 20:02:29 +0530 Subject: [PATCH 045/124] Address PR comments --- .../Services/Sites/SitesCustomServerTest.php | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index 2cabaf88df..87e21e403d 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -1929,12 +1929,12 @@ class SitesCustomServerTest extends Scope Query::limit(1)->toString(), ]); $this->assertEquals(200, $logs['headers']['status-code']); - $this->assertStringContainsString("GET", $logs['body']['executions'][0]['requestMethod']); - $this->assertStringContainsString("/logs-inline", $logs['body']['executions'][0]['requestPath']); - $this->assertStringContainsString("", $logs['body']['executions'][0]['logs']); - $this->assertStringContainsString("", $logs['body']['executions'][0]['logs']); - $this->assertStringContainsString("", $logs['body']['executions'][0]['errors']); - $this->assertStringContainsString("", $logs['body']['executions'][0]['errors']); + $this->assertEquals("GET", $logs['body']['executions'][0]['requestMethod']); + $this->assertEquals("/logs-inline", $logs['body']['executions'][0]['requestPath']); + $this->assertEmpty($logs['body']['executions'][0]['logs']); + $this->assertEmpty($logs['body']['executions'][0]['logs']); + $this->assertEmpty($logs['body']['executions'][0]['errors']); + $this->assertEmpty($logs['body']['executions'][0]['errors']); $log1Id = $logs['body']['executions'][0]['$id']; $this->assertNotEmpty($log1Id); @@ -1947,12 +1947,12 @@ class SitesCustomServerTest extends Scope Query::limit(1)->toString(), ]); $this->assertEquals(200, $logs['headers']['status-code']); - $this->assertStringContainsString("GET", $logs['body']['executions'][0]['requestMethod']); - $this->assertStringContainsString("/logs-action", $logs['body']['executions'][0]['requestPath']); - $this->assertStringContainsString("", $logs['body']['executions'][0]['logs']); - $this->assertStringContainsString("", $logs['body']['executions'][0]['logs']); - $this->assertStringContainsString("", $logs['body']['executions'][0]['errors']); - $this->assertStringContainsString("", $logs['body']['executions'][0]['errors']); + $this->assertEquals("GET", $logs['body']['executions'][0]['requestMethod']); + $this->assertEquals("/logs-action", $logs['body']['executions'][0]['requestPath']); + $this->assertEmpty($logs['body']['executions'][0]['logs']); + $this->assertEmpty($logs['body']['executions'][0]['logs']); + $this->assertEmpty($logs['body']['executions'][0]['errors']); + $this->assertEmpty($logs['body']['executions'][0]['errors']); $log2Id = $logs['body']['executions'][0]['$id']; $this->assertNotEmpty($log2Id); From 8db247c8404a3d0b9bbef28592cd95d6a038ca9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 25 Mar 2025 15:57:38 +0100 Subject: [PATCH 046/124] Update SDKs --- .../specs/open-api3-latest-console.json | 22 ++++++++++++++--- app/config/specs/open-api3-latest-server.json | 22 ++++++++++++++--- app/config/specs/swagger2-latest-console.json | 24 ++++++++++++++++--- app/config/specs/swagger2-latest-server.json | 24 ++++++++++++++++--- 4 files changed, 80 insertions(+), 12 deletions(-) diff --git a/app/config/specs/open-api3-latest-console.json b/app/config/specs/open-api3-latest-console.json index 9e9f99db63..cc8a611416 100644 --- a/app/config/specs/open-api3-latest-console.json +++ b/app/config/specs/open-api3-latest-console.json @@ -9268,7 +9268,7 @@ }, "logging": { "type": "boolean", - "description": "Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.", + "description": "When disabled, executions will exclude logs and errors, and will be slightly faster.", "x-example": false }, "entrypoint": { @@ -9889,7 +9889,7 @@ }, "logging": { "type": "boolean", - "description": "Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.", + "description": "When disabled, executions will exclude logs and errors, and will be slightly faster.", "x-example": false }, "entrypoint": { @@ -24730,6 +24730,11 @@ "description": "Is site enabled? When set to 'disabled', users cannot access the site but Server SDKs with and API key can still access the site. No data is lost when this is toggled.", "x-example": false }, + "logging": { + "type": "boolean", + "description": "When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.", + "x-example": false + }, "timeout": { "type": "integer", "description": "Maximum request time in seconds.", @@ -25360,6 +25365,11 @@ "description": "Is site enabled? When set to 'disabled', users cannot access the site but Server SDKs with and API key can still access the site. No data is lost when this is toggled.", "x-example": false }, + "logging": { + "type": "boolean", + "description": "When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.", + "x-example": false + }, "timeout": { "type": "integer", "description": "Maximum request time in seconds.", @@ -36864,6 +36874,11 @@ "description": "Is the site deployed with the latest configuration? This is set to false if you've changed an environment variables, entrypoint, commands, or other settings that needs redeploy to be applied. When the value is false, redeploy the site to update it with the latest configuration.", "x-example": false }, + "logging": { + "type": "boolean", + "description": "When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.", + "x-example": false + }, "framework": { "type": "string", "description": "Site framework.", @@ -36986,6 +37001,7 @@ "name", "enabled", "live", + "logging", "framework", "deploymentId", "deploymentCreatedAt", @@ -37205,7 +37221,7 @@ }, "logging": { "type": "boolean", - "description": "Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.", + "description": "When disabled, executions will exclude logs and errors, and will be slightly faster.", "x-example": false }, "runtime": { diff --git a/app/config/specs/open-api3-latest-server.json b/app/config/specs/open-api3-latest-server.json index 287ce791c3..ecda53b77b 100644 --- a/app/config/specs/open-api3-latest-server.json +++ b/app/config/specs/open-api3-latest-server.json @@ -8355,7 +8355,7 @@ }, "logging": { "type": "boolean", - "description": "Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.", + "description": "When disabled, executions will exclude logs and errors, and will be slightly faster.", "x-example": false }, "entrypoint": { @@ -8751,7 +8751,7 @@ }, "logging": { "type": "boolean", - "description": "Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.", + "description": "When disabled, executions will exclude logs and errors, and will be slightly faster.", "x-example": false }, "entrypoint": { @@ -16828,6 +16828,11 @@ "description": "Is site enabled? When set to 'disabled', users cannot access the site but Server SDKs with and API key can still access the site. No data is lost when this is toggled.", "x-example": false }, + "logging": { + "type": "boolean", + "description": "When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.", + "x-example": false + }, "timeout": { "type": "integer", "description": "Maximum request time in seconds.", @@ -17233,6 +17238,11 @@ "description": "Is site enabled? When set to 'disabled', users cannot access the site but Server SDKs with and API key can still access the site. No data is lost when this is toggled.", "x-example": false }, + "logging": { + "type": "boolean", + "description": "When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.", + "x-example": false + }, "timeout": { "type": "integer", "description": "Maximum request time in seconds.", @@ -27413,6 +27423,11 @@ "description": "Is the site deployed with the latest configuration? This is set to false if you've changed an environment variables, entrypoint, commands, or other settings that needs redeploy to be applied. When the value is false, redeploy the site to update it with the latest configuration.", "x-example": false }, + "logging": { + "type": "boolean", + "description": "When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.", + "x-example": false + }, "framework": { "type": "string", "description": "Site framework.", @@ -27535,6 +27550,7 @@ "name", "enabled", "live", + "logging", "framework", "deploymentId", "deploymentCreatedAt", @@ -27603,7 +27619,7 @@ }, "logging": { "type": "boolean", - "description": "Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.", + "description": "When disabled, executions will exclude logs and errors, and will be slightly faster.", "x-example": false }, "runtime": { diff --git a/app/config/specs/swagger2-latest-console.json b/app/config/specs/swagger2-latest-console.json index 05acf4a551..4d3ab5bce8 100644 --- a/app/config/specs/swagger2-latest-console.json +++ b/app/config/specs/swagger2-latest-console.json @@ -9425,7 +9425,7 @@ }, "logging": { "type": "boolean", - "description": "Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.", + "description": "When disabled, executions will exclude logs and errors, and will be slightly faster.", "default": true, "x-example": false }, @@ -10061,7 +10061,7 @@ }, "logging": { "type": "boolean", - "description": "Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.", + "description": "When disabled, executions will exclude logs and errors, and will be slightly faster.", "default": true, "x-example": false }, @@ -25234,6 +25234,12 @@ "default": true, "x-example": false }, + "logging": { + "type": "boolean", + "description": "When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.", + "default": true, + "x-example": false + }, "timeout": { "type": "integer", "description": "Maximum request time in seconds.", @@ -25878,6 +25884,12 @@ "default": true, "x-example": false }, + "logging": { + "type": "boolean", + "description": "When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.", + "default": true, + "x-example": false + }, "timeout": { "type": "integer", "description": "Maximum request time in seconds.", @@ -37444,6 +37456,11 @@ "description": "Is the site deployed with the latest configuration? This is set to false if you've changed an environment variables, entrypoint, commands, or other settings that needs redeploy to be applied. When the value is false, redeploy the site to update it with the latest configuration.", "x-example": false }, + "logging": { + "type": "boolean", + "description": "When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.", + "x-example": false + }, "framework": { "type": "string", "description": "Site framework.", @@ -37567,6 +37584,7 @@ "name", "enabled", "live", + "logging", "framework", "deploymentId", "deploymentCreatedAt", @@ -37788,7 +37806,7 @@ }, "logging": { "type": "boolean", - "description": "Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.", + "description": "When disabled, executions will exclude logs and errors, and will be slightly faster.", "x-example": false }, "runtime": { diff --git a/app/config/specs/swagger2-latest-server.json b/app/config/specs/swagger2-latest-server.json index b7371b1bbd..c2d3b06ebc 100644 --- a/app/config/specs/swagger2-latest-server.json +++ b/app/config/specs/swagger2-latest-server.json @@ -8509,7 +8509,7 @@ }, "logging": { "type": "boolean", - "description": "Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.", + "description": "When disabled, executions will exclude logs and errors, and will be slightly faster.", "default": true, "x-example": false }, @@ -8924,7 +8924,7 @@ }, "logging": { "type": "boolean", - "description": "Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.", + "description": "When disabled, executions will exclude logs and errors, and will be slightly faster.", "default": true, "x-example": false }, @@ -17298,6 +17298,12 @@ "default": true, "x-example": false }, + "logging": { + "type": "boolean", + "description": "When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.", + "default": true, + "x-example": false + }, "timeout": { "type": "integer", "description": "Maximum request time in seconds.", @@ -17721,6 +17727,12 @@ "default": true, "x-example": false }, + "logging": { + "type": "boolean", + "description": "When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.", + "default": true, + "x-example": false + }, "timeout": { "type": "integer", "description": "Maximum request time in seconds.", @@ -27964,6 +27976,11 @@ "description": "Is the site deployed with the latest configuration? This is set to false if you've changed an environment variables, entrypoint, commands, or other settings that needs redeploy to be applied. When the value is false, redeploy the site to update it with the latest configuration.", "x-example": false }, + "logging": { + "type": "boolean", + "description": "When disabled, request logs will exclude logs and errors, and site responses will be slightly faster.", + "x-example": false + }, "framework": { "type": "string", "description": "Site framework.", @@ -28087,6 +28104,7 @@ "name", "enabled", "live", + "logging", "framework", "deploymentId", "deploymentCreatedAt", @@ -28155,7 +28173,7 @@ }, "logging": { "type": "boolean", - "description": "Whether executions will be logged. When set to false, executions will not be logged, but will reduce resource used by your Appwrite project.", + "description": "When disabled, executions will exclude logs and errors, and will be slightly faster.", "x-example": false }, "runtime": { From 524ce8789f931139824e6e7511b79bbde46bd4c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 25 Mar 2025 21:01:28 +0100 Subject: [PATCH 047/124] Upgrade libs --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2fbd844d01..f501c7fb69 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -205,7 +205,7 @@ services: appwrite-console: <<: *x-logging container_name: appwrite-console - image: appwrite/console:5.3.0-sites-rc.28 + image: appwrite/console:5.3.0-sites-rc.30 restart: unless-stopped networks: - appwrite @@ -961,7 +961,7 @@ services: hostname: exc1 <<: *x-logging stop_signal: SIGINT - image: openruntimes/executor:0.7.12 + image: openruntimes/executor:0.7.13 restart: unless-stopped networks: - appwrite From d89cdbcf5a52717b7dc7e48b88020c2604502f0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 25 Mar 2025 21:34:09 +0100 Subject: [PATCH 048/124] Fix schedules region filtering --- src/Appwrite/Migration/Version/V19.php | 3 +-- src/Appwrite/Platform/Tasks/ScheduleBase.php | 9 ++++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Appwrite/Migration/Version/V19.php b/src/Appwrite/Migration/Version/V19.php index 18234ebdc4..7adf5b85be 100644 --- a/src/Appwrite/Migration/Version/V19.php +++ b/src/Appwrite/Migration/Version/V19.php @@ -10,7 +10,6 @@ use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Database\Exception; use Utopia\Database\Query; -use Utopia\System\System; class V19 extends Migration { @@ -731,7 +730,7 @@ class V19 extends Migration if (empty($document->getAttribute('scheduleId', null))) { $schedule = $this->consoleDB->createDocument('schedules', new Document([ - 'region' => System::getEnv('_APP_REGION', 'default'), // Todo replace with projects region + 'region' => $project->getAttribute('region'), // Todo replace with projects region 'resourceType' => 'function', 'resourceId' => $document->getId(), 'resourceInternalId' => $document->getInternalId(), diff --git a/src/Appwrite/Platform/Tasks/ScheduleBase.php b/src/Appwrite/Platform/Tasks/ScheduleBase.php index dad2db0d9a..324b88d07b 100644 --- a/src/Appwrite/Platform/Tasks/ScheduleBase.php +++ b/src/Appwrite/Platform/Tasks/ScheduleBase.php @@ -103,8 +103,15 @@ abstract class ScheduleBase extends Action $paginationQueries[] = Query::cursorAfter($latestDocument); } + // Temporarly accepting both 'fra' and 'default' + // When all migrated, only use _APP_REGION with 'default' as default value + $regions = [System::getEnv('_APP_REGION', 'default')]; + if (!in_array('default', $regions)) { + $regions[] = 'default'; + } + $results = $dbForPlatform->find('schedules', \array_merge($paginationQueries, [ - Query::equal('region', [System::getEnv('_APP_REGION', 'default')]), + Query::equal('region', $regions), Query::equal('resourceType', [static::getSupportedResource()]), Query::equal('active', [true]), ])); From f25143b240177b141c487048d5e9de03a85e7029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 25 Mar 2025 21:52:02 +0100 Subject: [PATCH 049/124] Support fra-region on cloud; temporary fix --- src/Appwrite/Migration/Version/V19.php | 2 +- src/Appwrite/Platform/Tasks/ScheduleBase.php | 9 ++++++++- src/Appwrite/Platform/Workers/Deletes.php | 9 ++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/Appwrite/Migration/Version/V19.php b/src/Appwrite/Migration/Version/V19.php index 7adf5b85be..4415003bfd 100644 --- a/src/Appwrite/Migration/Version/V19.php +++ b/src/Appwrite/Migration/Version/V19.php @@ -730,7 +730,7 @@ class V19 extends Migration if (empty($document->getAttribute('scheduleId', null))) { $schedule = $this->consoleDB->createDocument('schedules', new Document([ - 'region' => $project->getAttribute('region'), // Todo replace with projects region + 'region' => $project->getAttribute('region'), 'resourceType' => 'function', 'resourceId' => $document->getId(), 'resourceInternalId' => $document->getInternalId(), diff --git a/src/Appwrite/Platform/Tasks/ScheduleBase.php b/src/Appwrite/Platform/Tasks/ScheduleBase.php index 324b88d07b..a3c36cb96e 100644 --- a/src/Appwrite/Platform/Tasks/ScheduleBase.php +++ b/src/Appwrite/Platform/Tasks/ScheduleBase.php @@ -160,8 +160,15 @@ abstract class ScheduleBase extends Action $paginationQueries[] = Query::cursorAfter($latestDocument); } + // Temporarly accepting both 'fra' and 'default' + // When all migrated, only use _APP_REGION with 'default' as default value + $regions = [System::getEnv('_APP_REGION', 'default')]; + if (!in_array('default', $regions)) { + $regions[] = 'default'; + } + $results = $dbForPlatform->find('schedules', \array_merge($paginationQueries, [ - Query::equal('region', [System::getEnv('_APP_REGION', 'default')]), + Query::equal('region', $regions), Query::equal('resourceType', [static::getSupportedResource()]), Query::greaterThanEqual('resourceUpdatedAt', $lastSyncUpdate), ])); diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 6dff127784..8eaa08ce65 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -180,10 +180,17 @@ class Deletes extends Action */ private function deleteSchedules(Database $dbForPlatform, callable $getProjectDB, string $datetime): void { + // Temporarly accepting both 'fra' and 'default' + // When all migrated, only use _APP_REGION with 'default' as default value + $regions = [System::getEnv('_APP_REGION', 'default')]; + if (!in_array('default', $regions)) { + $regions[] = 'default'; + } + $this->listByGroup( 'schedules', [ - Query::equal('region', [System::getEnv('_APP_REGION', 'default')]), + Query::equal('region', $regions), Query::lessThanEqual('resourceUpdatedAt', $datetime), Query::equal('active', [false]), ], From 0295dfcc63e2656068922a30d70a65eecb138b9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 25 Mar 2025 23:07:56 +0100 Subject: [PATCH 050/124] Fix function tsts --- composer.json | 2 +- composer.lock | 51 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/composer.json b/composer.json index 66b18c7a7b..d4db9e0858 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,7 @@ "ext-openssl": "*", "ext-zlib": "*", "ext-sockets": "*", - "appwrite/php-runtimes": "0.18.*", + "appwrite/php-runtimes": "dev-feat-bash-support as 0.19.0", "appwrite/php-clamav": "2.0.*", "utopia-php/abuse": "0.52.*", "utopia-php/analytics": "0.10.*", diff --git a/composer.lock b/composer.lock index aa9598eb05..cf6027457c 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": "eeb306ee6d2576e466ceea5e927664d0", + "content-hash": "44991d525b25ebb55f3feca0a18f61d6", "packages": [ { "name": "adhocore/jwt", @@ -157,16 +157,16 @@ }, { "name": "appwrite/php-runtimes", - "version": "0.18.1", + "version": "dev-feat-bash-support", "source": { "type": "git", "url": "https://github.com/appwrite/runtimes.git", - "reference": "97b5d97ae2c0fc9a2a374769eadff024f95783aa" + "reference": "437cdbe6a1d0af13a69a62fd0608409092a3f455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/runtimes/zipball/97b5d97ae2c0fc9a2a374769eadff024f95783aa", - "reference": "97b5d97ae2c0fc9a2a374769eadff024f95783aa", + "url": "https://api.github.com/repos/appwrite/runtimes/zipball/437cdbe6a1d0af13a69a62fd0608409092a3f455", + "reference": "437cdbe6a1d0af13a69a62fd0608409092a3f455", "shasum": "" }, "require": { @@ -206,9 +206,9 @@ ], "support": { "issues": "https://github.com/appwrite/runtimes/issues", - "source": "https://github.com/appwrite/runtimes/tree/0.18.1" + "source": "https://github.com/appwrite/runtimes/tree/feat-bash-support" }, - "time": "2025-03-11T14:05:46+00:00" + "time": "2025-03-25T21:58:15+00:00" }, { "name": "beberlei/assert", @@ -2372,16 +2372,16 @@ }, { "name": "ramsey/collection", - "version": "2.1.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109" + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", - "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", "shasum": "" }, "require": { @@ -2442,9 +2442,9 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.1.0" + "source": "https://github.com/ramsey/collection/tree/2.1.1" }, - "time": "2025-03-02T04:48:29+00:00" + "time": "2025-03-22T05:38:12+00:00" }, { "name": "ramsey/uuid", @@ -5089,16 +5089,16 @@ "packages-dev": [ { "name": "appwrite/sdk-generator", - "version": "0.40.9", + "version": "0.40.10", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "dbb45a5db22cdc3368fe2573c07ba6088f188fa4" + "reference": "054ac96285caf4f77879087b2416a5ddb8263051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/dbb45a5db22cdc3368fe2573c07ba6088f188fa4", - "reference": "dbb45a5db22cdc3368fe2573c07ba6088f188fa4", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/054ac96285caf4f77879087b2416a5ddb8263051", + "reference": "054ac96285caf4f77879087b2416a5ddb8263051", "shasum": "" }, "require": { @@ -5134,9 +5134,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.40.9" + "source": "https://github.com/appwrite/sdk-generator/tree/0.40.10" }, - "time": "2025-03-17T18:39:14+00:00" + "time": "2025-03-25T13:44:16+00:00" }, { "name": "doctrine/annotations", @@ -8505,9 +8505,18 @@ "time": "2024-03-07T20:33:40+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "appwrite/php-runtimes", + "version": "dev-feat-bash-support", + "alias": "0.19.0", + "alias_normalized": "0.19.0.0" + } + ], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "appwrite/php-runtimes": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { From 708b6279e0f74aa9c37502481a39e301f4fe7813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 25 Mar 2025 23:38:44 +0100 Subject: [PATCH 051/124] upgrade lib --- composer.json | 2 +- composer.lock | 27 +++++++++------------------ 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/composer.json b/composer.json index d4db9e0858..8650a8b387 100644 --- a/composer.json +++ b/composer.json @@ -44,7 +44,7 @@ "ext-openssl": "*", "ext-zlib": "*", "ext-sockets": "*", - "appwrite/php-runtimes": "dev-feat-bash-support as 0.19.0", + "appwrite/php-runtimes": "0.19.*", "appwrite/php-clamav": "2.0.*", "utopia-php/abuse": "0.52.*", "utopia-php/analytics": "0.10.*", diff --git a/composer.lock b/composer.lock index cf6027457c..ee5f16f7c9 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": "44991d525b25ebb55f3feca0a18f61d6", + "content-hash": "e4281c45c1b60dade2ec8df58e6926d5", "packages": [ { "name": "adhocore/jwt", @@ -157,16 +157,16 @@ }, { "name": "appwrite/php-runtimes", - "version": "dev-feat-bash-support", + "version": "0.19.0", "source": { "type": "git", "url": "https://github.com/appwrite/runtimes.git", - "reference": "437cdbe6a1d0af13a69a62fd0608409092a3f455" + "reference": "8d21483efc19b9d977e323188989ee67a188464b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/runtimes/zipball/437cdbe6a1d0af13a69a62fd0608409092a3f455", - "reference": "437cdbe6a1d0af13a69a62fd0608409092a3f455", + "url": "https://api.github.com/repos/appwrite/runtimes/zipball/8d21483efc19b9d977e323188989ee67a188464b", + "reference": "8d21483efc19b9d977e323188989ee67a188464b", "shasum": "" }, "require": { @@ -206,9 +206,9 @@ ], "support": { "issues": "https://github.com/appwrite/runtimes/issues", - "source": "https://github.com/appwrite/runtimes/tree/feat-bash-support" + "source": "https://github.com/appwrite/runtimes/tree/0.19.0" }, - "time": "2025-03-25T21:58:15+00:00" + "time": "2025-03-25T22:37:51+00:00" }, { "name": "beberlei/assert", @@ -8505,18 +8505,9 @@ "time": "2024-03-07T20:33:40+00:00" } ], - "aliases": [ - { - "package": "appwrite/php-runtimes", - "version": "dev-feat-bash-support", - "alias": "0.19.0", - "alias_normalized": "0.19.0.0" - } - ], + "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "appwrite/php-runtimes": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { From a461d5bf7281841ccbbe1c4a27d31e850b8dc2ad Mon Sep 17 00:00:00 2001 From: fogelito Date: Wed, 26 Mar 2025 09:20:44 +0200 Subject: [PATCH 052/124] Deletes fix selects --- src/Appwrite/Platform/Workers/Deletes.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 8eaa08ce65..2cc1eaf9af 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -31,6 +31,8 @@ use Utopia\System\System; class Deletes extends Action { + protected array $selects = ['$internalId', '$id', '$collection', '$updatedAt']; + public static function getName(): string { return 'deletes'; @@ -366,7 +368,7 @@ class Deletes extends Action $queries[] = Query::equal('resourceType', [$resourceType]); } - $queries[] = Query::select(['$internalId', '$id', '$updatedAt']); + $queries[] = Query::select($this->selects); $queries[] = Query::orderAsc(); $this->deleteByGroup( @@ -403,7 +405,7 @@ class Deletes extends Action ); $queries = [ - Query::select(['$internalId', '$id', '$updatedAt']), + Query::select($this->selects), Query::lessThan('accessedAt', $datetime), Query::orderDesc('accessedAt'), Query::orderDesc(), @@ -439,7 +441,7 @@ class Deletes extends Action // Delete Usage stats from projectDB $this->deleteByGroup('stats', [ - Query::select(['$internalId', '$id', '$updatedAt']), + Query::select($this->selects), Query::equal('period', ['1h']), Query::lessThan('time', $hourlyUsageRetentionDatetime), Query::orderDesc('time'), @@ -452,7 +454,7 @@ class Deletes extends Action // Delete Usage stats from logsDB $this->deleteByGroup('stats', [ - Query::select(['$internalId', '$id', '$updatedAt']), + Query::select($this->selects), Query::equal('period', ['1h']), Query::lessThan('time', $hourlyUsageRetentionDatetime), Query::orderDesc('time'), @@ -749,7 +751,7 @@ class Deletes extends Action // Delete Executions $this->deleteByGroup('executions', [ - Query::select(['$internalId', '$id', '$updatedAt']), + Query::select($this->selects), Query::lessThan('$createdAt', $datetime), Query::orderDesc('$createdAt'), Query::orderDesc(), @@ -770,7 +772,7 @@ class Deletes extends Action // Delete Sessions $this->deleteByGroup('sessions', [ - Query::select(['$internalId', '$id', '$updatedAt']), + Query::select($this->selects), Query::lessThan('$createdAt', $expired), Query::orderDesc('$createdAt'), Query::orderDesc(), @@ -807,7 +809,7 @@ class Deletes extends Action try { $this->deleteByGroup(Audit::COLLECTION, [ - Query::select(['$internalId', '$id', '$updatedAt']), + Query::select($this->selects), Query::lessThan('time', $auditRetention), Query::orderDesc('time'), Query::orderAsc(), @@ -889,7 +891,7 @@ class Deletes extends Action */ Console::info("Deleting executions for function " . $functionId); $this->deleteByGroup('executions', [ - Query::select(['$internalId', '$id', '$updatedAt']), + Query::select($this->selects), Query::equal('functionInternalId', [$functionInternalId]), Query::orderAsc() ], $dbForProject); From 424a3575034c31b34b6c2c80a24fb953338642bd Mon Sep 17 00:00:00 2001 From: fogelito Date: Wed, 26 Mar 2025 10:02:30 +0200 Subject: [PATCH 053/124] Add $permissions --- src/Appwrite/Platform/Workers/Deletes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 2cc1eaf9af..5033822241 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -31,7 +31,7 @@ use Utopia\System\System; class Deletes extends Action { - protected array $selects = ['$internalId', '$id', '$collection', '$updatedAt']; + protected array $selects = ['$internalId', '$id', '$collection', '$permissions', '$updatedAt']; public static function getName(): string { From 6978f6960e56b09e93a14f7f1c2811d83ed82791 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 26 Mar 2025 10:14:51 +0100 Subject: [PATCH 054/124] Add new templates; fix bash support during QA --- app/config/frameworks.php | 38 +++--- app/config/templates/site.php | 124 ++++++++++++++---- composer.lock | 24 ++-- .../sites/templates/docusaurus-dark.png | Bin 0 -> 82937 bytes .../sites/templates/docusaurus-light.png | Bin 0 -> 82937 bytes .../images/sites/templates/vitepress-dark.png | Bin 0 -> 43788 bytes .../sites/templates/vitepress-light.png | Bin 0 -> 42996 bytes .../images/sites/templates/vuepress-dark.png | Bin 0 -> 72973 bytes .../images/sites/templates/vuepress-light.png | Bin 0 -> 72973 bytes 9 files changed, 128 insertions(+), 58 deletions(-) create mode 100644 public/images/sites/templates/docusaurus-dark.png create mode 100644 public/images/sites/templates/docusaurus-light.png create mode 100644 public/images/sites/templates/vitepress-dark.png create mode 100644 public/images/sites/templates/vitepress-light.png create mode 100644 public/images/sites/templates/vuepress-dark.png create mode 100644 public/images/sites/templates/vuepress-light.png diff --git a/app/config/frameworks.php b/app/config/frameworks.php index cc9e913523..e669d57710 100644 --- a/app/config/frameworks.php +++ b/app/config/frameworks.php @@ -30,14 +30,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist/analog', - 'startCommand' => 'sh helpers/analog/server.sh', + 'startCommand' => 'bash helpers/analog/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist/analog/public', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', 'fallbackFile' => 'index.html' ] ] @@ -56,14 +56,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist/angular', - 'startCommand' => 'sh helpers/angular/server.sh', + 'startCommand' => 'bash helpers/angular/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist/angular/browser', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', 'fallbackFile' => 'index.csr.html' ] ] @@ -82,14 +82,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './.next', - 'startCommand' => 'sh helpers/next-js/server.sh', + 'startCommand' => 'bash helpers/next-js/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './out', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ] ] ], @@ -105,7 +105,7 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', 'fallbackFile' => 'index.html' ] ] @@ -124,14 +124,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './.output', - 'startCommand' => 'sh helpers/nuxt/server.sh', + 'startCommand' => 'bash helpers/nuxt/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run generate', 'installCommand' => 'npm install', 'outputDirectory' => './output/public', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ] ] ], @@ -147,7 +147,7 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', 'fallbackFile' => 'index.html' ] ] @@ -166,14 +166,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './build', - 'startCommand' => 'sh helpers/sveltekit/server.sh', + 'startCommand' => 'bash helpers/sveltekit/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './build', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ] ] ], @@ -191,14 +191,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist', - 'startCommand' => 'sh helpers/astro/server.sh', + 'startCommand' => 'bash helpers/astro/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ] ] ], @@ -216,14 +216,14 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './build', - 'startCommand' => 'sh helpers/remix/server.sh', + 'startCommand' => 'bash helpers/remix/server.sh', ], 'static' => [ 'key' => 'static', 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './build/client', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ] ] ], @@ -239,7 +239,7 @@ return [ 'buildCommand' => 'flutter build web', 'installCommand' => '', 'outputDirectory' => './build/web', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ], ], ], @@ -255,7 +255,7 @@ return [ 'buildCommand' => 'npm run build', 'installCommand' => 'npm install', 'outputDirectory' => './dist', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ], ] ], @@ -271,7 +271,7 @@ return [ 'buildCommand' => '', 'installCommand' => '', 'outputDirectory' => './', - 'startCommand' => 'sh helpers/server.sh', + 'startCommand' => 'bash helpers/server.sh', ], ] ], diff --git a/app/config/templates/site.php b/app/config/templates/site.php index 1130d55fcf..10cd54b859 100644 --- a/app/config/templates/site.php +++ b/app/config/templates/site.php @@ -16,6 +16,16 @@ if (System::getEnv('_APP_ENV') === 'development') { $url = $protocol . '://' . $hostname; +class UseCases +{ + public const PORTFOLIO = 'portfolio'; + public const STARTER = 'starter'; + public const EVENTS = 'events'; + public const ECOMMERCE = 'ecommerce'; + public const DOCUMENTATION = 'documentation'; + public const BLOG = 'blog'; +} + const TEMPLATE_FRAMEWORKS = [ 'SVELTEKIT' => [ 'key' => 'sveltekit', @@ -143,10 +153,73 @@ function getFramework(string $frameworkEnum, array $overrides) } return [ + [ + 'key' => 'vitepress', + 'name' => 'Vitepress', + 'useCases' => [UseCases::DOCUMENTATION], + 'screenshotDark' => $url . '/images/sites/templates/vitepress-dark.png', + 'screenshotLight' => $url . '/images/sites/templates/vitepress-light.png', + 'frameworks' => [ + getFramework('VITE', [ + 'providerRootDirectory' => './vite/vitepress', + 'outputDirectory' => '404.html', + 'installCommand' => 'npm i vitepress && npm install', + 'buildCommand' => 'npm run docs:build', + 'outputDirectory' => './.vitepress/dist', + ]), + ], + 'vcsProvider' => 'github', + 'providerRepositoryId' => 'templates-for-sites', + 'providerOwner' => 'appwrite', + 'providerVersion' => '0.3.*', + 'variables' => [] + ], + [ + 'key' => 'vuepress', + 'name' => 'Vuepress', + 'useCases' => [UseCases::DOCUMENTATION], + 'screenshotDark' => $url . '/images/sites/templates/vuepress-dark.png', + 'screenshotLight' => $url . '/images/sites/templates/vuepress-light.png', + 'frameworks' => [ + getFramework('VUE', [ + 'providerRootDirectory' => './vue/vuepress', + 'outputDirectory' => '404.html', + 'installCommand' => 'npm install', + 'buildCommand' => 'npm run build', + 'outputDirectory' => './src/.vuepress/dist', + ]), + ], + 'vcsProvider' => 'github', + 'providerRepositoryId' => 'templates-for-sites', + 'providerOwner' => 'appwrite', + 'providerVersion' => '0.3.*', + 'variables' => [] + ], + [ + 'key' => 'docusaurus', + 'name' => 'Docusaurus', + 'useCases' => [UseCases::DOCUMENTATION], + 'screenshotDark' => $url . '/images/sites/templates/docusaurus-dark.png', + 'screenshotLight' => $url . '/images/sites/templates/docusaurus-light.png', + 'frameworks' => [ + getFramework('REACT', [ + 'providerRootDirectory' => './react/docusaurus', + 'outputDirectory' => '404.html', + 'installCommand' => 'npm install', + 'buildCommand' => 'npm run build', + 'outputDirectory' => './build', + ]), + ], + 'vcsProvider' => 'github', + 'providerRepositoryId' => 'templates-for-sites', + 'providerOwner' => 'appwrite', + 'providerVersion' => '0.3.*', + 'variables' => [] + ], [ 'key' => 'nxt-lnk', 'name' => 'Nxt Lnk', - 'useCases' => ['portfolio'], + 'useCases' => [UseCases::PORTFOLIO], 'screenshotDark' => $url . '/images/sites/templates/nxt-lnk-dark.png', 'screenshotLight' => $url . '/images/sites/templates/nxt-lnk-light.png', 'frameworks' => [ @@ -160,11 +233,10 @@ return [ 'providerVersion' => '0.3.*', 'variables' => [] ], - [ 'key' => 'magic-portfolio', 'name' => 'Magic Portfolio', - 'useCases' => ['portfolio'], + 'useCases' => [UseCases::PORTFOLIO], 'screenshotDark' => $url . '/images/sites/templates/magic-portfolio-dark.png', 'screenshotLight' => $url . '/images/sites/templates/magic-portfolio-light.png', 'frameworks' => [ @@ -178,11 +250,10 @@ return [ 'providerVersion' => '0.3.*', 'variables' => [] ], - [ 'key' => 'littlelink', 'name' => 'LittleLink', - 'useCases' => ['portfolio'], + 'useCases' => [UseCases::PORTFOLIO], 'screenshotDark' => $url . '/images/sites/templates/littlelink-dark.png', 'screenshotLight' => $url . '/images/sites/templates/littlelink-light.png', 'frameworks' => [ @@ -196,11 +267,10 @@ return [ 'providerVersion' => '0.3.*', 'variables' => [] ], - [ 'key' => 'logspot', 'name' => 'Logspot', - 'useCases' => ['blog'], + 'useCases' => [UseCases::BLOG], 'screenshotDark' => $url . '/images/sites/templates/logspot-dark.png', 'screenshotLight' => $url . '/images/sites/templates/logspot-light.png', 'frameworks' => [ @@ -220,7 +290,7 @@ return [ [ 'key' => 'astro-nano', 'name' => 'Astro Nano', - 'useCases' => ['portfolio'], + 'useCases' => [UseCases::PORTFOLIO], 'screenshotDark' => $url . '/images/sites/templates/astro-nano-dark.png', 'screenshotLight' => $url . '/images/sites/templates/astro-nano-light.png', 'frameworks' => [ @@ -239,7 +309,7 @@ return [ [ 'key' => 'astro-starlight', 'name' => 'Astro Starlight', - 'useCases' => ['documentation'], + 'useCases' => [UseCases::DOCUMENTATION], 'screenshotDark' => $url . '/images/sites/templates/astro-starlight-dark.png', 'screenshotLight' => $url . '/images/sites/templates/astro-starlight-light.png', 'frameworks' => [ @@ -258,7 +328,7 @@ return [ [ 'key' => 'astro-sphere', 'name' => 'Astro Sphere', - 'useCases' => ['portfolio'], + 'useCases' => [UseCases::PORTFOLIO], 'screenshotDark' => $url . '/images/sites/templates/astro-sphere-dark.png', 'screenshotLight' => $url . '/images/sites/templates/astro-sphere-light.png', 'frameworks' => [ @@ -277,7 +347,7 @@ return [ [ 'key' => 'astro-starlog', 'name' => 'Astro Starlog', - 'useCases' => ['blog'], + 'useCases' => [UseCases::BLOG], 'screenshotDark' => $url . '/images/sites/templates/astro-starlog-dark.png', 'screenshotLight' => $url . '/images/sites/templates/astro-starlog-light.png', 'frameworks' => [ @@ -296,7 +366,7 @@ return [ [ 'key' => 'onelink', 'name' => 'Onelink', - 'useCases' => ['portfolio'], + 'useCases' => [UseCases::PORTFOLIO], 'screenshotDark' => $url . '/images/sites/templates/onelink-dark.png', 'screenshotLight' => $url . '/images/sites/templates/onelink-light.png', 'frameworks' => [ @@ -316,7 +386,7 @@ return [ [ 'key' => 'starter-for-flutter', 'name' => 'Flutter starter', - 'useCases' => ['starter'], + 'useCases' => [UseCases::STARTER], 'screenshotDark' => $url . '/images/sites/templates/starter-for-flutter-dark.png', 'screenshotLight' => $url . '/images/sites/templates/starter-for-flutter-light.png', 'frameworks' => [ @@ -359,7 +429,7 @@ return [ [ 'key' => 'starter-for-js', 'name' => 'JavaScript starter', - 'useCases' => ['starter'], + 'useCases' => [UseCases::STARTER], 'screenshotDark' => $url . '/images/sites/templates/starter-for-js-dark.png', 'screenshotLight' => $url . '/images/sites/templates/starter-for-js-light.png', 'frameworks' => [ @@ -401,7 +471,7 @@ return [ [ 'key' => 'starter-for-angular', 'name' => 'Angular starter', - 'useCases' => ['starter'], + 'useCases' => [UseCases::STARTER], 'screenshotDark' => $url . '/images/sites/templates/starter-for-angular-dark.png', 'screenshotLight' => $url . '/images/sites/templates/starter-for-angular-light.png', 'frameworks' => [ @@ -445,7 +515,7 @@ return [ [ 'key' => 'starter-for-svelte', 'name' => 'Svelte starter', - 'useCases' => ['starter'], + 'useCases' => [UseCases::STARTER], 'screenshotDark' => $url . '/images/sites/templates/starter-for-svelte-dark.png', 'screenshotLight' => $url . '/images/sites/templates/starter-for-svelte-light.png', 'frameworks' => [ @@ -487,7 +557,7 @@ return [ [ 'key' => 'starter-for-react', 'name' => 'React starter', - 'useCases' => ['starter'], + 'useCases' => [UseCases::STARTER], 'screenshotDark' => $url . '/images/sites/templates/starter-for-react-dark.png', 'screenshotLight' => $url . '/images/sites/templates/starter-for-react-light.png', 'frameworks' => [ @@ -529,7 +599,7 @@ return [ [ 'key' => 'starter-for-vue', 'name' => 'Vue starter', - 'useCases' => ['starter'], + 'useCases' => [UseCases::STARTER], 'screenshotDark' => $url . '/images/sites/templates/starter-for-vue-dark.png', 'screenshotLight' => $url . '/images/sites/templates/starter-for-vue-light.png', 'frameworks' => [ @@ -571,7 +641,7 @@ return [ [ 'key' => 'starter-for-react-native', 'name' => 'React Native starter', - 'useCases' => ['starter'], + 'useCases' => [UseCases::STARTER], 'screenshotDark' => $url . '/images/sites/templates/starter-for-react-native-dark.png', 'screenshotLight' => $url . '/images/sites/templates/starter-for-react-native-light.png', 'frameworks' => [ @@ -614,7 +684,7 @@ return [ [ 'key' => 'starter-for-nextjs', 'name' => 'Next.js starter', - 'useCases' => ['starter'], + 'useCases' => [UseCases::STARTER], 'screenshotDark' => $url . '/images/sites/templates/starter-for-nextjs-dark.png', 'screenshotLight' => $url . '/images/sites/templates/starter-for-nextjs-light.png', 'frameworks' => [ @@ -656,7 +726,7 @@ return [ [ 'key' => 'starter-for-nuxt', 'name' => 'Nuxt starter', - 'useCases' => ['starter'], + 'useCases' => [UseCases::STARTER], 'screenshotDark' => $url . '/images/sites/templates/starter-for-nuxt-dark.png', 'screenshotLight' => $url . '/images/sites/templates/starter-for-nuxt-light.png', 'frameworks' => [ @@ -698,7 +768,7 @@ return [ [ 'key' => 'template-for-event', 'name' => 'Event template', - 'useCases' => ['events'], + 'useCases' => [UseCases::EVENTS], 'screenshotDark' => $url . '/images/sites/templates/template-for-event-dark.png', 'screenshotLight' => $url . '/images/sites/templates/template-for-event-light.png', 'frameworks' => [ @@ -734,7 +804,7 @@ return [ [ 'key' => 'template-for-portfolio', 'name' => 'Portfolio template', - 'useCases' => ['portfolio'], + 'useCases' => [UseCases::PORTFOLIO], 'screenshotDark' => $url . '/images/sites/templates/template-for-portfolio-dark.png', 'screenshotLight' => $url . '/images/sites/templates/template-for-portfolio-light.png', 'frameworks' => [ @@ -751,7 +821,7 @@ return [ [ 'key' => 'template-for-store', 'name' => 'Store template', - 'useCases' => ['ecommerce'], + 'useCases' => [UseCases::ECOMMERCE], 'screenshotDark' => $url . '/images/sites/templates/template-for-store-dark.png', 'screenshotLight' => $url . '/images/sites/templates/template-for-store-light.png', 'frameworks' => [ @@ -793,7 +863,7 @@ return [ [ 'key' => 'template-for-blog', 'name' => 'Blog template', - 'useCases' => ['blog'], + 'useCases' => [UseCases::BLOG], 'screenshotDark' => $url . '/images/sites/templates/template-for-blog-dark.png', 'screenshotLight' => $url . '/images/sites/templates/template-for-blog-light.png', 'frameworks' => [ @@ -810,7 +880,7 @@ return [ [ 'key' => 'astro-starter', 'name' => 'Astro starter', - 'useCases' => ['starter'], + 'useCases' => [UseCases::STARTER], 'screenshotDark' => $url . '/images/sites/templates/astro-starter-dark.png', 'screenshotLight' => $url . '/images/sites/templates/astro-starter-light.png', 'frameworks' => [ @@ -827,7 +897,7 @@ return [ [ 'key' => 'remix-starter', 'name' => 'Remix starter', - 'useCases' => ['starter'], + 'useCases' => [UseCases::STARTER], 'screenshotDark' => $url . '/images/sites/templates/remix-starter-dark.png', 'screenshotLight' => $url . '/images/sites/templates/remix-starter-light.png', 'frameworks' => [ diff --git a/composer.lock b/composer.lock index aa9598eb05..56647bc670 100644 --- a/composer.lock +++ b/composer.lock @@ -2372,16 +2372,16 @@ }, { "name": "ramsey/collection", - "version": "2.1.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109" + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", - "reference": "3c5990b8a5e0b79cd1cf11c2dc1229e58e93f109", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", "shasum": "" }, "require": { @@ -2442,9 +2442,9 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.1.0" + "source": "https://github.com/ramsey/collection/tree/2.1.1" }, - "time": "2025-03-02T04:48:29+00:00" + "time": "2025-03-22T05:38:12+00:00" }, { "name": "ramsey/uuid", @@ -5089,16 +5089,16 @@ "packages-dev": [ { "name": "appwrite/sdk-generator", - "version": "0.40.9", + "version": "0.40.10", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "dbb45a5db22cdc3368fe2573c07ba6088f188fa4" + "reference": "054ac96285caf4f77879087b2416a5ddb8263051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/dbb45a5db22cdc3368fe2573c07ba6088f188fa4", - "reference": "dbb45a5db22cdc3368fe2573c07ba6088f188fa4", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/054ac96285caf4f77879087b2416a5ddb8263051", + "reference": "054ac96285caf4f77879087b2416a5ddb8263051", "shasum": "" }, "require": { @@ -5134,9 +5134,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.40.9" + "source": "https://github.com/appwrite/sdk-generator/tree/0.40.10" }, - "time": "2025-03-17T18:39:14+00:00" + "time": "2025-03-25T13:44:16+00:00" }, { "name": "doctrine/annotations", diff --git a/public/images/sites/templates/docusaurus-dark.png b/public/images/sites/templates/docusaurus-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..916ce071ecf329f8f333a4286e1c3a06c23434f5 GIT binary patch literal 82937 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 literal 0 HcmV?d00001 diff --git a/public/images/sites/templates/vitepress-light.png b/public/images/sites/templates/vitepress-light.png new file mode 100644 index 0000000000000000000000000000000000000000..0f93de1c105d9f738aa379e5541a90d34f9af52f GIT binary patch literal 42996 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%0A7~WmExatQ;1{o~e2K%fSRg&z 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

    |o`UYFJ( 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%0A7~WmExatQ;1{o~e2K%fSRg&z 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
      |o`UYFJ( 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 Date: Wed, 26 Mar 2025 10:22:58 +0100 Subject: [PATCH 055/124] Upgrade Console --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 2fbd844d01..f892ab60be 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -205,7 +205,7 @@ services: appwrite-console: <<: *x-logging container_name: appwrite-console - image: appwrite/console:5.3.0-sites-rc.28 + image: appwrite/console:5.3.0-sites-rc.31 restart: unless-stopped networks: - appwrite From d9d38197ddcd91c6429843ba5878b9a9a4e3bef7 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 26 Mar 2025 23:47:59 +1300 Subject: [PATCH 056/124] Update libs --- composer.json | 2 +- composer.lock | 65 ++++++++++++++++++++++----------------------------- 2 files changed, 29 insertions(+), 38 deletions(-) diff --git a/composer.json b/composer.json index 5b0f26b883..b8c5afa109 100644 --- a/composer.json +++ b/composer.json @@ -51,7 +51,7 @@ "utopia-php/cache": "0.12.*", "utopia-php/cli": "0.15.*", "utopia-php/config": "0.2.*", - "utopia-php/database": "dev-feat-multi-tenant-insert as 0.62.1", + "utopia-php/database": "0.63.*", "utopia-php/domains": "0.5.*", "utopia-php/dsn": "0.2.1", "utopia-php/framework": "0.33.*", diff --git a/composer.lock b/composer.lock index 09b8250af6..d4956aeba0 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": "640d2a8be42ae521ea12d8a908873f2b", + "content-hash": "5b3c46863e4571c838c30090ad96436c", "packages": [ { "name": "adhocore/jwt", @@ -3497,16 +3497,16 @@ }, { "name": "utopia-php/database", - "version": "dev-feat-multi-tenant-insert", + "version": "0.63.0", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "2e01c999153a202a8bae9c21e4302e7a674442d0" + "reference": "51ff0a6514e6eda44a6da016d838e7e55282e01a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/2e01c999153a202a8bae9c21e4302e7a674442d0", - "reference": "2e01c999153a202a8bae9c21e4302e7a674442d0", + "url": "https://api.github.com/repos/utopia-php/database/zipball/51ff0a6514e6eda44a6da016d838e7e55282e01a", + "reference": "51ff0a6514e6eda44a6da016d838e7e55282e01a", "shasum": "" }, "require": { @@ -3546,9 +3546,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/feat-multi-tenant-insert" + "source": "https://github.com/utopia-php/database/tree/0.63.0" }, - "time": "2025-03-25T04:45:25+00:00" + "time": "2025-03-26T10:35:37+00:00" }, { "name": "utopia-php/domains", @@ -3950,16 +3950,16 @@ }, { "name": "utopia-php/migration", - "version": "0.8.2", + "version": "0.8.3", "source": { "type": "git", "url": "https://github.com/utopia-php/migration.git", - "reference": "aa3b7a508feb7090f487e7bf9cd71f5c92fbc7c1" + "reference": "85c2e14647b240b75be6b6b762e5b30e48fb8d8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/migration/zipball/aa3b7a508feb7090f487e7bf9cd71f5c92fbc7c1", - "reference": "aa3b7a508feb7090f487e7bf9cd71f5c92fbc7c1", + "url": "https://api.github.com/repos/utopia-php/migration/zipball/85c2e14647b240b75be6b6b762e5b30e48fb8d8a", + "reference": "85c2e14647b240b75be6b6b762e5b30e48fb8d8a", "shasum": "" }, "require": { @@ -3967,7 +3967,7 @@ "ext-curl": "*", "ext-openssl": "*", "php": ">=8.1", - "utopia-php/database": "0.62.*", + "utopia-php/database": "0.63.*", "utopia-php/dsn": "0.2.*", "utopia-php/framework": "0.33.*", "utopia-php/storage": "0.18.*" @@ -4000,9 +4000,9 @@ ], "support": { "issues": "https://github.com/utopia-php/migration/issues", - "source": "https://github.com/utopia-php/migration/tree/0.8.2" + "source": "https://github.com/utopia-php/migration/tree/0.8.3" }, - "time": "2025-03-24T09:05:31+00:00" + "time": "2025-03-26T10:45:51+00:00" }, { "name": "utopia-php/orchestration", @@ -4385,16 +4385,16 @@ }, { "name": "utopia-php/swoole", - "version": "0.8.2", + "version": "0.8.3", "source": { "type": "git", "url": "https://github.com/utopia-php/swoole.git", - "reference": "5fa9d42c608ad46a4ce42a6d2b2eae00592fccd4" + "reference": "1af73dd3e73987cf729c7db399054e4a70befd99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/swoole/zipball/5fa9d42c608ad46a4ce42a6d2b2eae00592fccd4", - "reference": "5fa9d42c608ad46a4ce42a6d2b2eae00592fccd4", + "url": "https://api.github.com/repos/utopia-php/swoole/zipball/1af73dd3e73987cf729c7db399054e4a70befd99", + "reference": "1af73dd3e73987cf729c7db399054e4a70befd99", "shasum": "" }, "require": { @@ -4430,9 +4430,9 @@ ], "support": { "issues": "https://github.com/utopia-php/swoole/issues", - "source": "https://github.com/utopia-php/swoole/tree/0.8.2" + "source": "https://github.com/utopia-php/swoole/tree/0.8.3" }, - "time": "2024-02-01T14:54:12+00:00" + "time": "2025-03-26T10:09:05+00:00" }, { "name": "utopia-php/system", @@ -4775,16 +4775,16 @@ "packages-dev": [ { "name": "appwrite/sdk-generator", - "version": "0.40.9", + "version": "0.40.10", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "dbb45a5db22cdc3368fe2573c07ba6088f188fa4" + "reference": "054ac96285caf4f77879087b2416a5ddb8263051" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/dbb45a5db22cdc3368fe2573c07ba6088f188fa4", - "reference": "dbb45a5db22cdc3368fe2573c07ba6088f188fa4", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/054ac96285caf4f77879087b2416a5ddb8263051", + "reference": "054ac96285caf4f77879087b2416a5ddb8263051", "shasum": "" }, "require": { @@ -4820,9 +4820,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.40.9" + "source": "https://github.com/appwrite/sdk-generator/tree/0.40.10" }, - "time": "2025-03-17T18:39:14+00:00" + "time": "2025-03-25T13:44:16+00:00" }, { "name": "doctrine/annotations", @@ -8132,18 +8132,9 @@ "time": "2024-03-07T20:33:40+00:00" } ], - "aliases": [ - { - "package": "utopia-php/database", - "version": "dev-feat-multi-tenant-insert", - "alias": "0.62.1", - "alias_normalized": "0.62.1.0" - } - ], + "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "utopia-php/database": 20 - }, + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { From 3b9318c2fcd9c60cd473bbc8735410a814998091 Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Wed, 26 Mar 2025 16:52:32 +0530 Subject: [PATCH 057/124] Add tests --- app/controllers/general.php | 12 +++--- .../Services/Sites/SitesCustomServerTest.php | 37 +++++++++++++++++++ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/app/controllers/general.php b/app/controllers/general.php index e66379d40d..87a9c420c7 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -269,12 +269,12 @@ function router(App $utopia, Database $dbForPlatform, callable $getProjectDB, Sw throw new AppwriteException(AppwriteException::FUNCTION_RUNTIME_UNSUPPORTED, 'Runtime "' . $resource->getAttribute('runtime', '') . '" is not supported'); } - if ($deployment->getAttribute('status') === 'waiting' || $deployment->getAttribute('status') === 'processing' || $deployment->getAttribute('status') === 'building') { - throw new AppwriteException(AppwriteException::BUILD_NOT_READY); - } - - if ($deployment->getAttribute('status') === 'failed') { - throw new AppwriteException(AppwriteException::BUILD_FAILED); + if ($deployment->getAttribute('status') !== 'ready') { + if ($deployment->getAttribute('status') === 'failed') { + throw new AppwriteException(AppwriteException::BUILD_FAILED); + } else { + throw new AppwriteException(AppwriteException::BUILD_NOT_READY); + } } if ($type === 'function') { diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index d0cc3b5ba5..4d0ef66112 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -2393,4 +2393,41 @@ class SitesCustomServerTest extends Scope $this->cleanupSite($siteId); } + + public function testDomainForFailedDeloyment(): void + { + $siteId = $this->setupSite([ + 'siteId' => ID::unique(), + 'name' => 'Test Site', + 'framework' => 'astro', + 'buildRuntime' => 'node-22', + 'buildCommand' => 'cd random' + ]); + + $this->assertNotEmpty($siteId); + + $domain = $this->setupSiteDomain($siteId); + $this->assertNotEmpty($domain); + $proxyClient = new Client(); + $proxyClient->setEndpoint('http://' . $domain); + + $deployment = $this->createDeployment($siteId, [ + 'code' => $this->packageSite('astro'), + 'activate' => true + ]); + $this->assertEquals(202, $deployment['headers']['status-code']); + + $deploymentId = $deployment['body']['$id']; + $this->assertNotEmpty($deploymentId); + + $this->assertEventually(function () use ($siteId, $deploymentId) { + $deployment = $this->getDeployment($siteId, $deploymentId); + $this->assertEquals('failed', $deployment['body']['status'], json_encode($deployment['body'], JSON_PRETTY_PRINT)); + }, 100000, 500); + + $response = $proxyClient->call(Client::METHOD_GET, '/'); + $this->assertStringContainsString('Build with the requested ID failed. Please check the logs for more information.', $response['body']); + + $this->cleanupSite($siteId); + } } From 583a18dcd76d62c3eecc4c2f7d0b17ac9af49db0 Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Wed, 26 Mar 2025 17:06:19 +0530 Subject: [PATCH 058/124] Update assertion --- tests/e2e/Services/Sites/SitesCustomServerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index 4d0ef66112..bf9eb0dc29 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -2426,7 +2426,7 @@ class SitesCustomServerTest extends Scope }, 100000, 500); $response = $proxyClient->call(Client::METHOD_GET, '/'); - $this->assertStringContainsString('Build with the requested ID failed. Please check the logs for more information.', $response['body']); + $this->assertStringContainsString('build_failed', $response['body']); $this->cleanupSite($siteId); } From 2e0a6f9b9ebefd0dff756a8c49b3dae6eb7c4bdf Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Wed, 26 Mar 2025 17:22:49 +0530 Subject: [PATCH 059/124] Update swoole version --- composer.lock | 16 ++++++++-------- .../e2e/Services/Sites/SitesCustomServerTest.php | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/composer.lock b/composer.lock index ee5f16f7c9..88cb3586d6 100644 --- a/composer.lock +++ b/composer.lock @@ -4700,16 +4700,16 @@ }, { "name": "utopia-php/swoole", - "version": "0.8.2", + "version": "0.8.3", "source": { "type": "git", "url": "https://github.com/utopia-php/swoole.git", - "reference": "5fa9d42c608ad46a4ce42a6d2b2eae00592fccd4" + "reference": "1af73dd3e73987cf729c7db399054e4a70befd99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/swoole/zipball/5fa9d42c608ad46a4ce42a6d2b2eae00592fccd4", - "reference": "5fa9d42c608ad46a4ce42a6d2b2eae00592fccd4", + "url": "https://api.github.com/repos/utopia-php/swoole/zipball/1af73dd3e73987cf729c7db399054e4a70befd99", + "reference": "1af73dd3e73987cf729c7db399054e4a70befd99", "shasum": "" }, "require": { @@ -4745,9 +4745,9 @@ ], "support": { "issues": "https://github.com/utopia-php/swoole/issues", - "source": "https://github.com/utopia-php/swoole/tree/0.8.2" + "source": "https://github.com/utopia-php/swoole/tree/0.8.3" }, - "time": "2024-02-01T14:54:12+00:00" + "time": "2025-03-26T10:09:05+00:00" }, { "name": "utopia-php/system", @@ -8507,7 +8507,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -8531,5 +8531,5 @@ "platform-overrides": { "php": "8.3" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index 99a1c47f42..ec941a9f56 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -2427,7 +2427,7 @@ class SitesCustomServerTest extends Scope $response1 = $proxyClient->call(Client::METHOD_GET, '/project1'); $this->assertEquals(200, $response1['headers']['status-code']); $response2 = $proxyClient->call(Client::METHOD_GET, '/project1/'); - $this->assertEquals(308, $response2['headers']['status-code']); + $this->assertEquals(200, $response2['headers']['status-code']); $this->cleanupSite($siteId); } } From ab03b4e3caa62347066912d520073eefec6abee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 26 Mar 2025 12:59:05 +0100 Subject: [PATCH 060/124] Deployment ready after screenshot --- app/config/frameworks.php | 2 +- app/controllers/general.php | 5 +- src/Appwrite/Auth/Key.php | 10 +++- .../Modules/Functions/Workers/Builds.php | 48 +++++++++++++------ 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/app/config/frameworks.php b/app/config/frameworks.php index 82fd70bf5b..5440e9a538 100644 --- a/app/config/frameworks.php +++ b/app/config/frameworks.php @@ -138,7 +138,7 @@ return [ 'vue' => [ 'key' => 'vue', 'name' => 'Vue.js', - 'screenshotSleep' => 3000, + 'screenshotSleep' => 5000, 'buildRuntime' => 'node-22', 'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'), 'adapters' => [ diff --git a/app/controllers/general.php b/app/controllers/general.php index 3f105484e1..13dec5dac9 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -268,8 +268,9 @@ function router(App $utopia, Database $dbForPlatform, callable $getProjectDB, Sw if (\is_null($runtime)) { throw new AppwriteException(AppwriteException::FUNCTION_RUNTIME_UNSUPPORTED, 'Runtime "' . $resource->getAttribute('runtime', '') . '" is not supported'); } - - if ($deployment->getAttribute('status') !== 'ready') { + + $allowAnyStatus = !\is_null($apiKey) && $apiKey->isDeploymentStatusIgnored(); + if (!$allowAnyStatus && $deployment->getAttribute('status') !== 'ready') { throw new AppwriteException(AppwriteException::BUILD_NOT_READY); } diff --git a/src/Appwrite/Auth/Key.php b/src/Appwrite/Auth/Key.php index 89c28c4727..87e77b2e06 100644 --- a/src/Appwrite/Auth/Key.php +++ b/src/Appwrite/Auth/Key.php @@ -24,6 +24,7 @@ class Key protected bool $bannerDisabled = false, protected bool $projectCheckDisabled = false, protected bool $previewAuthDisabled = false, + protected bool $deploymentStatusIgnored = false, ) { } @@ -78,6 +79,11 @@ class Key { return $this->previewAuthDisabled; } + + public function isDeploymentStatusIgnored(): bool + { + return $this->deploymentStatusIgnored; + } public function isProjectCheckDisabled(): bool { @@ -139,6 +145,7 @@ class Key $bannerDisabled = $payload['bannerDisabled'] ?? false; $projectCheckDisabled = $payload['projectCheckDisabled'] ?? false; $previewAuthDisabled = $payload['previewAuthDisabled'] ?? false; + $deploymentStatusIgnored = $payload['deploymentStatusIgnored'] ?? false; $scopes = \array_merge($payload['scopes'] ?? [], $scopes); if (!$projectCheckDisabled && $projectId !== $project->getId()) { @@ -156,7 +163,8 @@ class Key $hostnameOverride, $bannerDisabled, $projectCheckDisabled, - $previewAuthDisabled + $previewAuthDisabled, + $deploymentStatusIgnored ); case API_KEY_STANDARD: $key = $project->find( diff --git a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php index 3f28e7a7ce..849fd514d0 100644 --- a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php +++ b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php @@ -778,24 +778,26 @@ class Builds extends Action } $executor->deleteRuntime($project->getId(), $deployment->getId(), '-build'); - + /** Update the build document */ $deployment->setAttribute('buildStartAt', DateTime::format((new \DateTime())->setTimestamp(floor($response['startTime'])))); $deployment->setAttribute('buildEndAt', $endTime); $deployment->setAttribute('buildDuration', \intval(\ceil($durationEnd - $durationStart))); - $deployment->setAttribute('status', 'ready'); $deployment->setAttribute('buildPath', $response['path']); $deployment->setAttribute('buildSize', $response['size']); $deployment->setAttribute('totalSize', $deployment->getAttribute('buildSize', 0) + $deployment->getAttribute('sourceSize', 0)); - + $logs = ''; foreach ($response['output'] as $log) { $logs .= $log['content']; } + $logs .= "Capturing screenshots ...\n"; $deployment->setAttribute('buildLogs', $logs); + + $deployment = $dbForProject->updateDocument('deployments', $deployment->getId(), $deployment); $deployment = $dbForProject->updateDocument('deployments', $deploymentId, $deployment); - + if ($deployment->getInternalId() === $resource->getAttribute('latestDeploymentInternalId', '')) { $resource = $resource->setAttribute('latestDeploymentStatus', $deployment->getAttribute('status', '')); $dbForProject->updateDocument($resource->getCollection(), $resource->getId(), $resource); @@ -804,13 +806,8 @@ class Builds extends Action $queueForRealtime ->setPayload($deployment->getArrayCopy()) ->trigger(); - - if ($isVcsEnabled) { - $this->runGitAction('ready', $github, $providerCommitHash, $owner, $repositoryName, $project, $resource, $deployment->getId(), $dbForProject, $dbForPlatform); - } - - Console::success("Build id: $deploymentId created"); - + + /** Screenshot site */ if ($resource->getCollection() === 'sites') { try { $rule = Authorization::skip(fn () => $dbForPlatform->findOne('rules', [ @@ -848,6 +845,7 @@ class Builds extends Action 'bannerDisabled' => true, 'projectCheckDisabled' => true, 'previewAuthDisabled' => true, + 'deploymentStatusIgnored' => true ]); // TODO: @Meldiron if becomes too slow, do concurrently @@ -864,17 +862,17 @@ class Builds extends Action $config['sleep'] = $framework['screenshotSleep']; } - $response = $client->fetch( + $fetchResponse = $client->fetch( url: 'http://appwrite-browser:3000/v1/screenshots', method: 'POST', body: $config ); - if ($response->getStatusCode() >= 400) { - throw new \Exception($response->getBody()); + if ($fetchResponse->getStatusCode() >= 400) { + throw new \Exception($fetchResponse->getBody()); } - $screenshot = $response->getBody(); + $screenshot = $fetchResponse->getBody(); $fileId = ID::unique(); $fileName = $fileId . '.png'; @@ -928,6 +926,20 @@ class Builds extends Action } } + /** Update the status */ + $deployment->setAttribute('status', 'ready'); + $deployment = $dbForProject->updateDocument('deployments', $deploymentId, $deployment); + + $queueForRealtime + ->setPayload($deployment->getArrayCopy()) + ->trigger(); + + if ($isVcsEnabled) { + $this->runGitAction('ready', $github, $providerCommitHash, $owner, $repositoryName, $project, $resource, $deployment->getId(), $dbForProject, $dbForPlatform); + } + + Console::success("Build id: $deploymentId created"); + /** Set auto deploy */ if ($deployment->getAttribute('activate') === true) { $resource->setAttribute('live', true); @@ -1066,6 +1078,12 @@ class Builds extends Action Authorization::skip(fn () => $dbForPlatform->updateDocument('schedules', $schedule->getId(), $schedule)); } } catch (\Throwable $th) { + Console::warning('Build failed:'); + Console::error($th->getMessage()); + Console::error($th->getFile()); + Console::error($th->getLine()); + Console::error($th->getTraceAsString()); + if ($dbForProject->getDocument('deployments', $deploymentId)->getAttribute('status') === 'canceled') { Console::info('Build has been canceled'); return; From 681b6031aa5dfc85bd78796d7f05e85a339e7023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 26 Mar 2025 12:59:15 +0100 Subject: [PATCH 061/124] Linter fix --- app/controllers/general.php | 2 +- src/Appwrite/Auth/Key.php | 2 +- .../Platform/Modules/Functions/Workers/Builds.php | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/controllers/general.php b/app/controllers/general.php index 13dec5dac9..006584c954 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -268,7 +268,7 @@ function router(App $utopia, Database $dbForPlatform, callable $getProjectDB, Sw if (\is_null($runtime)) { throw new AppwriteException(AppwriteException::FUNCTION_RUNTIME_UNSUPPORTED, 'Runtime "' . $resource->getAttribute('runtime', '') . '" is not supported'); } - + $allowAnyStatus = !\is_null($apiKey) && $apiKey->isDeploymentStatusIgnored(); if (!$allowAnyStatus && $deployment->getAttribute('status') !== 'ready') { throw new AppwriteException(AppwriteException::BUILD_NOT_READY); diff --git a/src/Appwrite/Auth/Key.php b/src/Appwrite/Auth/Key.php index 87e77b2e06..44a75a6ee3 100644 --- a/src/Appwrite/Auth/Key.php +++ b/src/Appwrite/Auth/Key.php @@ -79,7 +79,7 @@ class Key { return $this->previewAuthDisabled; } - + public function isDeploymentStatusIgnored(): bool { return $this->deploymentStatusIgnored; diff --git a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php index 849fd514d0..b18b6e4004 100644 --- a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php +++ b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php @@ -778,7 +778,7 @@ class Builds extends Action } $executor->deleteRuntime($project->getId(), $deployment->getId(), '-build'); - + /** Update the build document */ $deployment->setAttribute('buildStartAt', DateTime::format((new \DateTime())->setTimestamp(floor($response['startTime'])))); $deployment->setAttribute('buildEndAt', $endTime); @@ -786,18 +786,18 @@ class Builds extends Action $deployment->setAttribute('buildPath', $response['path']); $deployment->setAttribute('buildSize', $response['size']); $deployment->setAttribute('totalSize', $deployment->getAttribute('buildSize', 0) + $deployment->getAttribute('sourceSize', 0)); - + $logs = ''; foreach ($response['output'] as $log) { $logs .= $log['content']; } $logs .= "Capturing screenshots ...\n"; $deployment->setAttribute('buildLogs', $logs); - + $deployment = $dbForProject->updateDocument('deployments', $deployment->getId(), $deployment); $deployment = $dbForProject->updateDocument('deployments', $deploymentId, $deployment); - + if ($deployment->getInternalId() === $resource->getAttribute('latestDeploymentInternalId', '')) { $resource = $resource->setAttribute('latestDeploymentStatus', $deployment->getAttribute('status', '')); $dbForProject->updateDocument($resource->getCollection(), $resource->getId(), $resource); @@ -806,7 +806,7 @@ class Builds extends Action $queueForRealtime ->setPayload($deployment->getArrayCopy()) ->trigger(); - + /** Screenshot site */ if ($resource->getCollection() === 'sites') { try { @@ -1083,7 +1083,7 @@ class Builds extends Action Console::error($th->getFile()); Console::error($th->getLine()); Console::error($th->getTraceAsString()); - + if ($dbForProject->getDocument('deployments', $deploymentId)->getAttribute('status') === 'canceled') { Console::info('Build has been canceled'); return; From 2c55f5aaa607f01e12fe0680a539100f5f18f6ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 26 Mar 2025 13:20:14 +0100 Subject: [PATCH 062/124] Concurrency screenshots --- .../Modules/Functions/Workers/Builds.php | 117 ++++++++++-------- 1 file changed, 63 insertions(+), 54 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php index b18b6e4004..eecc439642 100644 --- a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php +++ b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php @@ -41,6 +41,8 @@ use Utopia\Storage\Device\Local; use Utopia\System\System; use Utopia\VCS\Adapter\Git\GitHub; +use function Swoole\Coroutine\batch; + class Builds extends Action { public static function getName(): string @@ -849,69 +851,76 @@ class Builds extends Action ]); // TODO: @Meldiron if becomes too slow, do concurrently - foreach ($configs as $key => $config) { - $config['headers'] = \array_merge($config['headers'] ?? [], [ - 'x-appwrite-key' => API_KEY_DYNAMIC . '_' . $apiKey - ]); + $screenshots = batch(\array_map(function ($key) use ($configs, $deviceForFiles, $apiKey, $resource, $client, $bucket, $project, $dbForPlatform) { + return function () use ($key, $configs, $deviceForFiles, $apiKey, $resource, $client, $bucket, $project, $dbForPlatform) { + $config = $configs[$key]; - $config['sleep'] = 3000; + $config['headers'] = \array_merge($config['headers'] ?? [], [ + 'x-appwrite-key' => API_KEY_DYNAMIC . '_' . $apiKey + ]); + $config['sleep'] = 3000; - $frameworks = Config::getParam('frameworks', []); - $framework = $frameworks[$resource->getAttribute('framework', '')] ?? null; - if (!is_null($framework)) { - $config['sleep'] = $framework['screenshotSleep']; - } + $frameworks = Config::getParam('frameworks', []); + $framework = $frameworks[$resource->getAttribute('framework', '')] ?? null; + if (!is_null($framework)) { + $config['sleep'] = $framework['screenshotSleep']; + } - $fetchResponse = $client->fetch( - url: 'http://appwrite-browser:3000/v1/screenshots', - method: 'POST', - body: $config - ); + $fetchResponse = $client->fetch( + url: 'http://appwrite-browser:3000/v1/screenshots', + method: 'POST', + body: $config + ); - if ($fetchResponse->getStatusCode() >= 400) { - throw new \Exception($fetchResponse->getBody()); - } + if ($fetchResponse->getStatusCode() >= 400) { + throw new \Exception($fetchResponse->getBody()); + } - $screenshot = $fetchResponse->getBody(); + $screenshot = $fetchResponse->getBody(); - $fileId = ID::unique(); - $fileName = $fileId . '.png'; - $path = $deviceForFiles->getPath($fileName); - $path = str_ireplace($deviceForFiles->getRoot(), $deviceForFiles->getRoot() . DIRECTORY_SEPARATOR . $bucket->getId(), $path); // Add bucket id to path after root - $success = $deviceForFiles->write($path, $screenshot, "image/png"); + $fileId = ID::unique(); + $fileName = $fileId . '.png'; + $path = $deviceForFiles->getPath($fileName); + $path = str_ireplace($deviceForFiles->getRoot(), $deviceForFiles->getRoot() . DIRECTORY_SEPARATOR . $bucket->getId(), $path); // Add bucket id to path after root + $success = $deviceForFiles->write($path, $screenshot, "image/png"); - if (!$success) { - throw new \Exception("Screenshot failed to save"); - } + if (!$success) { + throw new \Exception("Screenshot failed to save"); + } - $teamId = $project->getAttribute('teamId', ''); - $file = new Document([ - '$id' => $fileId, - '$permissions' => [ - Permission::read(Role::team(ID::custom($teamId))), - ], - 'bucketId' => $bucket->getId(), - 'bucketInternalId' => $bucket->getInternalId(), - 'name' => $fileName, - 'path' => $path, - 'signature' => $deviceForFiles->getFileHash($path), - 'mimeType' => $deviceForFiles->getFileMimeType($path), - 'sizeOriginal' => \strlen($screenshot), - 'sizeActual' => $deviceForFiles->getFileSize($path), - 'algorithm' => Compression::GZIP, - 'comment' => '', - 'chunksTotal' => 1, - 'chunksUploaded' => 1, - 'openSSLVersion' => null, - 'openSSLCipher' => null, - 'openSSLTag' => null, - 'openSSLIV' => null, - 'search' => implode(' ', [$fileId, $fileName]), - 'metadata' => ['content_type' => $deviceForFiles->getFileMimeType($path)], - ]); - $file = Authorization::skip(fn () => $dbForPlatform->createDocument('bucket_' . $bucket->getInternalId(), $file)); + $teamId = $project->getAttribute('teamId', ''); + $file = new Document([ + '$id' => $fileId, + '$permissions' => [ + Permission::read(Role::team(ID::custom($teamId))), + ], + 'bucketId' => $bucket->getId(), + 'bucketInternalId' => $bucket->getInternalId(), + 'name' => $fileName, + 'path' => $path, + 'signature' => $deviceForFiles->getFileHash($path), + 'mimeType' => $deviceForFiles->getFileMimeType($path), + 'sizeOriginal' => \strlen($screenshot), + 'sizeActual' => $deviceForFiles->getFileSize($path), + 'algorithm' => Compression::GZIP, + 'comment' => '', + 'chunksTotal' => 1, + 'chunksUploaded' => 1, + 'openSSLVersion' => null, + 'openSSLCipher' => null, + 'openSSLTag' => null, + 'openSSLIV' => null, + 'search' => implode(' ', [$fileId, $fileName]), + 'metadata' => ['content_type' => $deviceForFiles->getFileMimeType($path)], + ]); + $file = Authorization::skip(fn () => $dbForPlatform->createDocument('bucket_' . $bucket->getInternalId(), $file)); - $deployment->setAttribute($key, $fileId); + return [ 'key' => $key, 'fileId' => $fileId ]; + }; + }, \array_keys($configs))); + + foreach ($screenshots as $screenshot) { + $deployment->setAttribute($screenshot['key'], $screenshot['fileId']); } $dbForProject->updateDocument('deployments', $deployment->getId(), $deployment); From 62be0e1d00eab357da3482080fb617496fb47728 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 26 Mar 2025 14:38:18 +0100 Subject: [PATCH 063/124] Fix latest deployment attributes --- .../Platform/Modules/Functions/Workers/Builds.php | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php index eecc439642..d2ef6deb36 100644 --- a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php +++ b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php @@ -798,13 +798,6 @@ class Builds extends Action $deployment = $dbForProject->updateDocument('deployments', $deployment->getId(), $deployment); - $deployment = $dbForProject->updateDocument('deployments', $deploymentId, $deployment); - - if ($deployment->getInternalId() === $resource->getAttribute('latestDeploymentInternalId', '')) { - $resource = $resource->setAttribute('latestDeploymentStatus', $deployment->getAttribute('status', '')); - $dbForProject->updateDocument($resource->getCollection(), $resource->getId(), $resource); - } - $queueForRealtime ->setPayload($deployment->getArrayCopy()) ->trigger(); @@ -938,6 +931,11 @@ class Builds extends Action /** Update the status */ $deployment->setAttribute('status', 'ready'); $deployment = $dbForProject->updateDocument('deployments', $deploymentId, $deployment); + + if ($deployment->getInternalId() === $resource->getAttribute('latestDeploymentInternalId', '')) { + $resource = $resource->setAttribute('latestDeploymentStatus', $deployment->getAttribute('status', '')); + $dbForProject->updateDocument($resource->getCollection(), $resource->getId(), $resource); + } $queueForRealtime ->setPayload($deployment->getArrayCopy()) From 70fbf69c5689da448716d9f47c156cb0db60bd2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 26 Mar 2025 14:38:27 +0100 Subject: [PATCH 064/124] Fix fonts --- app/views/general/404.phtml | 10 ++++++---- src/Appwrite/Transformation/Adapter/Preview.php | 8 +++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/views/general/404.phtml b/app/views/general/404.phtml index 7ec1cfbf21..5e63344c8a 100644 --- a/app/views/general/404.phtml +++ b/app/views/general/404.phtml @@ -7,6 +7,8 @@ 404 Not Found