From ba26dd6df50d2cb1fb0a14302765ce7e6ac6a8aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 11 Mar 2025 16:26:49 +0100 Subject: [PATCH 1/9] Apply consistency of attributes --- app/config/collections/projects.php | 6 +++--- .../Functions/Http/Deployments/Delete.php | 4 ++-- .../Functions/Http/Executions/Create.php | 2 +- .../Functions/Http/Functions/Create.php | 2 +- .../Http/Functions/Deployment/Update.php | 4 ++-- .../Functions/Http/Functions/Update.php | 6 +++--- .../Functions/Http/Variables/Create.php | 2 +- .../Functions/Http/Variables/Delete.php | 2 +- .../Functions/Http/Variables/Update.php | 2 +- .../Modules/Functions/Workers/Builds.php | 4 ++-- .../Proxy/Http/Rules/Function/Create.php | 2 +- .../Modules/Sites/Http/Deployments/Delete.php | 2 +- src/Appwrite/Platform/Workers/Functions.php | 2 +- .../Database/Validator/Queries/Functions.php | 2 +- src/Appwrite/Utopia/Response/Model/Func.php | 2 +- tests/e2e/General/UsageTest.php | 2 +- tests/e2e/Services/Functions/FunctionsBase.php | 4 ++-- .../Functions/FunctionsCustomServerTest.php | 18 +++++++++--------- tests/e2e/Services/Proxy/ProxyBase.php | 2 +- 19 files changed, 35 insertions(+), 35 deletions(-) diff --git a/app/config/collections/projects.php b/app/config/collections/projects.php index 7ea750f2b3..d15105b41d 100644 --- a/app/config/collections/projects.php +++ b/app/config/collections/projects.php @@ -569,7 +569,7 @@ return [ 'filters' => [], ], [ - '$id' => ID::custom('deployment'), + '$id' => ID::custom('deploymentId'), 'type' => Database::VAR_STRING, 'format' => '', 'size' => Database::LENGTH_KEY, @@ -788,9 +788,9 @@ return [ 'orders' => [Database::ORDER_ASC], ], [ - '$id' => ID::custom('_key_deployment'), + '$id' => ID::custom('_key_deploymentId'), 'type' => Database::INDEX_KEY, - 'attributes' => ['deployment'], + 'attributes' => ['deploymentId'], 'lengths' => [], 'orders' => [Database::ORDER_ASC], ] diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Delete.php b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Delete.php index c02c470980..81474742ce 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Delete.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Delete.php @@ -89,9 +89,9 @@ class Delete extends Action } } - if ($function->getAttribute('deployment') === $deployment->getId()) { // Reset function deployment + if ($function->getAttribute('deploymentId') === $deployment->getId()) { // Reset function deployment $function = $dbForProject->updateDocument('functions', $function->getId(), new Document(array_merge($function->getArrayCopy(), [ - 'deployment' => '', + 'deploymentId' => '', 'deploymentInternalId' => '', ]))); } diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php index 422b5f767f..dd580bc365 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php @@ -146,7 +146,7 @@ class Create extends Base throw new Exception(Exception::FUNCTION_RUNTIME_UNSUPPORTED, 'Runtime "' . $function->getAttribute('runtime', '') . '" is not supported'); } - $deployment = Authorization::skip(fn () => $dbForProject->getDocument('deployments', $function->getAttribute('deployment', ''))); + $deployment = Authorization::skip(fn () => $dbForProject->getDocument('deployments', $function->getAttribute('deploymentId', ''))); if ($deployment->getAttribute('resourceId') !== $function->getId()) { throw new Exception(Exception::DEPLOYMENT_NOT_FOUND, 'Deployment not found. Create a deployment before trying to execute a function'); diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php index b8959ab5bc..276435e73e 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php @@ -159,7 +159,7 @@ class Create extends Base 'name' => $name, 'runtime' => $runtime, 'deploymentInternalId' => '', - 'deployment' => '', + 'deploymentId' => '', 'events' => $events, 'schedule' => $schedule, 'scheduleInternalId' => '', diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Deployment/Update.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Deployment/Update.php index 9b5d7c5f9f..450f0fec04 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Deployment/Update.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Deployment/Update.php @@ -85,7 +85,7 @@ class Update extends Base $function = $dbForProject->updateDocument('functions', $function->getId(), new Document(array_merge($function->getArrayCopy(), [ 'deploymentInternalId' => $deployment->getInternalId(), - 'deployment' => $deployment->getId(), + 'deploymentId' => $deployment->getId(), ]))); // Inform scheduler if function is still active @@ -93,7 +93,7 @@ class Update extends Base $schedule ->setAttribute('resourceUpdatedAt', DateTime::now()) ->setAttribute('schedule', $function->getAttribute('schedule')) - ->setAttribute('active', !empty($function->getAttribute('schedule')) && !empty($function->getAttribute('deployment'))); + ->setAttribute('active', !empty($function->getAttribute('schedule')) && !empty($function->getAttribute('deploymentId'))); Authorization::skip(fn () => $dbForPlatform->updateDocument('schedules', $schedule->getId(), $schedule)); $queries = [ diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php index 550cc2aa51..d1f5f8eaf7 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php @@ -207,10 +207,10 @@ class Update extends Base } // Enforce Cold Start if spec limits change. - if ($function->getAttribute('specification') !== $specification && !empty($function->getAttribute('deployment'))) { + if ($function->getAttribute('specification') !== $specification && !empty($function->getAttribute('deploymentId'))) { $executor = new Executor(App::getEnv('_APP_EXECUTOR_HOST')); try { - $executor->deleteRuntime($project->getId(), $function->getAttribute('deployment')); + $executor->deleteRuntime($project->getId(), $function->getAttribute('deploymentId')); } catch (\Throwable $th) { // Don't throw if the deployment doesn't exist if ($th->getCode() !== 404) { @@ -254,7 +254,7 @@ class Update extends Base $schedule ->setAttribute('resourceUpdatedAt', DateTime::now()) ->setAttribute('schedule', $function->getAttribute('schedule')) - ->setAttribute('active', !empty($function->getAttribute('schedule')) && !empty($function->getAttribute('deployment'))); + ->setAttribute('active', !empty($function->getAttribute('schedule')) && !empty($function->getAttribute('deploymentId'))); Authorization::skip(fn () => $dbForPlatform->updateDocument('schedules', $schedule->getId(), $schedule)); $queueForEvents->setParam('functionId', $function->getId()); diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Variables/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Variables/Create.php index ba48a5c4bc..5cfd5e8a95 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Variables/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Variables/Create.php @@ -105,7 +105,7 @@ class Create extends Base $schedule ->setAttribute('resourceUpdatedAt', DateTime::now()) ->setAttribute('schedule', $function->getAttribute('schedule')) - ->setAttribute('active', !empty($function->getAttribute('schedule')) && !empty($function->getAttribute('deployment'))); + ->setAttribute('active', !empty($function->getAttribute('schedule')) && !empty($function->getAttribute('deploymentId'))); Authorization::skip(fn () => $dbForPlatform->updateDocument('schedules', $schedule->getId(), $schedule)); $response diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Variables/Delete.php b/src/Appwrite/Platform/Modules/Functions/Http/Variables/Delete.php index 650eaf4010..996e0026ac 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Variables/Delete.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Variables/Delete.php @@ -85,7 +85,7 @@ class Delete extends Base $schedule ->setAttribute('resourceUpdatedAt', DateTime::now()) ->setAttribute('schedule', $function->getAttribute('schedule')) - ->setAttribute('active', !empty($function->getAttribute('schedule')) && !empty($function->getAttribute('deployment'))); + ->setAttribute('active', !empty($function->getAttribute('schedule')) && !empty($function->getAttribute('deploymentId'))); Authorization::skip(fn () => $dbForPlatform->updateDocument('schedules', $schedule->getId(), $schedule)); $response->noContent(); diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Variables/Update.php b/src/Appwrite/Platform/Modules/Functions/Http/Variables/Update.php index 8911dc8abb..5cd277ca8f 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Variables/Update.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Variables/Update.php @@ -103,7 +103,7 @@ class Update extends Base $schedule ->setAttribute('resourceUpdatedAt', DateTime::now()) ->setAttribute('schedule', $function->getAttribute('schedule')) - ->setAttribute('active', !empty($function->getAttribute('schedule')) && !empty($function->getAttribute('deployment'))); + ->setAttribute('active', !empty($function->getAttribute('schedule')) && !empty($function->getAttribute('deploymentId'))); Authorization::skip(fn () => $dbForPlatform->updateDocument('schedules', $schedule->getId(), $schedule)); $response->dynamic($variable, Response::MODEL_VARIABLE); diff --git a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php index bf442e7c3b..c6c9280191 100644 --- a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php +++ b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php @@ -854,7 +854,7 @@ class Builds extends Action case 'functions': $oldDeploymentInternalId = $resource->getAttribute('deploymentInternalId', ''); - $resource->setAttribute('deployment', $deployment->getId()); + $resource->setAttribute('deploymentId', $deployment->getId()); $resource->setAttribute('deploymentInternalId', $deployment->getInternalId()); $resource = $dbForProject->updateDocument('functions', $resource->getId(), $resource); @@ -974,7 +974,7 @@ class Builds extends Action $schedule ->setAttribute('resourceUpdatedAt', DateTime::now()) ->setAttribute('schedule', $resource->getAttribute('schedule')) - ->setAttribute('active', !empty($resource->getAttribute('schedule')) && !empty($resource->getAttribute('deployment'))); + ->setAttribute('active', !empty($resource->getAttribute('schedule')) && !empty($resource->getAttribute('deploymentId'))); Authorization::skip(fn () => $dbForPlatform->updateDocument('schedules', $schedule->getId(), $schedule)); } } catch (\Throwable $th) { diff --git a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Function/Create.php b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Function/Create.php index 5f3d6382d5..fea02ddde9 100644 --- a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Function/Create.php +++ b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Function/Create.php @@ -108,7 +108,7 @@ class Create extends Action throw new Exception(Exception::RULE_RESOURCE_NOT_FOUND); } - $deployment = $dbForProject->getDocument('deployments', $function->getAttribute('deployment', '')); + $deployment = $dbForProject->getDocument('deployments', $function->getAttribute('deploymentId', '')); // TODO: @christyjacob remove once we migrate the rules in 1.7.x $ruleId = System::getEnv('_APP_RULES_FORMAT') === 'md5' ? md5($domain->get()) : ID::unique(); diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Delete.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Delete.php index 7065ac1917..458d758d93 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Delete.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Delete.php @@ -89,7 +89,7 @@ class Delete extends Action } } - if ($site->getAttribute('deployment') === $deployment->getId()) { // Reset site deployment + if ($site->getAttribute('deploymentId') === $deployment->getId()) { // Reset site deployment $site = $dbForProject->updateDocument('sites', $site->getId(), new Document(array_merge($site->getArrayCopy(), [ 'deploymentId' => '', 'deploymentInternalId' => '', diff --git a/src/Appwrite/Platform/Workers/Functions.php b/src/Appwrite/Platform/Workers/Functions.php index 1c952bc7a8..3e4c58fbe5 100644 --- a/src/Appwrite/Platform/Workers/Functions.php +++ b/src/Appwrite/Platform/Workers/Functions.php @@ -325,7 +325,7 @@ class Functions extends Action ): void { $user ??= new Document(); $functionId = $function->getId(); - $deploymentId = $function->getAttribute('deployment', ''); + $deploymentId = $function->getAttribute('deploymentId', ''); $spec = Config::getParam('specifications')[$function->getAttribute('specification', APP_COMPUTE_SPECIFICATION_DEFAULT)]; $log->addTag('deploymentId', $deploymentId); diff --git a/src/Appwrite/Utopia/Database/Validator/Queries/Functions.php b/src/Appwrite/Utopia/Database/Validator/Queries/Functions.php index 89f5d52c81..894ee26e3f 100644 --- a/src/Appwrite/Utopia/Database/Validator/Queries/Functions.php +++ b/src/Appwrite/Utopia/Database/Validator/Queries/Functions.php @@ -8,7 +8,7 @@ class Functions extends Base 'name', 'enabled', 'runtime', - 'deployment', + 'deploymentId', 'schedule', 'scheduleNext', 'schedulePrevious', diff --git a/src/Appwrite/Utopia/Response/Model/Func.php b/src/Appwrite/Utopia/Response/Model/Func.php index 3bfc24c82e..5b398bd336 100644 --- a/src/Appwrite/Utopia/Response/Model/Func.php +++ b/src/Appwrite/Utopia/Response/Model/Func.php @@ -65,7 +65,7 @@ class Func extends Model 'default' => '', 'example' => 'python-3.8', ]) - ->addRule('deployment', [ + ->addRule('deploymentId', [ 'type' => self::TYPE_STRING, 'description' => 'Function\'s active deployment ID.', 'default' => '', diff --git a/tests/e2e/General/UsageTest.php b/tests/e2e/General/UsageTest.php index a74101f50d..0609ea9fed 100644 --- a/tests/e2e/General/UsageTest.php +++ b/tests/e2e/General/UsageTest.php @@ -930,7 +930,7 @@ class UsageTest extends Scope $this->assertEquals(true, (new DatetimeValidator())->isValid($response['body']['$createdAt'])); $this->assertEquals(true, (new DatetimeValidator())->isValid($response['body']['$updatedAt'])); - $this->assertEquals($deploymentId, $response['body']['deployment']); + $this->assertEquals($deploymentId, $response['body']['deploymentId']); $response = $this->client->call( Client::METHOD_POST, diff --git a/tests/e2e/Services/Functions/FunctionsBase.php b/tests/e2e/Services/Functions/FunctionsBase.php index 2d0975181c..2d82de22f2 100644 --- a/tests/e2e/Services/Functions/FunctionsBase.php +++ b/tests/e2e/Services/Functions/FunctionsBase.php @@ -59,7 +59,7 @@ trait FunctionsBase 'x-appwrite-project' => $this->getProject()['$id'], 'x-appwrite-key' => $this->getProject()['apiKey'], ])); - $this->assertEquals($deploymentId, $function['body']['deployment'], 'Deployment is not activated, deployment: ' . json_encode($function['body'], JSON_PRETTY_PRINT)); + $this->assertEquals($deploymentId, $function['body']['deploymentId'], 'Deployment is not activated, deployment: ' . json_encode($function['body'], JSON_PRETTY_PRINT)); }, 100000, 500); } @@ -351,7 +351,7 @@ trait FunctionsBase $this->assertEventually(function () use ($functionId, $deploymentId) { $function = $this->getFunction($functionId); - $this->assertEquals($deploymentId, $function['body']['deployment'], 'Deployment is not activated, deployment: ' . json_encode($function['body'], JSON_PRETTY_PRINT)); + $this->assertEquals($deploymentId, $function['body']['deploymentId'], 'Deployment is not activated, deployment: ' . json_encode($function['body'], JSON_PRETTY_PRINT)); }, 100000, 500); return $deploymentId; diff --git a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php index 6671c57c90..8896d827c1 100644 --- a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php +++ b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php @@ -83,7 +83,7 @@ class FunctionsCustomServerTest extends Scope $this->assertEquals('php-8.0', $function['body']['runtime']); $this->assertEquals(true, $dateValidator->isValid($function['body']['$createdAt'])); $this->assertEquals(true, $dateValidator->isValid($function['body']['$updatedAt'])); - $this->assertEquals('', $function['body']['deployment']); + $this->assertEquals('', $function['body']['deploymentId']); $this->assertEquals([ 'buckets.*.create', 'buckets.*.delete', @@ -298,7 +298,7 @@ class FunctionsCustomServerTest extends Scope $this->assertEquals('Test1', $function['body']['name']); $this->assertEquals(true, $dateValidator->isValid($function['body']['$createdAt'])); $this->assertEquals(true, $dateValidator->isValid($function['body']['$updatedAt'])); - $this->assertEquals('', $function['body']['deployment']); + $this->assertEquals('', $function['body']['deploymentId']); $this->assertEquals([ 'users.*.update.name', 'users.*.update.email', @@ -431,7 +431,7 @@ class FunctionsCustomServerTest extends Scope $function = $this->getFunction($functionId); $this->assertEquals(200, $function['headers']['status-code']); - $this->assertEquals($deploymentId, $function['body']['deployment']); + $this->assertEquals($deploymentId, $function['body']['deploymentId']); // Test starter code is used and that dynamic keys work $execution = $this->createExecution($functionId, [ @@ -531,8 +531,8 @@ class FunctionsCustomServerTest extends Scope $function = $this->getFunction($functionId); $this->assertEquals(200, $function['headers']['status-code']); - $this->assertEquals($deploymentIdActive, $function['body']['deployment']); - $this->assertNotEquals($deploymentIdInactive, $function['body']['deployment']); + $this->assertEquals($deploymentIdActive, $function['body']['deploymentId']); + $this->assertNotEquals($deploymentIdInactive, $function['body']['deploymentId']); $deployment = $this->client->call(Client::METHOD_DELETE, '/functions/' . $functionId . '/deployments/' . $deploymentIdInactive, array_merge([ 'content-type' => 'application/json', @@ -670,7 +670,7 @@ class FunctionsCustomServerTest extends Scope $this->assertNotEmpty($response['body']['$id']); $this->assertEquals(true, $dateValidator->isValid($response['body']['$createdAt'])); $this->assertEquals(true, $dateValidator->isValid($response['body']['$updatedAt'])); - $this->assertEquals($data['deploymentId'], $response['body']['deployment']); + $this->assertEquals($data['deploymentId'], $response['body']['deploymentId']); return $data; } @@ -2079,15 +2079,15 @@ class FunctionsCustomServerTest extends Scope $function = $this->getFunction($functionId); $this->assertEquals(200, $function['headers']['status-code']); - $this->assertEquals($deploymentId2, $function['body']['deployment']); + $this->assertEquals($deploymentId2, $function['body']['deploymentId']); $function = $this->updateFunctionDeployment($functionId, $deploymentId1); $this->assertEquals(200, $function['headers']['status-code']); - $this->assertEquals($deploymentId1, $function['body']['deployment']); + $this->assertEquals($deploymentId1, $function['body']['deploymentId']); $function = $this->getFunction($functionId); $this->assertEquals(200, $function['headers']['status-code']); - $this->assertEquals($deploymentId1, $function['body']['deployment']); + $this->assertEquals($deploymentId1, $function['body']['deploymentId']); $execution = $this->createExecution($functionId, [ 'headers' => [ 'cookie' => 'cookieName=cookieValue' ] diff --git a/tests/e2e/Services/Proxy/ProxyBase.php b/tests/e2e/Services/Proxy/ProxyBase.php index 40f16b5f8e..44e015b751 100644 --- a/tests/e2e/Services/Proxy/ProxyBase.php +++ b/tests/e2e/Services/Proxy/ProxyBase.php @@ -255,7 +255,7 @@ trait ProxyBase 'x-appwrite-project' => $this->getProject()['$id'], 'x-appwrite-key' => $this->getProject()['apiKey'], ])); - $this->assertEquals($deploymentId, $function['body']['deployment'], 'Deployment is not activated, deployment: ' . json_encode($function['body'], JSON_PRETTY_PRINT)); + $this->assertEquals($deploymentId, $function['body']['deploymentId'], 'Deployment is not activated, deployment: ' . json_encode($function['body'], JSON_PRETTY_PRINT)); }, 100000, 500); return ['functionId' => $functionId, 'deploymentId' => $deploymentId]; From 994e2faa42e2dbc59e9c011fdd16a48c430bfd99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 11 Mar 2025 18:19:25 +0100 Subject: [PATCH 2/9] OPR v5 + Flutter starter --- .env | 2 +- app/cli.php | 2 +- app/config/collections/projects.php | 2 +- app/config/frameworks.php | 2 +- app/config/runtimes.php | 2 +- app/config/templates/site.php | 44 +++++++++++++++++- app/controllers/general.php | 4 +- composer.lock | 40 ++++++++-------- docker-compose.yml | 4 +- .../sites/templates/flutter-starter-dark.png | Bin 14779 -> 4331 bytes .../sites/templates/flutter-starter-light.png | Bin 14779 -> 4331 bytes .../Functions/Http/Functions/Create.php | 2 +- .../Modules/Functions/Workers/Builds.php | 2 +- src/Appwrite/Utopia/Response/Model/Func.php | 2 +- src/Executor/Executor.php | 8 ++-- .../Functions/FunctionsCustomServerTest.php | 2 +- 16 files changed, 80 insertions(+), 38 deletions(-) diff --git a/.env b/.env index b9aa42e2f5..945680114f 100644 --- a/.env +++ b/.env @@ -81,7 +81,7 @@ _APP_COMPUTE_RUNTIMES_NETWORK=runtimes _APP_EXECUTOR_SECRET=your-secret-key _APP_EXECUTOR_HOST=http://exc1/v1 _APP_FUNCTIONS_RUNTIMES=php-8.0,node-18.0,python-3.9,ruby-3.1 -_APP_SITES_RUNTIMES=static-1,node-22,flutter-3.24 +_APP_SITES_RUNTIMES=static-1,node-22,flutter-3.29 _APP_SITES_FRAMEWORKS=sveltekit,nextjs,nuxt,astro,remix,flutter,other,react,vue,analog,angular _APP_MAINTENANCE_INTERVAL=86400 _APP_MAINTENANCE_DELAY= diff --git a/app/cli.php b/app/cli.php index 360b5478c5..c92d2c2e6d 100644 --- a/app/cli.php +++ b/app/cli.php @@ -26,7 +26,7 @@ use Utopia\Registry\Registry; use Utopia\System\System; // overwriting runtimes to be architectur agnostic for CLI -Config::setParam('runtimes', (new Runtimes('v4rc'))->getAll(supported: false)); +Config::setParam('runtimes', (new Runtimes('v5'))->getAll(supported: false)); // require controllers after overwriting runtimes require_once __DIR__ . '/controllers/general.php'; diff --git a/app/config/collections/projects.php b/app/config/collections/projects.php index 7ea750f2b3..98d282d929 100644 --- a/app/config/collections/projects.php +++ b/app/config/collections/projects.php @@ -674,7 +674,7 @@ return [ 'size' => 8, 'signed' => true, 'required' => false, - 'default' => 'v4', + 'default' => 'v5', 'array' => false, 'filters' => [], ], diff --git a/app/config/frameworks.php b/app/config/frameworks.php index 355ead1bfc..1cb6ac811b 100644 --- a/app/config/frameworks.php +++ b/app/config/frameworks.php @@ -221,7 +221,7 @@ return [ 'flutter' => [ 'key' => 'flutter', 'name' => 'Flutter', - 'buildRuntime' => 'flutter-3.24', + 'buildRuntime' => 'flutter-3.29', 'runtimes' => getVersions($templateRuntimes['FLUTTER']['versions'], 'flutter'), 'adapters' => [ 'static' => [ diff --git a/app/config/runtimes.php b/app/config/runtimes.php index 4260655342..dbd33dac4b 100644 --- a/app/config/runtimes.php +++ b/app/config/runtimes.php @@ -6,4 +6,4 @@ use Appwrite\Runtimes\Runtimes; -return (new Runtimes('v4rc'))->getAll(); +return (new Runtimes('v5'))->getAll(); diff --git a/app/config/templates/site.php b/app/config/templates/site.php index 9954af2bbb..cefb173e4d 100644 --- a/app/config/templates/site.php +++ b/app/config/templates/site.php @@ -73,7 +73,7 @@ const TEMPLATE_FRAMEWORKS = [ 'installCommand' => '', 'buildCommand' => 'flutter build web', 'outputDirectory' => './build/web', - 'buildRuntime' => 'flutter-3.24', + 'buildRuntime' => 'flutter-3.29', 'adapter' => 'static', 'fallbackFile' => '', ], @@ -145,6 +145,48 @@ return [ 'providerVersion' => '0.1.*', 'variables' => [] ], + [ + 'key' => 'starter-for-flutter', + 'name' => 'Flutter starter', + 'useCases' => ['starter'], + 'screenshotDark' => $url . '/images/sites/templates/starter-for-flutter-dark.png', + 'screenshotLight' => $url . '/images/sites/templates/starter-for-flutter-light.png', + 'frameworks' => [ + getFramework('FLUTTER', [ + 'providerRootDirectory' => './', + ]), + ], + 'vcsProvider' => 'github', + 'providerRepositoryId' => 'starter-for-flutter', + 'providerOwner' => 'appwrite', + 'providerVersion' => '0.1.*', + 'variables' => [ + [ + 'name' => 'APPWRITE_PUBLIC_ENDPOINT', + 'description' => 'Endpoint of Appwrite server', + 'value' => '{apiEndpoint}', + 'placeholder' => '{apiEndpoint}', + 'required' => true, + 'type' => 'text' + ], + [ + 'name' => 'APPWRITE_PROJECT_ID', + 'description' => 'Your Appwrite project ID', + 'value' => '{projectId}', + 'placeholder' => '{projectId}', + 'required' => true, + 'type' => 'text' + ], + [ + 'name' => 'APPWRITE_PROJECT_NAME', + 'description' => 'Your Appwrite project name', + 'value' => '{projectName}', + 'placeholder' => '{projectName}', + 'required' => true, + 'type' => 'text' + ], + ] + ], [ 'key' => 'starter-for-js', 'name' => 'JavaScript starter', diff --git a/app/controllers/general.php b/app/controllers/general.php index f28409567e..e80f30c0b4 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -245,7 +245,7 @@ function router(App $utopia, Database $dbForPlatform, callable $getProjectDB, Sw $version = match ($type) { 'function' => $resource->getAttribute('version', 'v2'), - 'site' => 'v4', + 'site' => 'v5', }; $runtimes = Config::getParam($version === 'v2' ? 'runtimes-v2' : 'runtimes', []); @@ -416,7 +416,7 @@ function router(App $utopia, Database $dbForPlatform, callable $getProjectDB, Sw try { $version = match ($type) { 'function' => $resource->getAttribute('version', 'v2'), - 'site' => 'v4', + 'site' => 'v5', }; $entrypoint = match ($type) { 'function' => $deployment->getAttribute('entrypoint', ''), diff --git a/composer.lock b/composer.lock index 4fc58cf873..da69c2bb0b 100644 --- a/composer.lock +++ b/composer.lock @@ -157,16 +157,16 @@ }, { "name": "appwrite/php-runtimes", - "version": "0.18.0", + "version": "0.18.1", "source": { "type": "git", "url": "https://github.com/appwrite/runtimes.git", - "reference": "f1ddcc567325659ad79506bc9684a4fc2009dc42" + "reference": "97b5d97ae2c0fc9a2a374769eadff024f95783aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/runtimes/zipball/f1ddcc567325659ad79506bc9684a4fc2009dc42", - "reference": "f1ddcc567325659ad79506bc9684a4fc2009dc42", + "url": "https://api.github.com/repos/appwrite/runtimes/zipball/97b5d97ae2c0fc9a2a374769eadff024f95783aa", + "reference": "97b5d97ae2c0fc9a2a374769eadff024f95783aa", "shasum": "" }, "require": { @@ -206,9 +206,9 @@ ], "support": { "issues": "https://github.com/appwrite/runtimes/issues", - "source": "https://github.com/appwrite/runtimes/tree/0.18.0" + "source": "https://github.com/appwrite/runtimes/tree/0.18.1" }, - "time": "2025-03-07T14:30:31+00:00" + "time": "2025-03-11T14:05:46+00:00" }, { "name": "beberlei/assert", @@ -5085,16 +5085,16 @@ "packages-dev": [ { "name": "appwrite/sdk-generator", - "version": "0.40.2", + "version": "0.40.6", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "56f09482d9e2f223911277ab887f197402708049" + "reference": "d8816209a07e7d64ef62dbcaf8ad4aa1262f58b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/56f09482d9e2f223911277ab887f197402708049", - "reference": "56f09482d9e2f223911277ab887f197402708049", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/d8816209a07e7d64ef62dbcaf8ad4aa1262f58b9", + "reference": "d8816209a07e7d64ef62dbcaf8ad4aa1262f58b9", "shasum": "" }, "require": { @@ -5130,9 +5130,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.2" + "source": "https://github.com/appwrite/sdk-generator/tree/0.40.6" }, - "time": "2025-03-06T16:31:03+00:00" + "time": "2025-03-10T19:04:24+00:00" }, { "name": "doctrine/annotations", @@ -5404,16 +5404,16 @@ }, { "name": "laravel/pint", - "version": "v1.21.0", + "version": "v1.21.1", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "531fa0871fbde719c51b12afa3a443b8f4e4b425" + "reference": "c44bffbb2334e90fba560933c45948fa4a3f3e86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/531fa0871fbde719c51b12afa3a443b8f4e4b425", - "reference": "531fa0871fbde719c51b12afa3a443b8f4e4b425", + "url": "https://api.github.com/repos/laravel/pint/zipball/c44bffbb2334e90fba560933c45948fa4a3f3e86", + "reference": "c44bffbb2334e90fba560933c45948fa4a3f3e86", "shasum": "" }, "require": { @@ -5424,9 +5424,9 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.68.5", - "illuminate/view": "^11.42.0", - "larastan/larastan": "^3.0.4", + "friendsofphp/php-cs-fixer": "^3.70.2", + "illuminate/view": "^11.44.1", + "larastan/larastan": "^3.1.0", "laravel-zero/framework": "^11.36.1", "mockery/mockery": "^1.6.12", "nunomaduro/termwind": "^2.3", @@ -5466,7 +5466,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2025-02-18T03:18:57+00:00" + "time": "2025-03-11T03:22:21+00:00" }, { "name": "matthiasmullie/minify", diff --git a/docker-compose.yml b/docker-compose.yml index 547374eb5f..e457b87325 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -962,7 +962,7 @@ services: hostname: exc1 <<: *x-logging stop_signal: SIGINT - image: openruntimes/executor:0.7.9 + image: openruntimes/executor:0.7.10 restart: unless-stopped networks: - appwrite @@ -985,7 +985,7 @@ services: - OPR_EXECUTOR_ENV=$_APP_ENV - OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES,$_APP_SITES_RUNTIMES - OPR_EXECUTOR_SECRET=$_APP_EXECUTOR_SECRET - - OPR_EXECUTOR_RUNTIME_VERSIONS=v2,v4,v4rc + - OPR_EXECUTOR_RUNTIME_VERSIONS=v2,v5 - OPR_EXECUTOR_LOGGING_CONFIG=$_APP_LOGGING_CONFIG - OPR_EXECUTOR_STORAGE_DEVICE=$_APP_STORAGE_DEVICE - OPR_EXECUTOR_STORAGE_S3_ACCESS_KEY=$_APP_STORAGE_S3_ACCESS_KEY diff --git a/public/images/sites/templates/flutter-starter-dark.png b/public/images/sites/templates/flutter-starter-dark.png index 9b239ff767d76460066652793d7ed5d0ec0ce520..82c78d0c7df93d7db09660d6ad9ea8352df8ff19 100644 GIT binary patch literal 4331 zcmeAS@N?(olHy`uVBq!ia0y~yU707*_Z2?mA+ z7G@rxnN5sr3=9ef8JHOuCL}Zf&G#@k092wfs(dtLMiaqk_82V*M$5?2>R_~@9BmVf xww6X4hNDg9(cZymziG6KINEt8VVqzCqem&n+^6L_hQLMygQu&X%Q~loCICNDH~Iho literal 14779 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 literal 14779 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 $commands, 'scopes' => $scopes, 'search' => implode(' ', [$functionId, $name, $runtime]), - 'version' => 'v4', + 'version' => 'v5', 'installationId' => $installation->getId(), 'installationInternalId' => $installation->getInternalId(), 'providerRepositoryId' => $providerRepositoryId, diff --git a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php index bf442e7c3b..7ed3d0add3 100644 --- a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php +++ b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php @@ -1102,7 +1102,7 @@ class Builds extends Action { return match ($resource->getCollection()) { 'functions' => $resource->getAttribute('version', 'v2'), - 'sites' => 'v4', + 'sites' => 'v5', }; } diff --git a/src/Appwrite/Utopia/Response/Model/Func.php b/src/Appwrite/Utopia/Response/Model/Func.php index 3bfc24c82e..7037f5e363 100644 --- a/src/Appwrite/Utopia/Response/Model/Func.php +++ b/src/Appwrite/Utopia/Response/Model/Func.php @@ -119,7 +119,7 @@ class Func extends Model ->addRule('version', [ 'type' => self::TYPE_STRING, 'description' => 'Version of Open Runtimes used for the function.', - 'default' => 'v4', + 'default' => 'v5', 'example' => 'v2', ]) ->addRule('installationId', [ diff --git a/src/Executor/Executor.php b/src/Executor/Executor.php index 9702db43de..6e6a7bd3f4 100644 --- a/src/Executor/Executor.php +++ b/src/Executor/Executor.php @@ -74,8 +74,8 @@ class Executor $route = "/runtimes"; // Remove after migration - if ($version == 'v3') { - $version = 'v4'; + if ($version == 'v3' || $version === 'v4') { + $version = 'v5'; } $params = [ @@ -201,8 +201,8 @@ class Executor $route = '/runtimes/' . $runtimeId . '/executions'; // Remove after migration - if ($version == 'v3') { - $version = 'v4'; + if ($version == 'v3' || $version === 'v4') { + $version = 'v5'; } $params = [ diff --git a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php index 6671c57c90..18d848b9e6 100644 --- a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php +++ b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php @@ -1268,7 +1268,7 @@ class FunctionsCustomServerTest extends Scope return [ ['folder' => 'php-fn', 'name' => 'php-8.0', 'entrypoint' => 'index.php', 'runtimeName' => 'PHP', 'runtimeVersion' => '8.0'], ['folder' => 'node', 'name' => 'node-18.0', 'entrypoint' => 'index.js', 'runtimeName' => 'Node.js', 'runtimeVersion' => '18.0'], - // TODO: Re-enable; temporarly disabled due to OPR v4rc issues + // TODO: Re-enable; temporarly disabled due to OPR v5 issues // ['folder' => 'python', 'name' => 'python-3.9', 'entrypoint' => 'main.py', 'runtimeName' => 'Python', 'runtimeVersion' => '3.9'], ['folder' => 'ruby', 'name' => 'ruby-3.1', 'entrypoint' => 'main.rb', 'runtimeName' => 'Ruby', 'runtimeVersion' => '3.1'], // Swift and Dart disabled on purpose, as it's very slow. From 42cd1df77d9f6c8a4c70ca53e74e2ce7be01676f Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Wed, 12 Mar 2025 15:24:52 +0530 Subject: [PATCH 3/9] Remove duplication from workers --- src/Appwrite/Platform/Modules/Functions/Workers/Builds.php | 3 +-- src/Appwrite/Platform/Workers/Audits.php | 2 +- src/Appwrite/Platform/Workers/Certificates.php | 5 +---- src/Appwrite/Platform/Workers/Databases.php | 2 +- src/Appwrite/Platform/Workers/Deletes.php | 5 +---- src/Appwrite/Platform/Workers/Functions.php | 2 +- src/Appwrite/Platform/Workers/Mails.php | 2 +- src/Appwrite/Platform/Workers/Messaging.php | 2 +- src/Appwrite/Platform/Workers/Migrations.php | 2 +- src/Appwrite/Platform/Workers/Usage.php | 4 +--- src/Appwrite/Platform/Workers/UsageDump.php | 4 +--- src/Appwrite/Platform/Workers/Webhooks.php | 2 +- 12 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php index bf442e7c3b..6028ffff64 100644 --- a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php +++ b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php @@ -67,8 +67,7 @@ class Builds extends Action ->inject('isResourceBlocked') ->inject('deviceForFiles') ->inject('log') - ->callback(fn ($message, Document $project, Database $dbForPlatform, Event $queueForEvents, Func $queueForFunctions, StatsUsage $usage, Cache $cache, Database $dbForProject, Device $deviceForFunctions, Device $deviceForSites, callable $isResourceBlocked, Device $deviceForFiles, Log $log) => - $this->action($message, $project, $dbForPlatform, $queueForEvents, $queueForFunctions, $usage, $cache, $dbForProject, $deviceForFunctions, $deviceForSites, $isResourceBlocked, $deviceForFiles, $log)); + ->callback([$this, 'action']); } /** diff --git a/src/Appwrite/Platform/Workers/Audits.php b/src/Appwrite/Platform/Workers/Audits.php index f1ae46eea7..d94e184bab 100644 --- a/src/Appwrite/Platform/Workers/Audits.php +++ b/src/Appwrite/Platform/Workers/Audits.php @@ -47,7 +47,7 @@ class Audits extends Action ->desc('Audits worker') ->inject('message') ->inject('dbForProject') - ->callback(fn ($message, $dbForProject) => $this->action($message, $dbForProject)); + ->callback([$this, 'action']); $this->lastTriggeredTime = time(); } diff --git a/src/Appwrite/Platform/Workers/Certificates.php b/src/Appwrite/Platform/Workers/Certificates.php index 7e220b2734..84665fea65 100644 --- a/src/Appwrite/Platform/Workers/Certificates.php +++ b/src/Appwrite/Platform/Workers/Certificates.php @@ -49,10 +49,7 @@ class Certificates extends Action ->inject('queueForFunctions') ->inject('log') ->inject('certificates') - ->callback( - fn (Message $message, Database $dbForPlatform, Mail $queueForMails, Event $queueForEvents, Func $queueForFunctions, Log $log, CertificatesAdapter $certificates) => - $this->action($message, $dbForPlatform, $queueForMails, $queueForEvents, $queueForFunctions, $log, $certificates) - ); + ->callback([$this, 'action']); } /** diff --git a/src/Appwrite/Platform/Workers/Databases.php b/src/Appwrite/Platform/Workers/Databases.php index 0f400e0107..ccc928a3df 100644 --- a/src/Appwrite/Platform/Workers/Databases.php +++ b/src/Appwrite/Platform/Workers/Databases.php @@ -38,7 +38,7 @@ class Databases extends Action ->inject('dbForPlatform') ->inject('dbForProject') ->inject('log') - ->callback(fn (Message $message, Document $project, Database $dbForPlatform, Database $dbForProject, Log $log) => $this->action($message, $project, $dbForPlatform, $dbForProject, $log)); + ->callback([$this, 'action']); } /** diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index c985513073..91e1fe95d6 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -58,10 +58,7 @@ class Deletes extends Action ->inject('executionRetention') ->inject('auditRetention') ->inject('log') - ->callback( - fn ($message, Document $project, Database $dbForPlatform, callable $getProjectDB, callable $timelimit, Device $deviceForFiles, Device $deviceForFunctions, Device $deviceForSites, Device $deviceForBuilds, Device $deviceForCache, CertificatesAdapter $certificates, string $executionRetention, string $auditRetention, Log $log) => - $this->action($message, $project, $dbForPlatform, $getProjectDB, $timelimit, $deviceForFiles, $deviceForFunctions, $deviceForSites, $deviceForBuilds, $deviceForCache, $certificates, $executionRetention, $auditRetention, $log) - ); + ->callback([$this, 'action']); } /** diff --git a/src/Appwrite/Platform/Workers/Functions.php b/src/Appwrite/Platform/Workers/Functions.php index 1c952bc7a8..801ae99f22 100644 --- a/src/Appwrite/Platform/Workers/Functions.php +++ b/src/Appwrite/Platform/Workers/Functions.php @@ -49,7 +49,7 @@ class Functions extends Action ->inject('queueForStatsUsage') ->inject('log') ->inject('isResourceBlocked') - ->callback(fn (Document $project, Message $message, Database $dbForProject, Func $queueForFunctions, Event $queueForEvents, StatsUsage $queueForStatsUsage, Log $log, callable $isResourceBlocked) => $this->action($project, $message, $dbForProject, $queueForFunctions, $queueForEvents, $queueForStatsUsage, $log, $isResourceBlocked)); + ->callback([$this, 'action']); } public function action(Document $project, Message $message, Database $dbForProject, Func $queueForFunctions, Event $queueForEvents, StatsUsage $queueForStatsUsage, Log $log, callable $isResourceBlocked): void diff --git a/src/Appwrite/Platform/Workers/Mails.php b/src/Appwrite/Platform/Workers/Mails.php index e48f96ea90..3a15182e51 100644 --- a/src/Appwrite/Platform/Workers/Mails.php +++ b/src/Appwrite/Platform/Workers/Mails.php @@ -29,7 +29,7 @@ class Mails extends Action ->inject('message') ->inject('register') ->inject('log') - ->callback(fn (Message $message, Registry $register, Log $log) => $this->action($message, $register, $log)); + ->callback([$this, 'action']); } /** diff --git a/src/Appwrite/Platform/Workers/Messaging.php b/src/Appwrite/Platform/Workers/Messaging.php index cf2b8bfc84..6f94764bbf 100644 --- a/src/Appwrite/Platform/Workers/Messaging.php +++ b/src/Appwrite/Platform/Workers/Messaging.php @@ -71,7 +71,7 @@ class Messaging extends Action ->inject('dbForProject') ->inject('deviceForFiles') ->inject('queueForStatsUsage') - ->callback(fn (Message $message, Document $project, Log $log, Database $dbForProject, Device $deviceForFiles, StatsUsage $queueForStatsUsage) => $this->action($message, $project, $log, $dbForProject, $deviceForFiles, $queueForStatsUsage)); + ->callback([$this, 'action']); } /** diff --git a/src/Appwrite/Platform/Workers/Migrations.php b/src/Appwrite/Platform/Workers/Migrations.php index 3bf8e06356..6ea6adec57 100644 --- a/src/Appwrite/Platform/Workers/Migrations.php +++ b/src/Appwrite/Platform/Workers/Migrations.php @@ -54,7 +54,7 @@ class Migrations extends Action ->inject('dbForProject') ->inject('dbForPlatform') ->inject('logError') - ->callback(fn (Message $message, Document $project, Database $dbForProject, Database $dbForPlatform, callable $logError) => $this->action($message, $project, $dbForProject, $dbForPlatform, $logError)); + ->callback([$this, 'action']); } /** diff --git a/src/Appwrite/Platform/Workers/Usage.php b/src/Appwrite/Platform/Workers/Usage.php index 3687eeab67..5c7a8b081e 100644 --- a/src/Appwrite/Platform/Workers/Usage.php +++ b/src/Appwrite/Platform/Workers/Usage.php @@ -37,9 +37,7 @@ class Usage extends Action ->inject('project') ->inject('getProjectDB') ->inject('queueForUsageDump') - ->callback(function (Message $message, Document $project, callable $getProjectDB, UsageDump $queueForUsageDump) { - $this->action($message, $project, $getProjectDB, $queueForUsageDump); - }); + ->callback([$this, 'action']); $this->aggregationInterval = (int) System::getEnv('_APP_USAGE_AGGREGATION_INTERVAL', '20'); $this->lastTriggeredTime = time(); diff --git a/src/Appwrite/Platform/Workers/UsageDump.php b/src/Appwrite/Platform/Workers/UsageDump.php index 2f1d13f29a..cf756a3de5 100644 --- a/src/Appwrite/Platform/Workers/UsageDump.php +++ b/src/Appwrite/Platform/Workers/UsageDump.php @@ -38,9 +38,7 @@ class UsageDump extends Action $this ->inject('message') ->inject('getProjectDB') - ->callback(function (Message $message, callable $getProjectDB) { - $this->action($message, $getProjectDB); - }); + ->callback([$this, 'action']); } /** diff --git a/src/Appwrite/Platform/Workers/Webhooks.php b/src/Appwrite/Platform/Workers/Webhooks.php index c903dafdae..2066f690ac 100644 --- a/src/Appwrite/Platform/Workers/Webhooks.php +++ b/src/Appwrite/Platform/Workers/Webhooks.php @@ -37,7 +37,7 @@ class Webhooks extends Action ->inject('queueForMails') ->inject('queueForStatsUsage') ->inject('log') - ->callback(fn (Message $message, Document $project, Database $dbForPlatform, Mail $queueForMails, StatsUsage $queueForStatsUsage, Log $log) => $this->action($message, $project, $dbForPlatform, $queueForMails, $queueForStatsUsage, $log)); + ->callback([$this, 'action']); } /** From ea35b6226df301ad941d4b13b0cc5f0e8127139e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 12 Mar 2025 11:16:55 +0100 Subject: [PATCH 4/9] Fix flutter screenshots --- app/config/templates/site.php | 1 + docker-compose.yml | 4 ++-- .../sites/templates/flutter-starter-dark.png | Bin 4331 -> 14779 bytes .../sites/templates/flutter-starter-light.png | Bin 4331 -> 14779 bytes .../templates/starter-for-flutter-dark.png | Bin 0 -> 51788 bytes .../templates/starter-for-flutter-light.png | Bin 0 -> 51788 bytes .../Modules/Functions/Workers/Builds.php | 7 +++++++ 7 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 public/images/sites/templates/starter-for-flutter-dark.png create mode 100644 public/images/sites/templates/starter-for-flutter-light.png diff --git a/app/config/templates/site.php b/app/config/templates/site.php index cefb173e4d..2b3bf57599 100644 --- a/app/config/templates/site.php +++ b/app/config/templates/site.php @@ -154,6 +154,7 @@ return [ 'frameworks' => [ getFramework('FLUTTER', [ 'providerRootDirectory' => './', + 'buildCommand' => 'sh build.sh', ]), ], 'vcsProvider' => 'github', diff --git a/docker-compose.yml b/docker-compose.yml index e457b87325..5d1d7678dd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -206,7 +206,7 @@ services: appwrite-console: <<: *x-logging container_name: appwrite-console - image: appwrite/console:5.3.0-sites-rc.20 + image: appwrite/console:5.3.0-sites-rc.21 restart: unless-stopped networks: - appwrite @@ -953,7 +953,7 @@ services: appwrite-browser: container_name: appwrite-browser - image: appwrite/browser:0.2.1 + image: appwrite/browser:0.2.2 networks: - appwrite diff --git a/public/images/sites/templates/flutter-starter-dark.png b/public/images/sites/templates/flutter-starter-dark.png index 82c78d0c7df93d7db09660d6ad9ea8352df8ff19..9b239ff767d76460066652793d7ed5d0ec0ce520 100644 GIT binary patch literal 14779 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 diff --git a/public/images/sites/templates/flutter-starter-light.png b/public/images/sites/templates/flutter-starter-light.png index 82c78d0c7df93d7db09660d6ad9ea8352df8ff19..9b239ff767d76460066652793d7ed5d0ec0ce520 100644 GIT binary patch literal 14779 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 diff --git a/public/images/sites/templates/starter-for-flutter-dark.png b/public/images/sites/templates/starter-for-flutter-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..760cd8d341a4b7d3017213b8cca6f74bcac616a3 GIT binary patch literal 51788 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 API_KEY_DYNAMIC . '_' . $apiKey ]); + $config['sleep'] = 3000; // 3 seconds + + $isDevelopment = System::getEnv('_APP_ENV', 'development') === 'development'; + if ($isDevelopment) { + $config['timeout'] = 10000; // 10 seconds + } + $response = $client->fetch( url: 'http://appwrite-browser:3000/v1/screenshots', method: 'POST', From 536319b440a347c7d7821aa981b9b290f37fd6d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 12 Mar 2025 11:32:43 +0100 Subject: [PATCH 5/9] PR review changes --- src/Executor/Executor.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Executor/Executor.php b/src/Executor/Executor.php index 6e6a7bd3f4..c0596fd272 100644 --- a/src/Executor/Executor.php +++ b/src/Executor/Executor.php @@ -74,7 +74,7 @@ class Executor $route = "/runtimes"; // Remove after migration - if ($version == 'v3' || $version === 'v4') { + if ($version === 'v3' || $version === 'v4') { $version = 'v5'; } @@ -201,7 +201,7 @@ class Executor $route = '/runtimes/' . $runtimeId . '/executions'; // Remove after migration - if ($version == 'v3' || $version === 'v4') { + if ($version === 'v3' || $version === 'v4') { $version = 'v5'; } From 796a845bcf60dbe2cbaba60517b37579fcdac604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 12 Mar 2025 12:10:10 +0100 Subject: [PATCH 6/9] Setup request & response filters --- app/controllers/general.php | 8 ++++++ src/Appwrite/Utopia/Request/Filters/V19.php | 24 ++++++++++++++++ src/Appwrite/Utopia/Response/Filters/V19.php | 30 ++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 src/Appwrite/Utopia/Request/Filters/V19.php create mode 100644 src/Appwrite/Utopia/Response/Filters/V19.php diff --git a/app/controllers/general.php b/app/controllers/general.php index f28409567e..62fd54482a 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -20,10 +20,12 @@ use Appwrite\Utopia\Request; use Appwrite\Utopia\Request\Filters\V16 as RequestV16; use Appwrite\Utopia\Request\Filters\V17 as RequestV17; use Appwrite\Utopia\Request\Filters\V18 as RequestV18; +use Appwrite\Utopia\Request\Filters\V19 as RequestV19; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Filters\V16 as ResponseV16; use Appwrite\Utopia\Response\Filters\V17 as ResponseV17; use Appwrite\Utopia\Response\Filters\V18 as ResponseV18; +use Appwrite\Utopia\Response\Filters\V19 as ResponseV19; use Appwrite\Utopia\View; use Executor\Executor; use MaxMind\Db\Reader; @@ -689,6 +691,9 @@ App::init() if (version_compare($requestFormat, '1.6.0', '<')) { $request->addFilter(new RequestV18()); } + if (version_compare($requestFormat, '1.7.0', '<')) { + $request->addFilter(new RequestV19()); + } } $domain = $request->getHostname(); @@ -838,6 +843,9 @@ App::init() if (version_compare($responseFormat, '1.6.0', '<')) { $response->addFilter(new ResponseV18()); } + if (version_compare($responseFormat, '1.7.0', '<')) { + $response->addFilter(new ResponseV19()); + } if (version_compare($responseFormat, APP_VERSION_STABLE, '>')) { $response->addHeader('X-Appwrite-Warning', "The current SDK is built for Appwrite " . $responseFormat . ". However, the current Appwrite server version is " . APP_VERSION_STABLE . ". Please downgrade your SDK to match the Appwrite version: https://appwrite.io/docs/sdks"); } diff --git a/src/Appwrite/Utopia/Request/Filters/V19.php b/src/Appwrite/Utopia/Request/Filters/V19.php new file mode 100644 index 0000000000..041c126a69 --- /dev/null +++ b/src/Appwrite/Utopia/Request/Filters/V19.php @@ -0,0 +1,24 @@ + $this->parseFunction($content), + Response::MODEL_FUNCTION_LIST => $this->handleList($content, 'functions', fn ($item) => $this->parseFunction($item)), + default => $parsedResponse, + }; + + return $parsedResponse; + } + + protected function parseFunction(array $content) + { + $content['deployment'] = $content['deploymentId'] ?? ''; + unset($content['deploymentId']); + return $content; + } +} From 39699d16ba2d23224ef2710e82667f79a79afa58 Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Wed, 12 Mar 2025 16:55:48 +0530 Subject: [PATCH 7/9] Simplify callback syntax in tasks --- src/Appwrite/Platform/Tasks/Doctor.php | 2 +- src/Appwrite/Platform/Tasks/Install.php | 2 +- src/Appwrite/Platform/Tasks/Maintenance.php | 2 +- src/Appwrite/Platform/Tasks/Migrate.php | 6 +----- src/Appwrite/Platform/Tasks/QueueRetry.php | 2 +- src/Appwrite/Platform/Tasks/SSL.php | 2 +- src/Appwrite/Platform/Tasks/ScheduleBase.php | 2 +- src/Appwrite/Platform/Tasks/Screenshot.php | 2 +- src/Appwrite/Platform/Tasks/Specs.php | 2 +- src/Appwrite/Platform/Tasks/Upgrade.php | 2 +- src/Appwrite/Platform/Tasks/Vars.php | 2 +- 11 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/Appwrite/Platform/Tasks/Doctor.php b/src/Appwrite/Platform/Tasks/Doctor.php index c8d8c881b4..a9d0a6220c 100644 --- a/src/Appwrite/Platform/Tasks/Doctor.php +++ b/src/Appwrite/Platform/Tasks/Doctor.php @@ -28,7 +28,7 @@ class Doctor extends Action $this ->desc('Validate server health') ->inject('register') - ->callback(fn (Registry $register) => $this->action($register)); + ->callback([$this, 'action']); } public function action(Registry $register): void diff --git a/src/Appwrite/Platform/Tasks/Install.php b/src/Appwrite/Platform/Tasks/Install.php index 4abd267684..c7b1f72453 100644 --- a/src/Appwrite/Platform/Tasks/Install.php +++ b/src/Appwrite/Platform/Tasks/Install.php @@ -31,7 +31,7 @@ class Install extends Action ->param('image', 'appwrite', new Text(0), 'Main appwrite docker image', true) ->param('interactive', 'Y', new Text(1), 'Run an interactive session', true) ->param('no-start', false, new Boolean(true), 'Run an interactive session', true) - ->callback(fn ($httpPort, $httpsPort, $organization, $image, $interactive, $noStart) => $this->action($httpPort, $httpsPort, $organization, $image, $interactive, $noStart)); + ->callback([$this, 'action']); } public function action(string $httpPort, string $httpsPort, string $organization, string $image, string $interactive, bool $noStart): void diff --git a/src/Appwrite/Platform/Tasks/Maintenance.php b/src/Appwrite/Platform/Tasks/Maintenance.php index 2d37bdbf70..b202a39d74 100644 --- a/src/Appwrite/Platform/Tasks/Maintenance.php +++ b/src/Appwrite/Platform/Tasks/Maintenance.php @@ -26,7 +26,7 @@ class Maintenance extends Action ->inject('dbForPlatform') ->inject('queueForCertificates') ->inject('queueForDeletes') - ->callback(fn (Database $dbForPlatform, Certificate $queueForCertificates, Delete $queueForDeletes) => $this->action($dbForPlatform, $queueForCertificates, $queueForDeletes)); + ->callback([$this, 'action']); } public function action(Database $dbForPlatform, Certificate $queueForCertificates, Delete $queueForDeletes): void diff --git a/src/Appwrite/Platform/Tasks/Migrate.php b/src/Appwrite/Platform/Tasks/Migrate.php index 4efa78ed4b..4bc640639f 100644 --- a/src/Appwrite/Platform/Tasks/Migrate.php +++ b/src/Appwrite/Platform/Tasks/Migrate.php @@ -33,11 +33,7 @@ class Migrate extends Action ->inject('dbForPlatform') ->inject('getProjectDB') ->inject('register') - ->callback(function ($version, $dbForPlatform, $getProjectDB, Registry $register) { - \Co\run(function () use ($version, $dbForPlatform, $getProjectDB, $register) { - $this->action($version, $dbForPlatform, $getProjectDB, $register); - }); - }); + ->callback([$this, 'action']); } private function clearProjectsCache(Document $project) diff --git a/src/Appwrite/Platform/Tasks/QueueRetry.php b/src/Appwrite/Platform/Tasks/QueueRetry.php index 9fe4aed799..f8099dcb00 100644 --- a/src/Appwrite/Platform/Tasks/QueueRetry.php +++ b/src/Appwrite/Platform/Tasks/QueueRetry.php @@ -24,7 +24,7 @@ class QueueRetry extends Action ->param('name', '', new Text(100), 'Queue name') ->param('limit', 0, new Wildcard(), 'jobs limit', true) ->inject('publisher') - ->callback(fn ($name, $limit, $publisher) => $this->action($name, $limit, $publisher)); + ->callback([$this, 'action']); } /** diff --git a/src/Appwrite/Platform/Tasks/SSL.php b/src/Appwrite/Platform/Tasks/SSL.php index 5af0cb6cd8..ae1c93a360 100644 --- a/src/Appwrite/Platform/Tasks/SSL.php +++ b/src/Appwrite/Platform/Tasks/SSL.php @@ -24,7 +24,7 @@ class SSL extends Action ->param('domain', System::getEnv('_APP_DOMAIN', ''), new Hostname(), 'Domain to generate certificate for. If empty, main domain will be used.', true) ->param('skip-check', true, new Boolean(true), 'If DNS and renew check should be skipped. Defaults to true, and when true, all jobs will result in certificate generation attempt.', true) ->inject('queueForCertificates') - ->callback(fn (string $domain, bool|string $skipCheck, Certificate $queueForCertificates) => $this->action($domain, $skipCheck, $queueForCertificates)); + ->callback([$this, 'action']); } public function action(string $domain, bool|string $skipCheck, Certificate $queueForCertificates): void diff --git a/src/Appwrite/Platform/Tasks/ScheduleBase.php b/src/Appwrite/Platform/Tasks/ScheduleBase.php index dad2db0d9a..2c082a7ce4 100644 --- a/src/Appwrite/Platform/Tasks/ScheduleBase.php +++ b/src/Appwrite/Platform/Tasks/ScheduleBase.php @@ -37,7 +37,7 @@ abstract class ScheduleBase extends Action ->inject('pools') ->inject('dbForPlatform') ->inject('getProjectDB') - ->callback(fn (Group $pools, Database $dbForPlatform, callable $getProjectDB) => $this->action($pools, $dbForPlatform, $getProjectDB)); + ->callback([$this, 'action']); } protected function updateProjectAccess(Document $project, Database $dbForPlatform): void diff --git a/src/Appwrite/Platform/Tasks/Screenshot.php b/src/Appwrite/Platform/Tasks/Screenshot.php index 9224d88633..918ce60e11 100644 --- a/src/Appwrite/Platform/Tasks/Screenshot.php +++ b/src/Appwrite/Platform/Tasks/Screenshot.php @@ -21,7 +21,7 @@ class Screenshot extends Action $this ->desc('Create Site template screenshot') ->param('templateId', '', new Text(128), 'Template ID.') - ->callback(fn (string $templateId) => $this->action($templateId)); + ->callback([$this, 'action']); } public function action(string $templateId): void diff --git a/src/Appwrite/Platform/Tasks/Specs.php b/src/Appwrite/Platform/Tasks/Specs.php index 4d7fd5d695..1db018ce9d 100644 --- a/src/Appwrite/Platform/Tasks/Specs.php +++ b/src/Appwrite/Platform/Tasks/Specs.php @@ -50,7 +50,7 @@ class Specs extends Action ->param('version', 'latest', new Text(16), 'Spec version', true) ->param('mode', 'normal', new WhiteList(['normal', 'mocks']), 'Spec Mode', true) ->inject('register') - ->callback(fn (string $version, string $mode, Registry $register) => $this->action($version, $mode, $register)); + ->callback([$this, 'action']); } public function action(string $version, string $mode, Registry $register): void diff --git a/src/Appwrite/Platform/Tasks/Upgrade.php b/src/Appwrite/Platform/Tasks/Upgrade.php index 341ce42fc4..dfd10d347e 100644 --- a/src/Appwrite/Platform/Tasks/Upgrade.php +++ b/src/Appwrite/Platform/Tasks/Upgrade.php @@ -23,7 +23,7 @@ class Upgrade extends Install ->param('image', 'appwrite', new Text(0), 'Main appwrite docker image', true) ->param('interactive', 'Y', new Text(1), 'Run an interactive session', true) ->param('no-start', false, new Boolean(true), 'Run an interactive session', true) - ->callback(fn ($httpPort, $httpsPort, $organization, $image, $interactive, $noStart) => $this->action($httpPort, $httpsPort, $organization, $image, $interactive, $noStart)); + ->callback([$this, 'action']); } public function action(string $httpPort, string $httpsPort, string $organization, string $image, string $interactive, bool $noStart): void diff --git a/src/Appwrite/Platform/Tasks/Vars.php b/src/Appwrite/Platform/Tasks/Vars.php index 499f8b15ec..70ae550ef9 100644 --- a/src/Appwrite/Platform/Tasks/Vars.php +++ b/src/Appwrite/Platform/Tasks/Vars.php @@ -18,7 +18,7 @@ class Vars extends Action { $this ->desc('List all the server environment variables') - ->callback(fn () => $this->action()); + ->callback([$this, 'action']); } public function action(): void From 7f2fdf623cc6451e2c5aa785fa0eb35bcabd3f2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 12 Mar 2025 12:27:15 +0100 Subject: [PATCH 8/9] Update specs --- app/config/specs/open-api3-latest-client.json | 11 ---- .../specs/open-api3-latest-console.json | 54 ++++++++----------- app/config/specs/open-api3-latest-server.json | 52 ++++++++---------- app/config/specs/swagger2-latest-client.json | 9 ---- app/config/specs/swagger2-latest-console.json | 50 ++++++++--------- app/config/specs/swagger2-latest-server.json | 48 ++++++++--------- 6 files changed, 86 insertions(+), 138 deletions(-) diff --git a/app/config/specs/open-api3-latest-client.json b/app/config/specs/open-api3-latest-client.json index 426e85c709..852974b217 100644 --- a/app/config/specs/open-api3-latest-client.json +++ b/app/config/specs/open-api3-latest-client.json @@ -4813,17 +4813,6 @@ "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-console.json b/app/config/specs/open-api3-latest-console.json index f1ea9de50e..5dbb4e6b05 100644 --- a/app/config/specs/open-api3-latest-console.json +++ b/app/config/specs/open-api3-latest-console.json @@ -4360,7 +4360,7 @@ "deprecated": false, "demo": "console\/get-resource.md", "edit": "https:\/\/github.com\/appwrite\/appwrite\/edit\/masterCheck if a resource ID is available.", - "rate-limit": 10, + "rate-limit": 120, "rate-time": 60, "rate-key": "userId:{userId}, url:{url}", "scope": "rules.read", @@ -9082,7 +9082,7 @@ "parameters": [ { "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: name, enabled, runtime, deployment, schedule, scheduleNext, schedulePrevious, timeout, entrypoint, commands, installationId", + "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: name, enabled, runtime, deploymentId, schedule, scheduleNext, schedulePrevious, timeout, entrypoint, commands, installationId", "required": false, "schema": { "type": "array", @@ -9232,7 +9232,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -9851,7 +9853,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -10894,17 +10898,6 @@ "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" } ] }, @@ -24718,8 +24711,10 @@ "framework": { "type": "string", "description": "Sites framework.", - "x-example": "nextjs", + "x-example": "analog", "enum": [ + "analog", + "angular", "nextjs", "react", "nuxt", @@ -24823,7 +24818,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -25343,8 +25340,10 @@ "framework": { "type": "string", "description": "Sites framework.", - "x-example": "nextjs", + "x-example": "analog", "enum": [ + "analog", + "angular", "nextjs", "react", "nuxt", @@ -25448,7 +25447,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -26447,17 +26448,6 @@ "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" } ] } @@ -37187,7 +37177,7 @@ "description": "Function execution and build runtime.", "x-example": "python-3.8" }, - "deployment": { + "deploymentId": { "type": "string", "description": "Function's active deployment ID.", "x-example": "5e5ea5c16897e" @@ -37283,7 +37273,7 @@ "live", "logging", "runtime", - "deployment", + "deploymentId", "scopes", "vars", "events", diff --git a/app/config/specs/open-api3-latest-server.json b/app/config/specs/open-api3-latest-server.json index e524c0c8a7..d46cc5c898 100644 --- a/app/config/specs/open-api3-latest-server.json +++ b/app/config/specs/open-api3-latest-server.json @@ -8168,7 +8168,7 @@ "parameters": [ { "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: name, enabled, runtime, deployment, schedule, scheduleNext, schedulePrevious, timeout, entrypoint, commands, installationId", + "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: name, enabled, runtime, deploymentId, schedule, scheduleNext, schedulePrevious, timeout, entrypoint, commands, installationId", "required": false, "schema": { "type": "array", @@ -8319,7 +8319,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -8713,7 +8715,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -9769,17 +9773,6 @@ "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" } ] }, @@ -16815,8 +16808,10 @@ "framework": { "type": "string", "description": "Sites framework.", - "x-example": "nextjs", + "x-example": "analog", "enum": [ + "analog", + "angular", "nextjs", "react", "nuxt", @@ -16920,7 +16915,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -17215,8 +17212,10 @@ "framework": { "type": "string", "description": "Sites framework.", - "x-example": "nextjs", + "x-example": "analog", "enum": [ + "analog", + "angular", "nextjs", "react", "nuxt", @@ -17320,7 +17319,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -18331,17 +18332,6 @@ "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" } ] } @@ -27584,7 +27574,7 @@ "description": "Function execution and build runtime.", "x-example": "python-3.8" }, - "deployment": { + "deploymentId": { "type": "string", "description": "Function's active deployment ID.", "x-example": "5e5ea5c16897e" @@ -27680,7 +27670,7 @@ "live", "logging", "runtime", - "deployment", + "deploymentId", "scopes", "vars", "events", diff --git a/app/config/specs/swagger2-latest-client.json b/app/config/specs/swagger2-latest-client.json index c419af3260..ce79f11758 100644 --- a/app/config/specs/swagger2-latest-client.json +++ b/app/config/specs/swagger2-latest-client.json @@ -4976,15 +4976,6 @@ }, "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-console.json b/app/config/specs/swagger2-latest-console.json index d1ff74f8cf..8cbdb8accd 100644 --- a/app/config/specs/swagger2-latest-console.json +++ b/app/config/specs/swagger2-latest-console.json @@ -4569,7 +4569,7 @@ "deprecated": false, "demo": "console\/get-resource.md", "edit": "https:\/\/github.com\/appwrite\/appwrite\/edit\/masterCheck if a resource ID is available.", - "rate-limit": 10, + "rate-limit": 120, "rate-time": 60, "rate-key": "userId:{userId}, url:{url}", "scope": "rules.read", @@ -9231,7 +9231,7 @@ "parameters": [ { "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: name, enabled, runtime, deployment, schedule, scheduleNext, schedulePrevious, timeout, entrypoint, commands, installationId", + "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: name, enabled, runtime, deploymentId, schedule, scheduleNext, schedulePrevious, timeout, entrypoint, commands, installationId", "required": false, "type": "array", "collectionFormat": "multi", @@ -9384,7 +9384,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -10018,7 +10020,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -11071,15 +11075,6 @@ }, "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" } ] }, @@ -25219,8 +25214,10 @@ "type": "string", "description": "Sites framework.", "default": null, - "x-example": "nextjs", + "x-example": "analog", "enum": [ + "analog", + "angular", "nextjs", "react", "nuxt", @@ -25330,7 +25327,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -25858,8 +25857,10 @@ "type": "string", "description": "Sites framework.", "default": null, - "x-example": "nextjs", + "x-example": "analog", "enum": [ + "analog", + "angular", "nextjs", "react", "nuxt", @@ -25969,7 +25970,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -26976,15 +26979,6 @@ }, "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" } ] } @@ -37766,7 +37760,7 @@ "description": "Function execution and build runtime.", "x-example": "python-3.8" }, - "deployment": { + "deploymentId": { "type": "string", "description": "Function's active deployment ID.", "x-example": "5e5ea5c16897e" @@ -37863,7 +37857,7 @@ "live", "logging", "runtime", - "deployment", + "deploymentId", "scopes", "vars", "events", diff --git a/app/config/specs/swagger2-latest-server.json b/app/config/specs/swagger2-latest-server.json index bb49b13792..6db3ed277f 100644 --- a/app/config/specs/swagger2-latest-server.json +++ b/app/config/specs/swagger2-latest-server.json @@ -8314,7 +8314,7 @@ "parameters": [ { "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: name, enabled, runtime, deployment, schedule, scheduleNext, schedulePrevious, timeout, entrypoint, commands, installationId", + "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: name, enabled, runtime, deploymentId, schedule, scheduleNext, schedulePrevious, timeout, entrypoint, commands, installationId", "required": false, "type": "array", "collectionFormat": "multi", @@ -8468,7 +8468,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -8881,7 +8883,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -9947,15 +9951,6 @@ }, "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" } ] }, @@ -17282,8 +17277,10 @@ "type": "string", "description": "Sites framework.", "default": null, - "x-example": "nextjs", + "x-example": "analog", "enum": [ + "analog", + "angular", "nextjs", "react", "nuxt", @@ -17393,7 +17390,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -17700,8 +17699,10 @@ "type": "string", "description": "Sites framework.", "default": null, - "x-example": "nextjs", + "x-example": "analog", "enum": [ + "analog", + "angular", "nextjs", "react", "nuxt", @@ -17811,7 +17812,9 @@ "bun-1.1", "go-1.23", "static-1", - "flutter-3.24" + "flutter-3.24", + "flutter-3.27", + "flutter-3.29" ], "x-enum-name": null, "x-enum-keys": [] @@ -18830,15 +18833,6 @@ }, "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" } ] } @@ -28132,7 +28126,7 @@ "description": "Function execution and build runtime.", "x-example": "python-3.8" }, - "deployment": { + "deploymentId": { "type": "string", "description": "Function's active deployment ID.", "x-example": "5e5ea5c16897e" @@ -28229,7 +28223,7 @@ "live", "logging", "runtime", - "deployment", + "deploymentId", "scopes", "vars", "events", From 1a90c8aab57d516dce24c68081f4307de3a306de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 12 Mar 2025 12:39:33 +0100 Subject: [PATCH 9/9] Add Vite framework --- .env | 2 +- app/config/frameworks.php | 15 +++++++++++++++ app/config/specs/open-api3-latest-console.json | 2 ++ app/config/specs/open-api3-latest-server.json | 2 ++ app/config/specs/swagger2-latest-console.json | 2 ++ app/config/specs/swagger2-latest-server.json | 2 ++ app/config/templates/site.php | 14 ++++++++++---- 7 files changed, 34 insertions(+), 5 deletions(-) diff --git a/.env b/.env index 945680114f..e8427cab7c 100644 --- a/.env +++ b/.env @@ -82,7 +82,7 @@ _APP_EXECUTOR_SECRET=your-secret-key _APP_EXECUTOR_HOST=http://exc1/v1 _APP_FUNCTIONS_RUNTIMES=php-8.0,node-18.0,python-3.9,ruby-3.1 _APP_SITES_RUNTIMES=static-1,node-22,flutter-3.29 -_APP_SITES_FRAMEWORKS=sveltekit,nextjs,nuxt,astro,remix,flutter,other,react,vue,analog,angular +_APP_SITES_FRAMEWORKS=sveltekit,nextjs,nuxt,astro,remix,flutter,other,react,vue,analog,angular,vite _APP_MAINTENANCE_INTERVAL=86400 _APP_MAINTENANCE_DELAY= _APP_MAINTENANCE_RETENTION_CACHE=2592000 diff --git a/app/config/frameworks.php b/app/config/frameworks.php index 1cb6ac811b..e1b31a28ec 100644 --- a/app/config/frameworks.php +++ b/app/config/frameworks.php @@ -233,6 +233,21 @@ return [ ], ], ], + 'vite' => [ + 'key' => 'vite', + 'name' => 'Vite', + 'buildRuntime' => 'node-22', + 'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'), + 'adapters' => [ + 'static' => [ + 'key' => 'static', + 'buildCommand' => 'npm run build', + 'installCommand' => 'npm install', + 'outputDirectory' => './dist', + 'startCommand' => 'sh helpers/server.sh', + ], + ] + ], 'other' => [ 'key' => 'other', 'name' => 'Other', diff --git a/app/config/specs/open-api3-latest-console.json b/app/config/specs/open-api3-latest-console.json index 5dbb4e6b05..32bf94c6c1 100644 --- a/app/config/specs/open-api3-latest-console.json +++ b/app/config/specs/open-api3-latest-console.json @@ -24723,6 +24723,7 @@ "astro", "remix", "flutter", + "vite", "other" ], "x-enum-name": null, @@ -25352,6 +25353,7 @@ "astro", "remix", "flutter", + "vite", "other" ], "x-enum-name": null, diff --git a/app/config/specs/open-api3-latest-server.json b/app/config/specs/open-api3-latest-server.json index d46cc5c898..84179be2cd 100644 --- a/app/config/specs/open-api3-latest-server.json +++ b/app/config/specs/open-api3-latest-server.json @@ -16820,6 +16820,7 @@ "astro", "remix", "flutter", + "vite", "other" ], "x-enum-name": null, @@ -17224,6 +17225,7 @@ "astro", "remix", "flutter", + "vite", "other" ], "x-enum-name": null, diff --git a/app/config/specs/swagger2-latest-console.json b/app/config/specs/swagger2-latest-console.json index 8cbdb8accd..4eec95c22d 100644 --- a/app/config/specs/swagger2-latest-console.json +++ b/app/config/specs/swagger2-latest-console.json @@ -25226,6 +25226,7 @@ "astro", "remix", "flutter", + "vite", "other" ], "x-enum-name": null, @@ -25869,6 +25870,7 @@ "astro", "remix", "flutter", + "vite", "other" ], "x-enum-name": null, diff --git a/app/config/specs/swagger2-latest-server.json b/app/config/specs/swagger2-latest-server.json index 6db3ed277f..74bf68b1df 100644 --- a/app/config/specs/swagger2-latest-server.json +++ b/app/config/specs/swagger2-latest-server.json @@ -17289,6 +17289,7 @@ "astro", "remix", "flutter", + "vite", "other" ], "x-enum-name": null, @@ -17711,6 +17712,7 @@ "astro", "remix", "flutter", + "vite", "other" ], "x-enum-name": null, diff --git a/app/config/templates/site.php b/app/config/templates/site.php index 2b3bf57599..e90b27d97e 100644 --- a/app/config/templates/site.php +++ b/app/config/templates/site.php @@ -86,6 +86,15 @@ const TEMPLATE_FRAMEWORKS = [ 'adapter' => 'static', 'fallbackFile' => 'index.html', ], + 'VITE' => [ + 'key' => 'vite', + 'name' => 'Vite', + 'installCommand' => 'npm install', + 'buildCommand' => 'npm run build', + 'buildRuntime' => 'node-22', + 'adapter' => 'static', + 'outputDirectory' => './dist', + ], 'REACT' => [ 'key' => 'react', 'name' => 'React', @@ -195,11 +204,8 @@ return [ 'screenshotDark' => $url . '/images/sites/templates/starter-for-js-dark.png', 'screenshotLight' => $url . '/images/sites/templates/starter-for-js-light.png', 'frameworks' => [ - getFramework('OTHER', [ - 'installCommand' => 'npm install', - 'buildCommand' => 'npm run build', + getFramework('VITE', [ 'providerRootDirectory' => './', - 'outputDirectory' => './dist', ]), ], 'vcsProvider' => 'github',