From 84e1b050a9d720e6dfe33929e617f22c6c8cca98 Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Tue, 4 Mar 2025 17:28:06 +0530 Subject: [PATCH 01/11] Truncate commit message to 252 characters --- app/controllers/api/vcs.php | 6 +++--- src/Appwrite/Platform/Modules/Compute/Base.php | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/vcs.php b/app/controllers/api/vcs.php index 0f277a4661..92be85ba39 100644 --- a/app/controllers/api/vcs.php +++ b/app/controllers/api/vcs.php @@ -224,7 +224,7 @@ $createGitDeployments = function (GitHub $github, string $providerInstallationId 'providerCommitHash' => $providerCommitHash, 'providerCommitAuthorUrl' => $providerCommitAuthorUrl, 'providerCommitAuthor' => $providerCommitAuthor, - 'providerCommitMessage' => $providerCommitMessage, + 'providerCommitMessage' => mb_strimwidth($providerCommitMessage, 0, 252, '...'), 'providerCommitUrl' => $providerCommitUrl, 'providerCommentId' => \strval($latestCommentId), 'providerBranch' => $providerBranch, @@ -1028,7 +1028,7 @@ App::post('/v1/vcs/github/events') $providerRepositoryOwner = $parsedPayload["owner"] ?? ''; $providerCommitAuthor = $parsedPayload["headCommitAuthor"] ?? ''; $providerCommitAuthorUrl = $parsedPayload["authorUrl"] ?? ''; - $providerCommitMessage = $parsedPayload["headCommitMessage"] ?? ''; + $providerCommitMessage = mb_strimwidth($parsedPayload["headCommitMessage"] ?? '', 0, 252, '...'); $providerCommitUrl = $parsedPayload["headCommitUrl"] ?? ''; $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); @@ -1090,7 +1090,7 @@ App::post('/v1/vcs/github/events') $commitDetails = $github->getCommit($providerRepositoryOwner, $providerRepositoryName, $providerCommitHash); $providerCommitAuthor = $commitDetails["commitAuthor"] ?? ''; - $providerCommitMessage = $commitDetails["commitMessage"] ?? ''; + $providerCommitMessage = mb_strimwidth($commitDetails["commitMessage"] ?? '', 0, 252, '...'); $repositories = Authorization::skip(fn () => $dbForPlatform->find('repositories', [ Query::equal('providerRepositoryId', [$providerRepositoryId]), diff --git a/src/Appwrite/Platform/Modules/Compute/Base.php b/src/Appwrite/Platform/Modules/Compute/Base.php index 157654c486..a1703b7932 100644 --- a/src/Appwrite/Platform/Modules/Compute/Base.php +++ b/src/Appwrite/Platform/Modules/Compute/Base.php @@ -83,7 +83,7 @@ class Base extends Action 'providerCommitHash' => $commitDetails['commitHash'] ?? '', 'providerCommitAuthorUrl' => $authorUrl, 'providerCommitAuthor' => $commitDetails['commitAuthor'] ?? '', - 'providerCommitMessage' => $commitDetails['commitMessage'] ?? '', + 'providerCommitMessage' => mb_strimwidth($commitDetails['commitMessage'] ?? '', 0, 252, '...'), 'providerCommitUrl' => $commitDetails['commitUrl'] ?? '', 'providerBranch' => $providerBranch, 'providerRootDirectory' => $function->getAttribute('providerRootDirectory', ''), @@ -164,7 +164,7 @@ class Base extends Action 'providerCommitHash' => $commitDetails['commitHash'] ?? '', 'providerCommitAuthorUrl' => $authorUrl, 'providerCommitAuthor' => $commitDetails['commitAuthor'] ?? '', - 'providerCommitMessage' => $commitDetails['commitMessage'] ?? '', + 'providerCommitMessage' => mb_strimwidth($commitDetails['commitMessage'] ?? '', 0, 252, '...'), 'providerCommitUrl' => $commitDetails['commitUrl'] ?? '', 'providerBranch' => $providerBranch, 'providerRootDirectory' => $site->getAttribute('providerRootDirectory', ''), From bbf37e0a0e55b85dfa1a6ddacb9c3411707e671f Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Wed, 5 Mar 2025 13:40:15 +0530 Subject: [PATCH 02/11] Update length to 255 --- app/controllers/api/vcs.php | 6 +++--- src/Appwrite/Platform/Modules/Compute/Base.php | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/vcs.php b/app/controllers/api/vcs.php index 92be85ba39..ba364e98fd 100644 --- a/app/controllers/api/vcs.php +++ b/app/controllers/api/vcs.php @@ -224,7 +224,7 @@ $createGitDeployments = function (GitHub $github, string $providerInstallationId 'providerCommitHash' => $providerCommitHash, 'providerCommitAuthorUrl' => $providerCommitAuthorUrl, 'providerCommitAuthor' => $providerCommitAuthor, - 'providerCommitMessage' => mb_strimwidth($providerCommitMessage, 0, 252, '...'), + 'providerCommitMessage' => mb_strimwidth($providerCommitMessage, 0, 255, '...'), 'providerCommitUrl' => $providerCommitUrl, 'providerCommentId' => \strval($latestCommentId), 'providerBranch' => $providerBranch, @@ -1028,7 +1028,7 @@ App::post('/v1/vcs/github/events') $providerRepositoryOwner = $parsedPayload["owner"] ?? ''; $providerCommitAuthor = $parsedPayload["headCommitAuthor"] ?? ''; $providerCommitAuthorUrl = $parsedPayload["authorUrl"] ?? ''; - $providerCommitMessage = mb_strimwidth($parsedPayload["headCommitMessage"] ?? '', 0, 252, '...'); + $providerCommitMessage = mb_strimwidth($parsedPayload["headCommitMessage"] ?? '', 0, 255, '...'); $providerCommitUrl = $parsedPayload["headCommitUrl"] ?? ''; $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); @@ -1090,7 +1090,7 @@ App::post('/v1/vcs/github/events') $commitDetails = $github->getCommit($providerRepositoryOwner, $providerRepositoryName, $providerCommitHash); $providerCommitAuthor = $commitDetails["commitAuthor"] ?? ''; - $providerCommitMessage = mb_strimwidth($commitDetails["commitMessage"] ?? '', 0, 252, '...'); + $providerCommitMessage = mb_strimwidth($commitDetails["commitMessage"] ?? '', 0, 255, '...'); $repositories = Authorization::skip(fn () => $dbForPlatform->find('repositories', [ Query::equal('providerRepositoryId', [$providerRepositoryId]), diff --git a/src/Appwrite/Platform/Modules/Compute/Base.php b/src/Appwrite/Platform/Modules/Compute/Base.php index a1703b7932..43e23214b0 100644 --- a/src/Appwrite/Platform/Modules/Compute/Base.php +++ b/src/Appwrite/Platform/Modules/Compute/Base.php @@ -83,7 +83,7 @@ class Base extends Action 'providerCommitHash' => $commitDetails['commitHash'] ?? '', 'providerCommitAuthorUrl' => $authorUrl, 'providerCommitAuthor' => $commitDetails['commitAuthor'] ?? '', - 'providerCommitMessage' => mb_strimwidth($commitDetails['commitMessage'] ?? '', 0, 252, '...'), + 'providerCommitMessage' => mb_strimwidth($commitDetails['commitMessage'] ?? '', 0, 255, '...'), 'providerCommitUrl' => $commitDetails['commitUrl'] ?? '', 'providerBranch' => $providerBranch, 'providerRootDirectory' => $function->getAttribute('providerRootDirectory', ''), @@ -164,7 +164,7 @@ class Base extends Action 'providerCommitHash' => $commitDetails['commitHash'] ?? '', 'providerCommitAuthorUrl' => $authorUrl, 'providerCommitAuthor' => $commitDetails['commitAuthor'] ?? '', - 'providerCommitMessage' => mb_strimwidth($commitDetails['commitMessage'] ?? '', 0, 252, '...'), + 'providerCommitMessage' => mb_strimwidth($commitDetails['commitMessage'] ?? '', 0, 255, '...'), 'providerCommitUrl' => $commitDetails['commitUrl'] ?? '', 'providerBranch' => $providerBranch, 'providerRootDirectory' => $site->getAttribute('providerRootDirectory', ''), From de5f33f2060b478594502aa1adcc2369ef9de6a1 Mon Sep 17 00:00:00 2001 From: Khushboo Verma <43381712+vermakhushboo@users.noreply.github.com> Date: Wed, 5 Mar 2025 22:45:48 +0530 Subject: [PATCH 03/11] keep truncation only during create document --- app/controllers/api/vcs.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/vcs.php b/app/controllers/api/vcs.php index ba364e98fd..480ee54411 100644 --- a/app/controllers/api/vcs.php +++ b/app/controllers/api/vcs.php @@ -1028,7 +1028,7 @@ App::post('/v1/vcs/github/events') $providerRepositoryOwner = $parsedPayload["owner"] ?? ''; $providerCommitAuthor = $parsedPayload["headCommitAuthor"] ?? ''; $providerCommitAuthorUrl = $parsedPayload["authorUrl"] ?? ''; - $providerCommitMessage = mb_strimwidth($parsedPayload["headCommitMessage"] ?? '', 0, 255, '...'); + $providerCommitMessage = $parsedPayload["headCommitMessage"] ?? ''; $providerCommitUrl = $parsedPayload["headCommitUrl"] ?? ''; $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); @@ -1090,7 +1090,7 @@ App::post('/v1/vcs/github/events') $commitDetails = $github->getCommit($providerRepositoryOwner, $providerRepositoryName, $providerCommitHash); $providerCommitAuthor = $commitDetails["commitAuthor"] ?? ''; - $providerCommitMessage = mb_strimwidth($commitDetails["commitMessage"] ?? '', 0, 255, '...'); + $providerCommitMessage = $commitDetails["commitMessage"] ?? ''; $repositories = Authorization::skip(fn () => $dbForPlatform->find('repositories', [ Query::equal('providerRepositoryId', [$providerRepositoryId]), From f61db2949853bbed7b736e0f9f3cfda431398410 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 11 Mar 2025 09:50:02 +0100 Subject: [PATCH 04/11] Rename config to follow folder pattern --- app/init.php | 4 ++-- .../Platform/Modules/Functions/Http/Templates/Get.php | 2 +- .../Platform/Modules/Functions/Http/Templates/XList.php | 2 +- src/Appwrite/Platform/Modules/Sites/Http/Templates/Get.php | 2 +- src/Appwrite/Platform/Modules/Sites/Http/Templates/XList.php | 2 +- src/Appwrite/Platform/Tasks/Screenshot.php | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/init.php b/app/init.php index ae3d96cd97..a33b828779 100644 --- a/app/init.php +++ b/app/init.php @@ -390,8 +390,8 @@ Config::load('storage-mimes', __DIR__ . '/config/storage/mimes.php'); Config::load('storage-inputs', __DIR__ . '/config/storage/inputs.php'); Config::load('storage-outputs', __DIR__ . '/config/storage/outputs.php'); Config::load('specifications', __DIR__ . '/config/specifications.php'); -Config::load('function-templates', __DIR__ . '/config/templates/function.php'); -Config::load('site-templates', __DIR__ . '/config/templates/site.php'); +Config::load('templates-function', __DIR__ . '/config/templates/function.php'); +Config::load('templates-site', __DIR__ . '/config/templates/site.php'); /** * New DB Filters diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Templates/Get.php b/src/Appwrite/Platform/Modules/Functions/Http/Templates/Get.php index 542dfb3eb6..8eb95b2026 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Templates/Get.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Templates/Get.php @@ -53,7 +53,7 @@ class Get extends Base public function action(string $templateId, Response $response) { - $templates = Config::getParam('function-templates', []); + $templates = Config::getParam('templates-function', []); $filtered = \array_filter($templates, function ($template) use ($templateId) { return $template['id'] === $templateId; diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Templates/XList.php b/src/Appwrite/Platform/Modules/Functions/Http/Templates/XList.php index de773ae75e..2ce5df51ab 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Templates/XList.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Templates/XList.php @@ -57,7 +57,7 @@ class XList extends Base public function action(array $runtimes, array $usecases, int $limit, int $offset, Response $response) { - $templates = Config::getParam('function-templates', []); + $templates = Config::getParam('templates-function', []); if (!empty($runtimes)) { $templates = \array_filter($templates, function ($template) use ($runtimes) { diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Templates/Get.php b/src/Appwrite/Platform/Modules/Sites/Http/Templates/Get.php index 272caa5d81..5d6a7aa3ba 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Templates/Get.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Templates/Get.php @@ -53,7 +53,7 @@ class Get extends Base public function action(string $templateId, Response $response) { - $templates = Config::getParam('site-templates', []); + $templates = Config::getParam('templates-site', []); $allowedTemplates = \array_filter($templates, function ($item) use ($templateId) { return $item['key'] === $templateId; diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Templates/XList.php b/src/Appwrite/Platform/Modules/Sites/Http/Templates/XList.php index 1e8f4de49a..f293f76891 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Templates/XList.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Templates/XList.php @@ -57,7 +57,7 @@ class XList extends Base public function action(array $frameworks, array $usecases, int $limit, int $offset, Response $response) { - $templates = Config::getParam('site-templates', []); + $templates = Config::getParam('templates-site', []); if (!empty($frameworks)) { $templates = \array_filter($templates, function ($template) use ($frameworks) { diff --git a/src/Appwrite/Platform/Tasks/Screenshot.php b/src/Appwrite/Platform/Tasks/Screenshot.php index fb0cce3d38..f368660855 100644 --- a/src/Appwrite/Platform/Tasks/Screenshot.php +++ b/src/Appwrite/Platform/Tasks/Screenshot.php @@ -26,7 +26,7 @@ class Screenshot extends Action public function action(string $templateId): void { - $templates = Config::getParam('site-templates', []); + $templates = Config::getParam('templates-site', []); $allowedTemplates = \array_filter($templates, function ($item) use ($templateId) { return $item['key'] === $templateId; From 71b56fc5048280e03f68c4317e73bcbf91dbc0b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 11 Mar 2025 10:22:28 +0100 Subject: [PATCH 05/11] Remove log/execution search --- app/config/collections/projects.php | 18 ------------ app/controllers/general.php | 1 - .../Functions/Http/Executions/Create.php | 1 - .../Functions/Http/Executions/XList.php | 8 +---- .../Modules/Sites/Http/Logs/XList.php | 8 +---- .../Modules/Sites/Http/Sites/Update.php | 29 +++++++++++++++++-- src/Appwrite/Platform/Workers/Functions.php | 2 -- .../Database/Validator/Queries/Logs.php | 1 + 8 files changed, 30 insertions(+), 38 deletions(-) diff --git a/app/config/collections/projects.php b/app/config/collections/projects.php index 0612b50566..7ea750f2b3 100644 --- a/app/config/collections/projects.php +++ b/app/config/collections/projects.php @@ -1820,17 +1820,6 @@ return [ 'array' => false, 'filters' => ['json'], ], - [ - '$id' => ID::custom('search'), - 'type' => Database::VAR_STRING, - 'format' => '', - 'size' => 16384, - 'signed' => true, - 'required' => false, - 'default' => null, - 'array' => false, - 'filters' => [], - ], [ '$id' => ID::custom('scheduledAt'), 'type' => Database::VAR_DATETIME, @@ -1873,13 +1862,6 @@ return [ 'lengths' => [Database::LENGTH_KEY], 'orders' => [Database::ORDER_ASC], ], - [ - '$id' => ID::custom('_fulltext_search'), - 'type' => Database::INDEX_FULLTEXT, - 'attributes' => ['search'], - 'lengths' => [], - 'orders' => [], - ], [ '$id' => ID::custom('_key_trigger'), 'type' => Database::INDEX_KEY, diff --git a/app/controllers/general.php b/app/controllers/general.php index 6cd4405321..f28409567e 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -330,7 +330,6 @@ function router(App $utopia, Database $dbForPlatform, callable $getProjectDB, Sw 'errors' => '', 'logs' => '', 'duration' => 0.0, - 'search' => implode(' ', [$resource->getId(), $executionId]), ]); if ($type === 'function') { diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php index 0bb755a1f2..422b5f767f 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php @@ -249,7 +249,6 @@ class Create extends Base 'errors' => '', 'logs' => '', 'duration' => 0.0, - 'search' => implode(' ', [$functionId, $executionId]), ]); $queueForEvents diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Executions/XList.php b/src/Appwrite/Platform/Modules/Functions/Http/Executions/XList.php index 597e830dd3..7f133ee548 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Executions/XList.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Executions/XList.php @@ -19,7 +19,6 @@ use Utopia\Database\Validator\Query\Cursor; use Utopia\Database\Validator\UID; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; -use Utopia\Validator\Text; class XList extends Base { @@ -55,13 +54,12 @@ class XList extends Base )) ->param('functionId', '', new UID(), 'Function ID.') ->param('queries', [], new Executions(), '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(', ', Executions::ALLOWED_ATTRIBUTES), true) - ->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true) ->inject('response') ->inject('dbForProject') ->callback([$this, 'action']); } - public function action(string $functionId, array $queries, string $search, Response $response, Database $dbForProject) + public function action(string $functionId, array $queries, Response $response, Database $dbForProject) { $function = Authorization::skip(fn () => $dbForProject->getDocument('functions', $functionId)); @@ -78,10 +76,6 @@ class XList extends Base throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - if (!empty($search)) { - $queries[] = Query::search('search', $search); - } - // Set internal queries $queries[] = Query::equal('resourceInternalId', [$function->getInternalId()]); $queries[] = Query::equal('resourceType', ['functions']); diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Logs/XList.php b/src/Appwrite/Platform/Modules/Sites/Http/Logs/XList.php index 134978d8b9..8a9630b28b 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Logs/XList.php @@ -18,7 +18,6 @@ use Utopia\Database\Validator\Query\Cursor; use Utopia\Database\Validator\UID; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; -use Utopia\Validator\Text; class XList extends Base { @@ -54,13 +53,12 @@ class XList extends Base )) ->param('siteId', '', new UID(), 'Site ID.') ->param('queries', [], new Logs(), '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(', ', Executions::ALLOWED_ATTRIBUTES), true) - ->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true) ->inject('response') ->inject('dbForProject') ->callback([$this, 'action']); } - public function action(string $siteId, array $queries, string $search, Response $response, Database $dbForProject) + public function action(string $siteId, array $queries, Response $response, Database $dbForProject) { $site = $dbForProject->getDocument('sites', $siteId); @@ -74,10 +72,6 @@ class XList extends Base throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - if (!empty($search)) { - $queries[] = Query::search('search', $search); - } - // Set internal queries $queries[] = Query::equal('resourceInternalId', [$site->getInternalId()]); $queries[] = Query::equal('resourceType', ['sites']); diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php index 35e4fb07e3..6641f000f1 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php @@ -98,8 +98,33 @@ class Update extends Base ->callback([$this, 'action']); } - public function action(string $siteId, string $name, string $framework, bool $enabled, int $timeout, string $installCommand, string $buildCommand, string $outputDirectory, string $buildRuntime, string $adapter, string $fallbackFile, string $installationId, ?string $providerRepositoryId, string $providerBranch, bool $providerSilentMode, string $providerRootDirectory, string $specification, Request $request, Response $response, Database $dbForProject, Document $project, Event $queueForEvents, Build $queueForBuilds, Database $dbForPlatform, GitHub $github) - { + public function action( + string $siteId, + string $name, + string $framework, + bool $enabled, + int $timeout, + string $installCommand, + string $buildCommand, + string $outputDirectory, + string $buildRuntime, + string $adapter, + string $fallbackFile, + string $installationId, + ?string $providerRepositoryId, + string $providerBranch, + bool $providerSilentMode, + string $providerRootDirectory, + string $specification, + Request $request, + Response $response, + Database $dbForProject, + Document $project, + Event $queueForEvents, + Build $queueForBuilds, + Database $dbForPlatform, + GitHub $github + ) { if (!empty($adapter)) { $configFramework = Config::getParam('frameworks')[$framework] ?? []; $adapters = \array_keys($configFramework['adapters'] ?? []); diff --git a/src/Appwrite/Platform/Workers/Functions.php b/src/Appwrite/Platform/Workers/Functions.php index febaec54d7..1c952bc7a8 100644 --- a/src/Appwrite/Platform/Workers/Functions.php +++ b/src/Appwrite/Platform/Workers/Functions.php @@ -271,7 +271,6 @@ class Functions extends Action 'errors' => $message, 'logs' => '', 'duration' => 0.0, - 'search' => implode(' ', [$function->getId(), $executionId]), ]); $execution = $dbForProject->createDocument('executions', $execution); @@ -407,7 +406,6 @@ class Functions extends Action 'errors' => '', 'logs' => '', 'duration' => 0.0, - 'search' => implode(' ', [$functionId, $executionId]), ]); $execution = $dbForProject->createDocument('executions', $execution); diff --git a/src/Appwrite/Utopia/Database/Validator/Queries/Logs.php b/src/Appwrite/Utopia/Database/Validator/Queries/Logs.php index 329ce931d6..d07d3dd3d2 100644 --- a/src/Appwrite/Utopia/Database/Validator/Queries/Logs.php +++ b/src/Appwrite/Utopia/Database/Validator/Queries/Logs.php @@ -5,6 +5,7 @@ namespace Appwrite\Utopia\Database\Validator\Queries; class Logs extends Base { public const ALLOWED_ATTRIBUTES = [ + 'status', 'responseStatusCode', 'duration', 'requestMethod', From 733c5ad97dbf4ee7fd47ac3111dbed33809cf7f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 11 Mar 2025 10:24:18 +0100 Subject: [PATCH 06/11] Add enforced minimal specs --- src/Appwrite/Platform/Modules/Functions/Workers/Builds.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php index dee13c83ce..bf442e7c3b 100644 --- a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php +++ b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php @@ -493,8 +493,11 @@ class Builds extends Action $vars[$var->getAttribute('key')] = $var->getAttribute('value', ''); } + // Some runtimes/frameworks can't compile with less memory than this + $minMemory = $resource->getCollection() === 'sites' ? 2048 : 1024; + $cpus = $spec['cpus'] ?? APP_COMPUTE_CPUS_DEFAULT; - $memory = max($spec['memory'] ?? APP_COMPUTE_MEMORY_DEFAULT, 1024); // We have a minimum of 1024MB here because some runtimes can't compile with less memory than this. + $memory = max($spec['memory'] ?? APP_COMPUTE_MEMORY_DEFAULT, $minMemory); $timeout = (int) System::getEnv('_APP_COMPUTE_BUILD_TIMEOUT', 900); From 7f05a74b31d655d992fa54874ce1ef944c3921fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 11 Mar 2025 10:27:08 +0100 Subject: [PATCH 07/11] Increase rate limit for 0.5s debounce in UI --- src/Appwrite/Platform/Modules/Console/Http/Resources/Get.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Modules/Console/Http/Resources/Get.php b/src/Appwrite/Platform/Modules/Console/Http/Resources/Get.php index 28e7194b2c..e9304f6afd 100644 --- a/src/Appwrite/Platform/Modules/Console/Http/Resources/Get.php +++ b/src/Appwrite/Platform/Modules/Console/Http/Resources/Get.php @@ -49,7 +49,7 @@ class Get extends Action ], contentType: ContentType::NONE, )) - ->label('abuse-limit', 10) + ->label('abuse-limit', 120) ->label('abuse-key', 'userId:{userId}, url:{url}') ->label('abuse-time', 60) ->param('value', '', new Text(256), 'Resource value.') From 18e4be2eabed7125757edac4b35f6f25b47b65b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 11 Mar 2025 11:49:31 +0100 Subject: [PATCH 08/11] Add JS template --- app/config/templates/site.php | 45 ++++++++++++++++++ .../sites/templates/starter-for-js-dark.png | Bin 0 -> 54033 bytes .../sites/templates/starter-for-js-light.png | Bin 0 -> 54033 bytes src/Appwrite/Platform/Tasks/Screenshot.php | 9 ++-- 4 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 public/images/sites/templates/starter-for-js-dark.png create mode 100644 public/images/sites/templates/starter-for-js-light.png diff --git a/app/config/templates/site.php b/app/config/templates/site.php index 69339596f0..cf2ffff56c 100644 --- a/app/config/templates/site.php +++ b/app/config/templates/site.php @@ -135,6 +135,51 @@ return [ 'providerVersion' => '0.1.*', 'variables' => [] ], + [ + 'key' => 'starter-for-js', + 'name' => 'JavaScript starter', + 'useCases' => ['starter'], + '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', + 'providerRootDirectory' => './', + 'outputDirectory' => './dist', + ]), + ], + 'vcsProvider' => 'github', + 'providerRepositoryId' => 'starter-for-js', + 'providerOwner' => 'appwrite', + 'providerVersion' => '0.1.*', + 'variables' => [ + [ + 'name' => 'VITE_APPWRITE_ENDPOINT', + 'description' => 'Endpoint of Appwrite server', + 'value' => '{apiEndpoint}', + 'placeholder' => '{apiEndpoint}', + 'required' => true, + 'type' => 'text' + ], + [ + 'name' => 'VITE_APPWRITE_PROJECT_ID', + 'description' => 'Your Appwrite project ID', + 'value' => '{projectId}', + 'placeholder' => '{projectId}', + 'required' => true, + 'type' => 'text' + ], + [ + 'name' => 'VITE_APPWRITE_PROJECT_NAME', + 'description' => 'Your Appwrite project name', + 'value' => '{projectName}', + 'placeholder' => '{projectName}', + 'required' => true, + 'type' => 'text' + ], + ] + ], [ 'key' => 'starter-for-svelte', 'name' => 'Svelte starter', diff --git a/public/images/sites/templates/starter-for-js-dark.png b/public/images/sites/templates/starter-for-js-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..435b619f358ed604aac61a6467735331e83eca6b GIT binary patch literal 54033 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