From 10b8f97e9616db586bf2d9b792b97ba388bee5e1 Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Wed, 3 Dec 2025 13:22:39 -0800 Subject: [PATCH 01/95] chore: bump appwrite version to 1.8.1 --- README-CN.md | 6 +++--- README.md | 6 +++--- app/init/constants.php | 2 +- src/Appwrite/Migration/Migration.php | 1 + 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/README-CN.md b/README-CN.md index ad9ce7d29a..0aeb3e0376 100644 --- a/README-CN.md +++ b/README-CN.md @@ -72,7 +72,7 @@ docker run -it --rm \ --volume /var/run/docker.sock:/var/run/docker.sock \ --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \ --entrypoint="install" \ - appwrite/appwrite:1.8.0 + appwrite/appwrite:1.8.1 ``` ### Windows @@ -84,7 +84,7 @@ docker run -it --rm ^ --volume //var/run/docker.sock:/var/run/docker.sock ^ --volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^ --entrypoint="install" ^ - appwrite/appwrite:1.8.0 + appwrite/appwrite:1.8.1 ``` #### PowerShell @@ -94,7 +94,7 @@ docker run -it --rm ` --volume /var/run/docker.sock:/var/run/docker.sock ` --volume ${pwd}/appwrite:/usr/src/code/appwrite:rw ` --entrypoint="install" ` - appwrite/appwrite:1.8.0 + appwrite/appwrite:1.8.1 ``` 运行后,可以在浏览器上访问 http://localhost 找到 Appwrite 控制台。在非 Linux 的本机主机上完成安装后,服务器可能需要几分钟才能启动。 diff --git a/README.md b/README.md index 50c1ed399b..22b35769cd 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ docker run -it --rm \ --volume /var/run/docker.sock:/var/run/docker.sock \ --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \ --entrypoint="install" \ - appwrite/appwrite:1.8.0 + appwrite/appwrite:1.8.1 ``` ### Windows @@ -94,7 +94,7 @@ docker run -it --rm ^ --volume //var/run/docker.sock:/var/run/docker.sock ^ --volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^ --entrypoint="install" ^ - appwrite/appwrite:1.8.0 + appwrite/appwrite:1.8.1 ``` #### PowerShell @@ -104,7 +104,7 @@ docker run -it --rm ` --volume /var/run/docker.sock:/var/run/docker.sock ` --volume ${pwd}/appwrite:/usr/src/code/appwrite:rw ` --entrypoint="install" ` - appwrite/appwrite:1.8.0 + appwrite/appwrite:1.8.1 ``` Once the Docker installation is complete, go to http://localhost to access the Appwrite console from your browser. Please note that on non-Linux native hosts, the server might take a few minutes to start after completing the installation. diff --git a/app/init/constants.php b/app/init/constants.php index ea5c0fb2c5..6ac6473f3d 100644 --- a/app/init/constants.php +++ b/app/init/constants.php @@ -39,7 +39,7 @@ const APP_RESOURCE_TOKEN_ACCESS = 24 * 60 * 60; // 24 hours const APP_FILE_ACCESS = 24 * 60 * 60; // 24 hours const APP_CACHE_UPDATE = 24 * 60 * 60; // 24 hours const APP_CACHE_BUSTER = 4321; -const APP_VERSION_STABLE = '1.8.0'; +const APP_VERSION_STABLE = '1.8.1'; const APP_DATABASE_ATTRIBUTE_EMAIL = 'email'; const APP_DATABASE_ATTRIBUTE_ENUM = 'enum'; const APP_DATABASE_ATTRIBUTE_IP = 'ip'; diff --git a/src/Appwrite/Migration/Migration.php b/src/Appwrite/Migration/Migration.php index 588b193df4..bc37924db6 100644 --- a/src/Appwrite/Migration/Migration.php +++ b/src/Appwrite/Migration/Migration.php @@ -90,6 +90,7 @@ abstract class Migration '1.7.3' => 'V22', '1.7.4' => 'V22', '1.8.0' => 'V23', + '1.8.1' => 'V23', ]; /** From bc99e04b571bb84fc3dd626b09273b74a36485b9 Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Wed, 3 Dec 2025 13:26:06 -0800 Subject: [PATCH 02/95] feat: bump console to version 7.5.7 --- app/views/install/compose.phtml | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/install/compose.phtml b/app/views/install/compose.phtml index 34e0aee1ae..23ecd81494 100644 --- a/app/views/install/compose.phtml +++ b/app/views/install/compose.phtml @@ -179,7 +179,7 @@ $image = $this->getParam('image', ''); appwrite-console: <<: *x-logging container_name: appwrite-console - image: /console:7.4.7 + image: /console:7.5.7 restart: unless-stopped networks: - appwrite diff --git a/docker-compose.yml b/docker-compose.yml index 6cf8070691..8bab50428f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -219,7 +219,7 @@ services: appwrite-console: <<: *x-logging container_name: appwrite-console - image: appwrite/console:7.4.11 + image: appwrite/console:7.5.7 restart: unless-stopped networks: - appwrite From bf6f7848260657bd1aa0d986d19d79961dc64e49 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Dec 2025 22:03:16 +0000 Subject: [PATCH 03/95] Initial plan From 5cdb59142f7fd4f82af6f4339eef5bc62ca78864 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Dec 2025 22:11:54 +0000 Subject: [PATCH 04/95] Add CHANGES.md section for version 1.8.1 Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com> --- CHANGES.md | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 74b46b7edc..b21e213029 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,104 @@ +# Version 1.8.1 + +## What's Changed + +### Notable changes + +* Add CSV export functionality in [#10546](https://github.com/appwrite/appwrite/pull/10546), [#10750](https://github.com/appwrite/appwrite/pull/10750), [#10813](https://github.com/appwrite/appwrite/pull/10813), and [#10847](https://github.com/appwrite/appwrite/pull/10847) +* Add branch deployments support in [#10486](https://github.com/appwrite/appwrite/pull/10486) +* Add screenshots endpoint in [#10675](https://github.com/appwrite/appwrite/pull/10675) +* Add TanStack Start sites support in [#10681](https://github.com/appwrite/appwrite/pull/10681) +* Add Next.js standalone support in [#10747](https://github.com/appwrite/appwrite/pull/10747) +* Add Resend integration in [#10690](https://github.com/appwrite/appwrite/pull/10690) +* Add per-bucket image transformations in [#10722](https://github.com/appwrite/appwrite/pull/10722) +* Add operators support in [#10735](https://github.com/appwrite/appwrite/pull/10735) and [#10800](https://github.com/appwrite/appwrite/pull/10800) +* Add Appwrite authentication in [#10758](https://github.com/appwrite/appwrite/pull/10758) +* Add users attributes in [#10688](https://github.com/appwrite/appwrite/pull/10688) +* Add function and sites stats in [#10786](https://github.com/appwrite/appwrite/pull/10786) +* Add screenshot endpoint stats in [#10706](https://github.com/appwrite/appwrite/pull/10706) +* Add disable count feature in [#10668](https://github.com/appwrite/appwrite/pull/10668) +* Add ElevenLabs site template in [#10782](https://github.com/appwrite/appwrite/pull/10782) +* Add suggested environment variables in [#10795](https://github.com/appwrite/appwrite/pull/10795) +* Add max build duration environment variable in [#10674](https://github.com/appwrite/appwrite/pull/10674) +* Add JWT disposition in [#10867](https://github.com/appwrite/appwrite/pull/10867) +* Add custom realtime logger in [#10871](https://github.com/appwrite/appwrite/pull/10871) +* Improve MFA docs endpoint order in [#10793](https://github.com/appwrite/appwrite/pull/10793) +* Update GeoDB database in [#10890](https://github.com/appwrite/appwrite/pull/10890) +* Update to CLI 12.0.0 in [#10853](https://github.com/appwrite/appwrite/pull/10853) +* Update Flutter default build runtime in [#10807](https://github.com/appwrite/appwrite/pull/10807) +* Upgrade runtimes in [#10804](https://github.com/appwrite/appwrite/pull/10804) + +### Fixes + +* Fix duplicate document error while creating file in [#10891](https://github.com/appwrite/appwrite/pull/10891) +* Fix invalid query in [#10888](https://github.com/appwrite/appwrite/pull/10888) +* Fix error setting user password in [#10889](https://github.com/appwrite/appwrite/pull/10889) +* Fix TOTP issues in [#10884](https://github.com/appwrite/appwrite/pull/10884) +* Fix wrong user type in [#10875](https://github.com/appwrite/appwrite/pull/10875) +* Fix file token expiry in [#10877](https://github.com/appwrite/appwrite/pull/10877) +* Fix limit and offset computation in [#10880](https://github.com/appwrite/appwrite/pull/10880) +* Fix TanStack Nitro default in [#10860](https://github.com/appwrite/appwrite/pull/10860) +* Fix TanStack builds in [#10767](https://github.com/appwrite/appwrite/pull/10767) +* Fix enum examples in [#10828](https://github.com/appwrite/appwrite/pull/10828) +* Fix missing nullable in [#10819](https://github.com/appwrite/appwrite/pull/10819) +* Fix response models multi-methods in [#10815](https://github.com/appwrite/appwrite/pull/10815) +* Fix nullable validation in [#10778](https://github.com/appwrite/appwrite/pull/10778) +* Fix WebP library in [#10738](https://github.com/appwrite/appwrite/pull/10738) +* Fix upgrade utopia database in [#10812](https://github.com/appwrite/appwrite/pull/10812) +* Fix undefined variable in [#10654](https://github.com/appwrite/appwrite/pull/10654) +* Fix undefined sequence in [#10652](https://github.com/appwrite/appwrite/pull/10652) +* Fix error handler error in [#10719](https://github.com/appwrite/appwrite/pull/10719) +* Fix Next 16 compatibility in [#10713](https://github.com/appwrite/appwrite/pull/10713) +* Fix description in [#10702](https://github.com/appwrite/appwrite/pull/10702) +* Fix warning in builds worker in [#10705](https://github.com/appwrite/appwrite/pull/10705) +* Fix stats usage memory leak in [#10683](https://github.com/appwrite/appwrite/pull/10683) +* Fix author URL in template deployments in [#10535](https://github.com/appwrite/appwrite/pull/10535) +* Fix auth refactor in [#10667](https://github.com/appwrite/appwrite/pull/10667) +* Fix sites create deployment in [#10566](https://github.com/appwrite/appwrite/pull/10566) +* Fix test dependencies projects in [#10655](https://github.com/appwrite/appwrite/pull/10655) +* Fix list sites test in [#10726](https://github.com/appwrite/appwrite/pull/10726) + +### Miscellaneous + +* Bump assistant to 0.8.4 in [#10887](https://github.com/appwrite/appwrite/pull/10887) +* Bump database to 3.1.5 in [#10766](https://github.com/appwrite/appwrite/pull/10766) +* Bump Utopia DNS in [#10761](https://github.com/appwrite/appwrite/pull/10761) +* Update domains to 0.8.3 in [#10658](https://github.com/appwrite/appwrite/pull/10658) +* Update domains to 0.9.1 in [#10678](https://github.com/appwrite/appwrite/pull/10678) +* Update Apple Swift to 13.3.0 in [#10679](https://github.com/appwrite/appwrite/pull/10679) +* Update Apple Swift in [#10663](https://github.com/appwrite/appwrite/pull/10663) +* Update CLI to 10.2.2 in [#10672](https://github.com/appwrite/appwrite/pull/10672) +* Update docs examples to use Permission class in [#10707](https://github.com/appwrite/appwrite/pull/10707) +* Update SDK examples docs in [#10855](https://github.com/appwrite/appwrite/pull/10855) +* Add logs in [#10869](https://github.com/appwrite/appwrite/pull/10869) +* Release Python SDK in [#10762](https://github.com/appwrite/appwrite/pull/10762) +* Release Flutter 20.3.2 in [#10838](https://github.com/appwrite/appwrite/pull/10838) +* Release Flutter/Dart add screenshot examples in [#10811](https://github.com/appwrite/appwrite/pull/10811) +* Release PHP CLI in [#10791](https://github.com/appwrite/appwrite/pull/10791) +* Release SDKs in [#10817](https://github.com/appwrite/appwrite/pull/10817) +* Update SDKs in [#10694](https://github.com/appwrite/appwrite/pull/10694), [#10729](https://github.com/appwrite/appwrite/pull/10729), and [#10744](https://github.com/appwrite/appwrite/pull/10744) +* Update SDK generator in [#10743](https://github.com/appwrite/appwrite/pull/10743) +* Update database in [#10664](https://github.com/appwrite/appwrite/pull/10664) +* Update README file in [#10763](https://github.com/appwrite/appwrite/pull/10763) +* SDK release documentation in [#10745](https://github.com/appwrite/appwrite/pull/10745) +* SDK release runtime config in [#10765](https://github.com/appwrite/appwrite/pull/10765) +* Sync specs in [#10789](https://github.com/appwrite/appwrite/pull/10789) +* Sync 1.8.0 in [#10677](https://github.com/appwrite/appwrite/pull/10677) +* Add workflow for issue triage in [#10718](https://github.com/appwrite/appwrite/pull/10718) +* Add issue auto-labeler in [#10700](https://github.com/appwrite/appwrite/pull/10700) +* Add AI moderator repo in [#10717](https://github.com/appwrite/appwrite/pull/10717) +* Browser bump in [#10850](https://github.com/appwrite/appwrite/pull/10850) +* Template type enum override in [#10848](https://github.com/appwrite/appwrite/pull/10848) +* VCS reference type in [#10852](https://github.com/appwrite/appwrite/pull/10852) +* Index scope description in [#10851](https://github.com/appwrite/appwrite/pull/10851) +* Config for environment in [#10833](https://github.com/appwrite/appwrite/pull/10833) +* Format instance in [#10830](https://github.com/appwrite/appwrite/pull/10830) +* Replace sleep in webhooks service in [#10656](https://github.com/appwrite/appwrite/pull/10656) +* Skip auth to delete VCS lock in [#10691](https://github.com/appwrite/appwrite/pull/10691) +* Update email composer in [#10720](https://github.com/appwrite/appwrite/pull/10720) +* Update facts on GitHub sites and functions in [#10593](https://github.com/appwrite/appwrite/pull/10593) and [#10771](https://github.com/appwrite/appwrite/pull/10771) +* Revert auth single instance refactor in [#10837](https://github.com/appwrite/appwrite/pull/10837) and [#10874](https://github.com/appwrite/appwrite/pull/10874) + # Version 1.8.0 ## What's Changed From c3a3717bde4bb4f141b87a4add6272ada77f0a66 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 4 Dec 2025 22:02:02 +0000 Subject: [PATCH 05/95] Initial plan From 4283671d491ae40f1616aeafa61c6e7b6ff206b7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 4 Dec 2025 22:15:50 +0000 Subject: [PATCH 06/95] Add user email attributes migration and fix missing break statement in V23 Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com> --- src/Appwrite/Migration/Version/V23.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Appwrite/Migration/Version/V23.php b/src/Appwrite/Migration/Version/V23.php index c7be832626..64a45fc9b2 100644 --- a/src/Appwrite/Migration/Version/V23.php +++ b/src/Appwrite/Migration/Version/V23.php @@ -139,7 +139,7 @@ class V23 extends Migration } catch (\Throwable $th) { Console::warning("Failed to migration error attribute size in collection {$id}: {$th->getMessage()}"); } - + break; case 'buckets': try { $this->createAttributeFromCollection($this->dbForProject, $id, 'transformations'); @@ -148,6 +148,21 @@ class V23 extends Migration } $this->dbForProject->purgeCachedCollection($id); break; + case 'users': + $attributes = [ + 'emailCanonical', + 'emailIsFree', + 'emailIsDisposable', + 'emailIsCorporate', + 'emailIsCanonical', + ]; + try { + $this->createAttributesFromCollection($this->dbForProject, $id, $attributes); + } catch (\Throwable $th) { + Console::warning('Failed to create attributes "' . \implode(', ', $attributes) . "\" in collection {$id}: {$th->getMessage()}"); + } + $this->dbForProject->purgeCachedCollection($id); + break; default: break; } From 31c8c090608b6be30f740e1954f452b712347a26 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 5 Dec 2025 00:28:49 +0000 Subject: [PATCH 07/95] Address review feedback on CHANGES.md categorization Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com> --- CHANGES.md | 57 ++++++++++++++++++++++++++---------------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index b21e213029..9a9eef6030 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,62 +4,50 @@ ### Notable changes -* Add CSV export functionality in [#10546](https://github.com/appwrite/appwrite/pull/10546), [#10750](https://github.com/appwrite/appwrite/pull/10750), [#10813](https://github.com/appwrite/appwrite/pull/10813), and [#10847](https://github.com/appwrite/appwrite/pull/10847) * Add branch deployments support in [#10486](https://github.com/appwrite/appwrite/pull/10486) -* Add screenshots endpoint in [#10675](https://github.com/appwrite/appwrite/pull/10675) * Add TanStack Start sites support in [#10681](https://github.com/appwrite/appwrite/pull/10681) * Add Next.js standalone support in [#10747](https://github.com/appwrite/appwrite/pull/10747) * Add Resend integration in [#10690](https://github.com/appwrite/appwrite/pull/10690) -* Add per-bucket image transformations in [#10722](https://github.com/appwrite/appwrite/pull/10722) +* Add option to enable/disable image transformations per-bucket in [#10722](https://github.com/appwrite/appwrite/pull/10722) * Add operators support in [#10735](https://github.com/appwrite/appwrite/pull/10735) and [#10800](https://github.com/appwrite/appwrite/pull/10800) -* Add Appwrite authentication in [#10758](https://github.com/appwrite/appwrite/pull/10758) -* Add users attributes in [#10688](https://github.com/appwrite/appwrite/pull/10688) * Add function and sites stats in [#10786](https://github.com/appwrite/appwrite/pull/10786) -* Add screenshot endpoint stats in [#10706](https://github.com/appwrite/appwrite/pull/10706) * Add disable count feature in [#10668](https://github.com/appwrite/appwrite/pull/10668) * Add ElevenLabs site template in [#10782](https://github.com/appwrite/appwrite/pull/10782) * Add suggested environment variables in [#10795](https://github.com/appwrite/appwrite/pull/10795) -* Add max build duration environment variable in [#10674](https://github.com/appwrite/appwrite/pull/10674) -* Add JWT disposition in [#10867](https://github.com/appwrite/appwrite/pull/10867) -* Add custom realtime logger in [#10871](https://github.com/appwrite/appwrite/pull/10871) * Improve MFA docs endpoint order in [#10793](https://github.com/appwrite/appwrite/pull/10793) * Update GeoDB database in [#10890](https://github.com/appwrite/appwrite/pull/10890) -* Update to CLI 12.0.0 in [#10853](https://github.com/appwrite/appwrite/pull/10853) * Update Flutter default build runtime in [#10807](https://github.com/appwrite/appwrite/pull/10807) * Upgrade runtimes in [#10804](https://github.com/appwrite/appwrite/pull/10804) ### Fixes * Fix duplicate document error while creating file in [#10891](https://github.com/appwrite/appwrite/pull/10891) -* Fix invalid query in [#10888](https://github.com/appwrite/appwrite/pull/10888) +* Fix "Update external deployment (authorize)" throwing 500 error due to invalid query in [#10888](https://github.com/appwrite/appwrite/pull/10888) * Fix error setting user password in [#10889](https://github.com/appwrite/appwrite/pull/10889) -* Fix TOTP issues in [#10884](https://github.com/appwrite/appwrite/pull/10884) -* Fix wrong user type in [#10875](https://github.com/appwrite/appwrite/pull/10875) +* Fix error generating email MFA challenges in [#10884](https://github.com/appwrite/appwrite/pull/10884) * Fix file token expiry in [#10877](https://github.com/appwrite/appwrite/pull/10877) -* Fix limit and offset computation in [#10880](https://github.com/appwrite/appwrite/pull/10880) * Fix TanStack Nitro default in [#10860](https://github.com/appwrite/appwrite/pull/10860) * Fix TanStack builds in [#10767](https://github.com/appwrite/appwrite/pull/10767) -* Fix enum examples in [#10828](https://github.com/appwrite/appwrite/pull/10828) -* Fix missing nullable in [#10819](https://github.com/appwrite/appwrite/pull/10819) -* Fix response models multi-methods in [#10815](https://github.com/appwrite/appwrite/pull/10815) -* Fix nullable validation in [#10778](https://github.com/appwrite/appwrite/pull/10778) +* Fix missing nullable and nullable validation in [#10819](https://github.com/appwrite/appwrite/pull/10819) and [#10778](https://github.com/appwrite/appwrite/pull/10778) * Fix WebP library in [#10738](https://github.com/appwrite/appwrite/pull/10738) -* Fix upgrade utopia database in [#10812](https://github.com/appwrite/appwrite/pull/10812) -* Fix undefined variable in [#10654](https://github.com/appwrite/appwrite/pull/10654) -* Fix undefined sequence in [#10652](https://github.com/appwrite/appwrite/pull/10652) +* Fix batch writes in [#10812](https://github.com/appwrite/appwrite/pull/10812) * Fix error handler error in [#10719](https://github.com/appwrite/appwrite/pull/10719) * Fix Next 16 compatibility in [#10713](https://github.com/appwrite/appwrite/pull/10713) -* Fix description in [#10702](https://github.com/appwrite/appwrite/pull/10702) -* Fix warning in builds worker in [#10705](https://github.com/appwrite/appwrite/pull/10705) * Fix stats usage memory leak in [#10683](https://github.com/appwrite/appwrite/pull/10683) * Fix author URL in template deployments in [#10535](https://github.com/appwrite/appwrite/pull/10535) -* Fix auth refactor in [#10667](https://github.com/appwrite/appwrite/pull/10667) -* Fix sites create deployment in [#10566](https://github.com/appwrite/appwrite/pull/10566) -* Fix test dependencies projects in [#10655](https://github.com/appwrite/appwrite/pull/10655) -* Fix list sites test in [#10726](https://github.com/appwrite/appwrite/pull/10726) +* Fix VCS lock deletion in [#10691](https://github.com/appwrite/appwrite/pull/10691) ### Miscellaneous +* Add CSV export functionality in [#10546](https://github.com/appwrite/appwrite/pull/10546), [#10750](https://github.com/appwrite/appwrite/pull/10750), [#10813](https://github.com/appwrite/appwrite/pull/10813), and [#10847](https://github.com/appwrite/appwrite/pull/10847) +* Add screenshots endpoint in [#10675](https://github.com/appwrite/appwrite/pull/10675) +* Add screenshot endpoint stats in [#10706](https://github.com/appwrite/appwrite/pull/10706) +* Add users attributes in [#10688](https://github.com/appwrite/appwrite/pull/10688) +* Add max build duration environment variable in [#10674](https://github.com/appwrite/appwrite/pull/10674) +* Add custom realtime logger in [#10871](https://github.com/appwrite/appwrite/pull/10871) +* Add JWT disposition in [#10867](https://github.com/appwrite/appwrite/pull/10867) +* Add logs in [#10869](https://github.com/appwrite/appwrite/pull/10869) +* Auth refactor in [#10758](https://github.com/appwrite/appwrite/pull/10758), [#10837](https://github.com/appwrite/appwrite/pull/10837), [#10682](https://github.com/appwrite/appwrite/pull/10682), and [#10667](https://github.com/appwrite/appwrite/pull/10667) * Bump assistant to 0.8.4 in [#10887](https://github.com/appwrite/appwrite/pull/10887) * Bump database to 3.1.5 in [#10766](https://github.com/appwrite/appwrite/pull/10766) * Bump Utopia DNS in [#10761](https://github.com/appwrite/appwrite/pull/10761) @@ -68,9 +56,9 @@ * Update Apple Swift to 13.3.0 in [#10679](https://github.com/appwrite/appwrite/pull/10679) * Update Apple Swift in [#10663](https://github.com/appwrite/appwrite/pull/10663) * Update CLI to 10.2.2 in [#10672](https://github.com/appwrite/appwrite/pull/10672) +* Update to CLI 12.0.0 in [#10853](https://github.com/appwrite/appwrite/pull/10853) * Update docs examples to use Permission class in [#10707](https://github.com/appwrite/appwrite/pull/10707) * Update SDK examples docs in [#10855](https://github.com/appwrite/appwrite/pull/10855) -* Add logs in [#10869](https://github.com/appwrite/appwrite/pull/10869) * Release Python SDK in [#10762](https://github.com/appwrite/appwrite/pull/10762) * Release Flutter 20.3.2 in [#10838](https://github.com/appwrite/appwrite/pull/10838) * Release Flutter/Dart add screenshot examples in [#10811](https://github.com/appwrite/appwrite/pull/10811) @@ -94,10 +82,19 @@ * Config for environment in [#10833](https://github.com/appwrite/appwrite/pull/10833) * Format instance in [#10830](https://github.com/appwrite/appwrite/pull/10830) * Replace sleep in webhooks service in [#10656](https://github.com/appwrite/appwrite/pull/10656) -* Skip auth to delete VCS lock in [#10691](https://github.com/appwrite/appwrite/pull/10691) * Update email composer in [#10720](https://github.com/appwrite/appwrite/pull/10720) * Update facts on GitHub sites and functions in [#10593](https://github.com/appwrite/appwrite/pull/10593) and [#10771](https://github.com/appwrite/appwrite/pull/10771) -* Revert auth single instance refactor in [#10837](https://github.com/appwrite/appwrite/pull/10837) and [#10874](https://github.com/appwrite/appwrite/pull/10874) +* Fix wrong user type in [#10875](https://github.com/appwrite/appwrite/pull/10875) +* Fix limit and offset computation in [#10880](https://github.com/appwrite/appwrite/pull/10880) +* Fix enum examples in [#10828](https://github.com/appwrite/appwrite/pull/10828) +* Fix response models multi-methods in [#10815](https://github.com/appwrite/appwrite/pull/10815) +* Fix undefined variable in [#10654](https://github.com/appwrite/appwrite/pull/10654) +* Fix undefined sequence in [#10652](https://github.com/appwrite/appwrite/pull/10652) +* Fix description in [#10702](https://github.com/appwrite/appwrite/pull/10702) +* Fix warning in builds worker in [#10705](https://github.com/appwrite/appwrite/pull/10705) +* Fix sites create deployment in [#10566](https://github.com/appwrite/appwrite/pull/10566) +* Fix test dependencies projects in [#10655](https://github.com/appwrite/appwrite/pull/10655) +* Fix list sites test in [#10726](https://github.com/appwrite/appwrite/pull/10726) # Version 1.8.0 From 9f2105b2945828f86c940bf26f52b926b53c2614 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 5 Dec 2025 00:48:50 +0000 Subject: [PATCH 08/95] Address additional review feedback on CHANGES.md Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com> --- CHANGES.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 9a9eef6030..e6dd04b556 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -14,7 +14,6 @@ * Add disable count feature in [#10668](https://github.com/appwrite/appwrite/pull/10668) * Add ElevenLabs site template in [#10782](https://github.com/appwrite/appwrite/pull/10782) * Add suggested environment variables in [#10795](https://github.com/appwrite/appwrite/pull/10795) -* Improve MFA docs endpoint order in [#10793](https://github.com/appwrite/appwrite/pull/10793) * Update GeoDB database in [#10890](https://github.com/appwrite/appwrite/pull/10890) * Update Flutter default build runtime in [#10807](https://github.com/appwrite/appwrite/pull/10807) * Upgrade runtimes in [#10804](https://github.com/appwrite/appwrite/pull/10804) @@ -28,7 +27,7 @@ * Fix file token expiry in [#10877](https://github.com/appwrite/appwrite/pull/10877) * Fix TanStack Nitro default in [#10860](https://github.com/appwrite/appwrite/pull/10860) * Fix TanStack builds in [#10767](https://github.com/appwrite/appwrite/pull/10767) -* Fix missing nullable and nullable validation in [#10819](https://github.com/appwrite/appwrite/pull/10819) and [#10778](https://github.com/appwrite/appwrite/pull/10778) +* Fix nullable validation in [#10819](https://github.com/appwrite/appwrite/pull/10819) and [#10778](https://github.com/appwrite/appwrite/pull/10778) * Fix WebP library in [#10738](https://github.com/appwrite/appwrite/pull/10738) * Fix batch writes in [#10812](https://github.com/appwrite/appwrite/pull/10812) * Fix error handler error in [#10719](https://github.com/appwrite/appwrite/pull/10719) @@ -40,13 +39,14 @@ ### Miscellaneous * Add CSV export functionality in [#10546](https://github.com/appwrite/appwrite/pull/10546), [#10750](https://github.com/appwrite/appwrite/pull/10750), [#10813](https://github.com/appwrite/appwrite/pull/10813), and [#10847](https://github.com/appwrite/appwrite/pull/10847) +* Add JWT disposition in [#10867](https://github.com/appwrite/appwrite/pull/10867) * Add screenshots endpoint in [#10675](https://github.com/appwrite/appwrite/pull/10675) * Add screenshot endpoint stats in [#10706](https://github.com/appwrite/appwrite/pull/10706) * Add users attributes in [#10688](https://github.com/appwrite/appwrite/pull/10688) * Add max build duration environment variable in [#10674](https://github.com/appwrite/appwrite/pull/10674) * Add custom realtime logger in [#10871](https://github.com/appwrite/appwrite/pull/10871) -* Add JWT disposition in [#10867](https://github.com/appwrite/appwrite/pull/10867) * Add logs in [#10869](https://github.com/appwrite/appwrite/pull/10869) +* Improve MFA docs endpoint order in [#10793](https://github.com/appwrite/appwrite/pull/10793) * Auth refactor in [#10758](https://github.com/appwrite/appwrite/pull/10758), [#10837](https://github.com/appwrite/appwrite/pull/10837), [#10682](https://github.com/appwrite/appwrite/pull/10682), and [#10667](https://github.com/appwrite/appwrite/pull/10667) * Bump assistant to 0.8.4 in [#10887](https://github.com/appwrite/appwrite/pull/10887) * Bump database to 3.1.5 in [#10766](https://github.com/appwrite/appwrite/pull/10766) @@ -92,7 +92,7 @@ * Fix undefined sequence in [#10652](https://github.com/appwrite/appwrite/pull/10652) * Fix description in [#10702](https://github.com/appwrite/appwrite/pull/10702) * Fix warning in builds worker in [#10705](https://github.com/appwrite/appwrite/pull/10705) -* Fix sites create deployment in [#10566](https://github.com/appwrite/appwrite/pull/10566) +* Fix sites create deployment docs in [#10566](https://github.com/appwrite/appwrite/pull/10566) * Fix test dependencies projects in [#10655](https://github.com/appwrite/appwrite/pull/10655) * Fix list sites test in [#10726](https://github.com/appwrite/appwrite/pull/10726) From 944129551006ba4f2cc042716b78fc1889cc1d03 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 01:43:35 +0000 Subject: [PATCH 09/95] Feat: Audits upgrade --- app/controllers/api/messaging.php | 22 ++++++---- app/controllers/api/projects.php | 3 +- app/controllers/api/teams.php | 4 +- app/controllers/api/users.php | 4 +- app/http.php | 7 ++- app/init/resources.php | 11 ++++- composer.json | 6 +-- composer.lock | 43 +++++++++++-------- .../Collections/Documents/Logs/XList.php | 4 +- .../Http/Databases/Collections/Logs/XList.php | 12 +++--- .../Databases/Http/Databases/Logs/XList.php | 12 +++--- .../Databases/Http/TablesDB/Logs/XList.php | 12 +++--- src/Appwrite/Platform/Workers/Audits.php | 4 +- 13 files changed, 85 insertions(+), 59 deletions(-) diff --git a/app/controllers/api/messaging.php b/app/controllers/api/messaging.php index 771dd0e6a5..eed12c3376 100644 --- a/app/controllers/api/messaging.php +++ b/app/controllers/api/messaging.php @@ -1145,7 +1145,8 @@ App::get('/v1/messaging/providers/:providerId/logs') ->inject('dbForProject') ->inject('locale') ->inject('geodb') - ->action(function (string $providerId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) { + ->inject('audit') + ->action(function (string $providerId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit) { $provider = $dbForProject->getDocument('providers', $providerId); if ($provider->isEmpty()) { @@ -1158,9 +1159,12 @@ App::get('/v1/messaging/providers/:providerId/logs') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - $audit = new Audit($dbForProject); + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $resource = 'provider/' . $providerId; - $logs = $audit->getLogsByResource($resource, $queries); + $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); $output = []; foreach ($logs as $i => &$log) { @@ -2549,7 +2553,8 @@ App::get('/v1/messaging/topics/:topicId/logs') ->inject('dbForProject') ->inject('locale') ->inject('geodb') - ->action(function (string $topicId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) { + ->inject('audit') + ->action(function (string $topicId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit) { $topic = $dbForProject->getDocument('topics', $topicId); if ($topic->isEmpty()) { @@ -2562,7 +2567,6 @@ App::get('/v1/messaging/topics/:topicId/logs') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - $audit = new Audit($dbForProject); $resource = 'topic/' . $topicId; $logs = $audit->getLogsByResource($resource, $queries); @@ -2966,7 +2970,8 @@ App::get('/v1/messaging/subscribers/:subscriberId/logs') ->inject('dbForProject') ->inject('locale') ->inject('geodb') - ->action(function (string $subscriberId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) { + ->inject('audit') + ->action(function (string $subscriberId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit) { $subscriber = $dbForProject->getDocument('subscribers', $subscriberId); if ($subscriber->isEmpty()) { @@ -2979,7 +2984,6 @@ App::get('/v1/messaging/subscribers/:subscriberId/logs') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - $audit = new Audit($dbForProject); $resource = 'subscriber/' . $subscriberId; $logs = $audit->getLogsByResource($resource, $queries); @@ -3761,7 +3765,8 @@ App::get('/v1/messaging/messages/:messageId/logs') ->inject('dbForProject') ->inject('locale') ->inject('geodb') - ->action(function (string $messageId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) { + ->inject('audit') + ->action(function (string $messageId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit) { $message = $dbForProject->getDocument('messages', $messageId); if ($message->isEmpty()) { @@ -3774,7 +3779,6 @@ App::get('/v1/messaging/messages/:messageId/logs') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - $audit = new Audit($dbForProject); $resource = 'message/' . $messageId; $logs = $audit->getLogsByResource($resource, $queries); diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 37f7fdbc8b..364a7914b4 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -247,7 +247,8 @@ App::post('/v1/projects') } if ($create || $projectTables) { - $audit = new Audit($dbForProject); + $adapter = new \Utopia\Audit\Adapters\Database($dbForProject); + $audit = new Audit($adapter); $audit->setup(); } diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 5f45c38fed..04a43577ad 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -1464,7 +1464,8 @@ App::get('/v1/teams/:teamId/logs') ->inject('dbForProject') ->inject('locale') ->inject('geodb') - ->action(function (string $teamId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) { + ->inject('audit') + ->action(function (string $teamId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit) { $team = $dbForProject->getDocument('teams', $teamId); @@ -1478,7 +1479,6 @@ App::get('/v1/teams/:teamId/logs') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - $audit = new Audit($dbForProject); $resource = 'team/' . $team->getId(); $logs = $audit->getLogsByResource($resource, $queries); diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index e49b0631d3..161b5a3298 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -945,7 +945,8 @@ App::get('/v1/users/:userId/logs') ->inject('dbForProject') ->inject('locale') ->inject('geodb') - ->action(function (string $userId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) { + ->inject('audit') + ->action(function (string $userId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit) { $user = $dbForProject->getDocument('users', $userId); @@ -958,7 +959,6 @@ App::get('/v1/users/:userId/logs') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - $audit = new Audit($dbForProject); $logs = $audit->getLogsByUser($user->getSequence(), $queries); $output = []; foreach ($logs as $i => &$log) { diff --git a/app/http.php b/app/http.php index 1bd3e97e69..5bee2c1309 100644 --- a/app/http.php +++ b/app/http.php @@ -12,6 +12,7 @@ use Swoole\Process; use Swoole\Table; use Swoole\Timer; use Utopia\App; +use Utopia\Audit\Adapter\Database as AdapterDatabase; use Utopia\Audit\Audit; use Utopia\CLI\Console; use Utopia\Compression\Compression; @@ -261,7 +262,8 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg // create appwrite database, `dbForPlatform` is a direct access call. createDatabase($app, 'dbForPlatform', 'appwrite', $collections['console'], $pools, function (Database $dbForPlatform) use ($collections) { if ($dbForPlatform->getCollection(Audit::COLLECTION)->isEmpty()) { - $audit = new Audit($dbForPlatform); + $adapter = new AdapterDatabase($dbForPlatform); + $audit = new Audit($adapter); $audit->setup(); } @@ -390,7 +392,8 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg } if ($dbForProject->getCollection(Audit::COLLECTION)->isEmpty()) { - $audit = new Audit($dbForProject); + $adapter = new AdapterDatabase($dbForProject); + $audit = new Audit($adapter); $audit->setup(); } diff --git a/app/init/resources.php b/app/init/resources.php index 6351dae478..ba525091b6 100644 --- a/app/init/resources.php +++ b/app/init/resources.php @@ -4,7 +4,7 @@ use Ahc\Jwt\JWT; use Ahc\Jwt\JWTException; use Appwrite\Auth\Key; use Appwrite\Databases\TransactionState; -use Appwrite\Event\Audit; +use Appwrite\Event\Audit as AuditEvent; use Appwrite\Event\Build; use Appwrite\Event\Certificate; use Appwrite\Event\Database as EventDatabase; @@ -30,6 +30,8 @@ use Appwrite\Utopia\Response; use Executor\Executor; use Utopia\Abuse\Adapters\TimeLimit\Redis as TimeLimitRedis; use Utopia\App; +use Utopia\Audit\Adapter\Database as AdapterDatabase; +use Utopia\Audit\Audit; use Utopia\Auth\Hashes\Argon2; use Utopia\Auth\Hashes\Sha; use Utopia\Auth\Proofs\Code; @@ -146,7 +148,7 @@ App::setResource('queueForStatsUsage', function (Publisher $publisher) { return new StatsUsage($publisher); }, ['publisher']); App::setResource('queueForAudits', function (Publisher $publisher) { - return new Audit($publisher); + return new AuditEvent($publisher); }, ['publisher']); App::setResource('queueForFunctions', function (Publisher $publisher) { return new Func($publisher); @@ -652,6 +654,11 @@ App::setResource('getLogsDB', function (Group $pools, Cache $cache) { }; }, ['pools', 'cache']); +App::setResource('audit', function ($dbForProject) { + $adapter = new AdapterDatabase($dbForProject); + return new Audit($adapter); +}, ['dbForProject']); + App::setResource('telemetry', fn () => new NoTelemetry()); App::setResource('cache', function (Group $pools, Telemetry $telemetry) { diff --git a/composer.json b/composer.json index d32b739311..e00d5832cb 100644 --- a/composer.json +++ b/composer.json @@ -47,12 +47,12 @@ "appwrite/php-clamav": "2.0.*", "utopia-php/abuse": "1.*", "utopia-php/analytics": "0.10.*", - "utopia-php/audit": "1.*", + "utopia-php/audit": "2.*", "utopia-php/auth": "0.5.*", "utopia-php/cache": "0.13.*", "utopia-php/cli": "0.15.*", "utopia-php/config": "1.*.*", - "utopia-php/database": "3.*", + "utopia-php/database": "3.5.0 as 4.0.0", "utopia-php/detector": "0.2.*", "utopia-php/domains": "0.9.*", "utopia-php/emails": "0.6.*", @@ -109,4 +109,4 @@ "tbachert/spi": true } } -} +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index 47a32cf774..f1ab2dc20d 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7c9cb03eb5267f1e7a3ffc037ae22b6a", + "content-hash": "bdc28f33867a1e231528daa7dc812702", "packages": [ { "name": "adhocore/jwt", @@ -3552,21 +3552,23 @@ }, { "name": "utopia-php/audit", - "version": "1.0.2", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/utopia-php/audit.git", - "reference": "8c17065c2473d4ca799f65585ca74eb53e1be211" + "reference": "bac717c6096594eed3949a7d47b87700e7573c8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/audit/zipball/8c17065c2473d4ca799f65585ca74eb53e1be211", - "reference": "8c17065c2473d4ca799f65585ca74eb53e1be211", + "url": "https://api.github.com/repos/utopia-php/audit/zipball/bac717c6096594eed3949a7d47b87700e7573c8b", + "reference": "bac717c6096594eed3949a7d47b87700e7573c8b", "shasum": "" }, "require": { "php": ">=8.0", - "utopia-php/database": "*" + "utopia-php/database": "4.*", + "utopia-php/fetch": "^0.4.2", + "utopia-php/validators": "^0.1.0" }, "require-dev": { "laravel/pint": "1.*", @@ -3593,9 +3595,9 @@ ], "support": { "issues": "https://github.com/utopia-php/audit/issues", - "source": "https://github.com/utopia-php/audit/tree/1.0.2" + "source": "https://github.com/utopia-php/audit/tree/2.0.0" }, - "time": "2025-10-20T07:14:26+00:00" + "time": "2025-12-13T23:17:26+00:00" }, { "name": "utopia-php/auth", @@ -4264,16 +4266,16 @@ }, { "name": "utopia-php/framework", - "version": "0.33.34", + "version": "0.33.35", "source": { "type": "git", "url": "https://github.com/utopia-php/http.git", - "reference": "76def92594c32504ec80eaacdb60ff8fad73c856" + "reference": "82b139fb04f30045db51b0d322224f222da32313" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/http/zipball/76def92594c32504ec80eaacdb60ff8fad73c856", - "reference": "76def92594c32504ec80eaacdb60ff8fad73c856", + "url": "https://api.github.com/repos/utopia-php/http/zipball/82b139fb04f30045db51b0d322224f222da32313", + "reference": "82b139fb04f30045db51b0d322224f222da32313", "shasum": "" }, "require": { @@ -4306,9 +4308,9 @@ ], "support": { "issues": "https://github.com/utopia-php/http/issues", - "source": "https://github.com/utopia-php/http/tree/0.33.34" + "source": "https://github.com/utopia-php/http/tree/0.33.35" }, - "time": "2025-12-08T07:55:31+00:00" + "time": "2025-12-12T08:33:52+00:00" }, { "name": "utopia-php/image", @@ -8941,9 +8943,16 @@ "time": "2024-03-07T20:33:40+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "utopia-php/database", + "version": "3.5.0.0", + "alias": "4.0.0", + "alias_normalized": "4.0.0.0" + } + ], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -8967,5 +8976,5 @@ "platform-overrides": { "php": "8.3" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php index 47f5247831..292bed4c36 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php @@ -72,10 +72,11 @@ class XList extends Action ->inject('dbForProject') ->inject('locale') ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } - public function action(string $databaseId, string $collectionId, string $documentId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb): void + public function action(string $databaseId, string $collectionId, string $documentId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit): void { $database = Authorization::skip(fn () => $dbForProject->getDocument('databases', $databaseId)); if ($database->isEmpty()) { @@ -98,7 +99,6 @@ class XList extends Action throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - $audit = new Audit($dbForProject); $type = $this->getCollectionsEventsContext(); $context = $this->getContext(); $resource = "database/$databaseId/$type/$collectionId/$context/{$document->getId()}"; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php index a45daa32a4..2244bfd2d7 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php @@ -67,14 +67,15 @@ class XList extends Action ->param('databaseId', '', new UID(), 'Database ID.') ->param('collectionId', '', new UID(), 'Collection ID.') ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('response') - ->inject('dbForProject') - ->inject('locale') - ->inject('geodb') + ->inject('response') + ->inject('dbForProject') + ->inject('locale') + ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } - public function action(string $databaseId, string $collectionId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb): void + public function action(string $databaseId, string $collectionId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit): void { $database = Authorization::skip(fn () => $dbForProject->getDocument('databases', $databaseId)); @@ -95,7 +96,6 @@ class XList extends Action throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - $audit = new Audit($dbForProject); $context = $this->getContext(); $resource = "database/$databaseId/$context/$collectionId"; $logs = $audit->getLogsByResource($resource, $queries); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php index a794ec325e..42081127d5 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php @@ -63,14 +63,15 @@ class XList extends Action ]) ->param('databaseId', '', new UID(), 'Database ID.') ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('response') - ->inject('dbForProject') - ->inject('locale') - ->inject('geodb') + ->inject('response') + ->inject('dbForProject') + ->inject('locale') + ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } - public function action(string $databaseId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb): void + public function action(string $databaseId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit): void { $database = $dbForProject->getDocument('databases', $databaseId); @@ -84,7 +85,6 @@ class XList extends Action throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - $audit = new Audit($dbForProject); $resource = 'database/' . $databaseId; $logs = $audit->getLogsByResource($resource, $queries); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php index 53476dbae1..ed2aaa848c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php @@ -58,14 +58,15 @@ class XList extends Action ]) ->param('databaseId', '', new UID(), 'Database ID.') ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('response') - ->inject('dbForProject') - ->inject('locale') - ->inject('geodb') + ->inject('response') + ->inject('dbForProject') + ->inject('locale') + ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } - public function action(string $databaseId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb): void + public function action(string $databaseId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit): void { $database = $dbForProject->getDocument('databases', $databaseId); @@ -79,7 +80,6 @@ class XList extends Action throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - $audit = new Audit($dbForProject); $resource = 'database/' . $databaseId; $logs = $audit->getLogsByResource($resource, $queries); diff --git a/src/Appwrite/Platform/Workers/Audits.php b/src/Appwrite/Platform/Workers/Audits.php index be542e7811..2f0364e408 100644 --- a/src/Appwrite/Platform/Workers/Audits.php +++ b/src/Appwrite/Platform/Workers/Audits.php @@ -5,6 +5,7 @@ namespace Appwrite\Platform\Workers; use Exception; use Throwable; use Utopia\Audit\Audit; +use Utopia\Audit\Adapters\Database as AdapterDatabase; use Utopia\CLI\Console; use Utopia\Database\Document; use Utopia\Database\Exception\Authorization; @@ -136,7 +137,8 @@ class Audits extends Action $projectDocument = $projectLogs['project']; $dbForProject = $getProjectDB($projectDocument); - $audit = new Audit($dbForProject); + $adapter = new AdapterDatabase($dbForProject); + $audit = new Audit($adapter); $audit->logBatch($projectLogs['logs']); Console::success('Audit logs processed successfully'); From c50db111d61305080bf65364a2d8b237931d4080 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 02:19:53 +0000 Subject: [PATCH 10/95] format --- .../Platform/Modules/Databases/Http/Databases/Logs/XList.php | 2 +- src/Appwrite/Platform/Workers/Audits.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php index 42081127d5..be30a0fad8 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php @@ -71,7 +71,7 @@ class XList extends Action ->callback($this->action(...)); } - public function action(string $databaseId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit): void + public function action(string $databaseId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit): void { $database = $dbForProject->getDocument('databases', $databaseId); diff --git a/src/Appwrite/Platform/Workers/Audits.php b/src/Appwrite/Platform/Workers/Audits.php index 2f0364e408..369a67116d 100644 --- a/src/Appwrite/Platform/Workers/Audits.php +++ b/src/Appwrite/Platform/Workers/Audits.php @@ -4,8 +4,8 @@ namespace Appwrite\Platform\Workers; use Exception; use Throwable; -use Utopia\Audit\Audit; use Utopia\Audit\Adapters\Database as AdapterDatabase; +use Utopia\Audit\Audit; use Utopia\CLI\Console; use Utopia\Database\Document; use Utopia\Database\Exception\Authorization; From a0599d26582141f6b034748b21a64723aa7e9890 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 02:31:24 +0000 Subject: [PATCH 11/95] Upgrade audit --- composer.json | 4 ++-- composer.lock | 41 ++++++++++++++++++----------------------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/composer.json b/composer.json index e00d5832cb..be88d8ae5e 100644 --- a/composer.json +++ b/composer.json @@ -47,12 +47,12 @@ "appwrite/php-clamav": "2.0.*", "utopia-php/abuse": "1.*", "utopia-php/analytics": "0.10.*", - "utopia-php/audit": "2.*", + "utopia-php/audit": "dev-feat-db-3.x", "utopia-php/auth": "0.5.*", "utopia-php/cache": "0.13.*", "utopia-php/cli": "0.15.*", "utopia-php/config": "1.*.*", - "utopia-php/database": "3.5.0 as 4.0.0", + "utopia-php/database": "3.*.*", "utopia-php/detector": "0.2.*", "utopia-php/domains": "0.9.*", "utopia-php/emails": "0.6.*", diff --git a/composer.lock b/composer.lock index f1ab2dc20d..3e6b49307f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bdc28f33867a1e231528daa7dc812702", + "content-hash": "d26b9cee30ab2cc3bc5873ac911918d1", "packages": [ { "name": "adhocore/jwt", @@ -3552,21 +3552,21 @@ }, { "name": "utopia-php/audit", - "version": "2.0.0", + "version": "dev-feat-db-3.x", "source": { "type": "git", "url": "https://github.com/utopia-php/audit.git", - "reference": "bac717c6096594eed3949a7d47b87700e7573c8b" + "reference": "5b5a5440eb37ee6c6b7fc717868e6965b19c003f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/audit/zipball/bac717c6096594eed3949a7d47b87700e7573c8b", - "reference": "bac717c6096594eed3949a7d47b87700e7573c8b", + "url": "https://api.github.com/repos/utopia-php/audit/zipball/5b5a5440eb37ee6c6b7fc717868e6965b19c003f", + "reference": "5b5a5440eb37ee6c6b7fc717868e6965b19c003f", "shasum": "" }, "require": { "php": ">=8.0", - "utopia-php/database": "4.*", + "utopia-php/database": "3.*", "utopia-php/fetch": "^0.4.2", "utopia-php/validators": "^0.1.0" }, @@ -3595,9 +3595,9 @@ ], "support": { "issues": "https://github.com/utopia-php/audit/issues", - "source": "https://github.com/utopia-php/audit/tree/2.0.0" + "source": "https://github.com/utopia-php/audit/tree/feat-db-3.x" }, - "time": "2025-12-13T23:17:26+00:00" + "time": "2025-12-14T02:29:51+00:00" }, { "name": "utopia-php/auth", @@ -3898,16 +3898,16 @@ }, { "name": "utopia-php/database", - "version": "3.5.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "5da71b65a6123ce2e78795522b05b7458aabfbd7" + "reference": "af15066255a5fd7bd2926de37bcbf3d8500fc155" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/5da71b65a6123ce2e78795522b05b7458aabfbd7", - "reference": "5da71b65a6123ce2e78795522b05b7458aabfbd7", + "url": "https://api.github.com/repos/utopia-php/database/zipball/af15066255a5fd7bd2926de37bcbf3d8500fc155", + "reference": "af15066255a5fd7bd2926de37bcbf3d8500fc155", "shasum": "" }, "require": { @@ -3950,9 +3950,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/3.5.0" + "source": "https://github.com/utopia-php/database/tree/3.6.0" }, - "time": "2025-11-18T08:11:01+00:00" + "time": "2025-12-08T05:23:04+00:00" }, { "name": "utopia-php/detector", @@ -8943,16 +8943,11 @@ "time": "2024-03-07T20:33:40+00:00" } ], - "aliases": [ - { - "package": "utopia-php/database", - "version": "3.5.0.0", - "alias": "4.0.0", - "alias_normalized": "4.0.0.0" - } - ], + "aliases": [], "minimum-stability": "stable", - "stability-flags": {}, + "stability-flags": { + "utopia-php/audit": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { From 30083598c6df64cc0ec41a7c1d4ba51615346c15 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 02:33:17 +0000 Subject: [PATCH 12/95] fix audit --- app/http.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/http.php b/app/http.php index 5bee2c1309..cedfcdf1f3 100644 --- a/app/http.php +++ b/app/http.php @@ -13,6 +13,7 @@ use Swoole\Table; use Swoole\Timer; use Utopia\App; use Utopia\Audit\Adapter\Database as AdapterDatabase; +use Utopia\Audit\Adapter\SQL as AuditAdapterSQL; use Utopia\Audit\Audit; use Utopia\CLI\Console; use Utopia\Compression\Compression; @@ -261,7 +262,7 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg // create appwrite database, `dbForPlatform` is a direct access call. createDatabase($app, 'dbForPlatform', 'appwrite', $collections['console'], $pools, function (Database $dbForPlatform) use ($collections) { - if ($dbForPlatform->getCollection(Audit::COLLECTION)->isEmpty()) { + if ($dbForPlatform->getCollection(SQL::COLLECTION)->isEmpty()) { $adapter = new AdapterDatabase($dbForPlatform); $audit = new Audit($adapter); $audit->setup(); @@ -391,7 +392,7 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg Console::success('[Setup] - Skip: metadata table already exists'); } - if ($dbForProject->getCollection(Audit::COLLECTION)->isEmpty()) { + if ($dbForProject->getCollection(AuditAdapterSQL::COLLECTION)->isEmpty()) { $adapter = new AdapterDatabase($dbForProject); $audit = new Audit($adapter); $audit->setup(); From 2dcb1317786732a6fe8a61ea2a73aeb7d4c32af3 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 02:34:33 +0000 Subject: [PATCH 13/95] fix collection name --- app/http.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/http.php b/app/http.php index cedfcdf1f3..b7f857da48 100644 --- a/app/http.php +++ b/app/http.php @@ -262,7 +262,7 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg // create appwrite database, `dbForPlatform` is a direct access call. createDatabase($app, 'dbForPlatform', 'appwrite', $collections['console'], $pools, function (Database $dbForPlatform) use ($collections) { - if ($dbForPlatform->getCollection(SQL::COLLECTION)->isEmpty()) { + if ($dbForPlatform->getCollection(AuditAdapterSQL::COLLECTION)->isEmpty()) { $adapter = new AdapterDatabase($dbForPlatform); $audit = new Audit($adapter); $audit->setup(); From b83125a41ec806321a26ade27a8e6a195f5d5575 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 07:22:39 +0000 Subject: [PATCH 14/95] Fix audits creation --- app/controllers/api/projects.php | 8 +++++--- composer.lock | 22 +++++++++++----------- src/Appwrite/Platform/Workers/Deletes.php | 6 +++--- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 364a7914b4..ed6fa20eba 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -21,6 +21,7 @@ use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use PHPMailer\PHPMailer\PHPMailer; use Utopia\App; +use Utopia\Audit\Adapter\Database as AdapterDatabase; use Utopia\Audit\Audit; use Utopia\Cache\Cache; use Utopia\Config\Config; @@ -247,14 +248,15 @@ App::post('/v1/projects') } if ($create || $projectTables) { - $adapter = new \Utopia\Audit\Adapters\Database($dbForProject); + $adapter = new AdapterDatabase($dbForProject); $audit = new Audit($adapter); $audit->setup(); } if (!$create && $sharedTablesV1) { - $attributes = \array_map(fn ($attribute) => new Document($attribute), Audit::ATTRIBUTES); - $indexes = \array_map(fn (array $index) => new Document($index), Audit::INDEXES); + $adapter = new AdapterDatabase($dbForProject); + $attributes = $adapter->getAttributeDocuments(); + $indexes = $adapter->getIndexDocuments(); $dbForProject->createDocument(Database::METADATA, new Document([ '$id' => ID::custom('audit'), '$permissions' => [Permission::create(Role::any())], diff --git a/composer.lock b/composer.lock index 3e6b49307f..279ad2427b 100644 --- a/composer.lock +++ b/composer.lock @@ -2453,20 +2453,20 @@ }, { "name": "ramsey/uuid", - "version": "4.9.1", + "version": "4.9.2", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440" + "reference": "8429c78ca35a09f27565311b98101e2826affde0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/81f941f6f729b1e3ceea61d9d014f8b6c6800440", - "reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0", + "reference": "8429c78ca35a09f27565311b98101e2826affde0", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", + "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" }, @@ -2525,9 +2525,9 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.9.1" + "source": "https://github.com/ramsey/uuid/tree/4.9.2" }, - "time": "2025-09-04T20:59:21+00:00" + "time": "2025-12-14T04:43:48+00:00" }, { "name": "spomky-labs/otphp", @@ -3556,12 +3556,12 @@ "source": { "type": "git", "url": "https://github.com/utopia-php/audit.git", - "reference": "5b5a5440eb37ee6c6b7fc717868e6965b19c003f" + "reference": "bea15e59f63d1b0fceabf53bf73bed3962d176d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/audit/zipball/5b5a5440eb37ee6c6b7fc717868e6965b19c003f", - "reference": "5b5a5440eb37ee6c6b7fc717868e6965b19c003f", + "url": "https://api.github.com/repos/utopia-php/audit/zipball/bea15e59f63d1b0fceabf53bf73bed3962d176d5", + "reference": "bea15e59f63d1b0fceabf53bf73bed3962d176d5", "shasum": "" }, "require": { @@ -3597,7 +3597,7 @@ "issues": "https://github.com/utopia-php/audit/issues", "source": "https://github.com/utopia-php/audit/tree/feat-db-3.x" }, - "time": "2025-12-14T02:29:51+00:00" + "time": "2025-12-14T06:56:09+00:00" }, { "name": "utopia-php/auth", diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 38624367c9..40e8d45153 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -9,7 +9,7 @@ use Appwrite\Extend\Exception; use Executor\Executor; use Throwable; use Utopia\Abuse\Adapters\TimeLimit\Database as AbuseDatabase; -use Utopia\Audit\Audit; +use Utopia\Audit\Adapter\SQL; use Utopia\Cache\Adapter\Filesystem; use Utopia\Cache\Cache; use Utopia\CLI\Console; @@ -517,7 +517,7 @@ class Deletes extends Action $projectCollectionIds = [ ...\array_keys(Config::getParam('collections', [])['projects']), - Audit::COLLECTION, + SQL::COLLECTION, AbuseDatabase::COLLECTION, ]; @@ -786,7 +786,7 @@ class Deletes extends Action $dbForProject = $getProjectDB($project); try { - $this->deleteByGroup(Audit::COLLECTION, [ + $this->deleteByGroup(SQL::COLLECTION, [ Query::select([...$this->selects, 'time']), Query::lessThan('time', $auditRetention), Query::orderDesc('time'), From 5678860d1358e993126c78baaaa82758f110a676 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 14 Dec 2025 13:07:26 +0530 Subject: [PATCH 15/95] add: optional support for assistant. --- app/views/install/compose.phtml | 3 +++ src/Appwrite/Platform/Tasks/Install.php | 36 ++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/app/views/install/compose.phtml b/app/views/install/compose.phtml index 34e0aee1ae..2f77d1d0c7 100644 --- a/app/views/install/compose.phtml +++ b/app/views/install/compose.phtml @@ -11,6 +11,7 @@ $httpsPort = $this->getParam('httpsPort', ''); $version = $this->getParam('version', ''); $organization = $this->getParam('organization', ''); $image = $this->getParam('image', ''); +$enableAssistant = $this->getParam('enableAssistant', false); ?>services: traefik: image: traefik:2.11 @@ -848,6 +849,7 @@ $image = $this->getParam('image', ''); - _APP_DB_USER - _APP_DB_PASS + appwrite-assistant: image: appwrite/assistant:0.8.4 container_name: appwrite-assistant @@ -857,6 +859,7 @@ $image = $this->getParam('image', ''); - appwrite environment: - _APP_ASSISTANT_OPENAI_API_KEY + appwrite-browser: image: appwrite/browser:0.3.2 diff --git a/src/Appwrite/Platform/Tasks/Install.php b/src/Appwrite/Platform/Tasks/Install.php index b210a020b9..1173a8ce27 100644 --- a/src/Appwrite/Platform/Tasks/Install.php +++ b/src/Appwrite/Platform/Tasks/Install.php @@ -148,11 +148,44 @@ class Install extends Action $httpsPort = ($httpsPort) ? $httpsPort : $defaultHTTPSPort; } + $enableAssistant = false; + if ($interactive == 'Y' && Console::isInteractive()) { + $answer = Console::confirm('Add Appwrite Assistant? (Y/n)'); + $enableAssistant = !empty($answer) && \strtolower($answer) === 'y'; + } + $input = []; $password = new Password(); $token = new Token(); foreach ($vars as $var) { + if ($var['name'] === '_APP_ASSISTANT_OPENAI_API_KEY') { + if (!$enableAssistant) { + $input[$var['name']] = ''; + continue; + } + + // key already exists + if (!empty($var['default'])) { + $input[$var['name']] = $var['default']; + continue; + } + + // if assistant enabled and no key, ask for it + if (Console::isInteractive() && $interactive === 'Y') { + $input[$var['name']] = Console::confirm('Enter your OpenAI API key for Appwrite Assistant:'); + if (empty($input[$var['name']])) { + Console::warning('No API key provided. Assistant will be disabled.'); + $enableAssistant = false; + $input[$var['name']] = ''; + } + continue; + } + + $input[$var['name']] = ''; + continue; + } + if (!empty($var['filter']) && ($interactive !== 'Y' || !Console::isInteractive())) { if ($data && $var['default'] !== null) { $input[$var['name']] = $var['default']; @@ -199,7 +232,8 @@ class Install extends Action ->setParam('httpsPort', $httpsPort) ->setParam('version', APP_VERSION_STABLE) ->setParam('organization', $organization) - ->setParam('image', $image); + ->setParam('image', $image) + ->setParam('enableAssistant', $enableAssistant); $templateForEnv->setParam('vars', $input); From f270e47b48ba7450bdf0c6d6f2e8ca40a89cea85 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 07:50:21 +0000 Subject: [PATCH 16/95] more fixes to audit queries --- app/controllers/api/account.php | 10 +++++---- app/controllers/api/messaging.php | 22 ++++++++++++++----- app/controllers/api/teams.php | 7 ++++-- .../Collections/Documents/Logs/XList.php | 7 ++++-- .../Http/Databases/Collections/Logs/XList.php | 17 ++++++++------ .../Databases/Http/Databases/Logs/XList.php | 17 ++++++++------ .../Databases/Http/TablesDB/Logs/XList.php | 17 ++++++++------ 7 files changed, 62 insertions(+), 35 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index ada4a98de9..df1c6a35aa 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -2972,7 +2972,8 @@ App::get('/v1/account/logs') ->inject('locale') ->inject('geodb') ->inject('dbForProject') - ->action(function (array $queries, bool $includeTotal, Response $response, Document $user, Locale $locale, Reader $geodb, Database $dbForProject) { + ->inject('audit') + ->action(function (array $queries, bool $includeTotal, Response $response, Document $user, Locale $locale, Reader $geodb, Database $dbForProject, Audit $audit) { try { $queries = Query::parseQueries($queries); @@ -2980,9 +2981,10 @@ App::get('/v1/account/logs') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - $audit = new EventAudit($dbForProject); - - $logs = $audit->getLogsByUser($user->getSequence(), $queries); + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $logs = $audit->getLogsByUser($user->getSequence(), offset: $offset, limit: $limit); $output = []; diff --git a/app/controllers/api/messaging.php b/app/controllers/api/messaging.php index eed12c3376..72abce087b 100644 --- a/app/controllers/api/messaging.php +++ b/app/controllers/api/messaging.php @@ -1211,7 +1211,7 @@ App::get('/v1/messaging/providers/:providerId/logs') } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource, $filterQueries) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); @@ -2568,7 +2568,10 @@ App::get('/v1/messaging/topics/:topicId/logs') } $resource = 'topic/' . $topicId; - $logs = $audit->getLogsByResource($resource, $queries); + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); $output = []; @@ -2616,7 +2619,7 @@ App::get('/v1/messaging/topics/:topicId/logs') } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); @@ -2985,7 +2988,10 @@ App::get('/v1/messaging/subscribers/:subscriberId/logs') } $resource = 'subscriber/' . $subscriberId; - $logs = $audit->getLogsByResource($resource, $queries); + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); $output = []; @@ -3033,7 +3039,7 @@ App::get('/v1/messaging/subscribers/:subscriberId/logs') } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); @@ -3780,7 +3786,11 @@ App::get('/v1/messaging/messages/:messageId/logs') } $resource = 'message/' . $messageId; - $logs = $audit->getLogsByResource($resource, $queries); + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $filterQueries = $grouped['filters'] ?? []; + $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); $output = []; diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 04a43577ad..cc35f0d264 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -1480,7 +1480,10 @@ App::get('/v1/teams/:teamId/logs') } $resource = 'team/' . $team->getId(); - $logs = $audit->getLogsByResource($resource, $queries); + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); $output = []; @@ -1527,7 +1530,7 @@ App::get('/v1/teams/:teamId/logs') } } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php index 292bed4c36..e0b595ebd1 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php @@ -103,7 +103,10 @@ class XList extends Action $context = $this->getContext(); $resource = "database/$databaseId/$type/$collectionId/$context/{$document->getId()}"; - $logs = $audit->getLogsByResource($resource, $queries); + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); $output = []; @@ -152,7 +155,7 @@ class XList extends Action $response->dynamic(new Document([ 'logs' => $output, - 'total' => $audit->countLogsByResource($resource, $queries), + 'total' => $audit->countLogsByResource($resource), ]), $this->getResponseModel()); } } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php index 2244bfd2d7..73c615697a 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php @@ -67,11 +67,11 @@ class XList extends Action ->param('databaseId', '', new UID(), 'Database ID.') ->param('collectionId', '', new UID(), 'Collection ID.') ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('response') - ->inject('dbForProject') - ->inject('locale') - ->inject('geodb') - ->inject('audit') + ->inject('response') + ->inject('dbForProject') + ->inject('locale') + ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } @@ -98,7 +98,10 @@ class XList extends Action $context = $this->getContext(); $resource = "database/$databaseId/$context/$collectionId"; - $logs = $audit->getLogsByResource($resource, $queries); + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); $output = []; @@ -147,7 +150,7 @@ class XList extends Action $response->dynamic(new Document([ 'logs' => $output, - 'total' => $audit->countLogsByResource($resource, $queries), + 'total' => $audit->countLogsByResource($resource), ]), $this->getResponseModel()); } } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php index be30a0fad8..1d828977c4 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php @@ -63,11 +63,11 @@ class XList extends Action ]) ->param('databaseId', '', new UID(), 'Database ID.') ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('response') - ->inject('dbForProject') - ->inject('locale') - ->inject('geodb') - ->inject('audit') + ->inject('response') + ->inject('dbForProject') + ->inject('locale') + ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } @@ -86,7 +86,10 @@ class XList extends Action } $resource = 'database/' . $databaseId; - $logs = $audit->getLogsByResource($resource, $queries); + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); $output = []; @@ -133,7 +136,7 @@ class XList extends Action } $response->dynamic(new Document([ - 'total' => $audit->countLogsByResource($resource, $queries), + 'total' => $audit->countLogsByResource($resource), 'logs' => $output, ]), UtopiaResponse::MODEL_LOG_LIST); } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php index ed2aaa848c..b37d38dfe1 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php @@ -58,11 +58,11 @@ class XList extends Action ]) ->param('databaseId', '', new UID(), 'Database ID.') ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('response') - ->inject('dbForProject') - ->inject('locale') - ->inject('geodb') - ->inject('audit') + ->inject('response') + ->inject('dbForProject') + ->inject('locale') + ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } @@ -81,7 +81,10 @@ class XList extends Action } $resource = 'database/' . $databaseId; - $logs = $audit->getLogsByResource($resource, $queries); + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); $output = []; @@ -128,7 +131,7 @@ class XList extends Action } $response->dynamic(new Document([ - 'total' => $audit->countLogsByResource($resource, $queries), + 'total' => $audit->countLogsByResource($resource), 'logs' => $output, ]), UtopiaResponse::MODEL_LOG_LIST); } From 1199c1fc5240328b0305d8bd35d14acd7267596d Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 07:57:37 +0000 Subject: [PATCH 17/95] fix typo --- src/Appwrite/Platform/Workers/Audits.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Workers/Audits.php b/src/Appwrite/Platform/Workers/Audits.php index 369a67116d..c64591632d 100644 --- a/src/Appwrite/Platform/Workers/Audits.php +++ b/src/Appwrite/Platform/Workers/Audits.php @@ -4,7 +4,7 @@ namespace Appwrite\Platform\Workers; use Exception; use Throwable; -use Utopia\Audit\Adapters\Database as AdapterDatabase; +use Utopia\Audit\Adapter\Database as AdapterDatabase; use Utopia\Audit\Audit; use Utopia\CLI\Console; use Utopia\Database\Document; From 667285d53606df7b879016a8b1478005b918a4bc Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 07:58:16 +0000 Subject: [PATCH 18/95] fix tyupe --- app/controllers/api/account.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index df1c6a35aa..62bc4231b6 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -37,7 +37,7 @@ use libphonenumber\PhoneNumberUtil; use MaxMind\Db\Reader; use Utopia\Abuse\Abuse; use Utopia\App; -use Utopia\Audit\Audit as EventAudit; +use Utopia\Audit\Audit; use Utopia\Auth\Hashes\Sha; use Utopia\Auth\Proofs\Code as ProofsCode; use Utopia\Auth\Proofs\Password as ProofsPassword; From 2043470bd01936d8d2c4df14c3dc352e8b661908 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 08:00:31 +0000 Subject: [PATCH 19/95] fix typo --- app/controllers/api/account.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 62bc4231b6..c40c374c91 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -3013,7 +3013,7 @@ App::get('/v1/account/logs') } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByUser($user->getSequence(), $queries) : 0, + 'total' => $includeTotal ? $audit->countLogsByUser($user->getSequence()) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); From 2437d2be779c3176dc23d1301fc7f560f0d1e4a0 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 08:30:22 +0000 Subject: [PATCH 20/95] Upgrade audit and fix --- composer.lock | 8 ++++---- src/Appwrite/Platform/Workers/Audits.php | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index 279ad2427b..e0633c82dc 100644 --- a/composer.lock +++ b/composer.lock @@ -3556,12 +3556,12 @@ "source": { "type": "git", "url": "https://github.com/utopia-php/audit.git", - "reference": "bea15e59f63d1b0fceabf53bf73bed3962d176d5" + "reference": "a83dec21b3b9b7fc85fd8cf92563b2fd174a39cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/audit/zipball/bea15e59f63d1b0fceabf53bf73bed3962d176d5", - "reference": "bea15e59f63d1b0fceabf53bf73bed3962d176d5", + "url": "https://api.github.com/repos/utopia-php/audit/zipball/a83dec21b3b9b7fc85fd8cf92563b2fd174a39cb", + "reference": "a83dec21b3b9b7fc85fd8cf92563b2fd174a39cb", "shasum": "" }, "require": { @@ -3597,7 +3597,7 @@ "issues": "https://github.com/utopia-php/audit/issues", "source": "https://github.com/utopia-php/audit/tree/feat-db-3.x" }, - "time": "2025-12-14T06:56:09+00:00" + "time": "2025-12-14T08:29:40+00:00" }, { "name": "utopia-php/auth", diff --git a/src/Appwrite/Platform/Workers/Audits.php b/src/Appwrite/Platform/Workers/Audits.php index c64591632d..3349367adf 100644 --- a/src/Appwrite/Platform/Workers/Audits.php +++ b/src/Appwrite/Platform/Workers/Audits.php @@ -103,7 +103,7 @@ class Audits extends Action 'mode' => $mode, 'data' => $auditPayload, ], - 'timestamp' => date("Y-m-d H:i:s", $message->getTimestamp()), + 'time' => date("Y-m-d H:i:s", $message->getTimestamp()), ]; if (isset($this->logs[$project->getSequence()])) { From 99966b5a247cc05507bb935ea4cc66e26474d857 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 08:35:40 +0000 Subject: [PATCH 21/95] upgrade audit --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index e0633c82dc..1f0fdc69e0 100644 --- a/composer.lock +++ b/composer.lock @@ -3556,12 +3556,12 @@ "source": { "type": "git", "url": "https://github.com/utopia-php/audit.git", - "reference": "a83dec21b3b9b7fc85fd8cf92563b2fd174a39cb" + "reference": "c0a0d1679231c4c979f950458c273b04971b5f08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/audit/zipball/a83dec21b3b9b7fc85fd8cf92563b2fd174a39cb", - "reference": "a83dec21b3b9b7fc85fd8cf92563b2fd174a39cb", + "url": "https://api.github.com/repos/utopia-php/audit/zipball/c0a0d1679231c4c979f950458c273b04971b5f08", + "reference": "c0a0d1679231c4c979f950458c273b04971b5f08", "shasum": "" }, "require": { @@ -3597,7 +3597,7 @@ "issues": "https://github.com/utopia-php/audit/issues", "source": "https://github.com/utopia-php/audit/tree/feat-db-3.x" }, - "time": "2025-12-14T08:29:40+00:00" + "time": "2025-12-14T08:34:27+00:00" }, { "name": "utopia-php/auth", From 1a205c3f3ba765ad19890cd1e1e2bb20c938ee08 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 14 Dec 2025 08:50:39 +0000 Subject: [PATCH 22/95] upgrade audit --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index 1f0fdc69e0..0a6a2a1f72 100644 --- a/composer.lock +++ b/composer.lock @@ -3556,12 +3556,12 @@ "source": { "type": "git", "url": "https://github.com/utopia-php/audit.git", - "reference": "c0a0d1679231c4c979f950458c273b04971b5f08" + "reference": "4f77e217c86f0cb27d2b51b5e462411ae3579f80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/audit/zipball/c0a0d1679231c4c979f950458c273b04971b5f08", - "reference": "c0a0d1679231c4c979f950458c273b04971b5f08", + "url": "https://api.github.com/repos/utopia-php/audit/zipball/4f77e217c86f0cb27d2b51b5e462411ae3579f80", + "reference": "4f77e217c86f0cb27d2b51b5e462411ae3579f80", "shasum": "" }, "require": { @@ -3597,7 +3597,7 @@ "issues": "https://github.com/utopia-php/audit/issues", "source": "https://github.com/utopia-php/audit/tree/feat-db-3.x" }, - "time": "2025-12-14T08:34:27+00:00" + "time": "2025-12-14T08:49:56+00:00" }, { "name": "utopia-php/auth", From 0037305e16be571e8ccb42c1097a7eac461694b2 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 15 Dec 2025 02:12:35 +0000 Subject: [PATCH 23/95] Fix: failing tests --- app/controllers/api/messaging.php | 22 +++++-------------- app/controllers/api/projects.php | 8 +++---- app/controllers/api/teams.php | 7 ++---- .../Collections/Documents/Logs/XList.php | 7 ++---- .../Http/Databases/Collections/Logs/XList.php | 17 ++++++-------- .../Databases/Http/Databases/Logs/XList.php | 19 +++++++--------- .../Databases/Http/TablesDB/Logs/XList.php | 17 ++++++-------- src/Appwrite/Platform/Workers/Audits.php | 4 ++-- .../Account/AccountCustomClientTest.php | 2 ++ 9 files changed, 39 insertions(+), 64 deletions(-) diff --git a/app/controllers/api/messaging.php b/app/controllers/api/messaging.php index 72abce087b..eed12c3376 100644 --- a/app/controllers/api/messaging.php +++ b/app/controllers/api/messaging.php @@ -1211,7 +1211,7 @@ App::get('/v1/messaging/providers/:providerId/logs') } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource, $filterQueries) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); @@ -2568,10 +2568,7 @@ App::get('/v1/messaging/topics/:topicId/logs') } $resource = 'topic/' . $topicId; - $grouped = Query::groupByType($queries); - $limit = $grouped['limit'] ?? 25; - $offset = $grouped['offset'] ?? 0; - $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); + $logs = $audit->getLogsByResource($resource, $queries); $output = []; @@ -2619,7 +2616,7 @@ App::get('/v1/messaging/topics/:topicId/logs') } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); @@ -2988,10 +2985,7 @@ App::get('/v1/messaging/subscribers/:subscriberId/logs') } $resource = 'subscriber/' . $subscriberId; - $grouped = Query::groupByType($queries); - $limit = $grouped['limit'] ?? 25; - $offset = $grouped['offset'] ?? 0; - $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); + $logs = $audit->getLogsByResource($resource, $queries); $output = []; @@ -3039,7 +3033,7 @@ App::get('/v1/messaging/subscribers/:subscriberId/logs') } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); @@ -3786,11 +3780,7 @@ App::get('/v1/messaging/messages/:messageId/logs') } $resource = 'message/' . $messageId; - $grouped = Query::groupByType($queries); - $limit = $grouped['limit'] ?? 25; - $offset = $grouped['offset'] ?? 0; - $filterQueries = $grouped['filters'] ?? []; - $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); + $logs = $audit->getLogsByResource($resource, $queries); $output = []; diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index ed6fa20eba..364a7914b4 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -21,7 +21,6 @@ use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use PHPMailer\PHPMailer\PHPMailer; use Utopia\App; -use Utopia\Audit\Adapter\Database as AdapterDatabase; use Utopia\Audit\Audit; use Utopia\Cache\Cache; use Utopia\Config\Config; @@ -248,15 +247,14 @@ App::post('/v1/projects') } if ($create || $projectTables) { - $adapter = new AdapterDatabase($dbForProject); + $adapter = new \Utopia\Audit\Adapters\Database($dbForProject); $audit = new Audit($adapter); $audit->setup(); } if (!$create && $sharedTablesV1) { - $adapter = new AdapterDatabase($dbForProject); - $attributes = $adapter->getAttributeDocuments(); - $indexes = $adapter->getIndexDocuments(); + $attributes = \array_map(fn ($attribute) => new Document($attribute), Audit::ATTRIBUTES); + $indexes = \array_map(fn (array $index) => new Document($index), Audit::INDEXES); $dbForProject->createDocument(Database::METADATA, new Document([ '$id' => ID::custom('audit'), '$permissions' => [Permission::create(Role::any())], diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index cc35f0d264..04a43577ad 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -1480,10 +1480,7 @@ App::get('/v1/teams/:teamId/logs') } $resource = 'team/' . $team->getId(); - $grouped = Query::groupByType($queries); - $limit = $grouped['limit'] ?? 25; - $offset = $grouped['offset'] ?? 0; - $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); + $logs = $audit->getLogsByResource($resource, $queries); $output = []; @@ -1530,7 +1527,7 @@ App::get('/v1/teams/:teamId/logs') } } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php index e0b595ebd1..292bed4c36 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php @@ -103,10 +103,7 @@ class XList extends Action $context = $this->getContext(); $resource = "database/$databaseId/$type/$collectionId/$context/{$document->getId()}"; - $grouped = Query::groupByType($queries); - $limit = $grouped['limit'] ?? 25; - $offset = $grouped['offset'] ?? 0; - $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); + $logs = $audit->getLogsByResource($resource, $queries); $output = []; @@ -155,7 +152,7 @@ class XList extends Action $response->dynamic(new Document([ 'logs' => $output, - 'total' => $audit->countLogsByResource($resource), + 'total' => $audit->countLogsByResource($resource, $queries), ]), $this->getResponseModel()); } } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php index 73c615697a..2244bfd2d7 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php @@ -67,11 +67,11 @@ class XList extends Action ->param('databaseId', '', new UID(), 'Database ID.') ->param('collectionId', '', new UID(), 'Collection ID.') ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('response') - ->inject('dbForProject') - ->inject('locale') - ->inject('geodb') - ->inject('audit') + ->inject('response') + ->inject('dbForProject') + ->inject('locale') + ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } @@ -98,10 +98,7 @@ class XList extends Action $context = $this->getContext(); $resource = "database/$databaseId/$context/$collectionId"; - $grouped = Query::groupByType($queries); - $limit = $grouped['limit'] ?? 25; - $offset = $grouped['offset'] ?? 0; - $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); + $logs = $audit->getLogsByResource($resource, $queries); $output = []; @@ -150,7 +147,7 @@ class XList extends Action $response->dynamic(new Document([ 'logs' => $output, - 'total' => $audit->countLogsByResource($resource), + 'total' => $audit->countLogsByResource($resource, $queries), ]), $this->getResponseModel()); } } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php index 1d828977c4..42081127d5 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php @@ -63,15 +63,15 @@ class XList extends Action ]) ->param('databaseId', '', new UID(), 'Database ID.') ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('response') - ->inject('dbForProject') - ->inject('locale') - ->inject('geodb') - ->inject('audit') + ->inject('response') + ->inject('dbForProject') + ->inject('locale') + ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } - public function action(string $databaseId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit): void + public function action(string $databaseId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit): void { $database = $dbForProject->getDocument('databases', $databaseId); @@ -86,10 +86,7 @@ class XList extends Action } $resource = 'database/' . $databaseId; - $grouped = Query::groupByType($queries); - $limit = $grouped['limit'] ?? 25; - $offset = $grouped['offset'] ?? 0; - $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); + $logs = $audit->getLogsByResource($resource, $queries); $output = []; @@ -136,7 +133,7 @@ class XList extends Action } $response->dynamic(new Document([ - 'total' => $audit->countLogsByResource($resource), + 'total' => $audit->countLogsByResource($resource, $queries), 'logs' => $output, ]), UtopiaResponse::MODEL_LOG_LIST); } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php index b37d38dfe1..ed2aaa848c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php @@ -58,11 +58,11 @@ class XList extends Action ]) ->param('databaseId', '', new UID(), 'Database ID.') ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('response') - ->inject('dbForProject') - ->inject('locale') - ->inject('geodb') - ->inject('audit') + ->inject('response') + ->inject('dbForProject') + ->inject('locale') + ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } @@ -81,10 +81,7 @@ class XList extends Action } $resource = 'database/' . $databaseId; - $grouped = Query::groupByType($queries); - $limit = $grouped['limit'] ?? 25; - $offset = $grouped['offset'] ?? 0; - $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); + $logs = $audit->getLogsByResource($resource, $queries); $output = []; @@ -131,7 +128,7 @@ class XList extends Action } $response->dynamic(new Document([ - 'total' => $audit->countLogsByResource($resource), + 'total' => $audit->countLogsByResource($resource, $queries), 'logs' => $output, ]), UtopiaResponse::MODEL_LOG_LIST); } diff --git a/src/Appwrite/Platform/Workers/Audits.php b/src/Appwrite/Platform/Workers/Audits.php index 3349367adf..2f0364e408 100644 --- a/src/Appwrite/Platform/Workers/Audits.php +++ b/src/Appwrite/Platform/Workers/Audits.php @@ -4,8 +4,8 @@ namespace Appwrite\Platform\Workers; use Exception; use Throwable; -use Utopia\Audit\Adapter\Database as AdapterDatabase; use Utopia\Audit\Audit; +use Utopia\Audit\Adapters\Database as AdapterDatabase; use Utopia\CLI\Console; use Utopia\Database\Document; use Utopia\Database\Exception\Authorization; @@ -103,7 +103,7 @@ class Audits extends Action 'mode' => $mode, 'data' => $auditPayload, ], - 'time' => date("Y-m-d H:i:s", $message->getTimestamp()), + 'timestamp' => date("Y-m-d H:i:s", $message->getTimestamp()), ]; if (isset($this->logs[$project->getSequence()])) { diff --git a/tests/e2e/Services/Account/AccountCustomClientTest.php b/tests/e2e/Services/Account/AccountCustomClientTest.php index 457799f991..a1cc718aad 100644 --- a/tests/e2e/Services/Account/AccountCustomClientTest.php +++ b/tests/e2e/Services/Account/AccountCustomClientTest.php @@ -288,6 +288,8 @@ class AccountCustomClientTest extends Scope 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session, ])); + var_dump($response['body']['logs']); + $this->assertEquals(200, $response['headers']['status-code']); $this->assertIsArray($response['body']['logs']); $this->assertNotEmpty($response['body']['logs']); From 69ad4ae9303d48ca7578d1cae7bf6e8aabedbb5f Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 15 Dec 2025 02:15:45 +0000 Subject: [PATCH 24/95] Fix format --- app/controllers/api/projects.php | 4 ++-- .../Http/Databases/Collections/Logs/XList.php | 10 +++++----- .../Modules/Databases/Http/Databases/Logs/XList.php | 12 ++++++------ .../Modules/Databases/Http/TablesDB/Logs/XList.php | 10 +++++----- src/Appwrite/Platform/Workers/Audits.php | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 364a7914b4..ad8ed2047f 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -295,7 +295,7 @@ App::post('/v1/projects') // Hook allowing instant project mirroring during migration // Outside of migration, hook is not registered and has no effect - $hooks->trigger('afterProjectCreation', [ $project, $pools, $cache ]); + $hooks->trigger('afterProjectCreation', [$project, $pools, $cache]); $response ->setStatusCode(Response::STATUS_CODE_CREATED) @@ -2666,7 +2666,7 @@ App::patch('/v1/projects/:projectId/auth/session-invalidation') $auths = $project->getAttribute('auths', []); $auths['invalidateSessions'] = $enabled; $dbForPlatform->updateDocument('projects', $project->getId(), $project - ->setAttribute('auths', $auths)); + ->setAttribute('auths', $auths)); $response->dynamic($project, Response::MODEL_PROJECT); }); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php index 2244bfd2d7..a67af6cff1 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php @@ -67,11 +67,11 @@ class XList extends Action ->param('databaseId', '', new UID(), 'Database ID.') ->param('collectionId', '', new UID(), 'Collection ID.') ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('response') - ->inject('dbForProject') - ->inject('locale') - ->inject('geodb') - ->inject('audit') + ->inject('response') + ->inject('dbForProject') + ->inject('locale') + ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php index 42081127d5..6b2878ce9a 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php @@ -63,15 +63,15 @@ class XList extends Action ]) ->param('databaseId', '', new UID(), 'Database ID.') ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('response') - ->inject('dbForProject') - ->inject('locale') - ->inject('geodb') - ->inject('audit') + ->inject('response') + ->inject('dbForProject') + ->inject('locale') + ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } - public function action(string $databaseId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit): void + public function action(string $databaseId, array $queries, UtopiaResponse $response, Database $dbForProject, Locale $locale, Reader $geodb, Audit $audit): void { $database = $dbForProject->getDocument('databases', $databaseId); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php index ed2aaa848c..1315d35330 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php @@ -58,11 +58,11 @@ class XList extends Action ]) ->param('databaseId', '', new UID(), 'Database ID.') ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('response') - ->inject('dbForProject') - ->inject('locale') - ->inject('geodb') - ->inject('audit') + ->inject('response') + ->inject('dbForProject') + ->inject('locale') + ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } diff --git a/src/Appwrite/Platform/Workers/Audits.php b/src/Appwrite/Platform/Workers/Audits.php index 2f0364e408..369a67116d 100644 --- a/src/Appwrite/Platform/Workers/Audits.php +++ b/src/Appwrite/Platform/Workers/Audits.php @@ -4,8 +4,8 @@ namespace Appwrite\Platform\Workers; use Exception; use Throwable; -use Utopia\Audit\Audit; use Utopia\Audit\Adapters\Database as AdapterDatabase; +use Utopia\Audit\Audit; use Utopia\CLI\Console; use Utopia\Database\Document; use Utopia\Database\Exception\Authorization; From 2d3e34fd5aa91d0910cade2b487e8e5fc4d94ea7 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 15 Dec 2025 02:20:10 +0000 Subject: [PATCH 25/95] fix namespace --- app/controllers/api/projects.php | 2 +- src/Appwrite/Platform/Workers/Audits.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index ad8ed2047f..4b54ac1037 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -247,7 +247,7 @@ App::post('/v1/projects') } if ($create || $projectTables) { - $adapter = new \Utopia\Audit\Adapters\Database($dbForProject); + $adapter = new \Utopia\Audit\Adapter\Database($dbForProject); $audit = new Audit($adapter); $audit->setup(); } diff --git a/src/Appwrite/Platform/Workers/Audits.php b/src/Appwrite/Platform/Workers/Audits.php index 369a67116d..c64591632d 100644 --- a/src/Appwrite/Platform/Workers/Audits.php +++ b/src/Appwrite/Platform/Workers/Audits.php @@ -4,7 +4,7 @@ namespace Appwrite\Platform\Workers; use Exception; use Throwable; -use Utopia\Audit\Adapters\Database as AdapterDatabase; +use Utopia\Audit\Adapter\Database as AdapterDatabase; use Utopia\Audit\Audit; use Utopia\CLI\Console; use Utopia\Database\Document; From ace9d8674414300bbe5c849f238be8244c6cbef2 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 15 Dec 2025 02:41:56 +0000 Subject: [PATCH 26/95] fix attribute --- src/Appwrite/Platform/Workers/Audits.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Workers/Audits.php b/src/Appwrite/Platform/Workers/Audits.php index c64591632d..3349367adf 100644 --- a/src/Appwrite/Platform/Workers/Audits.php +++ b/src/Appwrite/Platform/Workers/Audits.php @@ -103,7 +103,7 @@ class Audits extends Action 'mode' => $mode, 'data' => $auditPayload, ], - 'timestamp' => date("Y-m-d H:i:s", $message->getTimestamp()), + 'time' => date("Y-m-d H:i:s", $message->getTimestamp()), ]; if (isset($this->logs[$project->getSequence()])) { From dc3459edd0cf816ac69fd1c3eaddc7c6103ab7ac Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 15 Dec 2025 02:43:27 +0000 Subject: [PATCH 27/95] remove dump --- tests/e2e/Services/Account/AccountCustomClientTest.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/e2e/Services/Account/AccountCustomClientTest.php b/tests/e2e/Services/Account/AccountCustomClientTest.php index a1cc718aad..457799f991 100644 --- a/tests/e2e/Services/Account/AccountCustomClientTest.php +++ b/tests/e2e/Services/Account/AccountCustomClientTest.php @@ -288,8 +288,6 @@ class AccountCustomClientTest extends Scope 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session, ])); - var_dump($response['body']['logs']); - $this->assertEquals(200, $response['headers']['status-code']); $this->assertIsArray($response['body']['logs']); $this->assertNotEmpty($response['body']['logs']); From 801219374c6924da15abca4d316f4d25c707e694 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 15 Dec 2025 02:50:21 +0000 Subject: [PATCH 28/95] Fix queries --- app/controllers/api/messaging.php | 26 ++++++++++++++----- app/controllers/api/teams.php | 8 ++++-- app/controllers/api/users.php | 8 ++++-- .../Collections/Documents/Logs/XList.php | 9 +++++-- .../Http/Databases/Collections/Logs/XList.php | 8 ++++-- .../Databases/Http/Databases/Logs/XList.php | 9 +++++-- .../Databases/Http/TablesDB/Logs/XList.php | 8 ++++-- 7 files changed, 57 insertions(+), 19 deletions(-) diff --git a/app/controllers/api/messaging.php b/app/controllers/api/messaging.php index eed12c3376..e1e595d992 100644 --- a/app/controllers/api/messaging.php +++ b/app/controllers/api/messaging.php @@ -1211,7 +1211,7 @@ App::get('/v1/messaging/providers/:providerId/logs') } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); @@ -2567,8 +2567,12 @@ App::get('/v1/messaging/topics/:topicId/logs') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $resource = 'topic/' . $topicId; - $logs = $audit->getLogsByResource($resource, $queries); + $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); $output = []; @@ -2616,7 +2620,7 @@ App::get('/v1/messaging/topics/:topicId/logs') } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); @@ -2984,8 +2988,12 @@ App::get('/v1/messaging/subscribers/:subscriberId/logs') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $resource = 'subscriber/' . $subscriberId; - $logs = $audit->getLogsByResource($resource, $queries); + $logs = $audit->getLogsByResource($resource, limit: $limit, offset: $offset); $output = []; @@ -3033,7 +3041,7 @@ App::get('/v1/messaging/subscribers/:subscriberId/logs') } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); @@ -3779,8 +3787,12 @@ App::get('/v1/messaging/messages/:messageId/logs') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $resource = 'message/' . $messageId; - $logs = $audit->getLogsByResource($resource, $queries); + $logs = $audit->getLogsByResource($resource, limit: $limit, offset: $offset); $output = []; @@ -3828,7 +3840,7 @@ App::get('/v1/messaging/messages/:messageId/logs') } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 04a43577ad..800e404027 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -1479,8 +1479,12 @@ App::get('/v1/teams/:teamId/logs') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $resource = 'team/' . $team->getId(); - $logs = $audit->getLogsByResource($resource, $queries); + $logs = $audit->getLogsByResource($resource, offset: $offset, limit: $limit); $output = []; @@ -1527,7 +1531,7 @@ App::get('/v1/teams/:teamId/logs') } } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0, + 'total' => $includeTotal ? $audit->countLogsByResource($resource) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 161b5a3298..de05f78223 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -959,7 +959,11 @@ App::get('/v1/users/:userId/logs') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - $logs = $audit->getLogsByUser($user->getSequence(), $queries); + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + + $logs = $audit->getLogsByUser($user->getSequence(), limit: $limit, offset: $offset); $output = []; foreach ($logs as $i => &$log) { $log['userAgent'] = (!empty($log['userAgent'])) ? $log['userAgent'] : 'UNKNOWN'; @@ -999,7 +1003,7 @@ App::get('/v1/users/:userId/logs') } $response->dynamic(new Document([ - 'total' => $includeTotal ? $audit->countLogsByUser($user->getSequence(), $queries) : 0, + 'total' => $includeTotal ? $audit->countLogsByUser($user->getSequence()) : 0, 'logs' => $output, ]), Response::MODEL_LOG_LIST); }); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php index 292bed4c36..a4dd38ef67 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php @@ -103,7 +103,12 @@ class XList extends Action $context = $this->getContext(); $resource = "database/$databaseId/$type/$collectionId/$context/{$document->getId()}"; - $logs = $audit->getLogsByResource($resource, $queries); + + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + + $logs = $audit->getLogsByResource($resource, limit: $limit, offset: $offset); $output = []; @@ -152,7 +157,7 @@ class XList extends Action $response->dynamic(new Document([ 'logs' => $output, - 'total' => $audit->countLogsByResource($resource, $queries), + 'total' => $audit->countLogsByResource($resource), ]), $this->getResponseModel()); } } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php index a67af6cff1..0f5a57c6e9 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php @@ -96,9 +96,13 @@ class XList extends Action throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $context = $this->getContext(); $resource = "database/$databaseId/$context/$collectionId"; - $logs = $audit->getLogsByResource($resource, $queries); + $logs = $audit->getLogsByResource($resource, limit: $limit, offset: $offset); $output = []; @@ -147,7 +151,7 @@ class XList extends Action $response->dynamic(new Document([ 'logs' => $output, - 'total' => $audit->countLogsByResource($resource, $queries), + 'total' => $audit->countLogsByResource($resource), ]), $this->getResponseModel()); } } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php index 6b2878ce9a..319f07db1c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php @@ -85,8 +85,13 @@ class XList extends Action throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } + + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $resource = 'database/' . $databaseId; - $logs = $audit->getLogsByResource($resource, $queries); + $logs = $audit->getLogsByResource($resource, limit: $limit, offset: $offset); $output = []; @@ -133,7 +138,7 @@ class XList extends Action } $response->dynamic(new Document([ - 'total' => $audit->countLogsByResource($resource, $queries), + 'total' => $audit->countLogsByResource($resource), 'logs' => $output, ]), UtopiaResponse::MODEL_LOG_LIST); } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php index 1315d35330..88745555d9 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php @@ -80,8 +80,12 @@ class XList extends Action throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } + $grouped = Query::groupByType($queries); + $limit = $grouped['limit'] ?? 25; + $offset = $grouped['offset'] ?? 0; + $resource = 'database/' . $databaseId; - $logs = $audit->getLogsByResource($resource, $queries); + $logs = $audit->getLogsByResource($resource, limit: $limit, offset: $offset); $output = []; @@ -128,7 +132,7 @@ class XList extends Action } $response->dynamic(new Document([ - 'total' => $audit->countLogsByResource($resource, $queries), + 'total' => $audit->countLogsByResource($resource), 'logs' => $output, ]), UtopiaResponse::MODEL_LOG_LIST); } From 63c2d72b2e15595a63614d75e4a9eb89f02de88d Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 15 Dec 2025 03:58:00 +0000 Subject: [PATCH 29/95] Fix logs --- .../Modules/Databases/Http/TablesDB/Tables/Logs/XList.php | 1 + .../Modules/Databases/Http/TablesDB/Tables/Rows/Logs/XList.php | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Logs/XList.php index 0680649544..5eab050b7e 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Logs/XList.php @@ -50,6 +50,7 @@ class XList extends CollectionLogXList ->inject('dbForProject') ->inject('locale') ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Logs/XList.php index 5f1efa2953..27bd82195d 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Logs/XList.php @@ -51,6 +51,7 @@ class XList extends DocumentLogXList ->inject('dbForProject') ->inject('locale') ->inject('geodb') + ->inject('audit') ->callback($this->action(...)); } } From 70a7deaa3807311c3925e6b7866ea9b7424b9b04 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Wed, 17 Dec 2025 20:46:54 +0530 Subject: [PATCH 30/95] Refactor certificate generation in worker --- docker-compose.yml | 1 + src/Appwrite/Certificates/Adapter.php | 2 + src/Appwrite/Certificates/LetsEncrypt.php | 5 + .../Modules/Proxy/{Http/Rules => }/Action.php | 2 +- .../Modules/Proxy/Http/Rules/API/Create.php | 2 +- .../Proxy/Http/Rules/Function/Create.php | 2 +- .../Proxy/Http/Rules/Redirect/Create.php | 2 +- .../Modules/Proxy/Http/Rules/Site/Create.php | 2 +- .../Proxy/Http/Rules/Verification/Update.php | 2 +- .../Platform/Workers/Certificates.php | 309 ++++++++---------- 10 files changed, 148 insertions(+), 181 deletions(-) rename src/Appwrite/Platform/Modules/Proxy/{Http/Rules => }/Action.php (99%) diff --git a/docker-compose.yml b/docker-compose.yml index 57007c4efc..f7e8df25e6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -555,6 +555,7 @@ services: - _APP_DOMAIN_TARGET_CAA - _APP_DNS - _APP_DOMAIN_FUNCTIONS + - _APP_DOMAIN_SITES - _APP_EMAIL_CERTIFICATES - _APP_REDIS_HOST - _APP_REDIS_PORT diff --git a/src/Appwrite/Certificates/Adapter.php b/src/Appwrite/Certificates/Adapter.php index ab673e9cfe..121542baa1 100644 --- a/src/Appwrite/Certificates/Adapter.php +++ b/src/Appwrite/Certificates/Adapter.php @@ -8,6 +8,8 @@ interface Adapter { public function issueCertificate(string $certName, string $domain, ?string $domainType): ?string; + public function isInstantGeneration(): bool; + public function isRenewRequired(string $domain, ?string $domainType, Log $log): bool; public function deleteCertificate(string $domain): void; diff --git a/src/Appwrite/Certificates/LetsEncrypt.php b/src/Appwrite/Certificates/LetsEncrypt.php index 76638d9816..14a61203a1 100644 --- a/src/Appwrite/Certificates/LetsEncrypt.php +++ b/src/Appwrite/Certificates/LetsEncrypt.php @@ -84,6 +84,11 @@ class LetsEncrypt implements Adapter return DateTime::addSeconds($dt, -60 * 60 * 24 * 30); } + public function isInstantGeneration(): bool + { + return true; + } + public function isRenewRequired(string $domain, ?string $domainType, Log $log): bool { $certPath = APP_STORAGE_CERTIFICATES . '/' . $domain . '/cert.pem'; diff --git a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Action.php b/src/Appwrite/Platform/Modules/Proxy/Action.php similarity index 99% rename from src/Appwrite/Platform/Modules/Proxy/Http/Rules/Action.php rename to src/Appwrite/Platform/Modules/Proxy/Action.php index 5ec5b8b8f5..c3fa535a5c 100644 --- a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Action.php +++ b/src/Appwrite/Platform/Modules/Proxy/Action.php @@ -1,6 +1,6 @@ desc('Certificates worker') ->inject('message') @@ -93,13 +92,12 @@ class Certificates extends Action $document = new Document($payload['domain'] ?? []); $domain = new Domain($document->getAttribute('domain', '')); + $domainType = $document->getAttribute('domainType'); $skipRenewCheck = $payload['skipRenewCheck'] ?? false; $validationDomain = $payload['validationDomain'] ?? null; $log->addTag('domain', $domain->get()); - $domainType = $document->getAttribute('domainType'); - $this->execute($domain, $domainType, $dbForPlatform, $queueForMails, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime, $log, $certificates, $skipRenewCheck, $plan, $validationDomain); } @@ -163,26 +161,43 @@ class Certificates extends Action * Note: Renewals are checked and scheduled from maintenance worker */ - // Get current certificate - $certificate = $dbForPlatform->findOne('certificates', [Query::equal('domain', [$domain->get()])]); + // Get rule document for domain + // TODO: (@Meldiron) Remove after 1.7.x migration + $rule = System::getEnv('_APP_RULES_FORMAT') === 'md5' + ? ValidatorAuthorization::skip(fn () => $dbForPlatform->getDocument('rules', md5($domain->get()))) + : ValidatorAuthorization::skip(fn () => $dbForPlatform->findOne('rules', [ + Query::equal('domain', [$domain->get()]), + Query::limit(1), + ])); - // If we don't have certificate for domain yet, let's create new document. At the end we save it + // Rule not found (or) not in the expected state + if ($rule->isEmpty() || $rule->getAttribute('status') !== RULE_STATUS_CERTIFICATE_GENERATING) { + Console::warning('Certificate generation for ' . $domain . ' is skipped as the associated rule is either empty or not in the expected state.'); + } + + // Get associated certificate for the rule + $certificate = $dbForPlatform->getDocument('certificates', $rule->getAttribute('certificateId') ?? ''); + + // If we don't have certificate for the rule yet, let's create one. if ($certificate->isEmpty()) { $certificate = new Document(); $certificate->setAttribute('domain', $domain->get()); } - $success = false; - try { $date = \date('H:i:s'); $certificate->setAttribute('logs', "\033[90m[{$date}] \033[97mCertificate generation started. \033[0m\n"); + // Persist ASAP so that logs are reset in retry flow and user can see the latest logs on Console. + $certificate = $this->upsertCertificate($rule, $certificate, $dbForPlatform); + // Ensure certificate is associated with the rule + $rule->setAttribute('certificateId', $certificate->getId()); + // Validate domain and DNS records. Skip if job is forced if (!$skipRenewCheck) { $mainDomain = $validationDomain ?? $this->getMainDomain(); $isMainDomain = !isset($mainDomain) || $domain->get() === $mainDomain; - $this->validateDomain($domain, $isMainDomain, $log); + $this->validateDomain($rule, $isMainDomain, $log); // If certificate exists already, double-check expiry date. Skip if job is forced if (!$certificates->isRenewRequired($domain->get(), $domainType, $log)) { @@ -191,85 +206,148 @@ class Certificates extends Action } } - // Prepare unique cert name. Using this helps prevent miss-match in configuration when renewing certificates. + // Prepare unique cert name. Using this helps prevent mismatch in configuration when renewing certificates. $certName = ID::unique(); $renewDate = $certificates->issueCertificate($certName, $domain->get(), $domainType); - // Command succeeded, store all data into document - $certificate->setAttribute('logs', 'Certificate successfully generated.'); + // If certificate is generated instantly, we can mark the rule as 'verified'. + if ($certificates->isInstantGeneration()) { + $rule->setAttribute('status', RULE_STATUS_VERIFIED); + $certificate->setAttribute('logs', 'Certificate successfully generated.'); + } - // Update certificate info stored in database - $certificate->setAttribute('renewDate', $renewDate); - $certificate->setAttribute('attempts', 0); - $certificate->setAttribute('issueDate', DateTime::now()); - $success = true; + $certificate->setAttributes([ + 'attempts' => 0, // Reset attempts count + 'issueDate' => DateTime::now(), // Store current time as issue date + 'renewDate' => $renewDate, + ]); } catch (Throwable $e) { $logs = $e->getMessage(); $currentLogs = $certificate->getAttribute('logs', ''); $date = \date('H:i:s'); $errorMessage = "\033[90m[{$date}] \033[31mCertificate generation failed: \033[0m\n"; - $certificate->setAttribute('logs', $currentLogs . $errorMessage . \mb_strcut($logs, 0, 500000));// Limit to 500kb + $attempts = $certificate->getAttribute('attempts', 0) + 1; // // Increase attempts count - // Increase attempts count - $attempts = $certificate->getAttribute('attempts', 0) + 1; - $certificate->setAttribute('attempts', $attempts); + // Update attributes on certificate document + $certificate->setAttributes([ + 'logs' => $currentLogs . $errorMessage . \mb_strcut($logs, 0, 500000), // Limit to 500kb + 'attempts' => $attempts, + 'renewDate' => DateTime::now(), // Store current time as renew date to ensure another attempt in next maintenance cycle. + ]); - // Store current time as renew date to ensure another attempt in next maintenance cycle. - $certificate->setAttribute('renewDate', DateTime::now()); + // Mark rule as 'unverified' + $rule->setAttribute('status', RULE_STATUS_CERTIFICATE_GENERATION_FAILED); // Send email to security email $this->notifyError($domain->get(), $e->getMessage(), $attempts, $queueForMails, $plan); throw $e; } finally { - // All actions result in new updatedAt date + // All actions result in new 'updated' date $certificate->setAttribute('updated', DateTime::now()); + // Save certificate document to database + $this->upsertCertificate($rule, $certificate, $dbForPlatform); - // Save all changes we made to certificate document into database - $this->saveCertificateDocument($domain->get(), $certificate, $success, $dbForPlatform, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime); + // Ensure certificate is associated with the rule + $rule->setAttribute('certificateId', $certificate->getId()); + // Update rule and emit events + $this->updateDomainDocuments($rule, $dbForPlatform, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime); } } /** - * Save certificate data into database. + * Save certificate data to database. * - * @param string $domain Domain name that certificate is for + * @param Document $rule Rule associated with the domain * @param Document $certificate Certificate document that we need to save - * @param bool $success * @param Database $dbForPlatform Database connection for console - * @param Event $queueForEvents - * @param Func $queueForFunctions - * @param Realtime $queueForRealtime - * @return void + * @return Document * @throws \Utopia\Database\Exception * @throws Authorization * @throws Conflict * @throws Structure */ - private function saveCertificateDocument( - string $domain, + private function upsertCertificate( + Document $rule, Document $certificate, - bool $success, + Database $dbForPlatform, + ): Document { + // Decide whether update (or) insert is needed + $existingCertificate = $dbForPlatform->getDocument('certificates', $rule->getAttribute('certificateId') ?? ''); + + if ($existingCertificate->isEmpty()) { + $certificate->removeAttribute('$sequence'); + $certificate = $dbForPlatform->createDocument('certificates', $certificate); + } else { + $certificate = new Document(\array_merge($existingCertificate->getArrayCopy(), $certificate->getArrayCopy())); + $certificate = $dbForPlatform->updateDocument('certificates', $certificate->getId(), $certificate); + } + + return $certificate; + } + + /** + * Update all existing domain documents so they have relation to correct certificate document. + * This solved issues: + * - when adding a domain for which there is already a certificate + * - when renew creates new document? It might? + * - overall makes it more reliable + * + * @param Document $rule Rule document that is affected by new certificate + * @param Database $dbForPlatform Database connection for console + * @param Event $queueForEvents Event publisher for events + * @param Webhook $queueForWebhooks Webhook publisher for webhooks + * @param Func $queueForFunctions Function publisher for functions + * @param Realtime $queueForRealtime Realtime publisher for realtime events + * + * @return void + */ + private function updateDomainDocuments( + Document $rule, Database $dbForPlatform, Event $queueForEvents, Webhook $queueForWebhooks, Func $queueForFunctions, Realtime $queueForRealtime ): void { - // Check if update or insert required - $certificateDocument = $dbForPlatform->findOne('certificates', [Query::equal('domain', [$domain])]); - if (!$certificateDocument->isEmpty()) { - // Merge new data with current data - $certificate = new Document(\array_merge($certificateDocument->getArrayCopy(), $certificate->getArrayCopy())); - $certificate = $dbForPlatform->updateDocument('certificates', $certificate->getId(), $certificate); - } else { - $certificate->removeAttribute('$sequence'); - $certificate = $dbForPlatform->createDocument('certificates', $certificate); + $rule = $dbForPlatform->updateDocument('rules', $rule->getId(), $rule); + + $projectId = $rule->getAttribute('projectId'); + + // Skip events for console project (triggered by auto-ssl generation for 1 click setups) + if ($projectId === 'console') { + return; } - $certificateId = $certificate->getId(); - $this->updateDomainDocuments($certificateId, $domain, $success, $dbForPlatform, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime); + $project = $dbForPlatform->getDocument('projects', $projectId); + + if ($project->isEmpty()) { + return; + } + + $ruleModel = new Rule(); + $queueForEvents + ->setProject($project) + ->setEvent('rules.[ruleId].update') + ->setParam('ruleId', $rule->getId()) + ->setPayload($rule->getArrayCopy(array_keys($ruleModel->getRules()))); + + /** Trigger Webhook */ + $queueForWebhooks + ->from($queueForEvents) + ->trigger(); + + /** Trigger Functions */ + $queueForFunctions + ->from($queueForEvents) + ->trigger(); + + /** Trigger Realtime Events */ + $queueForRealtime + ->setSubscribers(['console', $projectId]) + ->from($queueForEvents) + ->trigger(); } /** @@ -292,62 +370,17 @@ class Certificates extends Action * - Domain needs to be public and valid (prevents NFT domains that are not supported) * - Domain must have proper DNS record * - * @param Domain $domain Domain which we validate + * @param Document $rule Rule to validate * @param bool $isMainDomain In case of master domain, we look for different DNS configurations + * @param Log $log Logger for adding metrics * * @return void * @throws Exception */ - private function validateDomain(Domain $domain, bool $isMainDomain, Log $log): void + private function validateDomain(Document $rule, bool $isMainDomain, Log $log): void { - if (empty($domain->get())) { - throw new Exception('Missing certificate domain.'); - } - - if (!$domain->isKnown() || $domain->isTest()) { - throw new Exception('Unknown public suffix for domain.'); - } - if (!$isMainDomain) { - $validationStart = \microtime(true); - - $validators = []; - $targetCNAME = new Domain(System::getEnv('_APP_DOMAIN_TARGET_CNAME', '')); - if ($targetCNAME->isKnown() && !$targetCNAME->isTest()) { - $validators[] = new DNS($targetCNAME->get(), Record::TYPE_CNAME); - } - if ((new IP(IP::V4))->isValid(System::getEnv('_APP_DOMAIN_TARGET_A', ''))) { - $validators[] = new DNS(System::getEnv('_APP_DOMAIN_TARGET_A', ''), Record::TYPE_A); - } - if ((new IP(IP::V6))->isValid(System::getEnv('_APP_DOMAIN_TARGET_AAAA', ''))) { - $validators[] = new DNS(System::getEnv('_APP_DOMAIN_TARGET_AAAA', ''), Record::TYPE_AAAA); - } - - // Validate if domain target is properly configured - if (empty($validators)) { - throw new Exception('At least one of domain targets environment variable must be configured.'); - } - - // Verify domain with DNS records - $validator = new AnyOf($validators, AnyOf::TYPE_STRING); - if (!$validator->isValid($domain->get())) { - $log->addExtra('dnsTiming', \strval(\microtime(true) - $validationStart)); - $log->addTag('dnsDomain', $domain->get()); - throw new Exception('Failed to verify domain DNS records.'); - } - - // Ensure CAA won't block certificate issuance - if (!empty(System::getEnv('_APP_DOMAIN_TARGET_CAA', ''))) { - $validationStart = \microtime(true); - $validator = new DNS(System::getEnv('_APP_DOMAIN_TARGET_CAA', ''), Record::TYPE_CAA); - if (!$validator->isValid($domain->get())) { - $log->addExtra('dnsTimingCaa', \strval(\microtime(true) - $validationStart)); - $log->addTag('dnsDomain', $domain->get()); - $error = $validator->getDescription(); - $log->addExtra('dnsResponse', \is_array($error) ? \json_encode($error) : \strval($error)); - throw new Exception('Failed to verify domain DNS records. CAA records do not allow Appwrite\'s certificate issuer.'); - } - } + $this->verifyRule($rule, $log); } else { // Main domain validation // TODO: Would be awesome to check A/AAAA record here. Maybe dry run? @@ -406,78 +439,4 @@ class Certificates extends Action ->setRecipient(System::getEnv('_APP_EMAIL_CERTIFICATES', System::getEnv('_APP_SYSTEM_SECURITY_EMAIL_ADDRESS'))) ->trigger(); } - - /** - * Update all existing domain documents so they have relation to correct certificate document. - * This solved issues: - * - when adding a domain for which there is already a certificate - * - when renew creates new document? It might? - * - overall makes it more reliable - * - * @param string $certificateId ID of a new or updated certificate document - * @param string $domain Domain that is affected by new certificate - * @param bool $success Was certificate generation successful? - * - * @return void - */ - private function updateDomainDocuments( - string $certificateId, - string $domain, - bool $success, - Database $dbForPlatform, - Event $queueForEvents, - Webhook $queueForWebhooks, - Func $queueForFunctions, - Realtime $queueForRealtime - ): void { - // TODO: (@Meldiron) Remove after 1.7.x migration - $isMd5 = System::getEnv('_APP_RULES_FORMAT') === 'md5'; - $rule = $isMd5 - ? $dbForPlatform->getDocument('rules', md5($domain)) - : $dbForPlatform->findOne('rules', [ - Query::equal('domain', [$domain]), - ]); - - if (!$rule->isEmpty()) { - $rule->setAttribute('certificateId', $certificateId); - $rule->setAttribute('status', $success ? 'verified' : 'unverified'); - $dbForPlatform->updateDocument('rules', $rule->getId(), $rule); - - $projectId = $rule->getAttribute('projectId'); - - // Skip events for console project (triggered by auto-ssl generation for 1 click setups) - if ($projectId === 'console') { - return; - } - - $project = $dbForPlatform->getDocument('projects', $projectId); - - if ($project->isEmpty()) { - return; - } - - $ruleModel = new Rule(); - $queueForEvents - ->setProject($project) - ->setEvent('rules.[ruleId].update') - ->setParam('ruleId', $rule->getId()) - ->setPayload($rule->getArrayCopy(array_keys($ruleModel->getRules()))); - - /** Trigger Webhook */ - $queueForWebhooks - ->from($queueForEvents) - ->trigger(); - - /** Trigger Functions */ - $queueForFunctions - ->from($queueForEvents) - ->trigger(); - - /** Trigger Realtime Events */ - $queueForRealtime - ->from($queueForEvents) - ->setSubscribers(['console', $projectId]) - ->trigger(); - } - } } From 0e27088e2aa3457fca73909798055df2574ee4f1 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Wed, 17 Dec 2025 20:54:18 +0530 Subject: [PATCH 31/95] change function signature --- src/Appwrite/Certificates/Adapter.php | 2 +- src/Appwrite/Certificates/LetsEncrypt.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Certificates/Adapter.php b/src/Appwrite/Certificates/Adapter.php index 121542baa1..770d2bb71d 100644 --- a/src/Appwrite/Certificates/Adapter.php +++ b/src/Appwrite/Certificates/Adapter.php @@ -8,7 +8,7 @@ interface Adapter { public function issueCertificate(string $certName, string $domain, ?string $domainType): ?string; - public function isInstantGeneration(): bool; + public function isInstantGeneration(string $domain, ?string $domainType): bool; public function isRenewRequired(string $domain, ?string $domainType, Log $log): bool; diff --git a/src/Appwrite/Certificates/LetsEncrypt.php b/src/Appwrite/Certificates/LetsEncrypt.php index 14a61203a1..7e71080a3c 100644 --- a/src/Appwrite/Certificates/LetsEncrypt.php +++ b/src/Appwrite/Certificates/LetsEncrypt.php @@ -84,7 +84,7 @@ class LetsEncrypt implements Adapter return DateTime::addSeconds($dt, -60 * 60 * 24 * 30); } - public function isInstantGeneration(): bool + public function isInstantGeneration(string $domain, ?string $domainType): bool { return true; } From db0dbeb27b0d310d3ce1670b32b498920b2e2a88 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Wed, 17 Dec 2025 21:04:15 +0530 Subject: [PATCH 32/95] simplify --- .../Platform/Workers/Certificates.php | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/src/Appwrite/Platform/Workers/Certificates.php b/src/Appwrite/Platform/Workers/Certificates.php index 5f839f3850..68572961aa 100644 --- a/src/Appwrite/Platform/Workers/Certificates.php +++ b/src/Appwrite/Platform/Workers/Certificates.php @@ -195,9 +195,7 @@ class Certificates extends Action // Validate domain and DNS records. Skip if job is forced if (!$skipRenewCheck) { - $mainDomain = $validationDomain ?? $this->getMainDomain(); - $isMainDomain = !isset($mainDomain) || $domain->get() === $mainDomain; - $this->validateDomain($rule, $isMainDomain, $log); + $this->validateDomain($rule, $domain, $validationDomain, $log); // If certificate exists already, double-check expiry date. Skip if job is forced if (!$certificates->isRenewRequired($domain->get(), $domainType, $log)) { @@ -211,7 +209,7 @@ class Certificates extends Action $renewDate = $certificates->issueCertificate($certName, $domain->get(), $domainType); // If certificate is generated instantly, we can mark the rule as 'verified'. - if ($certificates->isInstantGeneration()) { + if ($certificates->isInstantGeneration($domain->get(), $domainType)) { $rule->setAttribute('status', RULE_STATUS_VERIFIED); $certificate->setAttribute('logs', 'Certificate successfully generated.'); } @@ -350,6 +348,31 @@ class Certificates extends Action ->trigger(); } + /** + * Internal domain validation functionality to prevent unnecessary attempts. We check: + * - Domain needs to be public and valid (prevents NFT domains that are not supported) + * - Domain must have proper DNS record + * + * @param Document $rule Rule to validate + * @param Domain $domain Domain to validate + * @param string|null $validationDomain Override for main domain check + * @param Log $log Logger for adding metrics + * + * @return void + * @throws Exception + */ + private function validateDomain(Document $rule, Domain $domain, ?string $validationDomain = null, Log $log): void + { + $mainDomain = $validationDomain ?? $this->getMainDomain(); + $isMainDomain = !isset($mainDomain) || $domain->get() === $mainDomain; + if (!$isMainDomain) { + $this->verifyRule($rule, $log); + } else { + // Main domain validation + // TODO: Would be awesome to check A/AAAA record here. Maybe dry run? + } + } + /** * Get main domain. Needed as we do different checks for main and non-main domains. * @@ -366,29 +389,7 @@ class Certificates extends Action } /** - * Internal domain validation functionality to prevent unnecessary attempts. We check: - * - Domain needs to be public and valid (prevents NFT domains that are not supported) - * - Domain must have proper DNS record - * - * @param Document $rule Rule to validate - * @param bool $isMainDomain In case of master domain, we look for different DNS configurations - * @param Log $log Logger for adding metrics - * - * @return void - * @throws Exception - */ - private function validateDomain(Document $rule, bool $isMainDomain, Log $log): void - { - if (!$isMainDomain) { - $this->verifyRule($rule, $log); - } else { - // Main domain validation - // TODO: Would be awesome to check A/AAAA record here. Maybe dry run? - } - } - - /** - * Method to make sure information about error is delivered to admnistrator. + * Method to make sure information about error is delivered to administrator. * * @param string $domain Domain that caused the error * @param string $errorMessage Verbose error message From 88bd35ce9881df475ceeb36cdba18af4e5132499 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Thu, 18 Dec 2025 12:40:24 +0530 Subject: [PATCH 33/95] periodic task for rule verification & certificate generation --- .env | 2 + Dockerfile | 1 + bin/rules | 3 + docker-compose.yml | 37 +++++ src/Appwrite/Event/Certificate.php | 25 ++++ .../Modules/Proxy/Http/Rules/API/Create.php | 1 + .../Proxy/Http/Rules/Function/Create.php | 1 + .../Platform/Modules/Proxy/Http/Rules/Get.php | 1 + .../Proxy/Http/Rules/Redirect/Create.php | 1 + .../Modules/Proxy/Http/Rules/Site/Create.php | 1 + .../Modules/Proxy/Http/Rules/XList.php | 1 + src/Appwrite/Platform/Services/Tasks.php | 2 + src/Appwrite/Platform/Tasks/Maintenance.php | 42 ------ src/Appwrite/Platform/Tasks/Rules.php | 126 ++++++++++++++++++ .../Platform/Workers/Certificates.php | 97 +++++++++++++- 15 files changed, 292 insertions(+), 49 deletions(-) create mode 100644 bin/rules create mode 100644 src/Appwrite/Platform/Tasks/Rules.php diff --git a/.env b/.env index 64fc7ef10f..d211f0ae6e 100644 --- a/.env +++ b/.env @@ -101,6 +101,8 @@ _APP_USAGE_AGGREGATION_INTERVAL=30 _APP_STATS_RESOURCES_INTERVAL=30 _APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000 _APP_MAINTENANCE_RETENTION_SCHEDULES=86400 +_APP_MAINTENANCE_RULE_VERIFICATION_INTERVAL=60 +_APP_MAINTENANCE_CERTIFICATE_RENEWAL_INTERVAL=86400 _APP_USAGE_STATS=enabled _APP_LOGGING_CONFIG= _APP_LOGGING_CONFIG_REALTIME= diff --git a/Dockerfile b/Dockerfile index e146008222..b65b73469c 100755 --- a/Dockerfile +++ b/Dockerfile @@ -58,6 +58,7 @@ RUN mkdir -p /storage/uploads && \ RUN chmod +x /usr/local/bin/doctor && \ chmod +x /usr/local/bin/install && \ chmod +x /usr/local/bin/maintenance && \ + chmod +x /usr/local/bin/rules && \ chmod +x /usr/local/bin/migrate && \ chmod +x /usr/local/bin/realtime && \ chmod +x /usr/local/bin/schedule-functions && \ diff --git a/bin/rules b/bin/rules new file mode 100644 index 0000000000..77e195eb61 --- /dev/null +++ b/bin/rules @@ -0,0 +1,3 @@ +#!/bin/sh + +php /usr/src/code/app/cli.php rules $@ \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index f7e8df25e6..99b42561b3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -786,6 +786,43 @@ services: - _APP_MAINTENANCE_START_TIME - _APP_DATABASE_SHARED_TABLES + appwrite-task-rules: + entrypoint: rules + <<: *x-logging + container_name: appwrite-task-rules + image: appwrite-dev + networks: + - appwrite + volumes: + - ./app:/usr/src/code/app + - ./src:/usr/src/code/src + depends_on: + - redis + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_DOMAIN + - _APP_DOMAIN_TARGET_CNAME + - _APP_DOMAIN_TARGET_AAAA + - _APP_DOMAIN_TARGET_A + - _APP_DOMAIN_TARGET_CAA + - _APP_DNS + - _APP_DOMAIN_FUNCTIONS + - _APP_DOMAIN_SITES + - _APP_OPENSSL_KEY_V1 + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_DATABASE_SHARED_TABLES + - _APP_MAINTENANCE_RULE_VERIFICATION_INTERVAL + - _APP_MAINTENANCE_CERTIFICATE_RENEWAL_INTERVAL + appwrite-task-stats-resources: container_name: appwrite-task-stats-resources entrypoint: stats-resources diff --git a/src/Appwrite/Event/Certificate.php b/src/Appwrite/Event/Certificate.php index 00875c7a4a..7e60d15180 100644 --- a/src/Appwrite/Event/Certificate.php +++ b/src/Appwrite/Event/Certificate.php @@ -7,7 +7,10 @@ use Utopia\Queue\Publisher; class Certificate extends Event { + public const string ACTION_DOMAIN_VERIFICATION = 'verification'; + public const string ACTION_GENERATION = 'generation'; protected bool $skipRenewCheck = false; + protected string $action = self::ACTION_GENERATION; protected ?Document $domain = null; protected ?string $validationDomain = null; @@ -90,6 +93,28 @@ class Certificate extends Event return $this->skipRenewCheck; } + /** + * Set action for this certificate event. + * + * @param string $action + * @return self + */ + public function setAction(string $action): self + { + $this->action = $action; + return $this; + } + + /** + * Get action for this certificate event. + * + * @return string + */ + public function getAction(): string + { + return $this->action; + } + /** * Prepare the payload for the event diff --git a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/API/Create.php b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/API/Create.php index ea2f34f8fd..95ea8dd8cf 100644 --- a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/API/Create.php +++ b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/API/Create.php @@ -125,6 +125,7 @@ class Create extends Action 'domain' => $rule->getAttribute('domain'), 'domainType' => $rule->getAttribute('deploymentResourceType', $rule->getAttribute('type')), ])) + ->setAction(Certificate::ACTION_GENERATION) ->trigger(); } 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 0009a2eb57..ea0fb69050 100644 --- a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Function/Create.php +++ b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Function/Create.php @@ -143,6 +143,7 @@ class Create extends Action 'domain' => $rule->getAttribute('domain'), 'domainType' => $rule->getAttribute('deploymentResourceType', $rule->getAttribute('type')), ])) + ->setAction(Certificate::ACTION_GENERATION) ->trigger(); } diff --git a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Get.php b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Get.php index 4581cb3d08..4c17fdc460 100644 --- a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Get.php +++ b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Get.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Proxy\Http\Rules; use Appwrite\Extend\Exception; +use Appwrite\Platform\Modules\Proxy\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; diff --git a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php index 493c827c46..f21374b49a 100644 --- a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php +++ b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Redirect/Create.php @@ -147,6 +147,7 @@ class Create extends Action 'domain' => $rule->getAttribute('domain'), 'domainType' => $rule->getAttribute('deploymentResourceType', $rule->getAttribute('type')), ])) + ->setAction(Certificate::ACTION_GENERATION) ->trigger(); } diff --git a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Site/Create.php b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Site/Create.php index 9ec79139af..26bd453eb3 100644 --- a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Site/Create.php +++ b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/Site/Create.php @@ -143,6 +143,7 @@ class Create extends Action 'domain' => $rule->getAttribute('domain'), 'domainType' => $rule->getAttribute('deploymentResourceType', $rule->getAttribute('type')), ])) + ->setAction(Certificate::ACTION_GENERATION) ->trigger(); } diff --git a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/XList.php b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/XList.php index 198bf55a6f..e160b71060 100644 --- a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/XList.php +++ b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/XList.php @@ -3,6 +3,7 @@ namespace Appwrite\Platform\Modules\Proxy\Http\Rules; use Appwrite\Extend\Exception; +use Appwrite\Platform\Modules\Proxy\Action; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; diff --git a/src/Appwrite/Platform/Services/Tasks.php b/src/Appwrite/Platform/Services/Tasks.php index 3ada193cf7..3b0ba7d5ea 100644 --- a/src/Appwrite/Platform/Services/Tasks.php +++ b/src/Appwrite/Platform/Services/Tasks.php @@ -7,6 +7,7 @@ use Appwrite\Platform\Tasks\Install; use Appwrite\Platform\Tasks\Maintenance; use Appwrite\Platform\Tasks\Migrate; use Appwrite\Platform\Tasks\QueueRetry; +use Appwrite\Platform\Tasks\Rules; use Appwrite\Platform\Tasks\ScheduleExecutions; use Appwrite\Platform\Tasks\ScheduleFunctions; use Appwrite\Platform\Tasks\ScheduleMessages; @@ -29,6 +30,7 @@ class Tasks extends Service ->addAction(Doctor::getName(), new Doctor()) ->addAction(Install::getName(), new Install()) ->addAction(Maintenance::getName(), new Maintenance()) + ->addAction(Rules::getName(), new Rules()) ->addAction(Migrate::getName(), new Migrate()) ->addAction(QueueRetry::getName(), new QueueRetry()) ->addAction(SDKs::getName(), new SDKs()) diff --git a/src/Appwrite/Platform/Tasks/Maintenance.php b/src/Appwrite/Platform/Tasks/Maintenance.php index 9c88bc4d4e..66d3a3d9de 100644 --- a/src/Appwrite/Platform/Tasks/Maintenance.php +++ b/src/Appwrite/Platform/Tasks/Maintenance.php @@ -92,7 +92,6 @@ class Maintenance extends Action ->trigger(); $this->notifyDeleteConnections($queueForDeletes); - $this->renewCertificates($dbForPlatform, $queueForCertificates); $this->notifyDeleteCache($cacheRetention, $queueForDeletes); $this->notifyDeleteSchedules($schedulesDeletionRetention, $queueForDeletes); $this->notifyDeleteCSVExports($queueForDeletes); @@ -114,47 +113,6 @@ class Maintenance extends Action ->trigger(); } - private function renewCertificates(Database $dbForPlatform, Certificate $queueForCertificate): void - { - $time = DatabaseDateTime::now(); - - $certificates = $dbForPlatform->find('certificates', [ - Query::lessThan('attempts', 5), // Maximum 5 attempts - Query::isNotNull('renewDate'), - Query::lessThanEqual('renewDate', $time), // includes 60 days cooldown (we have 30 days to renew) - Query::limit(200), // Limit 200 comes from LetsEncrypt (300 orders per 3 hours, keeping some for new domains) - ]); - - - if (\count($certificates) > 0) { - Console::info("[{$time}] Found " . \count($certificates) . " certificates for renewal, scheduling jobs."); - - // TODO: (@Meldiron) Remove after 1.7.x migration - $isMd5 = System::getEnv('_APP_RULES_FORMAT') === 'md5'; - - foreach ($certificates as $certificate) { - $domain = $certificate->getAttribute('domain'); - $rule = $isMd5 - ? $dbForPlatform->getDocument('rules', md5($domain)) - : $dbForPlatform->findOne('rules', [ - Query::equal('domain', [$domain]), - ]); - - if ($rule->isEmpty() || $rule->getAttribute('region') !== System::getEnv('_APP_REGION', 'default')) { - continue; - } - - $queueForCertificate - ->setDomain(new Document([ - 'domain' => $certificate->getAttribute('domain') - ])) - ->trigger(); - } - } else { - Console::info("[{$time}] No certificates for renewal."); - } - } - private function notifyDeleteCache($interval, Delete $queueForDeletes): void { $queueForDeletes diff --git a/src/Appwrite/Platform/Tasks/Rules.php b/src/Appwrite/Platform/Tasks/Rules.php new file mode 100644 index 0000000000..1398459a88 --- /dev/null +++ b/src/Appwrite/Platform/Tasks/Rules.php @@ -0,0 +1,126 @@ +desc('Schedules periodic tasks for rule verification and certificate renewal') + ->inject('dbForPlatform') + ->inject('queueForCertificates') + ->callback($this->action(...)); + } + + public function action(Database $dbForPlatform, Certificate $queueForCertificates): void + { + Console::title('Interval V1'); + Console::success(APP_NAME . ' interval process v1 has started'); + + $intervalRuleVerification = (int) System::getEnv('_APP_MAINTENANCE_RULE_VERIFICATION_INTERVAL', '60'); // 1 minute + $intervalCertificateRenewal = (int) System::getEnv('_APP_MAINTENANCE_CERTIFICATE_RENEWAL_INTERVAL', '86400'); // 1 day + + \go(function () use ($dbForPlatform, $queueForCertificates, $intervalRuleVerification) { + Console::loop(function () use ($dbForPlatform, $queueForCertificates) { + $this->checkRuleVerification($dbForPlatform, $queueForCertificates); + }, $intervalRuleVerification); + }); + + \go(function () use ($dbForPlatform, $queueForCertificates, $intervalCertificateRenewal) { + Console::loop(function () use ($dbForPlatform, $queueForCertificates) { + $this->renewCertificates($dbForPlatform, $queueForCertificates); + }, $intervalCertificateRenewal); + }); + } + + private function checkRuleVerification(Database $dbForPlatform, Certificate $queueForCertificate): void + { + $time = DatabaseDateTime::now(); + $fromTime = new DateTime('-3 days'); // Max 3 days old + + $rules = $dbForPlatform->find('rules', [ + Query::createdAfter(DatabaseDateTime::format($fromTime)), + Query::equal('status', [RULE_STATUS_CREATED]), // Created but not verified yet + Query::orderAsc('$updatedAt'), // Pick the ones waiting for another attempt for longest + Query::equal('region', [System::getEnv('_APP_REGION', 'default')]), // Only current region + Query::limit(30), // Reasonable pagination limit, processable within a minute + ]); + + if (\count($rules) === 0) { + Console::info("[{$time}] No rules for verification."); + return; // No rules to verify + } + + Console::info("[{$time}] Found " . \count($rules) . " rules for verification, scheduling jobs."); + + foreach ($rules as $rule) { + $queueForCertificate + ->setDomain(new Document([ + 'domain' => $rule->getAttribute('domain'), + 'domainType' => $rule->getAttribute('deploymentResourceType', $rule->getAttribute('type')), + ])) + ->setAction(Certificate::ACTION_DOMAIN_VERIFICATION) + ->trigger(); + } + } + + private function renewCertificates(Database $dbForPlatform, Certificate $queueForCertificate): void + { + $time = DatabaseDateTime::now(); + + $certificates = $dbForPlatform->find('certificates', [ + Query::lessThan('attempts', 5), // Maximum 5 attempts + Query::isNotNull('renewDate'), + Query::lessThanEqual('renewDate', $time), // includes 60 days cooldown (we have 30 days to renew) + Query::limit(200), // Limit 200 comes from LetsEncrypt (300 orders per 3 hours, keeping some for new domains) + ]); + + if (\count($certificates) === 0) { + Console::info("[{$time}] No certificates for renewal."); + return; + } + + Console::info("[{$time}] Found " . \count($certificates) . " certificates for renewal, scheduling jobs."); + + $isMd5 = System::getEnv('_APP_RULES_FORMAT') === 'md5'; + $appRegion = System::getEnv('_APP_REGION', 'default'); + + foreach ($certificates as $certificate) { + $domain = $certificate->getAttribute('domain'); + $rule = $isMd5 ? + $dbForPlatform->getDocument('rules', md5($domain)) : + $dbForPlatform->findOne('rules', [ + Query::equal('domain', [$domain]), + Query::limit(1) + ]); + + if ($rule->isEmpty() || $rule->getAttribute('region') !== $appRegion) { + continue; + } + + $queueForCertificate + ->setDomain(new Document([ + 'domain' => $rule->getAttribute('domain'), + 'domainType' => $rule->getAttribute('deploymentResourceType', $rule->getAttribute('type')), + ])) + ->setAction(Certificate::ACTION_GENERATION) + ->trigger(); + } + } +} diff --git a/src/Appwrite/Platform/Workers/Certificates.php b/src/Appwrite/Platform/Workers/Certificates.php index 68572961aa..a78918471a 100644 --- a/src/Appwrite/Platform/Workers/Certificates.php +++ b/src/Appwrite/Platform/Workers/Certificates.php @@ -3,11 +3,13 @@ namespace Appwrite\Platform\Workers; use Appwrite\Certificates\Adapter as CertificatesAdapter; +use Appwrite\Event\Certificate; use Appwrite\Event\Event; use Appwrite\Event\Func; use Appwrite\Event\Mail; use Appwrite\Event\Realtime; use Appwrite\Event\Webhook; +use Appwrite\Extend\Exception as AppwriteException; use Appwrite\Platform\Modules\Proxy\Action; use Appwrite\Template\Template; use Appwrite\Utopia\Response\Model\Rule; @@ -20,9 +22,9 @@ use Utopia\Database\Document; use Utopia\Database\Exception\Authorization; use Utopia\Database\Exception\Conflict; use Utopia\Database\Exception\Structure; -use Utopia\Database\Validator\Authorization as ValidatorAuthorization; use Utopia\Database\Helpers\ID; use Utopia\Database\Query; +use Utopia\Database\Validator\Authorization as ValidatorAuthorization; use Utopia\Domains\Domain; use Utopia\Locale\Locale; use Utopia\Logger\Log; @@ -52,6 +54,7 @@ class Certificates extends Action ->inject('queueForWebhooks') ->inject('queueForFunctions') ->inject('queueForRealtime') + ->inject('queueForCertificates') ->inject('log') ->inject('certificates') ->inject('plan') @@ -66,6 +69,7 @@ class Certificates extends Action * @param Webhook $queueForWebhooks * @param Func $queueForFunctions * @param Realtime $queueForRealtime + * @param Certificate $queueForCertificates * @param Log $log * @param CertificatesAdapter $certificates * @return void @@ -80,6 +84,7 @@ class Certificates extends Action Webhook $queueForWebhooks, Func $queueForFunctions, Realtime $queueForRealtime, + Certificate $queueForCertificates, Log $log, CertificatesAdapter $certificates, array $plan @@ -95,10 +100,88 @@ class Certificates extends Action $domainType = $document->getAttribute('domainType'); $skipRenewCheck = $payload['skipRenewCheck'] ?? false; $validationDomain = $payload['validationDomain'] ?? null; + $action = $payload['action'] ?? Certificate::ACTION_GENERATION; $log->addTag('domain', $domain->get()); - $this->execute($domain, $domainType, $dbForPlatform, $queueForMails, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime, $log, $certificates, $skipRenewCheck, $plan, $validationDomain); + switch ($action) { + case Certificate::ACTION_DOMAIN_VERIFICATION: + $this->handleDomainVerificationAction($domain, $dbForPlatform, $log, $queueForCertificates, $validationDomain); + break; + + case Certificate::ACTION_GENERATION: + $this->handleCertificateGenerationAction($domain, $domainType, $dbForPlatform, $queueForMails, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime, $log, $certificates, $skipRenewCheck, $plan, $validationDomain); + break; + + default: + throw new Exception('Invalid action: ' . $action); + } + + + } + + /** + * @param Domain $domain + * @param Database $dbForPlatform + * @param Log $log + * @param Certificate $queueForCertificates + * @return void + * @throws Throwable + * @throws \Utopia\Database\Exception + */ + private function handleDomainVerificationAction( + Domain $domain, + Database $dbForPlatform, + Log $log, + Certificate $queueForCertificates, + ?string $validationDomain = null, + ): void { + // Get rule + $rule = System::getEnv('_APP_RULES_FORMAT') === 'md5' + ? ValidatorAuthorization::skip(fn () => $dbForPlatform->getDocument('rules', md5($domain->get()))) + : ValidatorAuthorization::skip(fn () => $dbForPlatform->findOne('rules', [ + Query::equal('domain', [$domain->get()]), + Query::limit(1), + ])); + + // Skip if rule is not desired state (created but not verified yet). + if ($rule->getAttribute('status', '') !== RULE_STATUS_CREATED) { + Console::warning('Domain verification for ' . $rule->getAttribute('domain', '') . ' is not needed.'); + return; + } + + Console::info('Domain verification for ' . $rule->getAttribute('domain', '') . ' started.'); + + $updates = new Document(); + try { + // Verify DNS records + $this->validateDomain($rule, $domain, $log, $validationDomain); + // Reset logs and status for the rule + $updates + ->setAttribute('logs', '') + ->setAttribute('status', RULE_STATUS_CERTIFICATE_GENERATING); + + Console::success('Domain verification succeeded.'); + } catch (AppwriteException $err) { + Console::warning('Domain verification failed: ' . $err->getMessage()); + $updates->setAttribute('logs', $err->getMessage()); + } + + echo "updating rule with updates: " . \var_dump($updates); + $rule = $dbForPlatform->updateDocument('rules', $rule->getId(), $updates); + + // Issue a TLS certificate when domain is verified + if ($rule->getAttribute('status', '') === RULE_STATUS_CERTIFICATE_GENERATING) { + $queueForCertificates + ->setDomain(new Document([ + 'domain' => $rule->getAttribute('domain'), + 'domainType' => $rule->getAttribute('deploymentResourceType', $rule->getAttribute('type')), + ])) + ->setAction(Certificate::ACTION_GENERATION) + ->trigger(); + + Console::success('Certificate generation triggered successfully.'); + } } /** @@ -117,7 +200,7 @@ class Certificates extends Action * @throws Throwable * @throws \Utopia\Database\Exception */ - private function execute( + private function handleCertificateGenerationAction( Domain $domain, ?string $domainType, Database $dbForPlatform, @@ -172,7 +255,7 @@ class Certificates extends Action // Rule not found (or) not in the expected state if ($rule->isEmpty() || $rule->getAttribute('status') !== RULE_STATUS_CERTIFICATE_GENERATING) { - Console::warning('Certificate generation for ' . $domain . ' is skipped as the associated rule is either empty or not in the expected state.'); + Console::warning('Certificate generation for ' . $domain->get() . ' is skipped as the associated rule is either empty or not in the expected state.'); } // Get associated certificate for the rule @@ -195,7 +278,7 @@ class Certificates extends Action // Validate domain and DNS records. Skip if job is forced if (!$skipRenewCheck) { - $this->validateDomain($rule, $domain, $validationDomain, $log); + $this->validateDomain($rule, $domain, $log, $validationDomain); // If certificate exists already, double-check expiry date. Skip if job is forced if (!$certificates->isRenewRequired($domain->get(), $domainType, $log)) { @@ -355,13 +438,13 @@ class Certificates extends Action * * @param Document $rule Rule to validate * @param Domain $domain Domain to validate - * @param string|null $validationDomain Override for main domain check * @param Log $log Logger for adding metrics + * @param string|null $validationDomain Override for main domain check * * @return void * @throws Exception */ - private function validateDomain(Document $rule, Domain $domain, ?string $validationDomain = null, Log $log): void + private function validateDomain(Document $rule, Domain $domain, Log $log, ?string $validationDomain = null): void { $mainDomain = $validationDomain ?? $this->getMainDomain(); $isMainDomain = !isset($mainDomain) || $domain->get() === $mainDomain; From 6f1d2d094a14e4972430e727cb68dd45b8c54ad5 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Thu, 18 Dec 2025 13:00:49 +0530 Subject: [PATCH 34/95] rename task --- .env | 4 ++-- Dockerfile | 2 +- bin/maintenance-rules | 3 +++ bin/rules | 3 --- docker-compose.yml | 10 +++++----- src/Appwrite/Platform/Services/Tasks.php | 4 ++-- .../Tasks/{Rules.php => MaintenanceRules.php} | 16 ++++++++-------- 7 files changed, 21 insertions(+), 21 deletions(-) create mode 100644 bin/maintenance-rules delete mode 100644 bin/rules rename src/Appwrite/Platform/Tasks/{Rules.php => MaintenanceRules.php} (89%) diff --git a/.env b/.env index d211f0ae6e..be0e5df718 100644 --- a/.env +++ b/.env @@ -101,8 +101,8 @@ _APP_USAGE_AGGREGATION_INTERVAL=30 _APP_STATS_RESOURCES_INTERVAL=30 _APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000 _APP_MAINTENANCE_RETENTION_SCHEDULES=86400 -_APP_MAINTENANCE_RULE_VERIFICATION_INTERVAL=60 -_APP_MAINTENANCE_CERTIFICATE_RENEWAL_INTERVAL=86400 +_APP_MAINTENANCE_RULE_DOMAIN_VERIFICATION_INTERVAL=60 +_APP_MAINTENANCE_RULE_CERTIFICATE_RENEWAL_INTERVAL=86400 _APP_USAGE_STATS=enabled _APP_LOGGING_CONFIG= _APP_LOGGING_CONFIG_REALTIME= diff --git a/Dockerfile b/Dockerfile index b65b73469c..71baa9e1c6 100755 --- a/Dockerfile +++ b/Dockerfile @@ -58,7 +58,7 @@ RUN mkdir -p /storage/uploads && \ RUN chmod +x /usr/local/bin/doctor && \ chmod +x /usr/local/bin/install && \ chmod +x /usr/local/bin/maintenance && \ - chmod +x /usr/local/bin/rules && \ + chmod +x /usr/local/bin/maintenance-rules && \ chmod +x /usr/local/bin/migrate && \ chmod +x /usr/local/bin/realtime && \ chmod +x /usr/local/bin/schedule-functions && \ diff --git a/bin/maintenance-rules b/bin/maintenance-rules new file mode 100644 index 0000000000..666e517ca0 --- /dev/null +++ b/bin/maintenance-rules @@ -0,0 +1,3 @@ +#!/bin/sh + +php /usr/src/code/app/cli.php maintenance-rules $@ \ No newline at end of file diff --git a/bin/rules b/bin/rules deleted file mode 100644 index 77e195eb61..0000000000 --- a/bin/rules +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -php /usr/src/code/app/cli.php rules $@ \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 99b42561b3..5490d19b68 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -786,10 +786,10 @@ services: - _APP_MAINTENANCE_START_TIME - _APP_DATABASE_SHARED_TABLES - appwrite-task-rules: - entrypoint: rules + appwrite-task-maintenance-rules: + entrypoint: maintenance-rules <<: *x-logging - container_name: appwrite-task-rules + container_name: appwrite-task-maintenance-rules image: appwrite-dev networks: - appwrite @@ -820,8 +820,8 @@ services: - _APP_DB_USER - _APP_DB_PASS - _APP_DATABASE_SHARED_TABLES - - _APP_MAINTENANCE_RULE_VERIFICATION_INTERVAL - - _APP_MAINTENANCE_CERTIFICATE_RENEWAL_INTERVAL + - _APP_MAINTENANCE_RULE_DOMAIN_VERIFICATION_INTERVAL + - _APP_MAINTENANCE_RULE_CERTIFICATE_RENEWAL_INTERVAL appwrite-task-stats-resources: container_name: appwrite-task-stats-resources diff --git a/src/Appwrite/Platform/Services/Tasks.php b/src/Appwrite/Platform/Services/Tasks.php index 3b0ba7d5ea..f68e3922ac 100644 --- a/src/Appwrite/Platform/Services/Tasks.php +++ b/src/Appwrite/Platform/Services/Tasks.php @@ -7,7 +7,7 @@ use Appwrite\Platform\Tasks\Install; use Appwrite\Platform\Tasks\Maintenance; use Appwrite\Platform\Tasks\Migrate; use Appwrite\Platform\Tasks\QueueRetry; -use Appwrite\Platform\Tasks\Rules; +use Appwrite\Platform\Tasks\MaintenanceRules; use Appwrite\Platform\Tasks\ScheduleExecutions; use Appwrite\Platform\Tasks\ScheduleFunctions; use Appwrite\Platform\Tasks\ScheduleMessages; @@ -30,7 +30,7 @@ class Tasks extends Service ->addAction(Doctor::getName(), new Doctor()) ->addAction(Install::getName(), new Install()) ->addAction(Maintenance::getName(), new Maintenance()) - ->addAction(Rules::getName(), new Rules()) + ->addAction(MaintenanceRules::getName(), new MaintenanceRules()) ->addAction(Migrate::getName(), new Migrate()) ->addAction(QueueRetry::getName(), new QueueRetry()) ->addAction(SDKs::getName(), new SDKs()) diff --git a/src/Appwrite/Platform/Tasks/Rules.php b/src/Appwrite/Platform/Tasks/MaintenanceRules.php similarity index 89% rename from src/Appwrite/Platform/Tasks/Rules.php rename to src/Appwrite/Platform/Tasks/MaintenanceRules.php index 1398459a88..03e08bda0a 100644 --- a/src/Appwrite/Platform/Tasks/Rules.php +++ b/src/Appwrite/Platform/Tasks/MaintenanceRules.php @@ -12,11 +12,11 @@ use Utopia\Database\Query; use Utopia\Platform\Action; use Utopia\System\System; -class Rules extends Action +class MaintenanceRules extends Action { public static function getName(): string { - return 'rules'; + return 'maintenance-rules'; } public function __construct() @@ -33,19 +33,19 @@ class Rules extends Action Console::title('Interval V1'); Console::success(APP_NAME . ' interval process v1 has started'); - $intervalRuleVerification = (int) System::getEnv('_APP_MAINTENANCE_RULE_VERIFICATION_INTERVAL', '60'); // 1 minute - $intervalCertificateRenewal = (int) System::getEnv('_APP_MAINTENANCE_CERTIFICATE_RENEWAL_INTERVAL', '86400'); // 1 day + $intervalRuleDomainVerification = (int) System::getEnv('_APP_MAINTENANCE_RULE_DOMAIN_VERIFICATION_INTERVAL', '60'); // 1 minute + $intervalRuleCertificateRenewal = (int) System::getEnv('_APP_MAINTENANCE_RULE_CERTIFICATE_RENEWAL_INTERVAL', '86400'); // 1 day - \go(function () use ($dbForPlatform, $queueForCertificates, $intervalRuleVerification) { + \go(function () use ($dbForPlatform, $queueForCertificates, $intervalRuleDomainVerification) { Console::loop(function () use ($dbForPlatform, $queueForCertificates) { $this->checkRuleVerification($dbForPlatform, $queueForCertificates); - }, $intervalRuleVerification); + }, $intervalRuleDomainVerification); }); - \go(function () use ($dbForPlatform, $queueForCertificates, $intervalCertificateRenewal) { + \go(function () use ($dbForPlatform, $queueForCertificates, $intervalRuleCertificateRenewal) { Console::loop(function () use ($dbForPlatform, $queueForCertificates) { $this->renewCertificates($dbForPlatform, $queueForCertificates); - }, $intervalCertificateRenewal); + }, $intervalRuleCertificateRenewal); }); } From 62b391ef680c6a183e1484d6425f103b46470f1e Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Thu, 18 Dec 2025 13:46:56 +0530 Subject: [PATCH 35/95] certificate status exception --- src/Appwrite/Certificates/Adapter.php | 2 ++ .../Certificates/Exception/CertificateStatus.php | 10 ++++++++++ src/Appwrite/Certificates/LetsEncrypt.php | 6 ++++++ src/Appwrite/Platform/Tasks/MaintenanceRules.php | 4 ++-- 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 src/Appwrite/Certificates/Exception/CertificateStatus.php diff --git a/src/Appwrite/Certificates/Adapter.php b/src/Appwrite/Certificates/Adapter.php index 770d2bb71d..47d865ad08 100644 --- a/src/Appwrite/Certificates/Adapter.php +++ b/src/Appwrite/Certificates/Adapter.php @@ -10,6 +10,8 @@ interface Adapter public function isInstantGeneration(string $domain, ?string $domainType): bool; + public function getCertificateStatus(string $domain, ?string $domainType): string; + public function isRenewRequired(string $domain, ?string $domainType, Log $log): bool; public function deleteCertificate(string $domain): void; diff --git a/src/Appwrite/Certificates/Exception/CertificateStatus.php b/src/Appwrite/Certificates/Exception/CertificateStatus.php new file mode 100644 index 0000000000..652c1c4253 --- /dev/null +++ b/src/Appwrite/Certificates/Exception/CertificateStatus.php @@ -0,0 +1,10 @@ + Date: Thu, 18 Dec 2025 15:14:30 +0530 Subject: [PATCH 36/95] add action to payload --- docker-compose.yml | 2 ++ src/Appwrite/Event/Certificate.php | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5490d19b68..30b0737543 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -754,6 +754,7 @@ services: - ./app:/usr/src/code/app - ./src:/usr/src/code/src depends_on: + - mariadb - redis environment: - _APP_ENV @@ -797,6 +798,7 @@ services: - ./app:/usr/src/code/app - ./src:/usr/src/code/src depends_on: + - mariadb - redis environment: - _APP_ENV diff --git a/src/Appwrite/Event/Certificate.php b/src/Appwrite/Event/Certificate.php index 7e60d15180..4ad12094c2 100644 --- a/src/Appwrite/Event/Certificate.php +++ b/src/Appwrite/Event/Certificate.php @@ -127,7 +127,8 @@ class Certificate extends Event 'project' => $this->project, 'domain' => $this->domain, 'skipRenewCheck' => $this->skipRenewCheck, - 'validationDomain' => $this->validationDomain + 'validationDomain' => $this->validationDomain, + 'action' => $this->action ]; } } From aa4ecdf13898eafa3111e8301f0b88b874570caf Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Thu, 18 Dec 2025 16:07:15 +0530 Subject: [PATCH 37/95] emit events --- .../Platform/Workers/Certificates.php | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/Appwrite/Platform/Workers/Certificates.php b/src/Appwrite/Platform/Workers/Certificates.php index a78918471a..5c3fe9aede 100644 --- a/src/Appwrite/Platform/Workers/Certificates.php +++ b/src/Appwrite/Platform/Workers/Certificates.php @@ -106,7 +106,7 @@ class Certificates extends Action switch ($action) { case Certificate::ACTION_DOMAIN_VERIFICATION: - $this->handleDomainVerificationAction($domain, $dbForPlatform, $log, $queueForCertificates, $validationDomain); + $this->handleDomainVerificationAction($domain, $dbForPlatform, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime, $queueForCertificates, $log, $validationDomain); break; case Certificate::ACTION_GENERATION: @@ -123,8 +123,13 @@ class Certificates extends Action /** * @param Domain $domain * @param Database $dbForPlatform - * @param Log $log + * @param Event $queueForEvents + * @param Webhook $queueForWebhooks + * @param Func $queueForFunctions + * @param Realtime $queueForRealtime * @param Certificate $queueForCertificates + * @param Log $log + * @param string|null $validationDomain * @return void * @throws Throwable * @throws \Utopia\Database\Exception @@ -132,8 +137,12 @@ class Certificates extends Action private function handleDomainVerificationAction( Domain $domain, Database $dbForPlatform, - Log $log, + Event $queueForEvents, + Webhook $queueForWebhooks, + Func $queueForFunctions, + Realtime $queueForRealtime, Certificate $queueForCertificates, + Log $log, ?string $validationDomain = null, ): void { // Get rule @@ -152,23 +161,22 @@ class Certificates extends Action Console::info('Domain verification for ' . $rule->getAttribute('domain', '') . ' started.'); - $updates = new Document(); try { // Verify DNS records $this->validateDomain($rule, $domain, $log, $validationDomain); // Reset logs and status for the rule - $updates - ->setAttribute('logs', '') - ->setAttribute('status', RULE_STATUS_CERTIFICATE_GENERATING); + $rule->setAttribute('logs', ''); + $rule->setAttribute('status', RULE_STATUS_CERTIFICATE_GENERATING); Console::success('Domain verification succeeded.'); } catch (AppwriteException $err) { Console::warning('Domain verification failed: ' . $err->getMessage()); - $updates->setAttribute('logs', $err->getMessage()); + $rule->setAttribute('logs', $err->getMessage()); + } finally { + // Update rule and emit events + $this->updateRuleAndSendEvents($rule, $dbForPlatform, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime); } - echo "updating rule with updates: " . \var_dump($updates); - $rule = $dbForPlatform->updateDocument('rules', $rule->getId(), $updates); // Issue a TLS certificate when domain is verified if ($rule->getAttribute('status', '') === RULE_STATUS_CERTIFICATE_GENERATING) { @@ -333,7 +341,7 @@ class Certificates extends Action // Ensure certificate is associated with the rule $rule->setAttribute('certificateId', $certificate->getId()); // Update rule and emit events - $this->updateDomainDocuments($rule, $dbForPlatform, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime); + $this->updateRuleAndSendEvents($rule, $dbForPlatform, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime); } } @@ -384,7 +392,7 @@ class Certificates extends Action * * @return void */ - private function updateDomainDocuments( + protected function updateRuleAndSendEvents( Document $rule, Database $dbForPlatform, Event $queueForEvents, From e78887001afb86af53311f31834bf227f2de702a Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Thu, 18 Dec 2025 16:18:23 +0530 Subject: [PATCH 38/95] spacing --- src/Appwrite/Platform/Workers/Certificates.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Appwrite/Platform/Workers/Certificates.php b/src/Appwrite/Platform/Workers/Certificates.php index 5c3fe9aede..6371f6c313 100644 --- a/src/Appwrite/Platform/Workers/Certificates.php +++ b/src/Appwrite/Platform/Workers/Certificates.php @@ -401,7 +401,6 @@ class Certificates extends Action Realtime $queueForRealtime ): void { $rule = $dbForPlatform->updateDocument('rules', $rule->getId(), $rule); - $projectId = $rule->getAttribute('projectId'); // Skip events for console project (triggered by auto-ssl generation for 1 click setups) @@ -410,7 +409,6 @@ class Certificates extends Action } $project = $dbForPlatform->getDocument('projects', $projectId); - if ($project->isEmpty()) { return; } From 16fb25ce5a9e74961e7b3a0ef40ebb47d7b34f3b Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Thu, 18 Dec 2025 17:10:02 +0530 Subject: [PATCH 39/95] tiny --- src/Appwrite/Platform/Tasks/MaintenanceRules.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Appwrite/Platform/Tasks/MaintenanceRules.php b/src/Appwrite/Platform/Tasks/MaintenanceRules.php index c83207063a..cbcd538d8c 100644 --- a/src/Appwrite/Platform/Tasks/MaintenanceRules.php +++ b/src/Appwrite/Platform/Tasks/MaintenanceRules.php @@ -38,7 +38,7 @@ class MaintenanceRules extends Action \go(function () use ($dbForPlatform, $queueForCertificates, $intervalRuleDomainVerification) { Console::loop(function () use ($dbForPlatform, $queueForCertificates) { - $this->checkRuleVerification($dbForPlatform, $queueForCertificates); + $this->verifyDomain($dbForPlatform, $queueForCertificates); }, $intervalRuleDomainVerification); }); @@ -49,7 +49,7 @@ class MaintenanceRules extends Action }); } - private function checkRuleVerification(Database $dbForPlatform, Certificate $queueForCertificate): void + private function verifyDomain(Database $dbForPlatform, Certificate $queueForCertificate): void { $time = DatabaseDateTime::now(); $fromTime = new DateTime('-3 days'); // Max 3 days old @@ -63,11 +63,11 @@ class MaintenanceRules extends Action ]); if (\count($rules) === 0) { - Console::info("[{$time}] No rules for verification."); + Console::info("[{$time}] No rules for domain verification."); return; // No rules to verify } - Console::info("[{$time}] Found " . \count($rules) . " rules for verification, scheduling jobs."); + Console::info("[{$time}] Found " . \count($rules) . " rules for domain verification, scheduling jobs."); foreach ($rules as $rule) { $queueForCertificate From cf90653deb7d44ae7f42eff80725e083e3f07ff9 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Thu, 18 Dec 2025 17:30:08 +0530 Subject: [PATCH 40/95] lint --- src/Appwrite/Certificates/Exception/CertificateStatus.php | 2 +- src/Appwrite/Platform/Services/Tasks.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Certificates/Exception/CertificateStatus.php b/src/Appwrite/Certificates/Exception/CertificateStatus.php index 652c1c4253..3d94109d0e 100644 --- a/src/Appwrite/Certificates/Exception/CertificateStatus.php +++ b/src/Appwrite/Certificates/Exception/CertificateStatus.php @@ -7,4 +7,4 @@ use Exception; // Exception thrown during certificate status retrieval class CertificateStatus extends Exception { -} \ No newline at end of file +} diff --git a/src/Appwrite/Platform/Services/Tasks.php b/src/Appwrite/Platform/Services/Tasks.php index f68e3922ac..f585557690 100644 --- a/src/Appwrite/Platform/Services/Tasks.php +++ b/src/Appwrite/Platform/Services/Tasks.php @@ -5,9 +5,9 @@ namespace Appwrite\Platform\Services; use Appwrite\Platform\Tasks\Doctor; use Appwrite\Platform\Tasks\Install; use Appwrite\Platform\Tasks\Maintenance; +use Appwrite\Platform\Tasks\MaintenanceRules; use Appwrite\Platform\Tasks\Migrate; use Appwrite\Platform\Tasks\QueueRetry; -use Appwrite\Platform\Tasks\MaintenanceRules; use Appwrite\Platform\Tasks\ScheduleExecutions; use Appwrite\Platform\Tasks\ScheduleFunctions; use Appwrite\Platform\Tasks\ScheduleMessages; From 47ea2893c3bb469edf3048e95004f7eda3ff149e Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Tue, 23 Dec 2025 16:32:43 +0530 Subject: [PATCH 41/95] rename task to Interval --- .env | 4 ++-- Dockerfile | 2 +- bin/interval | 3 +++ bin/maintenance-rules | 3 --- docker-compose.yml | 10 ++++----- src/Appwrite/Platform/Services/Tasks.php | 4 ++-- .../{MaintenanceRules.php => Interval.php} | 22 +++++++++---------- .../Platform/Workers/Certificates.php | 1 + 8 files changed, 25 insertions(+), 24 deletions(-) create mode 100644 bin/interval delete mode 100644 bin/maintenance-rules rename src/Appwrite/Platform/Tasks/{MaintenanceRules.php => Interval.php} (85%) diff --git a/.env b/.env index be0e5df718..4dd381cb82 100644 --- a/.env +++ b/.env @@ -101,8 +101,8 @@ _APP_USAGE_AGGREGATION_INTERVAL=30 _APP_STATS_RESOURCES_INTERVAL=30 _APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000 _APP_MAINTENANCE_RETENTION_SCHEDULES=86400 -_APP_MAINTENANCE_RULE_DOMAIN_VERIFICATION_INTERVAL=60 -_APP_MAINTENANCE_RULE_CERTIFICATE_RENEWAL_INTERVAL=86400 +_APP_INTERVAL_DOMAIN_VERIFICATION=60 +_APP_INTERVAL_CERTIFICATE_RENEWAL=86400 _APP_USAGE_STATS=enabled _APP_LOGGING_CONFIG= _APP_LOGGING_CONFIG_REALTIME= diff --git a/Dockerfile b/Dockerfile index 71baa9e1c6..ecc5112cc4 100755 --- a/Dockerfile +++ b/Dockerfile @@ -57,8 +57,8 @@ RUN mkdir -p /storage/uploads && \ # Executables RUN chmod +x /usr/local/bin/doctor && \ chmod +x /usr/local/bin/install && \ + chmod +x /usr/local/bin/interval && \ chmod +x /usr/local/bin/maintenance && \ - chmod +x /usr/local/bin/maintenance-rules && \ chmod +x /usr/local/bin/migrate && \ chmod +x /usr/local/bin/realtime && \ chmod +x /usr/local/bin/schedule-functions && \ diff --git a/bin/interval b/bin/interval new file mode 100644 index 0000000000..e4355b1dc3 --- /dev/null +++ b/bin/interval @@ -0,0 +1,3 @@ +#!/bin/sh + +php /usr/src/code/app/cli.php interval $@ \ No newline at end of file diff --git a/bin/maintenance-rules b/bin/maintenance-rules deleted file mode 100644 index 666e517ca0..0000000000 --- a/bin/maintenance-rules +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -php /usr/src/code/app/cli.php maintenance-rules $@ \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 30b0737543..70650b0e57 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -787,10 +787,10 @@ services: - _APP_MAINTENANCE_START_TIME - _APP_DATABASE_SHARED_TABLES - appwrite-task-maintenance-rules: - entrypoint: maintenance-rules + appwrite-task-interval: + entrypoint: interval <<: *x-logging - container_name: appwrite-task-maintenance-rules + container_name: appwrite-task-interval image: appwrite-dev networks: - appwrite @@ -822,8 +822,8 @@ services: - _APP_DB_USER - _APP_DB_PASS - _APP_DATABASE_SHARED_TABLES - - _APP_MAINTENANCE_RULE_DOMAIN_VERIFICATION_INTERVAL - - _APP_MAINTENANCE_RULE_CERTIFICATE_RENEWAL_INTERVAL + - _APP_INTERVAL_DOMAIN_VERIFICATION + - _APP_INTERVAL_CERTIFICATE_RENEWAL appwrite-task-stats-resources: container_name: appwrite-task-stats-resources diff --git a/src/Appwrite/Platform/Services/Tasks.php b/src/Appwrite/Platform/Services/Tasks.php index f585557690..a7854e5cb6 100644 --- a/src/Appwrite/Platform/Services/Tasks.php +++ b/src/Appwrite/Platform/Services/Tasks.php @@ -5,7 +5,7 @@ namespace Appwrite\Platform\Services; use Appwrite\Platform\Tasks\Doctor; use Appwrite\Platform\Tasks\Install; use Appwrite\Platform\Tasks\Maintenance; -use Appwrite\Platform\Tasks\MaintenanceRules; +use Appwrite\Platform\Tasks\Interval; use Appwrite\Platform\Tasks\Migrate; use Appwrite\Platform\Tasks\QueueRetry; use Appwrite\Platform\Tasks\ScheduleExecutions; @@ -29,8 +29,8 @@ class Tasks extends Service $this ->addAction(Doctor::getName(), new Doctor()) ->addAction(Install::getName(), new Install()) + ->addAction(Interval::getName(), new Interval()) ->addAction(Maintenance::getName(), new Maintenance()) - ->addAction(MaintenanceRules::getName(), new MaintenanceRules()) ->addAction(Migrate::getName(), new Migrate()) ->addAction(QueueRetry::getName(), new QueueRetry()) ->addAction(SDKs::getName(), new SDKs()) diff --git a/src/Appwrite/Platform/Tasks/MaintenanceRules.php b/src/Appwrite/Platform/Tasks/Interval.php similarity index 85% rename from src/Appwrite/Platform/Tasks/MaintenanceRules.php rename to src/Appwrite/Platform/Tasks/Interval.php index cbcd538d8c..74ab9db1f1 100644 --- a/src/Appwrite/Platform/Tasks/MaintenanceRules.php +++ b/src/Appwrite/Platform/Tasks/Interval.php @@ -12,17 +12,17 @@ use Utopia\Database\Query; use Utopia\Platform\Action; use Utopia\System\System; -class MaintenanceRules extends Action +class Interval extends Action { public static function getName(): string { - return 'maintenance-rules'; + return 'interval'; } public function __construct() { $this - ->desc('Schedules periodic tasks for rule verification and certificate renewal') + ->desc('Schedules tasks on regular intervals by publishing them to our queues') ->inject('dbForPlatform') ->inject('queueForCertificates') ->callback($this->action(...)); @@ -30,22 +30,22 @@ class MaintenanceRules extends Action public function action(Database $dbForPlatform, Certificate $queueForCertificates): void { - Console::title('Rule maintenance V1'); - Console::success(APP_NAME . ' rule maintenance process v1 has started'); + Console::title('Interval V1'); + Console::success(APP_NAME . ' interval process v1 has started'); - $intervalRuleDomainVerification = (int) System::getEnv('_APP_MAINTENANCE_RULE_DOMAIN_VERIFICATION_INTERVAL', '60'); // 1 minute - $intervalRuleCertificateRenewal = (int) System::getEnv('_APP_MAINTENANCE_RULE_CERTIFICATE_RENEWAL_INTERVAL', '86400'); // 1 day + $intervalDomainVerification = (int) System::getEnv('_APP_INTERVAL_DOMAIN_VERIFICATION', '60'); // 1 minute + $intervalCertificateRenewal = (int) System::getEnv('_APP_INTERVAL_CERTIFICATE_RENEWAL', '86400'); // 1 day - \go(function () use ($dbForPlatform, $queueForCertificates, $intervalRuleDomainVerification) { + \go(function () use ($dbForPlatform, $queueForCertificates, $intervalDomainVerification) { Console::loop(function () use ($dbForPlatform, $queueForCertificates) { $this->verifyDomain($dbForPlatform, $queueForCertificates); - }, $intervalRuleDomainVerification); + }, $intervalDomainVerification); }); - \go(function () use ($dbForPlatform, $queueForCertificates, $intervalRuleCertificateRenewal) { + \go(function () use ($dbForPlatform, $queueForCertificates, $intervalCertificateRenewal) { Console::loop(function () use ($dbForPlatform, $queueForCertificates) { $this->renewCertificates($dbForPlatform, $queueForCertificates); - }, $intervalRuleCertificateRenewal); + }, $intervalCertificateRenewal); }); } diff --git a/src/Appwrite/Platform/Workers/Certificates.php b/src/Appwrite/Platform/Workers/Certificates.php index 6371f6c313..0c4d495724 100644 --- a/src/Appwrite/Platform/Workers/Certificates.php +++ b/src/Appwrite/Platform/Workers/Certificates.php @@ -264,6 +264,7 @@ class Certificates extends Action // Rule not found (or) not in the expected state if ($rule->isEmpty() || $rule->getAttribute('status') !== RULE_STATUS_CERTIFICATE_GENERATING) { Console::warning('Certificate generation for ' . $domain->get() . ' is skipped as the associated rule is either empty or not in the expected state.'); + return; } // Get associated certificate for the rule From 58751bbdf1990d9db8484049a30271dc84ca9383 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Tue, 23 Dec 2025 16:49:35 +0530 Subject: [PATCH 42/95] lint --- src/Appwrite/Platform/Services/Tasks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Services/Tasks.php b/src/Appwrite/Platform/Services/Tasks.php index a7854e5cb6..941530d7ed 100644 --- a/src/Appwrite/Platform/Services/Tasks.php +++ b/src/Appwrite/Platform/Services/Tasks.php @@ -4,8 +4,8 @@ namespace Appwrite\Platform\Services; use Appwrite\Platform\Tasks\Doctor; use Appwrite\Platform\Tasks\Install; -use Appwrite\Platform\Tasks\Maintenance; use Appwrite\Platform\Tasks\Interval; +use Appwrite\Platform\Tasks\Maintenance; use Appwrite\Platform\Tasks\Migrate; use Appwrite\Platform\Tasks\QueueRetry; use Appwrite\Platform\Tasks\ScheduleExecutions; From 5519086c2918eb137a89ba268c3d964ac73429d2 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 24 Dec 2025 01:30:02 +0000 Subject: [PATCH 43/95] Use db 3.x audit --- app/controllers/api/projects.php | 8 +- app/worker.php | 15 ++++ composer.json | 2 +- composer.lock | 110 +++++++++++------------ src/Appwrite/Platform/Workers/Audits.php | 11 +-- 5 files changed, 80 insertions(+), 66 deletions(-) diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index c8064809ce..db4e0063c5 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -21,6 +21,7 @@ use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; use PHPMailer\PHPMailer\PHPMailer; use Utopia\App; +use Utopia\Audit\Adapter\Database as AdapterDatabase; use Utopia\Audit\Audit; use Utopia\Cache\Cache; use Utopia\Config\Config; @@ -247,14 +248,15 @@ App::post('/v1/projects') } if ($create || $projectTables) { - $adapter = new \Utopia\Audit\Adapter\Database($dbForProject); + $adapter = new AdapterDatabase($dbForProject); $audit = new Audit($adapter); $audit->setup(); } if (!$create && $sharedTablesV1) { - $attributes = \array_map(fn ($attribute) => new Document($attribute), Audit::ATTRIBUTES); - $indexes = \array_map(fn (array $index) => new Document($index), Audit::INDEXES); + $adapter = new AdapterDatabase($dbForProject); + $attributes = $adapter->getAttributeDocuments(); + $indexes = $adapter->getIndexDocuments(); $dbForProject->createDocument(Database::METADATA, new Document([ '$id' => ID::custom('audit'), '$permissions' => [Permission::create(Role::any())], diff --git a/app/worker.php b/app/worker.php index 76f3bb9e8a..7868861cf4 100644 --- a/app/worker.php +++ b/app/worker.php @@ -21,6 +21,8 @@ use Appwrite\Utopia\Database\Documents\User; use Executor\Executor; use Swoole\Runtime; use Utopia\Abuse\Adapters\TimeLimit\Redis as TimeLimitRedis; +use Utopia\Audit\Adapter\Database as AdapterDatabase; +use Utopia\Audit\Audit as UtopiaAudit; use Utopia\Cache\Adapter\Pool as CachePool; use Utopia\Cache\Adapter\Sharding; use Utopia\Cache\Cache; @@ -450,6 +452,19 @@ Server::setResource('logError', function (Registry $register, Document $project) Server::setResource('executor', fn () => new Executor()); +Server::setResource('getAudit', function (Database $dbForPlatform, callable $getProjectDB) { + return function (Document $project) use ($dbForPlatform, $getProjectDB) { + if ($project->isEmpty() || $project->getId() === 'console') { + $adapter = new AdapterDatabase($dbForPlatform); + return new UtopiaAudit($adapter); + } + + $dbForProject = $getProjectDB($project); + $adapter = new AdapterDatabase($dbForProject); + return new UtopiaAudit($adapter); + }; +}, ['dbForPlatform', 'getProjectDB']); + $pools = $register->get('pools'); $platform = new Appwrite(); $args = $platform->getEnv('argv'); diff --git a/composer.json b/composer.json index be88d8ae5e..1051b40d42 100644 --- a/composer.json +++ b/composer.json @@ -47,7 +47,7 @@ "appwrite/php-clamav": "2.0.*", "utopia-php/abuse": "1.*", "utopia-php/analytics": "0.10.*", - "utopia-php/audit": "dev-feat-db-3.x", + "utopia-php/audit": "dev-feat-db-3x", "utopia-php/auth": "0.5.*", "utopia-php/cache": "0.13.*", "utopia-php/cli": "0.15.*", diff --git a/composer.lock b/composer.lock index ff6254b821..5dfaab9f67 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d26b9cee30ab2cc3bc5873ac911918d1", + "content-hash": "54b49eb2f01fdf10632c6be6feadb6fe", "packages": [ { "name": "adhocore/jwt", @@ -3552,16 +3552,16 @@ }, { "name": "utopia-php/audit", - "version": "dev-feat-db-3.x", + "version": "dev-feat-db-3x", "source": { "type": "git", "url": "https://github.com/utopia-php/audit.git", - "reference": "4f77e217c86f0cb27d2b51b5e462411ae3579f80" + "reference": "7b35dab40bce66bda56eeeacd2bbcbf1e823f05f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/audit/zipball/4f77e217c86f0cb27d2b51b5e462411ae3579f80", - "reference": "4f77e217c86f0cb27d2b51b5e462411ae3579f80", + "url": "https://api.github.com/repos/utopia-php/audit/zipball/7b35dab40bce66bda56eeeacd2bbcbf1e823f05f", + "reference": "7b35dab40bce66bda56eeeacd2bbcbf1e823f05f", "shasum": "" }, "require": { @@ -3595,9 +3595,9 @@ ], "support": { "issues": "https://github.com/utopia-php/audit/issues", - "source": "https://github.com/utopia-php/audit/tree/feat-db-3.x" + "source": "https://github.com/utopia-php/audit/tree/feat-db-3x" }, - "time": "2025-12-14T08:49:56+00:00" + "time": "2025-12-24T01:20:43+00:00" }, { "name": "utopia-php/auth", @@ -3656,16 +3656,16 @@ }, { "name": "utopia-php/cache", - "version": "0.13.1", + "version": "0.13.2", "source": { "type": "git", "url": "https://github.com/utopia-php/cache.git", - "reference": "97220cb3b3822b166ee016d1646e2ae2815dc540" + "reference": "5768498c9f451482f0bf3eede4d6452ddcd4a0f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/cache/zipball/97220cb3b3822b166ee016d1646e2ae2815dc540", - "reference": "97220cb3b3822b166ee016d1646e2ae2815dc540", + "url": "https://api.github.com/repos/utopia-php/cache/zipball/5768498c9f451482f0bf3eede4d6452ddcd4a0f6", + "reference": "5768498c9f451482f0bf3eede4d6452ddcd4a0f6", "shasum": "" }, "require": { @@ -3674,7 +3674,7 @@ "ext-redis": "*", "php": ">=8.0", "utopia-php/pools": "0.8.*", - "utopia-php/telemetry": "0.1.*" + "utopia-php/telemetry": "*" }, "require-dev": { "laravel/pint": "1.2.*", @@ -3702,9 +3702,9 @@ ], "support": { "issues": "https://github.com/utopia-php/cache/issues", - "source": "https://github.com/utopia-php/cache/tree/0.13.1" + "source": "https://github.com/utopia-php/cache/tree/0.13.2" }, - "time": "2025-05-09T14:43:52+00:00" + "time": "2025-12-17T08:55:43+00:00" }, { "name": "utopia-php/cli", @@ -3898,16 +3898,16 @@ }, { "name": "utopia-php/database", - "version": "3.6.0", + "version": "3.6.1", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "af15066255a5fd7bd2926de37bcbf3d8500fc155" + "reference": "c8c1b2f5770245dd4006e2680681e3efbe8b1fa7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/af15066255a5fd7bd2926de37bcbf3d8500fc155", - "reference": "af15066255a5fd7bd2926de37bcbf3d8500fc155", + "url": "https://api.github.com/repos/utopia-php/database/zipball/c8c1b2f5770245dd4006e2680681e3efbe8b1fa7", + "reference": "c8c1b2f5770245dd4006e2680681e3efbe8b1fa7", "shasum": "" }, "require": { @@ -3950,9 +3950,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/3.6.0" + "source": "https://github.com/utopia-php/database/tree/3.6.1" }, - "time": "2025-12-08T05:23:04+00:00" + "time": "2025-12-16T09:55:41+00:00" }, { "name": "utopia-php/detector", @@ -4001,23 +4001,23 @@ }, { "name": "utopia-php/dns", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/utopia-php/dns.git", - "reference": "dce3453364a4524b7250db8d8eb74820b814409e" + "reference": "5daf8b683dad877491c4df84c6be24850b2f363b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/dns/zipball/dce3453364a4524b7250db8d8eb74820b814409e", - "reference": "dce3453364a4524b7250db8d8eb74820b814409e", + "url": "https://api.github.com/repos/utopia-php/dns/zipball/5daf8b683dad877491c4df84c6be24850b2f363b", + "reference": "5daf8b683dad877491c4df84c6be24850b2f363b", "shasum": "" }, "require": { "php": ">=8.3", "utopia-php/console": "0.0.*", "utopia-php/domains": "0.9.*", - "utopia-php/telemetry": "0.1.*", + "utopia-php/telemetry": "*", "utopia-php/validators": "0.*" }, "require-dev": { @@ -4052,9 +4052,9 @@ ], "support": { "issues": "https://github.com/utopia-php/dns/issues", - "source": "https://github.com/utopia-php/dns/tree/1.4.0" + "source": "https://github.com/utopia-php/dns/tree/1.4.1" }, - "time": "2025-12-05T10:09:00+00:00" + "time": "2025-12-17T09:09:08+00:00" }, { "name": "utopia-php/domains", @@ -4732,21 +4732,21 @@ }, { "name": "utopia-php/pools", - "version": "0.8.2", + "version": "0.8.3", "source": { "type": "git", "url": "https://github.com/utopia-php/pools.git", - "reference": "05c67aba42eb68ac65489cc1e7fc5db83db2dd4d" + "reference": "ad7d6ba946376e81c603204285ce9a674b6502b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/pools/zipball/05c67aba42eb68ac65489cc1e7fc5db83db2dd4d", - "reference": "05c67aba42eb68ac65489cc1e7fc5db83db2dd4d", + "url": "https://api.github.com/repos/utopia-php/pools/zipball/ad7d6ba946376e81c603204285ce9a674b6502b8", + "reference": "ad7d6ba946376e81c603204285ce9a674b6502b8", "shasum": "" }, "require": { - "php": ">=8.3", - "utopia-php/telemetry": "0.1.*" + "php": ">=8.4", + "utopia-php/telemetry": "*" }, "require-dev": { "laravel/pint": "1.*", @@ -4778,9 +4778,9 @@ ], "support": { "issues": "https://github.com/utopia-php/pools/issues", - "source": "https://github.com/utopia-php/pools/tree/0.8.2" + "source": "https://github.com/utopia-php/pools/tree/0.8.3" }, - "time": "2025-04-17T02:04:54+00:00" + "time": "2025-12-17T09:35:18+00:00" }, { "name": "utopia-php/preloader", @@ -4837,16 +4837,16 @@ }, { "name": "utopia-php/queue", - "version": "0.11.1", + "version": "0.11.2", "source": { "type": "git", "url": "https://github.com/utopia-php/queue.git", - "reference": "498bbbef418b1db71b51e1bb62f5d1d752ddd8d6" + "reference": "a854f7c4abc18e0eca55fc5608cd7088d71eb19f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/queue/zipball/498bbbef418b1db71b51e1bb62f5d1d752ddd8d6", - "reference": "498bbbef418b1db71b51e1bb62f5d1d752ddd8d6", + "url": "https://api.github.com/repos/utopia-php/queue/zipball/a854f7c4abc18e0eca55fc5608cd7088d71eb19f", + "reference": "a854f7c4abc18e0eca55fc5608cd7088d71eb19f", "shasum": "" }, "require": { @@ -4856,7 +4856,7 @@ "utopia-php/fetch": "0.4.*", "utopia-php/framework": "0.33.*", "utopia-php/pools": "0.8.*", - "utopia-php/telemetry": "0.1.*" + "utopia-php/telemetry": "*" }, "require-dev": { "ext-redis": "*", @@ -4897,9 +4897,9 @@ ], "support": { "issues": "https://github.com/utopia-php/queue/issues", - "source": "https://github.com/utopia-php/queue/tree/0.11.1" + "source": "https://github.com/utopia-php/queue/tree/0.11.2" }, - "time": "2025-05-30T11:50:34+00:00" + "time": "2025-12-17T09:32:35+00:00" }, { "name": "utopia-php/registry", @@ -4955,16 +4955,16 @@ }, { "name": "utopia-php/storage", - "version": "0.18.16", + "version": "0.18.18", "source": { "type": "git", "url": "https://github.com/utopia-php/storage.git", - "reference": "0c7b8ad68de8e1eb23ccc8af9f27a30eb832930f" + "reference": "acaea524f315f87b8811a2c34450fe2b502f49d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/storage/zipball/0c7b8ad68de8e1eb23ccc8af9f27a30eb832930f", - "reference": "0c7b8ad68de8e1eb23ccc8af9f27a30eb832930f", + "url": "https://api.github.com/repos/utopia-php/storage/zipball/acaea524f315f87b8811a2c34450fe2b502f49d8", + "reference": "acaea524f315f87b8811a2c34450fe2b502f49d8", "shasum": "" }, "require": { @@ -5007,9 +5007,9 @@ ], "support": { "issues": "https://github.com/utopia-php/storage/issues", - "source": "https://github.com/utopia-php/storage/tree/0.18.16" + "source": "https://github.com/utopia-php/storage/tree/0.18.18" }, - "time": "2025-12-03T02:15:45+00:00" + "time": "2025-12-17T07:33:45+00:00" }, { "name": "utopia-php/swoole", @@ -5438,16 +5438,16 @@ "packages-dev": [ { "name": "appwrite/sdk-generator", - "version": "1.5.9", + "version": "1.7.1", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "ee434aa00a9185380b9a39bb46bf86d7104d3a93" + "reference": "14b9ebd7f5e3287cd24ef342c38dfa714808e80e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/ee434aa00a9185380b9a39bb46bf86d7104d3a93", - "reference": "ee434aa00a9185380b9a39bb46bf86d7104d3a93", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/14b9ebd7f5e3287cd24ef342c38dfa714808e80e", + "reference": "14b9ebd7f5e3287cd24ef342c38dfa714808e80e", "shasum": "" }, "require": { @@ -5483,9 +5483,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/1.5.9" + "source": "https://github.com/appwrite/sdk-generator/tree/1.7.1" }, - "time": "2025-11-25T05:22:25+00:00" + "time": "2025-12-22T11:47:51+00:00" }, { "name": "doctrine/annotations", @@ -8971,5 +8971,5 @@ "platform-overrides": { "php": "8.3" }, - "plugin-api-version": "2.9.0" + "plugin-api-version": "2.6.0" } diff --git a/src/Appwrite/Platform/Workers/Audits.php b/src/Appwrite/Platform/Workers/Audits.php index 3349367adf..91dbb7cb00 100644 --- a/src/Appwrite/Platform/Workers/Audits.php +++ b/src/Appwrite/Platform/Workers/Audits.php @@ -4,8 +4,6 @@ namespace Appwrite\Platform\Workers; use Exception; use Throwable; -use Utopia\Audit\Adapter\Database as AdapterDatabase; -use Utopia\Audit\Audit; use Utopia\CLI\Console; use Utopia\Database\Document; use Utopia\Database\Exception\Authorization; @@ -43,8 +41,8 @@ class Audits extends Action $this ->desc('Audits worker') ->inject('message') - ->inject('getProjectDB') ->inject('project') + ->inject('getAudit') ->callback($this->action(...)); $this->lastTriggeredTime = time(); @@ -55,13 +53,14 @@ class Audits extends Action * @param Message $message * @param callable $getProjectDB * @param Document $project + * @param callable $getAudit * @return Commit|NoCommit * @throws Throwable * @throws \Utopia\Database\Exception * @throws Authorization * @throws Structure */ - public function action(Message $message, callable $getProjectDB, Document $project): Commit|NoCommit + public function action(Message $message, Document $project, callable $getAudit): Commit|NoCommit { $payload = $message->getPayload() ?? []; @@ -136,9 +135,7 @@ class Audits extends Action Console::log('Processing Project "' . $sequence . '" batch with ' . count($projectLogs['logs']) . ' events'); $projectDocument = $projectLogs['project']; - $dbForProject = $getProjectDB($projectDocument); - $adapter = new AdapterDatabase($dbForProject); - $audit = new Audit($adapter); + $audit = $getAudit($projectDocument); $audit->logBatch($projectLogs['logs']); Console::success('Audit logs processed successfully'); From 69430154e6c06e6c2bed001e4772cb010c9ab7ab Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 24 Dec 2025 10:24:51 +0000 Subject: [PATCH 44/95] update autit to rc version --- composer.json | 2 +- composer.lock | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/composer.json b/composer.json index 1051b40d42..844a10d7e8 100644 --- a/composer.json +++ b/composer.json @@ -47,7 +47,7 @@ "appwrite/php-clamav": "2.0.*", "utopia-php/abuse": "1.*", "utopia-php/analytics": "0.10.*", - "utopia-php/audit": "dev-feat-db-3x", + "utopia-php/audit": "2.0.2-rc1", "utopia-php/auth": "0.5.*", "utopia-php/cache": "0.13.*", "utopia-php/cli": "0.15.*", diff --git a/composer.lock b/composer.lock index 5dfaab9f67..f637488a9a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "54b49eb2f01fdf10632c6be6feadb6fe", + "content-hash": "b873febd2b03c32ec61a57b690cc44a2", "packages": [ { "name": "adhocore/jwt", @@ -3552,7 +3552,7 @@ }, { "name": "utopia-php/audit", - "version": "dev-feat-db-3x", + "version": "2.0.2-rc1", "source": { "type": "git", "url": "https://github.com/utopia-php/audit.git", @@ -3595,7 +3595,7 @@ ], "support": { "issues": "https://github.com/utopia-php/audit/issues", - "source": "https://github.com/utopia-php/audit/tree/feat-db-3x" + "source": "https://github.com/utopia-php/audit/tree/2.0.2-rc1" }, "time": "2025-12-24T01:20:43+00:00" }, @@ -5438,16 +5438,16 @@ "packages-dev": [ { "name": "appwrite/sdk-generator", - "version": "1.7.1", + "version": "1.7.2", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "14b9ebd7f5e3287cd24ef342c38dfa714808e80e" + "reference": "3876d486e2c00b788fbda677ef9fcc77391b8898" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/14b9ebd7f5e3287cd24ef342c38dfa714808e80e", - "reference": "14b9ebd7f5e3287cd24ef342c38dfa714808e80e", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/3876d486e2c00b788fbda677ef9fcc77391b8898", + "reference": "3876d486e2c00b788fbda677ef9fcc77391b8898", "shasum": "" }, "require": { @@ -5483,9 +5483,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/1.7.1" + "source": "https://github.com/appwrite/sdk-generator/tree/1.7.2" }, - "time": "2025-12-22T11:47:51+00:00" + "time": "2025-12-24T07:49:12+00:00" }, { "name": "doctrine/annotations", @@ -8946,7 +8946,7 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { - "utopia-php/audit": 20 + "utopia-php/audit": 5 }, "prefer-stable": false, "prefer-lowest": false, @@ -8971,5 +8971,5 @@ "platform-overrides": { "php": "8.3" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } From aa17eeb6e356c15544296aab6cef84cb3a789c4e Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 28 Dec 2025 14:19:28 +0545 Subject: [PATCH 45/95] Disable filters for platform and project databases - Stat resources - Disable filters for platform and project databases - Stat resources --- src/Appwrite/Platform/Workers/StatsResources.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index 1ef348091a..4aeef308ae 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -100,6 +100,9 @@ class StatsResources extends Action return; } + $dbForPlatform->disableFilters(); + $dbForProject->disableFilters(); + try { $region = $project->getAttribute('region'); From d2cda9770b3ef4925c59e738728f8a8100c1cb9d Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 28 Dec 2025 09:01:37 +0000 Subject: [PATCH 46/95] Use get audit resource for audit cleanup. --- src/Appwrite/Platform/Workers/Deletes.php | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index db55d3963c..007f398e11 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -10,6 +10,7 @@ use Executor\Executor; use Throwable; use Utopia\Abuse\Adapters\TimeLimit\Database as AbuseDatabase; use Utopia\Audit\Adapter\SQL; +use Utopia\Audit\Audit; use Utopia\Cache\Adapter\Filesystem; use Utopia\Cache\Cache; use Utopia\CLI\Console; @@ -62,6 +63,7 @@ class Deletes extends Action ->inject('executionRetention') ->inject('auditRetention') ->inject('log') + ->inject('getAudit') ->callback($this->action(...)); } @@ -84,7 +86,8 @@ class Deletes extends Action Executor $executor, string $executionRetention, string $auditRetention, - Log $log + Log $log, + callable $getAudit, ): void { $payload = $message->getPayload() ?? []; @@ -145,7 +148,7 @@ class Deletes extends Action break; case DELETE_TYPE_AUDIT: if (!$project->isEmpty()) { - $this->deleteAuditLogs($project, $getProjectDB, $auditRetention); + $this->deleteAuditLogs($project, $auditRetention, $getAudit); } break; case DELETE_TYPE_REALTIME: @@ -777,23 +780,20 @@ class Deletes extends Action * @param Database $dbForPlatform * @param callable $getProjectDB * @param string $auditRetention + * @param callable $getAudit * @return void * @throws Exception */ - private function deleteAuditLogs(Document $project, callable $getProjectDB, string $auditRetention): void + private function deleteAuditLogs(Document $project, string $auditRetention, callable $getAudit): void { $projectId = $project->getId(); - $dbForProject = $getProjectDB($project); + /** @var Audit $audit */ + $audit = $getAudit($project); try { - $this->deleteByGroup(SQL::COLLECTION, [ - Query::select([...$this->selects, 'time']), - Query::lessThan('time', $auditRetention), - Query::orderDesc('time'), - Query::orderAsc(), - ], $dbForProject); - } catch (DatabaseException $e) { - Console::error('Failed to delete audit logs for project ' . $projectId . ': ' . $e->getMessage()); + $audit->cleanup(new \DateTime($auditRetention)); + } catch (Throwable $th) { + Console::error('Failed to delete audit logs for project ' . $projectId . ': ' . $th->getMessage()); } } From b32dd316e12922a4baa543ea2c16a1e404f30a7b Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 28 Dec 2025 09:09:11 +0000 Subject: [PATCH 47/95] Fix: use skip filters instead --- .../Platform/Workers/StatsResources.php | 154 +++++++++--------- 1 file changed, 78 insertions(+), 76 deletions(-) diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index 4aeef308ae..2988092d47 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -77,7 +77,7 @@ class StatsResources extends Action $this->documents = []; $startTime = microtime(true); - $this->countForProject($dbForPlatform, $getLogsDB, $getProjectDB, $project); + $dbForPlatform->skipFilters(fn () => $this->countForProject($dbForPlatform, $getLogsDB, $getProjectDB, $project)); $endTime = microtime(true); $executionTime = $endTime - $startTime; Console::info('Project: ' . $project->getId() . '(' . $project->getSequence() . ') aggregated in ' . $executionTime .' seconds'); @@ -104,7 +104,6 @@ class StatsResources extends Action $dbForProject->disableFilters(); try { - $region = $project->getAttribute('region'); $platforms = $dbForPlatform->count('platforms', [ @@ -123,88 +122,91 @@ class StatsResources extends Action ]); - $databases = $dbForProject->count('databases'); - $buckets = $dbForProject->count('buckets'); - $users = $dbForProject->count('users'); + $dbForProject->skipFilters(function () use ($dbForProject, $dbForLogs, $region, $project, $platforms, $webhooks, $keys, $domains) { + $databases = $dbForProject->count('databases'); + $buckets = $dbForProject->count('buckets'); + $users = $dbForProject->count('users'); - $last30Days = (new \DateTime())->sub(\DateInterval::createFromDateString('30 days'))->format('Y-m-d 00:00:00'); - $usersMAU = $dbForProject->count('users', [ - Query::greaterThanEqual('accessedAt', $last30Days) - ]); - $last24Hours = (new \DateTime())->sub(\DateInterval::createFromDateString('24 hours'))->format('Y-m-d h:m:00'); - $usersDAU = $dbForProject->count('users', [ - Query::greaterThanEqual('accessedAt', $last24Hours) - ]); - $last7Days = (new \DateTime())->sub(\DateInterval::createFromDateString('7 days'))->format('Y-m-d 00:00:00'); - $usersWAU = $dbForProject->count('users', [ - Query::greaterThanEqual('accessedAt', $last7Days) - ]); - $teams = $dbForProject->count('teams'); - $functions = $dbForProject->count('functions'); + $last30Days = (new \DateTime())->sub(\DateInterval::createFromDateString('30 days'))->format('Y-m-d 00:00:00'); + $usersMAU = $dbForProject->count('users', [ + Query::greaterThanEqual('accessedAt', $last30Days) + ]); + $last24Hours = (new \DateTime())->sub(\DateInterval::createFromDateString('24 hours'))->format('Y-m-d h:m:00'); + $usersDAU = $dbForProject->count('users', [ + Query::greaterThanEqual('accessedAt', $last24Hours) + ]); + $last7Days = (new \DateTime())->sub(\DateInterval::createFromDateString('7 days'))->format('Y-m-d 00:00:00'); + $usersWAU = $dbForProject->count('users', [ + Query::greaterThanEqual('accessedAt', $last7Days) + ]); + $teams = $dbForProject->count('teams'); + $functions = $dbForProject->count('functions'); - $messages = $dbForProject->count('messages'); - $providers = $dbForProject->count('providers'); - $topics = $dbForProject->count('topics'); - $targets = $dbForProject->count('targets'); - $emailTargets = $dbForProject->count('targets', [ - Query::equal('providerType', [MESSAGE_TYPE_EMAIL]) - ]); - $pushTargets = $dbForProject->count('targets', [ - Query::equal('providerType', [MESSAGE_TYPE_PUSH]) - ]); - $smsTargets = $dbForProject->count('targets', [ - Query::equal('providerType', [MESSAGE_TYPE_SMS]) - ]); + $messages = $dbForProject->count('messages'); + $providers = $dbForProject->count('providers'); + $topics = $dbForProject->count('topics'); + $targets = $dbForProject->count('targets'); + $emailTargets = $dbForProject->count('targets', [ + Query::equal('providerType', [MESSAGE_TYPE_EMAIL]) + ]); + $pushTargets = $dbForProject->count('targets', [ + Query::equal('providerType', [MESSAGE_TYPE_PUSH]) + ]); + $smsTargets = $dbForProject->count('targets', [ + Query::equal('providerType', [MESSAGE_TYPE_SMS]) + ]); - $metrics = [ - METRIC_DATABASES => $databases, - METRIC_BUCKETS => $buckets, - METRIC_USERS => $users, - METRIC_FUNCTIONS => $functions, - METRIC_TEAMS => $teams, - METRIC_MESSAGES => $messages, - METRIC_MAU => $usersMAU, - METRIC_DAU => $usersDAU, - METRIC_WAU => $usersWAU, - METRIC_WEBHOOKS => $webhooks, - METRIC_PLATFORMS => $platforms, - METRIC_PROVIDERS => $providers, - METRIC_TOPICS => $topics, - METRIC_KEYS => $keys, - METRIC_DOMAINS => $domains, - METRIC_TARGETS => $targets, - str_replace('{providerType}', MESSAGE_TYPE_EMAIL, METRIC_PROVIDER_TYPE_TARGETS) => $emailTargets, - str_replace('{providerType}', MESSAGE_TYPE_PUSH, METRIC_PROVIDER_TYPE_TARGETS) => $pushTargets, - str_replace('{providerType}', MESSAGE_TYPE_SMS, METRIC_PROVIDER_TYPE_TARGETS) => $smsTargets, - ]; + $metrics = [ + METRIC_DATABASES => $databases, + METRIC_BUCKETS => $buckets, + METRIC_USERS => $users, + METRIC_FUNCTIONS => $functions, + METRIC_TEAMS => $teams, + METRIC_MESSAGES => $messages, + METRIC_MAU => $usersMAU, + METRIC_DAU => $usersDAU, + METRIC_WAU => $usersWAU, + METRIC_WEBHOOKS => $webhooks, + METRIC_PLATFORMS => $platforms, + METRIC_PROVIDERS => $providers, + METRIC_TOPICS => $topics, + METRIC_KEYS => $keys, + METRIC_DOMAINS => $domains, + METRIC_TARGETS => $targets, + str_replace('{providerType}', MESSAGE_TYPE_EMAIL, METRIC_PROVIDER_TYPE_TARGETS) => $emailTargets, + str_replace('{providerType}', MESSAGE_TYPE_PUSH, METRIC_PROVIDER_TYPE_TARGETS) => $pushTargets, + str_replace('{providerType}', MESSAGE_TYPE_SMS, METRIC_PROVIDER_TYPE_TARGETS) => $smsTargets, + ]; - foreach ($metrics as $metric => $value) { - $this->createStatsDocuments($region, $metric, $value); - } + foreach ($metrics as $metric => $value) { + $this->createStatsDocuments($region, $metric, $value); + } - try { - $this->countForBuckets($dbForProject, $dbForLogs, $region); - } catch (Throwable $th) { - call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); - } + try { + $this->countForBuckets($dbForProject, $dbForLogs, $region); + } catch (Throwable $th) { + call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); + } - try { - $this->countImageTransformations($dbForProject, $dbForLogs, $region); - } catch (Throwable $th) { - call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); - } + try { + $this->countImageTransformations($dbForProject, $dbForLogs, $region); + } catch (Throwable $th) { + call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); + } - try { - $this->countForDatabase($dbForProject, $region); - } catch (Throwable $th) { - call_user_func_array($this->logError, [$th, "StatsResources", "count_for_database_{$project->getId()}"]); - } + try { + $this->countForDatabase($dbForProject, $region); + } catch (Throwable $th) { + call_user_func_array($this->logError, [$th, "StatsResources", "count_for_database_{$project->getId()}"]); + } + + try { + $this->countForSitesAndFunctions($dbForProject, $region); + } catch (Throwable $th) { + call_user_func_array($this->logError, [$th, "StatsResources", "count_for_functions_{$project->getId()}"]); + } + }); - try { - $this->countForSitesAndFunctions($dbForProject, $region); - } catch (Throwable $th) { - call_user_func_array($this->logError, [$th, "StatsResources", "count_for_functions_{$project->getId()}"]); - } $this->writeDocuments($dbForLogs, $project); } catch (Throwable $th) { From 61c619f3734180118ca467359f03e26fb8eeec79 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 28 Dec 2025 09:27:21 +0000 Subject: [PATCH 48/95] remove disables --- src/Appwrite/Platform/Workers/StatsResources.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index 2988092d47..3e2fa046b4 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -100,8 +100,6 @@ class StatsResources extends Action return; } - $dbForPlatform->disableFilters(); - $dbForProject->disableFilters(); try { $region = $project->getAttribute('region'); From 08f30224b6a045f96d4ee69c5114722a34793bd3 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 28 Dec 2025 10:26:21 +0000 Subject: [PATCH 49/95] Use disable instead of skip agin --- .../Platform/Workers/StatsResources.php | 157 +++++++++--------- 1 file changed, 78 insertions(+), 79 deletions(-) diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index 3e2fa046b4..b48b008ce2 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -77,7 +77,7 @@ class StatsResources extends Action $this->documents = []; $startTime = microtime(true); - $dbForPlatform->skipFilters(fn () => $this->countForProject($dbForPlatform, $getLogsDB, $getProjectDB, $project)); + $this->countForProject($dbForPlatform, $getLogsDB, $getProjectDB, $project); $endTime = microtime(true); $executionTime = $endTime - $startTime; Console::info('Project: ' . $project->getId() . '(' . $project->getSequence() . ') aggregated in ' . $executionTime .' seconds'); @@ -99,7 +99,9 @@ class StatsResources extends Action Console::error($th->getMessage()); return; } - + + $dbForPlatform->disableFilters(); + $dbForProject->disableFilters(); try { $region = $project->getAttribute('region'); @@ -120,91 +122,88 @@ class StatsResources extends Action ]); - $dbForProject->skipFilters(function () use ($dbForProject, $dbForLogs, $region, $project, $platforms, $webhooks, $keys, $domains) { - $databases = $dbForProject->count('databases'); - $buckets = $dbForProject->count('buckets'); - $users = $dbForProject->count('users'); + $databases = $dbForProject->count('databases'); + $buckets = $dbForProject->count('buckets'); + $users = $dbForProject->count('users'); - $last30Days = (new \DateTime())->sub(\DateInterval::createFromDateString('30 days'))->format('Y-m-d 00:00:00'); - $usersMAU = $dbForProject->count('users', [ - Query::greaterThanEqual('accessedAt', $last30Days) - ]); - $last24Hours = (new \DateTime())->sub(\DateInterval::createFromDateString('24 hours'))->format('Y-m-d h:m:00'); - $usersDAU = $dbForProject->count('users', [ - Query::greaterThanEqual('accessedAt', $last24Hours) - ]); - $last7Days = (new \DateTime())->sub(\DateInterval::createFromDateString('7 days'))->format('Y-m-d 00:00:00'); - $usersWAU = $dbForProject->count('users', [ - Query::greaterThanEqual('accessedAt', $last7Days) - ]); - $teams = $dbForProject->count('teams'); - $functions = $dbForProject->count('functions'); + $last30Days = (new \DateTime())->sub(\DateInterval::createFromDateString('30 days'))->format('Y-m-d 00:00:00'); + $usersMAU = $dbForProject->count('users', [ + Query::greaterThanEqual('accessedAt', $last30Days) + ]); + $last24Hours = (new \DateTime())->sub(\DateInterval::createFromDateString('24 hours'))->format('Y-m-d h:m:00'); + $usersDAU = $dbForProject->count('users', [ + Query::greaterThanEqual('accessedAt', $last24Hours) + ]); + $last7Days = (new \DateTime())->sub(\DateInterval::createFromDateString('7 days'))->format('Y-m-d 00:00:00'); + $usersWAU = $dbForProject->count('users', [ + Query::greaterThanEqual('accessedAt', $last7Days) + ]); + $teams = $dbForProject->count('teams'); + $functions = $dbForProject->count('functions'); - $messages = $dbForProject->count('messages'); - $providers = $dbForProject->count('providers'); - $topics = $dbForProject->count('topics'); - $targets = $dbForProject->count('targets'); - $emailTargets = $dbForProject->count('targets', [ - Query::equal('providerType', [MESSAGE_TYPE_EMAIL]) - ]); - $pushTargets = $dbForProject->count('targets', [ - Query::equal('providerType', [MESSAGE_TYPE_PUSH]) - ]); - $smsTargets = $dbForProject->count('targets', [ - Query::equal('providerType', [MESSAGE_TYPE_SMS]) - ]); + $messages = $dbForProject->count('messages'); + $providers = $dbForProject->count('providers'); + $topics = $dbForProject->count('topics'); + $targets = $dbForProject->count('targets'); + $emailTargets = $dbForProject->count('targets', [ + Query::equal('providerType', [MESSAGE_TYPE_EMAIL]) + ]); + $pushTargets = $dbForProject->count('targets', [ + Query::equal('providerType', [MESSAGE_TYPE_PUSH]) + ]); + $smsTargets = $dbForProject->count('targets', [ + Query::equal('providerType', [MESSAGE_TYPE_SMS]) + ]); - $metrics = [ - METRIC_DATABASES => $databases, - METRIC_BUCKETS => $buckets, - METRIC_USERS => $users, - METRIC_FUNCTIONS => $functions, - METRIC_TEAMS => $teams, - METRIC_MESSAGES => $messages, - METRIC_MAU => $usersMAU, - METRIC_DAU => $usersDAU, - METRIC_WAU => $usersWAU, - METRIC_WEBHOOKS => $webhooks, - METRIC_PLATFORMS => $platforms, - METRIC_PROVIDERS => $providers, - METRIC_TOPICS => $topics, - METRIC_KEYS => $keys, - METRIC_DOMAINS => $domains, - METRIC_TARGETS => $targets, - str_replace('{providerType}', MESSAGE_TYPE_EMAIL, METRIC_PROVIDER_TYPE_TARGETS) => $emailTargets, - str_replace('{providerType}', MESSAGE_TYPE_PUSH, METRIC_PROVIDER_TYPE_TARGETS) => $pushTargets, - str_replace('{providerType}', MESSAGE_TYPE_SMS, METRIC_PROVIDER_TYPE_TARGETS) => $smsTargets, - ]; + $metrics = [ + METRIC_DATABASES => $databases, + METRIC_BUCKETS => $buckets, + METRIC_USERS => $users, + METRIC_FUNCTIONS => $functions, + METRIC_TEAMS => $teams, + METRIC_MESSAGES => $messages, + METRIC_MAU => $usersMAU, + METRIC_DAU => $usersDAU, + METRIC_WAU => $usersWAU, + METRIC_WEBHOOKS => $webhooks, + METRIC_PLATFORMS => $platforms, + METRIC_PROVIDERS => $providers, + METRIC_TOPICS => $topics, + METRIC_KEYS => $keys, + METRIC_DOMAINS => $domains, + METRIC_TARGETS => $targets, + str_replace('{providerType}', MESSAGE_TYPE_EMAIL, METRIC_PROVIDER_TYPE_TARGETS) => $emailTargets, + str_replace('{providerType}', MESSAGE_TYPE_PUSH, METRIC_PROVIDER_TYPE_TARGETS) => $pushTargets, + str_replace('{providerType}', MESSAGE_TYPE_SMS, METRIC_PROVIDER_TYPE_TARGETS) => $smsTargets, + ]; - foreach ($metrics as $metric => $value) { - $this->createStatsDocuments($region, $metric, $value); - } + foreach ($metrics as $metric => $value) { + $this->createStatsDocuments($region, $metric, $value); + } - try { - $this->countForBuckets($dbForProject, $dbForLogs, $region); - } catch (Throwable $th) { - call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); - } + try { + $this->countForBuckets($dbForProject, $dbForLogs, $region); + } catch (Throwable $th) { + call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); + } - try { - $this->countImageTransformations($dbForProject, $dbForLogs, $region); - } catch (Throwable $th) { - call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); - } + try { + $this->countImageTransformations($dbForProject, $dbForLogs, $region); + } catch (Throwable $th) { + call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); + } - try { - $this->countForDatabase($dbForProject, $region); - } catch (Throwable $th) { - call_user_func_array($this->logError, [$th, "StatsResources", "count_for_database_{$project->getId()}"]); - } - - try { - $this->countForSitesAndFunctions($dbForProject, $region); - } catch (Throwable $th) { - call_user_func_array($this->logError, [$th, "StatsResources", "count_for_functions_{$project->getId()}"]); - } - }); + try { + $this->countForDatabase($dbForProject, $region); + } catch (Throwable $th) { + call_user_func_array($this->logError, [$th, "StatsResources", "count_for_database_{$project->getId()}"]); + } + try { + $this->countForSitesAndFunctions($dbForProject, $region); + } catch (Throwable $th) { + call_user_func_array($this->logError, [$th, "StatsResources", "count_for_functions_{$project->getId()}"]); + } $this->writeDocuments($dbForLogs, $project); } catch (Throwable $th) { From 9c8f565211c16a877010c944efb88d9c0677c093 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 28 Dec 2025 10:33:12 +0000 Subject: [PATCH 50/95] use the helper method instead --- src/Appwrite/Platform/Workers/StatsResources.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index b48b008ce2..f6578100f0 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -100,8 +100,7 @@ class StatsResources extends Action return; } - $dbForPlatform->disableFilters(); - $dbForProject->disableFilters(); + $this->disableSubqueries(); try { $region = $project->getAttribute('region'); From 126de78ce2dfa6864a2cc11e5e334f47fa9ecca2 Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 28 Dec 2025 14:13:56 +0200 Subject: [PATCH 51/95] skip functions --- src/Appwrite/Platform/Action.php | 2 +- src/Appwrite/Platform/Workers/StatsResources.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Platform/Action.php b/src/Appwrite/Platform/Action.php index 3db0c74d45..e2df7652b7 100644 --- a/src/Appwrite/Platform/Action.php +++ b/src/Appwrite/Platform/Action.php @@ -46,7 +46,7 @@ class Action extends UtopiaAction * * @return void */ - protected function foreachDocument(Database $database, string $collection, array $queries = [], callable $callback = null, int $limit = 1000, bool $concurrent = false): void + protected function foreachDocument(Database $database, string $collection, array $queries = [], callable $callback = null, int $limit = 1000, bool $concurrent = false, bool $filters = true): void { $results = []; $sum = $limit; diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index f6578100f0..8fd74a6b89 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -199,7 +199,7 @@ class StatsResources extends Action } try { - $this->countForSitesAndFunctions($dbForProject, $region); + $dbForProject->skipFilters(fn () => $this->countForSitesAndFunctions($dbForProject, $region)); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_functions_{$project->getId()}"]); } From 7a89779827731c4036c7b852253002ca17fc3307 Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 28 Dec 2025 14:17:48 +0200 Subject: [PATCH 52/95] revert --- src/Appwrite/Platform/Action.php | 2 +- src/Appwrite/Platform/Workers/StatsResources.php | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Appwrite/Platform/Action.php b/src/Appwrite/Platform/Action.php index e2df7652b7..3db0c74d45 100644 --- a/src/Appwrite/Platform/Action.php +++ b/src/Appwrite/Platform/Action.php @@ -46,7 +46,7 @@ class Action extends UtopiaAction * * @return void */ - protected function foreachDocument(Database $database, string $collection, array $queries = [], callable $callback = null, int $limit = 1000, bool $concurrent = false, bool $filters = true): void + protected function foreachDocument(Database $database, string $collection, array $queries = [], callable $callback = null, int $limit = 1000, bool $concurrent = false): void { $results = []; $sum = $limit; diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index 8fd74a6b89..407cbfca8a 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -99,10 +99,9 @@ class StatsResources extends Action Console::error($th->getMessage()); return; } - - $this->disableSubqueries(); try { + $region = $project->getAttribute('region'); $platforms = $dbForPlatform->count('platforms', [ From 472e2c282df930fa708c9050eff4d61be6f8ab39 Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 28 Dec 2025 14:31:46 +0200 Subject: [PATCH 53/95] skip specific filters --- src/Appwrite/Platform/Workers/StatsResources.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index 407cbfca8a..f23fe09430 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -180,25 +180,25 @@ class StatsResources extends Action } try { - $this->countForBuckets($dbForProject, $dbForLogs, $region); + $dbForProject->skipFilters(fn () => $this->countForBuckets($dbForProject, $dbForLogs, $region), $this->filters); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); } try { - $this->countImageTransformations($dbForProject, $dbForLogs, $region); + $dbForProject->skipFilters(fn () => $this->countImageTransformations($dbForProject, $dbForLogs, $region), $this->filters); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); } try { - $this->countForDatabase($dbForProject, $region); + $dbForProject->skipFilters(fn () => $this->countForDatabase($dbForProject, $region), $this->filters); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_database_{$project->getId()}"]); } try { - $dbForProject->skipFilters(fn () => $this->countForSitesAndFunctions($dbForProject, $region)); + $dbForProject->skipFilters(fn () => $this->countForSitesAndFunctions($dbForProject, $region), $this->filters); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_functions_{$project->getId()}"]); } From bd9f02b689c74a1c2d986ebc054c531524c2233e Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 28 Dec 2025 15:01:29 +0200 Subject: [PATCH 54/95] Only functions --- src/Appwrite/Platform/Action.php | 4 ++-- src/Appwrite/Platform/Workers/StatsResources.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Appwrite/Platform/Action.php b/src/Appwrite/Platform/Action.php index 3db0c74d45..356209ef6f 100644 --- a/src/Appwrite/Platform/Action.php +++ b/src/Appwrite/Platform/Action.php @@ -22,9 +22,9 @@ class Action extends UtopiaAction protected mixed $logError; protected array $filters = [ - 'subQueryKeys', 'subQueryWebhooks', 'subQueryPlatforms', 'subQueryProjectVariables', 'subQueryBlocks', 'subQueryDevKeys', // Project + 'subQueryKeys', 'subQueryWebhooks', 'subQueryPlatforms', 'subQueryBlocks', 'subQueryDevKeys', // Project 'subQueryAuthenticators', 'subQuerySessions', 'subQueryTokens', 'subQueryChallenges', 'subQueryMemberships', 'subQueryTargets', 'subQueryTopicTargets',// Users - 'subQueryVariables', // Sites + 'subQueryVariables', 'subQueryProjectVariables' // Sites / Functions ]; /** diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index f23fe09430..8442f89d21 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -180,19 +180,19 @@ class StatsResources extends Action } try { - $dbForProject->skipFilters(fn () => $this->countForBuckets($dbForProject, $dbForLogs, $region), $this->filters); + $this->countForBuckets($dbForProject, $dbForLogs, $region); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); } try { - $dbForProject->skipFilters(fn () => $this->countImageTransformations($dbForProject, $dbForLogs, $region), $this->filters); + $this->countImageTransformations($dbForProject, $dbForLogs, $region); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); } try { - $dbForProject->skipFilters(fn () => $this->countForDatabase($dbForProject, $region), $this->filters); + $this->countForDatabase($dbForProject, $region); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_database_{$project->getId()}"]); } From c463a9a6621007c4a01e802edf9ccdd3dfa96e8c Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 28 Dec 2025 15:14:56 +0200 Subject: [PATCH 55/95] Only functions --- src/Appwrite/Platform/Workers/StatsResources.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index 8442f89d21..f8a14d03a5 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -198,7 +198,8 @@ class StatsResources extends Action } try { - $dbForProject->skipFilters(fn () => $this->countForSitesAndFunctions($dbForProject, $region), $this->filters); + $dbForProject->skipFilters(fn () => $this->countForSitesAndFunctions($dbForProject, $region), ['subQueryVariables', 'subQueryProjectVariables']); + } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_functions_{$project->getId()}"]); } From d583b5e2280842afee72cc23f729157c69b6202f Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 28 Dec 2025 15:33:00 +0200 Subject: [PATCH 56/95] All again --- src/Appwrite/Platform/Workers/StatsResources.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index f8a14d03a5..f23fe09430 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -180,26 +180,25 @@ class StatsResources extends Action } try { - $this->countForBuckets($dbForProject, $dbForLogs, $region); + $dbForProject->skipFilters(fn () => $this->countForBuckets($dbForProject, $dbForLogs, $region), $this->filters); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); } try { - $this->countImageTransformations($dbForProject, $dbForLogs, $region); + $dbForProject->skipFilters(fn () => $this->countImageTransformations($dbForProject, $dbForLogs, $region), $this->filters); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); } try { - $this->countForDatabase($dbForProject, $region); + $dbForProject->skipFilters(fn () => $this->countForDatabase($dbForProject, $region), $this->filters); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_database_{$project->getId()}"]); } try { - $dbForProject->skipFilters(fn () => $this->countForSitesAndFunctions($dbForProject, $region), ['subQueryVariables', 'subQueryProjectVariables']); - + $dbForProject->skipFilters(fn () => $this->countForSitesAndFunctions($dbForProject, $region), $this->filters); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_functions_{$project->getId()}"]); } From 5d9201466b19051852f1a78826680ca9d5674198 Mon Sep 17 00:00:00 2001 From: fogelito Date: Sun, 28 Dec 2025 16:54:38 +0200 Subject: [PATCH 57/95] functions + databases --- src/Appwrite/Platform/Workers/StatsResources.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index f23fe09430..e465f9cca2 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -180,25 +180,25 @@ class StatsResources extends Action } try { - $dbForProject->skipFilters(fn () => $this->countForBuckets($dbForProject, $dbForLogs, $region), $this->filters); + $this->countForBuckets($dbForProject, $dbForLogs, $region); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); } try { - $dbForProject->skipFilters(fn () => $this->countImageTransformations($dbForProject, $dbForLogs, $region), $this->filters); + $this->countImageTransformations($dbForProject, $dbForLogs, $region); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_buckets_{$project->getId()}"]); } try { - $dbForProject->skipFilters(fn () => $this->countForDatabase($dbForProject, $region), $this->filters); + $dbForProject->skipFilters(fn () => $this->countForDatabase($dbForProject, $region), ['subQueryAttributes', 'subQueryIndexes']); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_database_{$project->getId()}"]); } try { - $dbForProject->skipFilters(fn () => $this->countForSitesAndFunctions($dbForProject, $region), $this->filters); + $dbForProject->skipFilters(fn () => $this->countForSitesAndFunctions($dbForProject, $region), ['subQueryVariables', 'subQueryProjectVariables']); } catch (Throwable $th) { call_user_func_array($this->logError, [$th, "StatsResources", "count_for_functions_{$project->getId()}"]); } From 6410a245ebdb3727a633e26864c91e095de673d0 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sun, 28 Dec 2025 20:59:46 +0530 Subject: [PATCH 58/95] fix: sdk configuration options --- src/Appwrite/Platform/Tasks/SDKs.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Appwrite/Platform/Tasks/SDKs.php b/src/Appwrite/Platform/Tasks/SDKs.php index 5d8cb98ae7..347caec1a4 100644 --- a/src/Appwrite/Platform/Tasks/SDKs.php +++ b/src/Appwrite/Platform/Tasks/SDKs.php @@ -193,8 +193,8 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND break; case 'php': $config = new PHP(); - $config->setComposerVendor('appwrite'); - $config->setComposerPackage('appwrite'); + $config->setComposerVendor($language['composerVendor'] ?? 'appwrite'); + $config->setComposerPackage($language['composerPackage'] ?? 'appwrite'); break; case 'nodejs': $config = new Node(); @@ -380,7 +380,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND $sdk ->setName($language['name']) ->setNamespace($language['namespace'] ?? 'appwrite') - ->setDescription("Appwrite is an open-source backend as a service server that abstract and simplify complex and repetitive development tasks behind a very simple to use REST API. Appwrite aims to help you develop your apps faster and in a more secure way. Use the {$language['name']} SDK to integrate your app with the Appwrite server to easily start interacting with all of Appwrite backend APIs and tools. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)") + ->setDescription($language['description'] ?? "Appwrite is an open-source backend as a service server that abstract and simplify complex and repetitive development tasks behind a very simple to use REST API. Appwrite aims to help you develop your apps faster and in a more secure way. Use the {$language['name']} SDK to integrate your app with the Appwrite server to easily start interacting with all of Appwrite backend APIs and tools. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)") ->setShortDescription('Appwrite is an open-source self-hosted backend server that abstract and simplify complex and repetitive development tasks behind a very simple REST API') ->setLicense($license) ->setLicenseContent($licenseContent) From 58e091099f5d52121d8b333a53536e2fb69a0f53 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sun, 28 Dec 2025 21:17:43 +0530 Subject: [PATCH 59/95] fix grammar --- src/Appwrite/Platform/Tasks/SDKs.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Platform/Tasks/SDKs.php b/src/Appwrite/Platform/Tasks/SDKs.php index 347caec1a4..859e259b7c 100644 --- a/src/Appwrite/Platform/Tasks/SDKs.php +++ b/src/Appwrite/Platform/Tasks/SDKs.php @@ -380,8 +380,8 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND $sdk ->setName($language['name']) ->setNamespace($language['namespace'] ?? 'appwrite') - ->setDescription($language['description'] ?? "Appwrite is an open-source backend as a service server that abstract and simplify complex and repetitive development tasks behind a very simple to use REST API. Appwrite aims to help you develop your apps faster and in a more secure way. Use the {$language['name']} SDK to integrate your app with the Appwrite server to easily start interacting with all of Appwrite backend APIs and tools. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)") - ->setShortDescription('Appwrite is an open-source self-hosted backend server that abstract and simplify complex and repetitive development tasks behind a very simple REST API') + ->setDescription($language['description'] ?? "Appwrite is an open-source backend as a service server that abstracts and simplifies complex and repetitive development tasks behind a very simple to use REST API. Appwrite aims to help you develop your apps faster and in a more secure way. Use the {$language['name']} SDK to integrate your app with the Appwrite server to easily start interacting with all of Appwrite backend APIs and tools. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)") + ->setShortDescription('Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API') ->setLicense($license) ->setLicenseContent($licenseContent) ->setVersion($language['version']) From da7738edaa82002f6ae6bee3191568309309b653 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 29 Dec 2025 01:50:39 +0000 Subject: [PATCH 60/95] Feat: Storage module --- .../Modules/Storage/Http/Buckets/Create.php | 167 +++++++ .../Modules/Storage/Http/Buckets/Delete.php | 89 ++++ .../Storage/Http/Buckets/Files/Create.php | 452 ++++++++++++++++++ .../Storage/Http/Buckets/Files/Delete.php | 17 + .../Http/Buckets/Files/Download/Get.php | 17 + .../Storage/Http/Buckets/Files/Get.php | 91 ++++ .../Http/Buckets/Files/Preview/Get.php | 17 + .../Storage/Http/Buckets/Files/Push/Get.php | 17 + .../Storage/Http/Buckets/Files/Update.php | 17 + .../Storage/Http/Buckets/Files/View/Get.php | 17 + .../Storage/Http/Buckets/Files/XList.php | 151 ++++++ .../Modules/Storage/Http/Buckets/Get.php | 65 +++ .../Modules/Storage/Http/Buckets/Update.php | 131 +++++ .../Modules/Storage/Http/Buckets/XList.php | 117 +++++ .../Modules/Storage/Http/Usage/Get.php | 17 + .../Modules/Storage/Http/Usage/XList.php | 17 + .../Platform/Modules/Storage/Module.php | 14 + .../Modules/Storage/Services/Http.php | 51 ++ 18 files changed, 1464 insertions(+) create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Create.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Delete.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Delete.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Download/Get.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Get.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Update.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/View/Get.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Get.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/Update.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Buckets/XList.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Usage/Get.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Http/Usage/XList.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Module.php create mode 100644 src/Appwrite/Platform/Modules/Storage/Services/Http.php diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Create.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Create.php new file mode 100644 index 0000000000..a4d28ab487 --- /dev/null +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Create.php @@ -0,0 +1,167 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_POST) + ->setHttpPath('/v1/storage/buckets') + ->desc('Create bucket') + ->groups(['api', 'storage']) + ->label('scope', 'buckets.write') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('event', 'buckets.[bucketId].create') + ->label('audits.event', 'bucket.create') + ->label('audits.resource', 'bucket/{response.$id}') + ->label('sdk', new Method( + namespace: 'storage', + group: 'buckets', + name: 'createBucket', + description: '/docs/references/storage/create-bucket.md', + auth: [AuthType::ADMIN, AuthType::KEY], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_CREATED, + model: Response::MODEL_BUCKET, + ) + ] + )) + ->param('bucketId', '', new CustomId(), 'Unique Id. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.') + ->param('name', '', new Text(128), 'Bucket name') + ->param('permissions', null, new Nullable(new \Utopia\Database\Validator\Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE)), 'An array of permission strings. By default, no user is granted with any permissions. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) + ->param('fileSecurity', false, new Boolean(true), 'Enables configuring permissions for individual file. A user needs one of file or bucket level permissions to access a file. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) + ->param('enabled', true, new Boolean(true), 'Is bucket enabled? When set to \'disabled\', users cannot access the files in this bucket but Server SDKs with and API key can still access the bucket. No files are lost when this is toggled.', true) + ->param('maximumFileSize', fn(array $plan) => empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000, fn(array $plan) => new Range(1, empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000), 'Maximum file size allowed in bytes. Maximum allowed value is ' . Storage::human(System::getEnv('_APP_STORAGE_LIMIT', 0), 0) . '.', true, ['plan']) + ->param('allowedFileExtensions', [], new ArrayList(new Text(64), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Allowed file extensions. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' extensions are allowed, each 64 characters long.', true) + ->param('compression', Compression::NONE, new WhiteList([Compression::NONE, Compression::GZIP, Compression::ZSTD], true), 'Compression algorithm choosen for compression. Can be one of ' . Compression::NONE . ', [' . Compression::GZIP . '](https://en.wikipedia.org/wiki/Gzip), or [' . Compression::ZSTD . '](https://en.wikipedia.org/wiki/Zstd), For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' compression is skipped even if it\'s enabled', true) + ->param('encryption', true, new Boolean(true), 'Is encryption enabled? For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' encryption is skipped even if it\'s enabled', true) + ->param('antivirus', true, new Boolean(true), 'Is virus scanning enabled? For file size above ' . Storage::human(APP_LIMIT_ANTIVIRUS, 0) . ' AntiVirus scanning is skipped even if it\'s enabled', true) + ->param('transformations', true, new Boolean(true), 'Are image transformations enabled?', true) + ->inject('response') + ->inject('dbForProject') + ->inject('queueForEvents') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + string $name, + ?array $permissions, + bool $fileSecurity, + bool $enabled, + int $maximumFileSize, + array $allowedFileExtensions, + ?string $compression, + ?bool $encryption, + bool $antivirus, + bool $transformations, + Response $response, + Database $dbForProject, + Event $queueForEvents + ) { + $bucketId = $bucketId === 'unique()' ? ID::unique() : $bucketId; + + // Map aggregate permissions into the multiple permissions they represent. + $permissions = Permission::aggregate($permissions) ?? []; + $compression ??= Compression::NONE; + $encryption ??= true; + try { + $files = (Config::getParam('collections', [])['buckets'] ?? [])['files'] ?? []; + if (empty($files)) { + throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Files collection is not configured.'); + } + + $attributes = []; + $indexes = []; + + foreach ($files['attributes'] as $attribute) { + $attributes[] = new Document([ + '$id' => $attribute['$id'], + 'type' => $attribute['type'], + 'size' => $attribute['size'], + 'required' => $attribute['required'], + 'signed' => $attribute['signed'], + 'array' => $attribute['array'], + 'filters' => $attribute['filters'], + 'default' => $attribute['default'] ?? null, + 'format' => $attribute['format'] ?? '' + ]); + } + + foreach ($files['indexes'] as $index) { + $indexes[] = new Document([ + '$id' => $index['$id'], + 'type' => $index['type'], + 'attributes' => $index['attributes'], + 'lengths' => $index['lengths'], + 'orders' => $index['orders'], + ]); + } + + $dbForProject->createDocument('buckets', new Document([ + '$id' => $bucketId, + '$collection' => 'buckets', + '$permissions' => $permissions, + 'name' => $name, + 'maximumFileSize' => $maximumFileSize, + 'allowedFileExtensions' => $allowedFileExtensions, + 'fileSecurity' => $fileSecurity, + 'enabled' => $enabled, + 'compression' => $compression, + 'encryption' => $encryption, + 'antivirus' => $antivirus, + 'transformations' => $transformations, + 'search' => implode(' ', [$bucketId, $name]), + ])); + + $bucket = $dbForProject->getDocument('buckets', $bucketId); + + $dbForProject->createCollection('bucket_' . $bucket->getSequence(), $attributes, $indexes, permissions: $permissions, documentSecurity: $fileSecurity); + } catch (DuplicateException) { + throw new Exception(Exception::STORAGE_BUCKET_ALREADY_EXISTS); + } + + $queueForEvents + ->setParam('bucketId', $bucket->getId()); + + $response + ->setStatusCode(Response::STATUS_CODE_CREATED) + ->dynamic($bucket, Response::MODEL_BUCKET); + } +} diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Delete.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Delete.php new file mode 100644 index 0000000000..9523f55e12 --- /dev/null +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Delete.php @@ -0,0 +1,89 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_DELETE) + ->setHttpPath('/v1/storage/buckets/:bucketId') + ->desc('Delete bucket') + ->groups(['api', 'storage']) + ->label('scope', 'buckets.write') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('audits.event', 'bucket.delete') + ->label('event', 'buckets.[bucketId].delete') + ->label('audits.resource', 'bucket/{request.bucketId}') + ->label('sdk', new Method( + namespace: 'storage', + group: 'buckets', + name: 'deleteBucket', + description: '/docs/references/storage/delete-bucket.md', + auth: [AuthType::ADMIN, AuthType::KEY], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_NOCONTENT, + model: Response::MODEL_NONE, + ) + ], + contentType: ContentType::NONE + )) + ->param('bucketId', '', new UID(), 'Bucket unique ID.') + ->inject('response') + ->inject('dbForProject') + ->inject('queueForDeletes') + ->inject('queueForEvents') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + Response $response, + Database $dbForProject, + DeleteEvent $queueForDeletes, + Event $queueForEvents + ) { + $bucket = $dbForProject->getDocument('buckets', $bucketId); + + if ($bucket->isEmpty()) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + if (!$dbForProject->deleteDocument('buckets', $bucketId)) { + throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to remove bucket from DB'); + } + + $queueForDeletes + ->setType(DELETE_TYPE_DOCUMENT) + ->setDocument($bucket); + + $queueForEvents + ->setParam('bucketId', $bucket->getId()) + ->setPayload($response->output($bucket, Response::MODEL_BUCKET)) + ; + + $response->noContent(); + } +} diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php new file mode 100644 index 0000000000..8640dedb8b --- /dev/null +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php @@ -0,0 +1,452 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_POST) + ->setHttpPath('/v1/storage/buckets/:bucketId/files') + ->desc('Create file') + ->groups(['api', 'storage']) + ->label('scope', 'files.write') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('audits.event', 'file.create') + ->label('event', 'buckets.[bucketId].files.[fileId].create') + ->label('audits.resource', 'file/{response.$id}') + ->label('abuse-key', 'ip:{ip},method:{method},url:{url},userId:{userId},chunkId:{chunkId}') + ->label('abuse-limit', APP_LIMIT_WRITE_RATE_DEFAULT) + ->label('abuse-time', APP_LIMIT_WRITE_RATE_PERIOD_DEFAULT) + ->label('sdk', new Method( + namespace: 'storage', + group: 'files', + name: 'createFile', + description: '/docs/references/storage/create-file.md', + auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_CREATED, + model: Response::MODEL_FILE, + ) + ], + type: MethodType::UPLOAD, + requestType: ContentType::MULTIPART + )) + ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') + ->param('fileId', '', new CustomId(), 'File ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.') + ->param('file', [], new File(), 'Binary file. Appwrite SDKs provide helpers to handle file input. [Learn about file input](https://appwrite.io/docs/products/storage/upload-download#input-file).', skipValidation: true) + ->param('permissions', null, new Nullable(new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_UPDATE, Database::PERMISSION_DELETE, Database::PERMISSION_WRITE])), 'An array of permission strings. By default, only the current user is granted all permissions. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) + ->inject('request') + ->inject('response') + ->inject('dbForProject') + ->inject('user') + ->inject('queueForEvents') + ->inject('mode') + ->inject('deviceForFiles') + ->inject('deviceForLocal') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + string $fileId, + mixed $file, + ?array $permissions, + Request $request, + Response $response, + Database $dbForProject, + Document $user, + Event $queueForEvents, + string $mode, + Device $deviceForFiles, + Device $deviceForLocal + ) { + $bucket = Authorization::skip(fn() => $dbForProject->getDocument('buckets', $bucketId)); + + $isAPIKey = User::isApp(Authorization::getRoles()); + $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); + + if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + $validator = new Authorization(\Utopia\Database\Database::PERMISSION_CREATE); + if (!$validator->isValid($bucket->getCreate())) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + $allowedPermissions = [ + \Utopia\Database\Database::PERMISSION_READ, + \Utopia\Database\Database::PERMISSION_UPDATE, + \Utopia\Database\Database::PERMISSION_DELETE, + ]; + + // Map aggregate permissions to into the set of individual permissions they represent. + $permissions = Permission::aggregate($permissions, $allowedPermissions); + + // Add permissions for current the user if none were provided. + if (\is_null($permissions)) { + $permissions = []; + if (!empty($user->getId()) && !$isPrivilegedUser) { + foreach ($allowedPermissions as $permission) { + $permissions[] = (new Permission($permission, 'user', $user->getId()))->toString(); + } + } + } + + // Users can only manage their own roles, API keys and Admin users can manage any + $roles = Authorization::getRoles(); + if (!$isAPIKey && !$isPrivilegedUser) { + foreach (\Utopia\Database\Database::PERMISSIONS as $type) { + foreach ($permissions as $permission) { + $permission = Permission::parse($permission); + if ($permission->getPermission() != $type) { + continue; + } + $role = (new Role( + $permission->getRole(), + $permission->getIdentifier(), + $permission->getDimension() + ))->toString(); + if (!Authorization::isRole($role)) { + throw new Exception(Exception::USER_UNAUTHORIZED, 'Permissions must be one of: (' . \implode(', ', $roles) . ')'); + } + } + } + } + + $maximumFileSize = $bucket->getAttribute('maximumFileSize', 0); + if ($maximumFileSize > (int) System::getEnv('_APP_STORAGE_LIMIT', 0)) { + throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Maximum bucket file size is larger than _APP_STORAGE_LIMIT'); + } + + $file = $request->getFiles('file'); + + // GraphQL multipart spec adds files with index keys + if (empty($file)) { + $file = $request->getFiles(0); + } + + if (empty($file)) { + throw new Exception(Exception::STORAGE_FILE_EMPTY); + } + + // Make sure we handle a single file and multiple files the same way + $fileName = (\is_array($file['name']) && isset($file['name'][0])) ? $file['name'][0] : $file['name']; + $fileTmpName = (\is_array($file['tmp_name']) && isset($file['tmp_name'][0])) ? $file['tmp_name'][0] : $file['tmp_name']; + $fileSize = (\is_array($file['size']) && isset($file['size'][0])) ? $file['size'][0] : $file['size']; + + $contentRange = $request->getHeader('content-range'); + $fileId = $fileId === 'unique()' ? ID::unique() : $fileId; + $chunk = 1; + $chunks = 1; + + if (!empty($contentRange)) { + $start = $request->getContentRangeStart(); + $end = $request->getContentRangeEnd(); + $fileSize = $request->getContentRangeSize(); + $fileId = $request->getHeader('x-appwrite-id', $fileId); + // TODO make `end >= $fileSize` in next breaking version + if (is_null($start) || is_null($end) || is_null($fileSize) || $end > $fileSize) { + throw new Exception(Exception::STORAGE_INVALID_CONTENT_RANGE); + } + + $idValidator = new UID(); + if (!$idValidator->isValid($fileId)) { + throw new Exception(Exception::STORAGE_INVALID_APPWRITE_ID); + } + + // TODO remove the condition that checks `$end === $fileSize` in next breaking version + if ($end === $fileSize - 1 || $end === $fileSize) { + //if it's a last chunks the chunk size might differ, so we set the $chunks and $chunk to -1 notify it's last chunk + $chunks = $chunk = -1; + } else { + // Calculate total number of chunks based on the chunk size i.e ($rangeEnd - $rangeStart) + $chunks = (int) ceil($fileSize / ($end + 1 - $start)); + $chunk = (int) ($start / ($end + 1 - $start)) + 1; + } + } + + /** + * Validators + */ + // Check if file type is allowed + $allowedFileExtensions = $bucket->getAttribute('allowedFileExtensions', []); + $fileExt = new FileExt($allowedFileExtensions); + if (!empty($allowedFileExtensions) && !$fileExt->isValid($fileName)) { + throw new Exception(Exception::STORAGE_FILE_TYPE_UNSUPPORTED, 'File extension not allowed'); + } + + // Check if file size is exceeding allowed limit + $fileSizeValidator = new FileSize($maximumFileSize); + if (!$fileSizeValidator->isValid($fileSize)) { + throw new Exception(Exception::STORAGE_INVALID_FILE_SIZE, 'File size not allowed'); + } + + $upload = new Upload(); + if (!$upload->isValid($fileTmpName)) { + throw new Exception(Exception::STORAGE_INVALID_FILE); + } + + // Save to storage + $fileSize ??= $deviceForLocal->getFileSize($fileTmpName); + $path = $deviceForFiles->getPath($fileId . '.' . \pathinfo($fileName, PATHINFO_EXTENSION)); + $path = str_ireplace($deviceForFiles->getRoot(), $deviceForFiles->getRoot() . DIRECTORY_SEPARATOR . $bucket->getId(), $path); // Add bucket id to path after root + + $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); + + $metadata = ['content_type' => $deviceForLocal->getFileMimeType($fileTmpName)]; + if (!$file->isEmpty()) { + $chunks = $file->getAttribute('chunksTotal', 1); + $uploaded = $file->getAttribute('chunksUploaded', 0); + $metadata = $file->getAttribute('metadata', []); + + if ($chunk === -1) { + $chunk = $chunks; + } + + if ($uploaded === $chunks) { + throw new Exception(Exception::STORAGE_FILE_ALREADY_EXISTS); + } + } + + $chunksUploaded = $deviceForFiles->upload($fileTmpName, $path, $chunk, $chunks, $metadata); + + if (empty($chunksUploaded)) { + throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed uploading file'); + } + + if ($chunksUploaded === $chunks) { + if (System::getEnv('_APP_STORAGE_ANTIVIRUS') === 'enabled' && $bucket->getAttribute('antivirus', true) && $fileSize <= APP_LIMIT_ANTIVIRUS && $deviceForFiles->getType() === Storage::DEVICE_LOCAL) { + $antivirus = new Network( + System::getEnv('_APP_STORAGE_ANTIVIRUS_HOST', 'clamav'), + (int) System::getEnv('_APP_STORAGE_ANTIVIRUS_PORT', 3310) + ); + + if (!$antivirus->fileScan($path)) { + $deviceForFiles->delete($path); + throw new Exception(Exception::STORAGE_INVALID_FILE); + } + } + + $mimeType = $deviceForFiles->getFileMimeType($path); // Get mime-type before compression and encryption + $fileHash = $deviceForFiles->getFileHash($path); // Get file hash before compression and encryption + $data = ''; + // Compression + $algorithm = $bucket->getAttribute('compression', Compression::NONE); + if ($fileSize <= APP_STORAGE_READ_BUFFER && $algorithm != Compression::NONE) { + $data = $deviceForFiles->read($path); + switch ($algorithm) { + case Compression::ZSTD: + $compressor = new Zstd(); + break; + case Compression::GZIP: + default: + $compressor = new GZIP(); + break; + } + $data = $compressor->compress($data); + } else { + // reset the algorithm to none as we do not compress the file + // if file size exceedes the APP_STORAGE_READ_BUFFER + // regardless the bucket compression algoorithm + $algorithm = Compression::NONE; + } + + if ($bucket->getAttribute('encryption', true) && $fileSize <= APP_STORAGE_READ_BUFFER) { + if (empty($data)) { + $data = $deviceForFiles->read($path); + } + $key = System::getEnv('_APP_OPENSSL_KEY_V1'); + $iv = OpenSSL::randomPseudoBytes(OpenSSL::cipherIVLength(OpenSSL::CIPHER_AES_128_GCM)); + $data = OpenSSL::encrypt($data, OpenSSL::CIPHER_AES_128_GCM, $key, 0, $iv, $tag); + } + + if (!empty($data)) { + if (!$deviceForFiles->write($path, $data, $mimeType)) { + throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to save file'); + } + } + + $sizeActual = $deviceForFiles->getFileSize($path); + + $openSSLVersion = null; + $openSSLCipher = null; + $openSSLTag = null; + $openSSLIV = null; + + if ($bucket->getAttribute('encryption', true) && $fileSize <= APP_STORAGE_READ_BUFFER) { + $openSSLVersion = '1'; + $openSSLCipher = OpenSSL::CIPHER_AES_128_GCM; + $openSSLTag = \bin2hex($tag); + $openSSLIV = \bin2hex($iv); + } + + if ($file->isEmpty()) { + $doc = new Document([ + '$id' => $fileId, + '$permissions' => $permissions, + 'bucketId' => $bucket->getId(), + 'bucketInternalId' => $bucket->getSequence(), + 'name' => $fileName, + 'path' => $path, + 'signature' => $fileHash, + 'mimeType' => $mimeType, + 'sizeOriginal' => $fileSize, + 'sizeActual' => $sizeActual, + 'algorithm' => $algorithm, + 'comment' => '', + 'chunksTotal' => $chunks, + 'chunksUploaded' => $chunksUploaded, + 'openSSLVersion' => $openSSLVersion, + 'openSSLCipher' => $openSSLCipher, + 'openSSLTag' => $openSSLTag, + 'openSSLIV' => $openSSLIV, + 'search' => implode(' ', [$fileId, $fileName]), + 'metadata' => $metadata, + ]); + + try { + $file = $dbForProject->createDocument('bucket_' . $bucket->getSequence(), $doc); + } catch (DuplicateException) { + throw new Exception(Exception::STORAGE_FILE_ALREADY_EXISTS); + } catch (NotFoundException) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + } else { + $file = $file + ->setAttribute('$permissions', $permissions) + ->setAttribute('signature', $fileHash) + ->setAttribute('mimeType', $mimeType) + ->setAttribute('sizeActual', $sizeActual) + ->setAttribute('algorithm', $algorithm) + ->setAttribute('openSSLVersion', $openSSLVersion) + ->setAttribute('openSSLCipher', $openSSLCipher) + ->setAttribute('openSSLTag', $openSSLTag) + ->setAttribute('openSSLIV', $openSSLIV) + ->setAttribute('metadata', $metadata) + ->setAttribute('chunksUploaded', $chunksUploaded); + + /** + * Validate create permission and skip authorization in updateDocument + * Without this, the file creation will fail when user doesn't have update permission + * However as with chunk upload even if we are updating, we are essentially creating a file + * adding it's new chunk so we validate create permission instead of update + */ + $validator = new Authorization(\Utopia\Database\Database::PERMISSION_CREATE); + if (!$validator->isValid($bucket->getCreate())) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + $file = Authorization::skip(fn() => $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file)); + } + } else { + if ($file->isEmpty()) { + $doc = new Document([ + '$id' => ID::custom($fileId), + '$permissions' => $permissions, + 'bucketId' => $bucket->getId(), + 'bucketInternalId' => $bucket->getSequence(), + 'name' => $fileName, + 'path' => $path, + 'signature' => '', + 'mimeType' => '', + 'sizeOriginal' => $fileSize, + 'sizeActual' => 0, + 'algorithm' => '', + 'comment' => '', + 'chunksTotal' => $chunks, + 'chunksUploaded' => $chunksUploaded, + 'search' => implode(' ', [$fileId, $fileName]), + 'metadata' => $metadata, + ]); + + try { + $file = $dbForProject->createDocument('bucket_' . $bucket->getSequence(), $doc); + } catch (DuplicateException) { + throw new Exception(Exception::STORAGE_FILE_ALREADY_EXISTS); + } catch (NotFoundException) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + } else { + $file = $file + ->setAttribute('chunksUploaded', $chunksUploaded) + ->setAttribute('metadata', $metadata); + + /** + * Validate create permission and skip authorization in updateDocument + * Without this, the file creation will fail when user doesn't have update permission + * However as with chunk upload even if we are updating, we are essentially creating a file + * adding it's new chunk so we validate create permission instead of update + */ + $validator = new Authorization(\Utopia\Database\Database::PERMISSION_CREATE); + if (!$validator->isValid($bucket->getCreate())) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + try { + $file = Authorization::skip(fn() => $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file)); + } catch (NotFoundException) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + } + } + + $queueForEvents + ->setParam('bucketId', $bucket->getId()) + ->setParam('fileId', $file->getId()) + ->setContext('bucket', $bucket); + + $metadata = null; // was causing leaks as it was passed by reference + + $response + ->setStatusCode(Response::STATUS_CODE_CREATED) + ->dynamic($file, Response::MODEL_FILE); + } +} diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Delete.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Delete.php new file mode 100644 index 0000000000..09e019335a --- /dev/null +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Delete.php @@ -0,0 +1,17 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/storage/buckets/:bucketId/files/:fileId') + ->desc('Get file') + ->groups(['api', 'storage']) + ->label('scope', 'files.read') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('sdk', new Method( + namespace: 'storage', + group: 'files', + name: 'getFile', + description: '/docs/references/storage/get-file.md', + auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_FILE, + ) + ] + )) + ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') + ->param('fileId', '', new UID(), 'File ID.') + ->inject('response') + ->inject('dbForProject') + ->inject('mode') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + string $fileId, + Response $response, + Database $dbForProject, + string $mode + ) { + $bucket = Authorization::skip(fn() => $dbForProject->getDocument('buckets', $bucketId)); + + $isAPIKey = User::isApp(Authorization::getRoles()); + $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); + + if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + $fileSecurity = $bucket->getAttribute('fileSecurity', false); + $validator = new Authorization(\Utopia\Database\Database::PERMISSION_READ); + $valid = $validator->isValid($bucket->getRead()); + if (!$fileSecurity && !$valid) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + if ($fileSecurity && !$valid) { + $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); + } else { + $file = Authorization::skip(fn() => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); + } + + if ($file->isEmpty()) { + throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); + } + + $response->dynamic($file, Response::MODEL_FILE); + } +} diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php new file mode 100644 index 0000000000..5f33f9f323 --- /dev/null +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php @@ -0,0 +1,17 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/storage/buckets/:bucketId/files') + ->desc('List files') + ->groups(['api', 'storage']) + ->label('scope', 'files.read') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('sdk', new Method( + namespace: 'storage', + group: 'files', + name: 'listFiles', + description: '/docs/references/storage/list-files.md', + auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_FILE_LIST, + ) + ] + )) + ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') + ->param('queries', [], new Files(), '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(', ', Files::ALLOWED_ATTRIBUTES), true) + ->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true) + ->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true) + ->inject('response') + ->inject('dbForProject') + ->inject('mode') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + array $queries, + string $search, + bool $includeTotal, + Response $response, + Database $dbForProject, + string $mode + ) { + $bucket = Authorization::skip(fn() => $dbForProject->getDocument('buckets', $bucketId)); + + $isAPIKey = User::isApp(Authorization::getRoles()); + $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); + + if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + $fileSecurity = $bucket->getAttribute('fileSecurity', false); + $validator = new Authorization(\Utopia\Database\Database::PERMISSION_READ); + $valid = $validator->isValid($bucket->getRead()); + if (!$fileSecurity && !$valid) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + $queries = Query::parseQueries($queries); + + if (!empty($search)) { + $queries[] = Query::search('search', $search); + } + + /** + * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries + */ + $cursor = \array_filter($queries, function ($query) { + return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); + }); + $cursor = reset($cursor); + if ($cursor) { + /** @var Query $cursor */ + + $validator = new Cursor(); + if (!$validator->isValid($cursor)) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); + } + + $fileId = $cursor->getValue(); + + if ($fileSecurity && !$valid) { + $cursorDocument = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); + } else { + $cursorDocument = Authorization::skip(fn() => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); + } + + if ($cursorDocument->isEmpty()) { + throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "File '{$fileId}' for the 'cursor' value not found."); + } + + $cursor->setValue($cursorDocument); + } + + $filterQueries = Query::groupByType($queries)['filters']; + + try { + if ($fileSecurity && !$valid) { + $files = $dbForProject->find('bucket_' . $bucket->getSequence(), $queries); + $total = $includeTotal ? $dbForProject->count('bucket_' . $bucket->getSequence(), $filterQueries, APP_LIMIT_COUNT) : 0; + } else { + $files = Authorization::skip(fn() => $dbForProject->find('bucket_' . $bucket->getSequence(), $queries)); + $total = $includeTotal ? Authorization::skip(fn() => $dbForProject->count('bucket_' . $bucket->getSequence(), $filterQueries, APP_LIMIT_COUNT)) : 0; + } + } catch (NotFoundException) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } catch (OrderException $e) { + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."); + } catch (QueryException $e) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); + } + + $response->dynamic(new Document([ + 'files' => $files, + 'total' => $total, + ]), Response::MODEL_FILE_LIST); + } +} diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Get.php new file mode 100644 index 0000000000..dd14feef6e --- /dev/null +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Get.php @@ -0,0 +1,65 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/storage/buckets/:bucketId') + ->desc('Get bucket') + ->groups(['api', 'storage']) + ->label('scope', 'buckets.read') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('sdk', new Method( + namespace: 'storage', + group: 'buckets', + name: 'getBucket', + description: '/docs/references/storage/get-bucket.md', + auth: [AuthType::ADMIN, AuthType::KEY], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_BUCKET, + ) + ] + )) + ->param('bucketId', '', new UID(), 'Bucket unique ID.') + ->inject('response') + ->inject('dbForProject') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + Response $response, + Database $dbForProject + ) { + $bucket = $dbForProject->getDocument('buckets', $bucketId); + + if ($bucket->isEmpty()) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + $response->dynamic($bucket, Response::MODEL_BUCKET); + } +} diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Update.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Update.php new file mode 100644 index 0000000000..9f83479671 --- /dev/null +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Update.php @@ -0,0 +1,131 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_PUT) + ->setHttpPath('/v1/storage/buckets/:bucketId') + ->desc('Update bucket') + ->groups(['api', 'storage']) + ->label('scope', 'buckets.write') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('event', 'buckets.[bucketId].update') + ->label('audits.event', 'bucket.update') + ->label('audits.resource', 'bucket/{response.$id}') + ->label('sdk', new Method( + namespace: 'storage', + group: 'buckets', + name: 'updateBucket', + description: '/docs/references/storage/update-bucket.md', + auth: [AuthType::ADMIN, AuthType::KEY], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_BUCKET, + ) + ] + )) + ->param('bucketId', '', new UID(), 'Bucket unique ID.') + ->param('name', null, new Text(128), 'Bucket name', false) + ->param('permissions', null, new Nullable(new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE)), 'An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) + ->param('fileSecurity', false, new Boolean(true), 'Enables configuring permissions for individual file. A user needs one of file or bucket level permissions to access a file. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) + ->param('enabled', true, new Boolean(true), 'Is bucket enabled? When set to \'disabled\', users cannot access the files in this bucket but Server SDKs with and API key can still access the bucket. No files are lost when this is toggled.', true) + ->param('maximumFileSize', fn(array $plan) => empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000, fn(array $plan) => new Range(1, empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000), 'Maximum file size allowed in bytes. Maximum allowed value is ' . Storage::human(System::getEnv('_APP_STORAGE_LIMIT', 0), 0) . '.', true, ['plan']) + ->param('allowedFileExtensions', [], new ArrayList(new Text(64), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Allowed file extensions. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' extensions are allowed, each 64 characters long.', true) + ->param('compression', Compression::NONE, new WhiteList([Compression::NONE, Compression::GZIP, Compression::ZSTD], true), 'Compression algorithm choosen for compression. Can be one of ' . Compression::NONE . ', [' . Compression::GZIP . '](https://en.wikipedia.org/wiki/Gzip), or [' . Compression::ZSTD . '](https://en.wikipedia.org/wiki/Zstd), For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' compression is skipped even if it\'s enabled', true) + ->param('encryption', true, new Boolean(true), 'Is encryption enabled? For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' encryption is skipped even if it\'s enabled', true) + ->param('antivirus', true, new Boolean(true), 'Is virus scanning enabled? For file size above ' . Storage::human(APP_LIMIT_ANTIVIRUS, 0) . ' AntiVirus scanning is skipped even if it\'s enabled', true) + ->param('transformations', true, new Boolean(true), 'Are image transformations enabled?', true) + ->inject('response') + ->inject('dbForProject') + ->inject('queueForEvents') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + string $name, + ?array $permissions, + bool $fileSecurity, + bool $enabled, + ?int $maximumFileSize, + array $allowedFileExtensions, + ?string $compression, + ?bool $encryption, + bool $antivirus, + bool $transformations, + Response $response, + Database $dbForProject, + Event $queueForEvents + ) { + $bucket = $dbForProject->getDocument('buckets', $bucketId); + + if ($bucket->isEmpty()) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + $permissions ??= $bucket->getPermissions(); + $maximumFileSize ??= $bucket->getAttribute('maximumFileSize', (int) System::getEnv('_APP_STORAGE_LIMIT', 0)); + $allowedFileExtensions ??= $bucket->getAttribute('allowedFileExtensions', []); + $enabled ??= $bucket->getAttribute('enabled', true); + $encryption ??= $bucket->getAttribute('encryption', true); + $antivirus ??= $bucket->getAttribute('antivirus', true); + $compression ??= $bucket->getAttribute('compression', Compression::NONE); + $transformations ??= $bucket->getAttribute('transformations', true); + + // Map aggregate permissions into the multiple permissions they represent. + $permissions = Permission::aggregate($permissions); + + $bucket = $dbForProject->updateDocument('buckets', $bucket->getId(), $bucket + ->setAttribute('name', $name) + ->setAttribute('$permissions', $permissions) + ->setAttribute('maximumFileSize', $maximumFileSize) + ->setAttribute('allowedFileExtensions', $allowedFileExtensions) + ->setAttribute('fileSecurity', $fileSecurity) + ->setAttribute('enabled', $enabled) + ->setAttribute('encryption', $encryption) + ->setAttribute('compression', $compression) + ->setAttribute('antivirus', $antivirus) + ->setAttribute('transformations', $transformations)); + + $dbForProject->updateCollection('bucket_' . $bucket->getSequence(), $permissions, $fileSecurity); + + $queueForEvents + ->setParam('bucketId', $bucket->getId()); + + $response->dynamic($bucket, Response::MODEL_BUCKET); + } +} diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/XList.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/XList.php new file mode 100644 index 0000000000..74f12852be --- /dev/null +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/XList.php @@ -0,0 +1,117 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/storage/buckets') + ->desc('List buckets') + ->groups(['api', 'storage']) + ->label('scope', 'buckets.read') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('sdk', new Method( + namespace: 'storage', + group: 'buckets', + name: 'listBuckets', + description: '/docs/references/storage/list-buckets.md', + auth: [AuthType::ADMIN, AuthType::KEY], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_BUCKET_LIST, + ) + ] + )) + ->param('queries', [], new Buckets(), '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(', ', Buckets::ALLOWED_ATTRIBUTES), true) + ->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true) + ->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true) + ->inject('response') + ->inject('dbForProject') + ->callback($this->action(...)); + } + + public function action( + array $queries, + string $search, + bool $includeTotal, + Response $response, + Database $dbForProject + ) { + try { + $queries = Query::parseQueries($queries); + } catch (QueryException $e) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); + } + + if (!empty($search)) { + $queries[] = Query::search('search', $search); + } + + /** + * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries + */ + $cursor = \array_filter($queries, function ($query) { + return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); + }); + $cursor = reset($cursor); + if ($cursor) { + /** @var Query $cursor */ + + $validator = new Cursor(); + if (!$validator->isValid($cursor)) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); + } + + $bucketId = $cursor->getValue(); + $cursorDocument = $dbForProject->getDocument('buckets', $bucketId); + + if ($cursorDocument->isEmpty()) { + throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "Bucket '{$bucketId}' for the 'cursor' value not found."); + } + + $cursor->setValue($cursorDocument); + } + + $filterQueries = Query::groupByType($queries)['filters']; + try { + $buckets = $dbForProject->find('buckets', $queries); + $total = $includeTotal ? $dbForProject->count('buckets', $filterQueries, APP_LIMIT_COUNT) : 0; + } catch (OrderException $e) { + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."); + } catch (QueryException $e) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); + } + $response->dynamic(new Document([ + 'buckets' => $buckets, + 'total' => $total, + ]), Response::MODEL_BUCKET_LIST); + } +} diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Usage/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Usage/Get.php new file mode 100644 index 0000000000..496ac54582 --- /dev/null +++ b/src/Appwrite/Platform/Modules/Storage/Http/Usage/Get.php @@ -0,0 +1,17 @@ +addService('http', new Http()); + } +} diff --git a/src/Appwrite/Platform/Modules/Storage/Services/Http.php b/src/Appwrite/Platform/Modules/Storage/Services/Http.php new file mode 100644 index 0000000000..e60571eff0 --- /dev/null +++ b/src/Appwrite/Platform/Modules/Storage/Services/Http.php @@ -0,0 +1,51 @@ +type = Service::TYPE_HTTP; + + // Buckets + $this->addAction(CreateBucket::getName(), new CreateBucket()); + $this->addAction(GetBucket::getName(), new GetBucket()); + $this->addAction(ListBuckets::getName(), new ListBuckets()); + $this->addAction(UpdateBucket::getName(), new UpdateBucket()); + $this->addAction(DeleteBucket::getName(), new DeleteBucket()); + + // Files + $this->addAction(CreateFile::getName(), new CreateFile()); + $this->addAction(GetFile::getName(), new GetFile()); + $this->addAction(ListFiles::getName(), new ListFiles()); + $this->addAction(UpdateFile::getName(), new UpdateFile()); + $this->addAction(DeleteFile::getName(), new DeleteFile()); + $this->addAction(GetFilePreview::getName(), new GetFilePreview()); + $this->addAction(GetFileDownload::getName(), new GetFileDownload()); + $this->addAction(GetFileView::getName(), new GetFileView()); + $this->addAction(GetFileForPush::getName(), new GetFileForPush()); + + // Usage + $this->addAction(ListUsage::getName(), new ListUsage()); + $this->addAction(GetBucketUsage::getName(), new GetBucketUsage()); + } +} From f4f4ad9c7dfc95d31483a280d3f1b3b2599a2657 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 29 Dec 2025 01:51:07 +0000 Subject: [PATCH 61/95] format --- .../Modules/Storage/Http/Buckets/Create.php | 3 +-- .../Storage/Http/Buckets/Files/Create.php | 7 +++---- .../Storage/Http/Buckets/Files/Get.php | 4 ++-- .../Storage/Http/Buckets/Files/Push/Get.php | 2 +- .../Storage/Http/Buckets/Files/XList.php | 8 ++++---- .../Modules/Storage/Http/Buckets/Update.php | 2 +- .../Modules/Storage/Services/Http.php | 20 +++++++++---------- 7 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Create.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Create.php index a4d28ab487..00daef061e 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Create.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Create.php @@ -5,7 +5,6 @@ namespace Appwrite\Platform\Modules\Storage\Http\Buckets; use Appwrite\Event\Event; use Appwrite\Extend\Exception; use Appwrite\SDK\AuthType; -use Appwrite\SDK\ContentType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\CustomId; @@ -67,7 +66,7 @@ class Create extends Action ->param('permissions', null, new Nullable(new \Utopia\Database\Validator\Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE)), 'An array of permission strings. By default, no user is granted with any permissions. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) ->param('fileSecurity', false, new Boolean(true), 'Enables configuring permissions for individual file. A user needs one of file or bucket level permissions to access a file. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) ->param('enabled', true, new Boolean(true), 'Is bucket enabled? When set to \'disabled\', users cannot access the files in this bucket but Server SDKs with and API key can still access the bucket. No files are lost when this is toggled.', true) - ->param('maximumFileSize', fn(array $plan) => empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000, fn(array $plan) => new Range(1, empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000), 'Maximum file size allowed in bytes. Maximum allowed value is ' . Storage::human(System::getEnv('_APP_STORAGE_LIMIT', 0), 0) . '.', true, ['plan']) + ->param('maximumFileSize', fn (array $plan) => empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000, fn (array $plan) => new Range(1, empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000), 'Maximum file size allowed in bytes. Maximum allowed value is ' . Storage::human(System::getEnv('_APP_STORAGE_LIMIT', 0), 0) . '.', true, ['plan']) ->param('allowedFileExtensions', [], new ArrayList(new Text(64), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Allowed file extensions. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' extensions are allowed, each 64 characters long.', true) ->param('compression', Compression::NONE, new WhiteList([Compression::NONE, Compression::GZIP, Compression::ZSTD], true), 'Compression algorithm choosen for compression. Can be one of ' . Compression::NONE . ', [' . Compression::GZIP . '](https://en.wikipedia.org/wiki/Gzip), or [' . Compression::ZSTD . '](https://en.wikipedia.org/wiki/Zstd), For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' compression is skipped even if it\'s enabled', true) ->param('encryption', true, new Boolean(true), 'Is encryption enabled? For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' encryption is skipped even if it\'s enabled', true) diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php index 8640dedb8b..b2d9af5a08 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php @@ -2,7 +2,6 @@ namespace Appwrite\Platform\Modules\Storage\Http\Buckets\Files; -use Ahc\Jwt\JWT; use Appwrite\ClamAV\Network; use Appwrite\Event\Event; use Appwrite\Extend\Exception; @@ -108,7 +107,7 @@ class Create extends Action Device $deviceForFiles, Device $deviceForLocal ) { - $bucket = Authorization::skip(fn() => $dbForProject->getDocument('buckets', $bucketId)); + $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); $isAPIKey = User::isApp(Authorization::getRoles()); $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); @@ -384,7 +383,7 @@ class Create extends Action if (!$validator->isValid($bucket->getCreate())) { throw new Exception(Exception::USER_UNAUTHORIZED); } - $file = Authorization::skip(fn() => $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file)); + $file = Authorization::skip(fn () => $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file)); } } else { if ($file->isEmpty()) { @@ -431,7 +430,7 @@ class Create extends Action } try { - $file = Authorization::skip(fn() => $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file)); + $file = Authorization::skip(fn () => $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file)); } catch (NotFoundException) { throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); } diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Get.php index 102ea4d34e..e19fa8ae88 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Get.php @@ -60,7 +60,7 @@ class Get extends Action Database $dbForProject, string $mode ) { - $bucket = Authorization::skip(fn() => $dbForProject->getDocument('buckets', $bucketId)); + $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); $isAPIKey = User::isApp(Authorization::getRoles()); $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); @@ -79,7 +79,7 @@ class Get extends Action if ($fileSecurity && !$valid) { $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); } else { - $file = Authorization::skip(fn() => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); + $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); } if ($file->isEmpty()) { diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php index 182cc7e172..b70ada75d3 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php @@ -11,7 +11,7 @@ class Get extends Action return 'getFileForPush'; } - // FILE PUSH - GET /v1/storage/buckets/:bucketId/files/:fileId/push + // FILE PUSH - GET /v1/storage/buckets/:bucketId/files/:fileId/push // Endpoint implementation from /app/controllers/api/storage.php lines 1487-1641 // Provides file access for push notifications with JWT validation } diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php index bdd8f4b493..f9448f7d87 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php @@ -73,7 +73,7 @@ class XList extends Action Database $dbForProject, string $mode ) { - $bucket = Authorization::skip(fn() => $dbForProject->getDocument('buckets', $bucketId)); + $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); $isAPIKey = User::isApp(Authorization::getRoles()); $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); @@ -115,7 +115,7 @@ class XList extends Action if ($fileSecurity && !$valid) { $cursorDocument = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); } else { - $cursorDocument = Authorization::skip(fn() => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); + $cursorDocument = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); } if ($cursorDocument->isEmpty()) { @@ -132,8 +132,8 @@ class XList extends Action $files = $dbForProject->find('bucket_' . $bucket->getSequence(), $queries); $total = $includeTotal ? $dbForProject->count('bucket_' . $bucket->getSequence(), $filterQueries, APP_LIMIT_COUNT) : 0; } else { - $files = Authorization::skip(fn() => $dbForProject->find('bucket_' . $bucket->getSequence(), $queries)); - $total = $includeTotal ? Authorization::skip(fn() => $dbForProject->count('bucket_' . $bucket->getSequence(), $filterQueries, APP_LIMIT_COUNT)) : 0; + $files = Authorization::skip(fn () => $dbForProject->find('bucket_' . $bucket->getSequence(), $queries)); + $total = $includeTotal ? Authorization::skip(fn () => $dbForProject->count('bucket_' . $bucket->getSequence(), $filterQueries, APP_LIMIT_COUNT)) : 0; } } catch (NotFoundException) { throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Update.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Update.php index 9f83479671..44f0192fb4 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Update.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Update.php @@ -63,7 +63,7 @@ class Update extends Action ->param('permissions', null, new Nullable(new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE)), 'An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) ->param('fileSecurity', false, new Boolean(true), 'Enables configuring permissions for individual file. A user needs one of file or bucket level permissions to access a file. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) ->param('enabled', true, new Boolean(true), 'Is bucket enabled? When set to \'disabled\', users cannot access the files in this bucket but Server SDKs with and API key can still access the bucket. No files are lost when this is toggled.', true) - ->param('maximumFileSize', fn(array $plan) => empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000, fn(array $plan) => new Range(1, empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000), 'Maximum file size allowed in bytes. Maximum allowed value is ' . Storage::human(System::getEnv('_APP_STORAGE_LIMIT', 0), 0) . '.', true, ['plan']) + ->param('maximumFileSize', fn (array $plan) => empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000, fn (array $plan) => new Range(1, empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000), 'Maximum file size allowed in bytes. Maximum allowed value is ' . Storage::human(System::getEnv('_APP_STORAGE_LIMIT', 0), 0) . '.', true, ['plan']) ->param('allowedFileExtensions', [], new ArrayList(new Text(64), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Allowed file extensions. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' extensions are allowed, each 64 characters long.', true) ->param('compression', Compression::NONE, new WhiteList([Compression::NONE, Compression::GZIP, Compression::ZSTD], true), 'Compression algorithm choosen for compression. Can be one of ' . Compression::NONE . ', [' . Compression::GZIP . '](https://en.wikipedia.org/wiki/Gzip), or [' . Compression::ZSTD . '](https://en.wikipedia.org/wiki/Zstd), For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' compression is skipped even if it\'s enabled', true) ->param('encryption', true, new Boolean(true), 'Is encryption enabled? For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' encryption is skipped even if it\'s enabled', true) diff --git a/src/Appwrite/Platform/Modules/Storage/Services/Http.php b/src/Appwrite/Platform/Modules/Storage/Services/Http.php index e60571eff0..95fe160f8b 100644 --- a/src/Appwrite/Platform/Modules/Storage/Services/Http.php +++ b/src/Appwrite/Platform/Modules/Storage/Services/Http.php @@ -4,20 +4,20 @@ namespace Appwrite\Platform\Modules\Storage\Services; use Appwrite\Platform\Modules\Storage\Http\Buckets\Create as CreateBucket; use Appwrite\Platform\Modules\Storage\Http\Buckets\Delete as DeleteBucket; +use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Create as CreateFile; +use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Delete as DeleteFile; +use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Download\Get as GetFileDownload; +use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Get as GetFile; +use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Preview\Get as GetFilePreview; +use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Push\Get as GetFileForPush; +use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Update as UpdateFile; +use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\View\Get as GetFileView; +use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\XList as ListFiles; use Appwrite\Platform\Modules\Storage\Http\Buckets\Get as GetBucket; use Appwrite\Platform\Modules\Storage\Http\Buckets\Update as UpdateBucket; use Appwrite\Platform\Modules\Storage\Http\Buckets\XList as ListBuckets; -use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Create as CreateFile; -use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Delete as DeleteFile; -use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Get as GetFile; -use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Preview\Get as GetFilePreview; -use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Download\Get as GetFileDownload; -use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\View\Get as GetFileView; -use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Push\Get as GetFileForPush; -use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Update as UpdateFile; -use Appwrite\Platform\Modules\Storage\Http\Buckets\Files\XList as ListFiles; -use Appwrite\Platform\Modules\Storage\Http\Usage\XList as ListUsage; use Appwrite\Platform\Modules\Storage\Http\Usage\Get as GetBucketUsage; +use Appwrite\Platform\Modules\Storage\Http\Usage\XList as ListUsage; use Utopia\Platform\Service; class Http extends Service From f99cb20d05f7e63be7abc56d7553a78f18af24b6 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 29 Dec 2025 07:44:03 +0000 Subject: [PATCH 62/95] Initialize storage module and remove storage and fix remaining endpoints --- src/Appwrite/Platform/Appwrite.php | 2 + .../Storage/Http/Buckets/Files/Delete.php | 101 ++++++- .../Http/Buckets/Files/Download/Get.php | 202 ++++++++++++- .../Http/Buckets/Files/Preview/Get.php | 276 +++++++++++++++++- .../Storage/Http/Buckets/Files/Push/Get.php | 196 ++++++++++++- .../Storage/Http/Buckets/Files/Update.php | 104 ++++++- .../Storage/Http/Buckets/Files/View/Get.php | 214 +++++++++++++- .../Modules/Storage/Http/Usage/Get.php | 126 +++++++- .../Modules/Storage/Http/Usage/XList.php | 109 ++++++- 9 files changed, 1306 insertions(+), 24 deletions(-) diff --git a/src/Appwrite/Platform/Appwrite.php b/src/Appwrite/Platform/Appwrite.php index 4aa135c4f1..a34c79308a 100644 --- a/src/Appwrite/Platform/Appwrite.php +++ b/src/Appwrite/Platform/Appwrite.php @@ -10,6 +10,7 @@ use Appwrite\Platform\Modules\Functions; use Appwrite\Platform\Modules\Projects; use Appwrite\Platform\Modules\Proxy; use Appwrite\Platform\Modules\Sites; +use Appwrite\Platform\Modules\Storage; use Appwrite\Platform\Modules\Tokens; use Utopia\Platform\Platform; @@ -26,5 +27,6 @@ class Appwrite extends Platform $this->addModule(new Console\Module()); $this->addModule(new Proxy\Module()); $this->addModule(new Tokens\Module()); + $this->addModule(new Storage\Module()); } } diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Delete.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Delete.php index 09e019335a..a7ad0851d7 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Delete.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Delete.php @@ -2,16 +2,111 @@ namespace Appwrite\Platform\Modules\Storage\Http\Buckets\Files; +use Appwrite\Event\Delete as DeleteEvent; +use Appwrite\Event\Event; +use Appwrite\Extend\Exception; +use Appwrite\SDK\AuthType; +use Appwrite\SDK\ContentType; +use Appwrite\SDK\Method; +use Appwrite\SDK\Response as SDKResponse; +use Appwrite\Utopia\Response; +use Utopia\Database\Database; +use Utopia\Database\Validator\Authorization; +use Utopia\Database\Validator\UID; use Utopia\Platform\Action; +use Utopia\Platform\Scope\HTTP; class Delete extends Action { + use HTTP; + public static function getName() { return 'deleteFile'; } - // FILE DELETE - DELETE /v1/storage/buckets/:bucketId/files/:fileId - // Endpoint implementation from /app/controllers/api/storage.php lines 1758-1864 - // Deletes file from storage device and database with proper cleanup + public function __construct() + { + $this + ->setHttpMethod(Action::HTTP_REQUEST_METHOD_DELETE) + ->setHttpPath('/v1/storage/buckets/:bucketId/files/:fileId') + ->desc('Delete file') + ->groups(['api', 'storage']) + ->label('scope', 'files.write') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('event', 'buckets.[bucketId].files.[fileId].delete') + ->label('audits.event', 'file.delete') + ->label('audits.resource', 'file/{request.fileId}') + ->label('sdk', new Method( + namespace: 'storage', + group: 'files', + name: 'deleteFile', + description: '/docs/references/storage/delete-file.md', + auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_NOCONTENT, + model: Response::MODEL_NONE, + ) + ], + contentType: ContentType::NONE + )) + ->param('bucketId', '', new UID(), 'Bucket unique ID.') + ->param('fileId', '', new UID(), 'File ID.') + ->inject('response') + ->inject('dbForProject') + ->inject('queueForDeletes') + ->inject('queueForEvents') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + string $fileId, + Response $response, + Database $dbForProject, + DeleteEvent $queueForDeletes, + Event $queueForEvents + ) { + $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); + + if ($bucket->isEmpty()) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + // Validate delete permission + $validator = new Authorization(Database::PERMISSION_DELETE); + $validBucketDelete = $validator->isValid($bucket->getDelete()); + $fileSecurity = $bucket->getAttribute('fileSecurity', false); + + if (!$validBucketDelete && !$fileSecurity) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + // Fetch file based on security + if ($fileSecurity && !$validBucketDelete) { + $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); + } else { + $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); + } + + if ($file->isEmpty()) { + throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); + } + + if (!$dbForProject->deleteDocument('bucket_' . $bucket->getSequence(), $fileId)) { + throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to remove file from DB'); + } + + $queueForDeletes + ->setType(DELETE_TYPE_DOCUMENT) + ->setDocument($file); + + $queueForEvents + ->setParam('bucketId', $bucket->getId()) + ->setParam('fileId', $file->getId()) + ->setPayload($response->output($file, Response::MODEL_FILE)); + + $response->noContent(); + } } diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Download/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Download/Get.php index 3efc003fe8..45e3b83375 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Download/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Download/Get.php @@ -2,16 +2,212 @@ namespace Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Download; +use Appwrite\Extend\Exception; +use Appwrite\OpenSSL\OpenSSL; +use Appwrite\SDK\AuthType; +use Appwrite\SDK\ContentType; +use Appwrite\SDK\Method; +use Appwrite\SDK\MethodType; +use Appwrite\SDK\Response as SDKResponse; +use Appwrite\Utopia\Database\Documents\User; +use Appwrite\Utopia\Response; +use Utopia\Database\Database; +use Utopia\Database\Document; +use Utopia\Database\Validator\Authorization; +use Utopia\Database\Validator\UID; use Utopia\Platform\Action; +use Utopia\Platform\Scope\HTTP; +use Utopia\Storage\Compression\Algorithms\GZIP; +use Utopia\Storage\Compression\Algorithms\Zstd; +use Utopia\Storage\Compression\Compression; +use Utopia\Storage\Device; +use Utopia\Swoole\Request; +use Utopia\System\System; +use Utopia\Validator\Text; class Get extends Action { + use HTTP; + public static function getName() { return 'getFileDownload'; } - // FILE DOWNLOAD - GET /v1/storage/buckets/:bucketId/files/:fileId/download - // Endpoint implementation from /app/controllers/api/storage.php lines 1154-1314 - // Provides file download with range request support and proper headers + public function __construct() + { + $this + ->setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/storage/buckets/:bucketId/files/:fileId/download') + ->desc('Get file for download') + ->groups(['api', 'storage']) + ->label('scope', 'files.read') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('sdk', new Method( + namespace: 'storage', + group: 'files', + name: 'getFileDownload', + description: '/docs/references/storage/get-file-download.md', + auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_NONE, + ) + ], + contentType: ContentType::ANY, + type: MethodType::LOCATION + )) + ->param('bucketId', '', new UID(), 'Storage bucket ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') + ->param('fileId', '', new UID(), 'File ID.') + // NOTE: this is only for the sdk generator and is not used in the action below and is utilised in `resources.php` for `resourceToken`. + ->param('token', '', new Text(512), 'File token for accessing this file.', true) + ->inject('request') + ->inject('response') + ->inject('dbForProject') + ->inject('mode') + ->inject('resourceToken') + ->inject('deviceForFiles') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + string $fileId, + ?string $token, + Request $request, + Response $response, + Database $dbForProject, + string $mode, + Document $resourceToken, + Device $deviceForFiles + ) { + /* @type Document $bucket */ + $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); + + $isAPIKey = User::isApp(Authorization::getRoles()); + $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); + + if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + $isToken = !$resourceToken->isEmpty() && $resourceToken->getAttribute('bucketInternalId') === $bucket->getSequence(); + $fileSecurity = $bucket->getAttribute('fileSecurity', false); + $validator = new Authorization(Database::PERMISSION_READ); + $valid = $validator->isValid($bucket->getRead()); + if (!$fileSecurity && !$valid && !$isToken) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + if ($fileSecurity && !$valid && !$isToken) { + $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); + } else { + /* @type Document $file */ + $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); + } + + if (!$resourceToken->isEmpty() && $resourceToken->getAttribute('fileInternalId') !== $file->getSequence()) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + if ($file->isEmpty()) { + throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); + } + + $path = $file->getAttribute('path', ''); + + if (!$deviceForFiles->exists($path)) { + throw new Exception(Exception::STORAGE_FILE_NOT_FOUND, 'File not found in ' . $path); + } + + $size = $file->getAttribute('sizeOriginal', 0); + + $rangeHeader = $request->getHeader('range'); + if (!empty($rangeHeader)) { + $start = $request->getRangeStart(); + $end = $request->getRangeEnd(); + $unit = $request->getRangeUnit(); + + if ($end === null || $end - $start > APP_STORAGE_READ_BUFFER) { + $end = min(($start + MAX_OUTPUT_CHUNK_SIZE - 1), ($size - 1)); + } + + if ($unit !== 'bytes' || $start >= $end || $end >= $size) { + throw new Exception(Exception::STORAGE_INVALID_RANGE); + } + + $response + ->addHeader('Accept-Ranges', 'bytes') + ->addHeader('Content-Range', 'bytes ' . $start . '-' . $end . '/' . $size) + ->addHeader('Content-Length', $end - $start + 1) + ->setStatusCode(Response::STATUS_CODE_PARTIALCONTENT); + } + + $response + ->setContentType($file->getAttribute('mimeType')) + ->addHeader('Cache-Control', 'private, max-age=3888000') // 45 days + ->addHeader('X-Peak', \memory_get_peak_usage()) + ->addHeader('Content-Disposition', 'attachment; filename="' . $file->getAttribute('name', '') . '"') + ; + + $source = ''; + if (!empty($file->getAttribute('openSSLCipher'))) { // Decrypt + $source = $deviceForFiles->read($path); + $source = OpenSSL::decrypt( + $source, + $file->getAttribute('openSSLCipher'), + System::getEnv('_APP_OPENSSL_KEY_V' . $file->getAttribute('openSSLVersion')), + 0, + \hex2bin($file->getAttribute('openSSLIV')), + \hex2bin($file->getAttribute('openSSLTag')) + ); + } + + switch ($file->getAttribute('algorithm', Compression::NONE)) { + case Compression::ZSTD: + if (empty($source)) { + $source = $deviceForFiles->read($path); + } + $compressor = new Zstd(); + $source = $compressor->decompress($source); + break; + case Compression::GZIP: + if (empty($source)) { + $source = $deviceForFiles->read($path); + } + $compressor = new GZIP(); + $source = $compressor->decompress($source); + break; + } + + if (!empty($source)) { + if (!empty($rangeHeader)) { + $response->send(substr($source, $start, ($end - $start + 1))); + return; + } + $response->send($source); + return; + } + + if (!empty($rangeHeader)) { + $response->send($deviceForFiles->read($path, $start, ($end - $start + 1))); + return; + } + + if ($size > APP_STORAGE_READ_BUFFER) { + for ($i = 0; $i < ceil($size / MAX_OUTPUT_CHUNK_SIZE); $i++) { + $response->chunk( + $deviceForFiles->read( + $path, + ($i * MAX_OUTPUT_CHUNK_SIZE), + min(MAX_OUTPUT_CHUNK_SIZE, $size - ($i * MAX_OUTPUT_CHUNK_SIZE)) + ), + (($i + 1) * MAX_OUTPUT_CHUNK_SIZE) >= $size + ); + } + } else { + $response->send($deviceForFiles->read($path)); + } + } } diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php index 5f33f9f323..9c4e49d0bb 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php @@ -2,16 +2,286 @@ namespace Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Preview; +use Appwrite\Extend\Exception; +use Appwrite\OpenSSL\OpenSSL; +use Appwrite\SDK\AuthType; +use Appwrite\SDK\ContentType; +use Appwrite\SDK\Method; +use Appwrite\SDK\MethodType; +use Appwrite\SDK\Response as SDKResponse; +use Appwrite\Utopia\Database\Documents\User; +use Appwrite\Utopia\Response; +use Utopia\CLI\Console; +use Utopia\Config\Config; +use Utopia\Database\Database; +use Utopia\Database\DateTime; +use Utopia\Database\Document; +use Utopia\Database\Validator\Authorization; +use Utopia\Database\Validator\UID; +use Utopia\Image\Image; use Utopia\Platform\Action; +use Utopia\Platform\Scope\HTTP; +use Utopia\Storage\Compression\Algorithms\GZIP; +use Utopia\Storage\Compression\Algorithms\Zstd; +use Utopia\Storage\Compression\Compression; +use Utopia\Storage\Device; +use Utopia\Swoole\Request; +use Utopia\System\System; +use Utopia\Validator\HexColor; +use Utopia\Validator\Range; +use Utopia\Validator\Text; +use Utopia\Validator\WhiteList; class Get extends Action { + use HTTP; + public static function getName() { return 'getFilePreview'; } - // FILE PREVIEW - GET /v1/storage/buckets/:bucketId/files/:fileId/preview - // Endpoint implementation from /app/controllers/api/storage.php lines 938-1153 - // Provides image preview generation with crop, transformation, and rendering capabilities + public function __construct() + { + $this + ->setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/storage/buckets/:bucketId/files/:fileId/preview') + ->desc('Get file preview') + ->groups(['api', 'storage']) + ->label('scope', 'files.read') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('cache', true) + ->label('cache.resourceType', 'bucket/{request.bucketId}') + ->label('cache.resource', 'file/{request.fileId}') + ->label('sdk', new Method( + namespace: 'storage', + group: 'files', + name: 'getFilePreview', + description: '/docs/references/storage/get-file-preview.md', + auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_NONE + ) + ], + type: MethodType::LOCATION, + contentType: ContentType::IMAGE + )) + ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') + ->param('fileId', '', new UID(), 'File ID') + ->param('width', 0, new Range(0, 4000), 'Resize preview image width, Pass an integer between 0 to 4000.', true) + ->param('height', 0, new Range(0, 4000), 'Resize preview image height, Pass an integer between 0 to 4000.', true) + ->param('gravity', Image::GRAVITY_CENTER, new WhiteList(Image::getGravityTypes()), 'Image crop gravity. Can be one of ' . implode(",", Image::getGravityTypes()), true) + ->param('quality', -1, new Range(-1, 100), 'Preview image quality. Pass an integer between 0 to 100. Defaults to keep existing image quality.', true) + ->param('borderWidth', 0, new Range(0, 100), 'Preview image border in pixels. Pass an integer between 0 to 100. Defaults to 0.', true) + ->param('borderColor', '', new HexColor(), 'Preview image border color. Use a valid HEX color, no # is needed for prefix.', true) + ->param('borderRadius', 0, new Range(0, 4000), 'Preview image border radius in pixels. Pass an integer between 0 to 4000.', true) + ->param('opacity', 1, new Range(0, 1, Range::TYPE_FLOAT), 'Preview image opacity. Only works with images having an alpha channel (like png). Pass a number between 0 to 1.', true) + ->param('rotation', 0, new Range(-360, 360), 'Preview image rotation in degrees. Pass an integer between -360 and 360.', true) + ->param('background', '', new HexColor(), 'Preview image background color. Only works with transparent images (png). Use a valid HEX color, no # is needed for prefix.', true) + ->param('output', '', new WhiteList(\array_keys(Config::getParam('storage-outputs')), true), 'Output format type (jpeg, jpg, png, gif and webp).', true) + // NOTE: this is only for the sdk generator and is not used in the action below and is utilised in `resources.php` for `resourceToken`. + ->param('token', '', new Text(512), 'File token for accessing this file.', true) + ->inject('request') + ->inject('response') + ->inject('dbForProject') + ->inject('resourceToken') + ->inject('deviceForFiles') + ->inject('deviceForLocal') + ->inject('project') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + string $fileId, + int $width, + int $height, + string $gravity, + int $quality, + int $borderWidth, + string $borderColor, + int $borderRadius, + float $opacity, + int $rotation, + string $background, + string $output, + ?string $token, + Request $request, + Response $response, + Database $dbForProject, + Document $resourceToken, + Device $deviceForFiles, + Device $deviceForLocal, + Document $project + ) { + + if (!\extension_loaded('imagick')) { + throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Imagick extension is missing'); + } + + /* @type Document $bucket */ + $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); + + $isAPIKey = User::isApp(Authorization::getRoles()); + $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); + + if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + if (!$bucket->getAttribute('transformations', true) && !$isAPIKey && !$isPrivilegedUser) { + throw new Exception(Exception::STORAGE_BUCKET_TRANSFORMATIONS_DISABLED); + } + + $isToken = !$resourceToken->isEmpty() && $resourceToken->getAttribute('bucketInternalId') === $bucket->getSequence(); + $fileSecurity = $bucket->getAttribute('fileSecurity', false); + $validator = new Authorization(Database::PERMISSION_READ); + $valid = $validator->isValid($bucket->getRead()); + if (!$fileSecurity && !$valid && !$isToken) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + if ($fileSecurity && !$valid && !$isToken) { + $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); + } else { + /* @type Document $file */ + $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); + } + + if (!$resourceToken->isEmpty() && $resourceToken->getAttribute('fileInternalId') !== $file->getSequence()) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + if ($file->isEmpty()) { + throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); + } + + $inputs = Config::getParam('storage-inputs'); + $outputs = Config::getParam('storage-outputs'); + $fileLogos = Config::getParam('storage-logos'); + + $path = $file->getAttribute('path'); + $type = \strtolower(\pathinfo($path, PATHINFO_EXTENSION)); + $algorithm = $file->getAttribute('algorithm', Compression::NONE); + $cipher = $file->getAttribute('openSSLCipher'); + $mime = $file->getAttribute('mimeType'); + if (!\in_array($mime, $inputs) || $file->getAttribute('sizeActual') > (int) System::getEnv('_APP_STORAGE_PREVIEW_LIMIT', APP_STORAGE_READ_BUFFER)) { + if (!\in_array($mime, $inputs)) { + $path = (\array_key_exists($mime, $fileLogos)) ? $fileLogos[$mime] : $fileLogos['default']; + } else { + // it was an image but the file size exceeded the limit + $path = $fileLogos['default_image']; + } + + $algorithm = Compression::NONE; + $cipher = null; + $background = (empty($background)) ? 'eceff1' : $background; + $type = \strtolower(\pathinfo($path, PATHINFO_EXTENSION)); + $deviceForFiles = $deviceForLocal; + } + + if (!$deviceForFiles->exists($path)) { + throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); + } + + if (empty($output)) { + // when file extension is provided but it's not one of our + // supported outputs we fallback to `jpg` + if (!empty($type) && !array_key_exists($type, $outputs)) { + $type = 'jpg'; + } + + // when file extension is not provided and the mime type is not one of our supported outputs + // we fallback to `jpg` output format + $output = empty($type) ? (array_search($mime, $outputs) ?? 'jpg') : $type; + } + + $startTime = \microtime(true); + + $source = $deviceForFiles->read($path); + + $downloadTime = \microtime(true) - $startTime; + + if (!empty($cipher)) { // Decrypt + $source = OpenSSL::decrypt( + $source, + $file->getAttribute('openSSLCipher'), + System::getEnv('_APP_OPENSSL_KEY_V' . $file->getAttribute('openSSLVersion')), + 0, + \hex2bin($file->getAttribute('openSSLIV')), + \hex2bin($file->getAttribute('openSSLTag')) + ); + } + + $decryptionTime = \microtime(true) - $startTime - $downloadTime; + + switch ($algorithm) { + case Compression::ZSTD: + $compressor = new Zstd(); + $source = $compressor->decompress($source); + break; + case Compression::GZIP: + $compressor = new GZIP(); + $source = $compressor->decompress($source); + break; + } + + $decompressionTime = \microtime(true) - $startTime - $downloadTime - $decryptionTime; + + try { + $image = new Image($source); + } catch (\Exception $e) { + throw new Exception(Exception::STORAGE_FILE_TYPE_UNSUPPORTED, $e->getMessage()); + } + + $image->crop((int) $width, (int) $height, $gravity); + + if (!empty($opacity) || $opacity === 0) { + $image->setOpacity($opacity); + } + + if (!empty($background)) { + $image->setBackground('#' . $background); + } + + if (!empty($borderWidth)) { + $image->setBorder($borderWidth, '#' . $borderColor); + } + + if (!empty($borderRadius)) { + $image->setBorderRadius($borderRadius); + } + + if (!empty($rotation)) { + $image->setRotation(($rotation + 360) % 360); + } + + $data = $image->output($output, $quality); + + $renderingTime = \microtime(true) - $startTime - $downloadTime - $decryptionTime - $decompressionTime; + + $totalTime = \microtime(true) - $startTime; + + Console::info("File preview rendered,project=" . $project->getId() . ",bucket=" . $bucketId . ",file=" . $file->getId() . ",uri=" . $request->getURI() . ",total=" . $totalTime . ",rendering=" . $renderingTime . ",decryption=" . $decryptionTime . ",decompression=" . $decompressionTime . ",download=" . $downloadTime); + + $contentType = (\array_key_exists($output, $outputs)) ? $outputs[$output] : $outputs['jpg']; + + //Do not update transformedAt if it's a console user + if (!User::isPrivileged(Authorization::getRoles())) { + $transformedAt = $file->getAttribute('transformedAt', ''); + if (DateTime::formatTz(DateTime::addSeconds(new \DateTime(), -APP_PROJECT_ACCESS)) > $transformedAt) { + $file->setAttribute('transformedAt', DateTime::now()); + Authorization::skip(fn () => $dbForProject->updateDocument('bucket_' . $file->getAttribute('bucketInternalId'), $file->getId(), $file)); + } + } + + $response + ->addHeader('Cache-Control', 'private, max-age=2592000') // 30 days + ->setContentType($contentType) + ->file($data); + + unset($image); + } } diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php index b70ada75d3..67372435b1 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php @@ -2,16 +2,206 @@ namespace Appwrite\Platform\Modules\Storage\Http\Buckets\Files\Push; +use Ahc\Jwt\JWT; +use Ahc\Jwt\JWTException; +use Appwrite\Extend\Exception; +use Appwrite\OpenSSL\OpenSSL; +use Appwrite\Utopia\Database\Documents\User; +use Appwrite\Utopia\Response; +use Utopia\Config\Config; +use Utopia\Database\Database; +use Utopia\Database\Document; +use Utopia\Database\Validator\Authorization; +use Utopia\Database\Validator\UID; use Utopia\Platform\Action; +use Utopia\Platform\Scope\HTTP; +use Utopia\Storage\Compression\Algorithms\GZIP; +use Utopia\Storage\Compression\Algorithms\Zstd; +use Utopia\Storage\Compression\Compression; +use Utopia\Storage\Device; +use Utopia\Swoole\Request; +use Utopia\System\System; +use Utopia\Validator\Text; class Get extends Action { + use HTTP; + public static function getName() { return 'getFileForPush'; } - // FILE PUSH - GET /v1/storage/buckets/:bucketId/files/:fileId/push - // Endpoint implementation from /app/controllers/api/storage.php lines 1487-1641 - // Provides file access for push notifications with JWT validation + public function __construct() + { + $this + ->setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/storage/buckets/:bucketId/files/:fileId/push') + ->desc('Get file for push notification') + ->groups(['api', 'storage']) + ->label('scope', 'public') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') + ->param('fileId', '', new UID(), 'File ID.') + ->param('jwt', '', new Text(2048, 0), 'JSON Web Token to validate', true) + ->inject('response') + ->inject('request') + ->inject('dbForProject') + ->inject('dbForPlatform') + ->inject('project') + ->inject('mode') + ->inject('deviceForFiles') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + string $fileId, + string $jwt, + Response $response, + Request $request, + Database $dbForProject, + Database $dbForPlatform, + Document $project, + string $mode, + Device $deviceForFiles + ) { + $decoder = new JWT(System::getEnv('_APP_OPENSSL_KEY_V1'), 'HS256', 3600, 0); + + try { + $decoded = $decoder->decode($jwt); + } catch (JWTException) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + if ( + $decoded['projectId'] !== $project->getId() || + $decoded['bucketId'] !== $bucketId || + $decoded['fileId'] !== $fileId + ) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + $isInternal = $decoded['internal'] ?? false; + $disposition = $decoded['disposition'] ?? 'inline'; + $dbForProject = $isInternal ? $dbForPlatform : $dbForProject; + + $isAPIKey = User::isApp(Authorization::getRoles()); + $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); + + $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); + if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); + if ($file->isEmpty()) { + throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); + } + + $mimes = Config::getParam('storage-mimes'); + + $path = $file->getAttribute('path', ''); + + if (!$deviceForFiles->exists($path)) { + throw new Exception(Exception::STORAGE_FILE_NOT_FOUND, 'File not found in ' . $path); + } + + $contentType = 'text/plain'; + + if (\in_array($file->getAttribute('mimeType'), $mimes)) { + $contentType = $file->getAttribute('mimeType'); + } + + $size = $file->getAttribute('sizeOriginal', 0); + + $rangeHeader = $request->getHeader('range'); + if (!empty($rangeHeader)) { + $start = $request->getRangeStart(); + $end = $request->getRangeEnd(); + $unit = $request->getRangeUnit(); + + if ($end === null || $end - $start > APP_STORAGE_READ_BUFFER) { + $end = min(($start + APP_STORAGE_READ_BUFFER - 1), ($size - 1)); + } + + if ($unit != 'bytes' || $start >= $end || $end >= $size) { + throw new Exception(Exception::STORAGE_INVALID_RANGE); + } + + $response + ->addHeader('Accept-Ranges', 'bytes') + ->addHeader('Content-Range', "bytes $start-$end/$size") + ->addHeader('Content-Length', $end - $start + 1) + ->setStatusCode(Response::STATUS_CODE_PARTIALCONTENT); + } + + $response + ->setContentType($contentType) + ->addHeader('Content-Security-Policy', 'script-src none;') + ->addHeader('X-Content-Type-Options', 'nosniff') + ->addHeader('Content-Disposition', $disposition . '; filename="' . $file->getAttribute('name', '') . '"') + ->addHeader('Cache-Control', 'private, max-age=3888000') // 45 days + ->addHeader('X-Peak', \memory_get_peak_usage()); + + $source = ''; + if (!empty($file->getAttribute('openSSLCipher'))) { // Decrypt + $source = $deviceForFiles->read($path); + $source = OpenSSL::decrypt( + $source, + $file->getAttribute('openSSLCipher'), + System::getEnv('_APP_OPENSSL_KEY_V' . $file->getAttribute('openSSLVersion')), + 0, + \hex2bin($file->getAttribute('openSSLIV')), + \hex2bin($file->getAttribute('openSSLTag')) + ); + } + + switch ($file->getAttribute('algorithm', Compression::NONE)) { + case Compression::ZSTD: + if (empty($source)) { + $source = $deviceForFiles->read($path); + } + $compressor = new Zstd(); + $source = $compressor->decompress($source); + break; + case Compression::GZIP: + if (empty($source)) { + $source = $deviceForFiles->read($path); + } + $compressor = new GZIP(); + $source = $compressor->decompress($source); + break; + } + + if (!empty($source)) { + if (!empty($rangeHeader)) { + $response->send(substr($source, $start, ($end - $start + 1))); + return; + } + $response->send($source); + return; + } + + if (!empty($rangeHeader)) { + $response->send($deviceForFiles->read($path, $start, ($end - $start + 1))); + return; + } + + $size = $deviceForFiles->getFileSize($path); + if ($size > APP_STORAGE_READ_BUFFER) { + for ($i = 0; $i < ceil($size / MAX_OUTPUT_CHUNK_SIZE); $i++) { + $response->chunk( + $deviceForFiles->read( + $path, + ($i * MAX_OUTPUT_CHUNK_SIZE), + min(MAX_OUTPUT_CHUNK_SIZE, $size - ($i * MAX_OUTPUT_CHUNK_SIZE)) + ), + (($i + 1) * MAX_OUTPUT_CHUNK_SIZE) >= $size + ); + } + } else { + $response->send($deviceForFiles->read($path)); + } + } } diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Update.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Update.php index 91d6783bc5..f961bab184 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Update.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Update.php @@ -2,16 +2,114 @@ namespace Appwrite\Platform\Modules\Storage\Http\Buckets\Files; +use Appwrite\Event\Event; +use Appwrite\Extend\Exception; +use Appwrite\SDK\AuthType; +use Appwrite\SDK\Method; +use Appwrite\SDK\Response as SDKResponse; +use Appwrite\Utopia\Response; +use Utopia\Database\Database; +use Utopia\Database\Helpers\Permission; +use Utopia\Database\Validator\Authorization; +use Utopia\Database\Validator\Permissions; +use Utopia\Database\Validator\UID; use Utopia\Platform\Action; +use Utopia\Platform\Scope\HTTP; +use Utopia\Validator\Nullable; +use Utopia\Validator\Text; class Update extends Action { + use HTTP; + public static function getName() { return 'updateFile'; } - // FILE UPDATE - PUT /v1/storage/buckets/:bucketId/files/:fileId - // Endpoint implementation from /app/controllers/api/storage.php lines 1642-1757 - // Updates file metadata like name and permissions + public function __construct() + { + $this + ->setHttpMethod(Action::HTTP_REQUEST_METHOD_PUT) + ->setHttpPath('/v1/storage/buckets/:bucketId/files/:fileId') + ->desc('Update file') + ->groups(['api', 'storage']) + ->label('scope', 'files.write') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('event', 'buckets.[bucketId].files.[fileId].update') + ->label('audits.event', 'file.update') + ->label('audits.resource', 'file/{response.$id}') + ->label('sdk', new Method( + namespace: 'storage', + group: 'files', + name: 'updateFile', + description: '/docs/references/storage/update-file.md', + auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_FILE, + ) + ] + )) + ->param('bucketId', '', new UID(), 'Bucket unique ID.') + ->param('fileId', '', new UID(), 'File ID.') + ->param('name', null, new Text(128), 'File name.', true) + ->param('permissions', null, new Nullable(new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE)), 'An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) + ->inject('response') + ->inject('dbForProject') + ->inject('queueForEvents') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + string $fileId, + ?string $name, + ?array $permissions, + Response $response, + Database $dbForProject, + Event $queueForEvents + ) { + $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); + + if ($bucket->isEmpty()) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + $fileSecurity = $bucket->getAttribute('fileSecurity', false); + + $bucketUpdateValidator = new Authorization(Database::PERMISSION_UPDATE); + $bucketUpdateValid = $bucketUpdateValidator->isValid($bucket->getUpdate()); + + if (!$bucketUpdateValid && !$fileSecurity) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + // Fetch file depending on fileSecurity & bucket permission + if ($fileSecurity && !$bucketUpdateValid) { + $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); + } else { + $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); + } + + if ($file->isEmpty()) { + throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); + } + + // Aggregate provided permissions with existing ones if null + $permissions = Permission::aggregate($permissions ?? $file->getPermissions()); + + $name ??= $file->getAttribute('name'); + + $file = $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file + ->setAttribute('name', $name) + ->setAttribute('$permissions', $permissions)); + + $queueForEvents + ->setParam('bucketId', $bucket->getId()) + ->setParam('fileId', $file->getId()); + + $response->dynamic($file, Response::MODEL_FILE); + } } diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/View/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/View/Get.php index 2339efd93b..41ee95b165 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/View/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/View/Get.php @@ -2,16 +2,224 @@ namespace Appwrite\Platform\Modules\Storage\Http\Buckets\Files\View; +use Appwrite\Extend\Exception; +use Appwrite\OpenSSL\OpenSSL; +use Appwrite\SDK\AuthType; +use Appwrite\SDK\ContentType; +use Appwrite\SDK\Method; +use Appwrite\SDK\MethodType; +use Appwrite\SDK\Response as SDKResponse; +use Appwrite\Utopia\Database\Documents\User; +use Appwrite\Utopia\Response; +use Utopia\Config\Config; +use Utopia\Database\Database; +use Utopia\Database\Document; +use Utopia\Database\Validator\Authorization; +use Utopia\Database\Validator\UID; use Utopia\Platform\Action; +use Utopia\Platform\Scope\HTTP; +use Utopia\Storage\Compression\Algorithms\GZIP; +use Utopia\Storage\Compression\Algorithms\Zstd; +use Utopia\Storage\Compression\Compression; +use Utopia\Storage\Device; +use Utopia\Swoole\Request; +use Utopia\System\System; +use Utopia\Validator\Text; class Get extends Action { + use HTTP; + public static function getName() { return 'getFileView'; } - // FILE VIEW - GET /v1/storage/buckets/:bucketId/files/:fileId/view - // Endpoint implementation from /app/controllers/api/storage.php lines 1315-1486 - // Provides file view inline with content type enforcement and security headers + public function __construct() + { + $this + ->setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/storage/buckets/:bucketId/files/:fileId/view') + ->desc('Get file for view') + ->groups(['api', 'storage']) + ->label('scope', 'files.read') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('sdk', new Method( + namespace: 'storage', + group: 'files', + name: 'getFileView', + description: '/docs/references/storage/get-file-view.md', + auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_NONE, + ) + ], + contentType: ContentType::ANY, + type: MethodType::LOCATION + )) + ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') + ->param('fileId', '', new UID(), 'File ID.') + // NOTE: this is only for the sdk generator and is not used in the action below and is utilised in `resources.php` for `resourceToken`. + ->param('token', '', new Text(512), 'File token for accessing this file.', true) + ->inject('response') + ->inject('request') + ->inject('dbForProject') + ->inject('mode') + ->inject('resourceToken') + ->inject('deviceForFiles') + ->callback($this->action(...)); + } + + public function action( + string $bucketId, + string $fileId, + ?string $token, + Response $response, + Request $request, + Database $dbForProject, + string $mode, + Document $resourceToken, + Device $deviceForFiles + ) { + /* @type Document $bucket */ + $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); + + $isAPIKey = User::isApp(Authorization::getRoles()); + $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); + + if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + $isToken = !$resourceToken->isEmpty() && $resourceToken->getAttribute('bucketInternalId') === $bucket->getSequence(); + $fileSecurity = $bucket->getAttribute('fileSecurity', false); + $validator = new Authorization(Database::PERMISSION_READ); + $valid = $validator->isValid($bucket->getRead()); + if (!$fileSecurity && !$valid && !$isToken) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + if ($fileSecurity && !$valid && !$isToken) { + $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); + } else { + /* @type Document $file */ + $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); + } + + if (!$resourceToken->isEmpty() && $resourceToken->getAttribute('fileInternalId') !== $file->getSequence()) { + throw new Exception(Exception::USER_UNAUTHORIZED); + } + + if ($file->isEmpty()) { + throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); + } + + $mimes = Config::getParam('storage-mimes'); + + $path = $file->getAttribute('path', ''); + + if (!$deviceForFiles->exists($path)) { + throw new Exception(Exception::STORAGE_FILE_NOT_FOUND, 'File not found in ' . $path); + } + + $contentType = 'text/plain'; + + if (\in_array($file->getAttribute('mimeType'), $mimes)) { + $contentType = $file->getAttribute('mimeType'); + } + + $size = $file->getAttribute('sizeOriginal', 0); + + $rangeHeader = $request->getHeader('range'); + if (!empty($rangeHeader)) { + $start = $request->getRangeStart(); + $end = $request->getRangeEnd(); + $unit = $request->getRangeUnit(); + + if ($end === null || $end - $start > APP_STORAGE_READ_BUFFER) { + $end = min(($start + APP_STORAGE_READ_BUFFER - 1), ($size - 1)); + } + + if ($unit != 'bytes' || $start >= $end || $end >= $size) { + throw new Exception(Exception::STORAGE_INVALID_RANGE); + } + + $response + ->addHeader('Accept-Ranges', 'bytes') + ->addHeader('Content-Range', "bytes $start-$end/$size") + ->addHeader('Content-Length', $end - $start + 1) + ->setStatusCode(Response::STATUS_CODE_PARTIALCONTENT); + } + + $response + ->setContentType($contentType) + ->addHeader('Content-Security-Policy', 'script-src none;') + ->addHeader('X-Content-Type-Options', 'nosniff') + ->addHeader('Content-Disposition', 'inline; filename="' . $file->getAttribute('name', '') . '"') + ->addHeader('Cache-Control', 'private, max-age=3888000') // 45 days + ->addHeader('X-Peak', \memory_get_peak_usage()) + ; + + $source = ''; + if (!empty($file->getAttribute('openSSLCipher'))) { // Decrypt + $source = $deviceForFiles->read($path); + $source = OpenSSL::decrypt( + $source, + $file->getAttribute('openSSLCipher'), + System::getEnv('_APP_OPENSSL_KEY_V' . $file->getAttribute('openSSLVersion')), + 0, + \hex2bin($file->getAttribute('openSSLIV')), + \hex2bin($file->getAttribute('openSSLTag')) + ); + } + + switch ($file->getAttribute('algorithm', Compression::NONE)) { + case Compression::ZSTD: + if (empty($source)) { + $source = $deviceForFiles->read($path); + } + $compressor = new Zstd(); + $source = $compressor->decompress($source); + break; + case Compression::GZIP: + if (empty($source)) { + $source = $deviceForFiles->read($path); + } + $compressor = new GZIP(); + $source = $compressor->decompress($source); + break; + } + + if (!empty($source)) { + if (!empty($rangeHeader)) { + $response->send(substr($source, $start, ($end - $start + 1))); + return; + } + $response->send($source); + return; + } + + if (!empty($rangeHeader)) { + $response->send($deviceForFiles->read($path, $start, ($end - $start + 1))); + return; + } + + $size = $deviceForFiles->getFileSize($path); + if ($size > APP_STORAGE_READ_BUFFER) { + for ($i = 0; $i < ceil($size / MAX_OUTPUT_CHUNK_SIZE); $i++) { + $response->chunk( + $deviceForFiles->read( + $path, + ($i * MAX_OUTPUT_CHUNK_SIZE), + min(MAX_OUTPUT_CHUNK_SIZE, $size - ($i * MAX_OUTPUT_CHUNK_SIZE)) + ), + (($i + 1) * MAX_OUTPUT_CHUNK_SIZE) >= $size + ); + } + } else { + $response->send($deviceForFiles->read($path)); + } + } } diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Usage/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Usage/Get.php index 496ac54582..b816e83f72 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Usage/Get.php @@ -2,16 +2,136 @@ namespace Appwrite\Platform\Modules\Storage\Http\Usage; +use Appwrite\Extend\Exception; +use Appwrite\SDK\AuthType; +use Appwrite\SDK\Method; +use Appwrite\SDK\Response as SDKResponse; +use Appwrite\Utopia\Response; +use Utopia\Config\Config; +use Utopia\Database\Database; +use Utopia\Database\Document; +use Utopia\Database\Query; +use Utopia\Database\Validator\Authorization; +use Utopia\Database\Validator\UID; use Utopia\Platform\Action; +use Utopia\Platform\Scope\HTTP; +use Utopia\Validator\WhiteList; class Get extends Action { + use HTTP; + public static function getName() { return 'getBucketUsage'; } - // BUCKET USAGE - GET /v1/storage/:bucketId/usage - // Endpoint implementation from /app/controllers/api/storage.php lines 1952-2053 - // Returns bucket-specific usage statistics + public function __construct() + { + $this + ->setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/storage/:bucketId/usage') + ->desc('Get bucket usage stats') + ->groups(['api', 'storage']) + ->label('scope', 'files.read') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('sdk', new Method( + namespace: 'storage', + group: null, + name: 'getBucketUsage', + description: '/docs/references/storage/get-bucket-usage.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_USAGE_BUCKETS, + ) + ] + )) + ->param('bucketId', '', new UID(), 'Bucket ID.') + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->inject('response') + ->inject('project') + ->inject('dbForProject') + ->inject('getLogsDB') + ->callback($this->action(...)); + } + + public function action(string $bucketId, string $range, Response $response, Document $project, Database $dbForProject, callable $getLogsDB) + { + $dbForLogs = call_user_func($getLogsDB, $project); + $bucket = $dbForProject->getDocument('buckets', $bucketId); + + if ($bucket->isEmpty()) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + $periods = Config::getParam('usage', []); + $stats = $usage = []; + $days = $periods[$range]; + $metrics = [ + str_replace('{bucketInternalId}', $bucket->getSequence(), METRIC_BUCKET_ID_FILES), + str_replace('{bucketInternalId}', $bucket->getSequence(), METRIC_BUCKET_ID_FILES_STORAGE), + str_replace('{bucketInternalId}', $bucket->getSequence(), METRIC_BUCKET_ID_FILES_IMAGES_TRANSFORMED), + ]; + + Authorization::skip(function () use ($dbForProject, $dbForLogs, $bucket, $days, $metrics, &$stats) { + foreach ($metrics as $metric) { + $db = ($metric === str_replace('{bucketInternalId}', $bucket->getSequence(), METRIC_BUCKET_ID_FILES_IMAGES_TRANSFORMED)) + ? $dbForLogs + : $dbForProject; + + $result = $db->findOne('stats', [ + Query::equal('metric', [$metric]), + Query::equal('period', ['inf']) + ]); + + $stats[$metric]['total'] = $result['value'] ?? 0; + $limit = $days['limit']; + $period = $days['period']; + $results = $db->find('stats', [ + Query::equal('metric', [$metric]), + Query::equal('period', [$period]), + Query::limit($limit), + Query::orderDesc('time'), + ]); + $stats[$metric]['data'] = []; + foreach ($results as $result) { + $stats[$metric]['data'][$result->getAttribute('time')] = [ + 'value' => $result->getAttribute('value'), + ]; + } + } + }); + + + $format = match ($days['period']) { + '1h' => 'Y-m-d\\TH:00:00.000P', + '1d' => 'Y-m-d\\T00:00:00.000P', + }; + + foreach ($metrics as $metric) { + $usage[$metric]['total'] = $stats[$metric]['total']; + $usage[$metric]['data'] = []; + $leap = time() - ($days['limit'] * $days['factor']); + while ($leap < time()) { + $leap += $days['factor']; + $formatDate = date($format, $leap); + $usage[$metric]['data'][] = [ + 'value' => $stats[$metric]['data'][$formatDate]['value'] ?? 0, + 'date' => $formatDate, + ]; + } + } + + $response->dynamic(new Document([ + 'range' => $range, + 'filesTotal' => $usage[$metrics[0]]['total'], + 'filesStorageTotal' => $usage[$metrics[1]]['total'], + 'files' => $usage[$metrics[0]]['data'], + 'storage' => $usage[$metrics[1]]['data'], + 'imageTransformations' => $usage[$metrics[2]]['data'], + 'imageTransformationsTotal' => $usage[$metrics[2]]['total'], + ]), Response::MODEL_USAGE_BUCKETS); + } } diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Usage/XList.php b/src/Appwrite/Platform/Modules/Storage/Http/Usage/XList.php index 6d4bc921ef..d29fa7c1b4 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Usage/XList.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Usage/XList.php @@ -2,16 +2,119 @@ namespace Appwrite\Platform\Modules\Storage\Http\Usage; +use Appwrite\SDK\AuthType; +use Appwrite\SDK\Method; +use Appwrite\SDK\Response as SDKResponse; +use Appwrite\Utopia\Response; +use Utopia\Config\Config; +use Utopia\Database\Database; +use Utopia\Database\Document; +use Utopia\Database\Query; +use Utopia\Database\Validator\Authorization; use Utopia\Platform\Action; +use Utopia\Platform\Scope\HTTP; +use Utopia\Validator\WhiteList; class XList extends Action { + use HTTP; + public static function getName() { return 'getUsage'; } - // STORAGE USAGE - GET /v1/storage/usage - // Endpoint implementation from /app/controllers/api/storage.php lines 1865-1951 - // Returns global storage usage statistics + public function __construct() + { + $this + ->setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/storage/usage') + ->desc('Get storage usage stats') + ->groups(['api', 'storage']) + ->label('scope', 'files.read') + ->label('resourceType', RESOURCE_TYPE_BUCKETS) + ->label('sdk', new Method( + namespace: 'storage', + group: null, + name: 'getUsage', + description: '/docs/references/storage/get-usage.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_USAGE_STORAGE, + ) + ] + )) + ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) + ->inject('response') + ->inject('dbForProject') + ->callback($this->action(...)); + } + + public function action(string $range, Response $response, Database $dbForProject) + { + $periods = Config::getParam('usage', []); + $stats = $usage = []; + $days = $periods[$range]; + $metrics = [ + METRIC_BUCKETS, + METRIC_FILES, + METRIC_FILES_STORAGE, + ]; + + Authorization::skip(function () use ($dbForProject, $days, $metrics, &$stats) { + foreach ($metrics as $metric) { + $result = $dbForProject->findOne('stats', [ + Query::equal('metric', [$metric]), + Query::equal('period', ['inf']) + ]); + + $stats[$metric]['total'] = $result['value'] ?? 0; + $limit = $days['limit']; + $period = $days['period']; + $results = $dbForProject->find('stats', [ + Query::equal('metric', [$metric]), + Query::equal('period', [$period]), + Query::limit($limit), + Query::orderDesc('time'), + ]); + $stats[$metric]['data'] = []; + foreach ($results as $result) { + $stats[$metric]['data'][$result->getAttribute('time')] = [ + 'value' => $result->getAttribute('value'), + ]; + } + } + }); + + $format = match ($days['period']) { + '1h' => 'Y-m-d\\TH:00:00.000P', + '1d' => 'Y-m-d\\T00:00:00.000P', + }; + + foreach ($metrics as $metric) { + $usage[$metric]['total'] = $stats[$metric]['total']; + $usage[$metric]['data'] = []; + $leap = time() - ($days['limit'] * $days['factor']); + while ($leap < time()) { + $leap += $days['factor']; + $formatDate = date($format, $leap); + $usage[$metric]['data'][] = [ + 'value' => $stats[$metric]['data'][$formatDate]['value'] ?? 0, + 'date' => $formatDate, + ]; + } + } + + $response->dynamic(new Document([ + 'range' => $range, + 'bucketsTotal' => $usage[$metrics[0]]['total'], + 'filesTotal' => $usage[$metrics[1]]['total'], + 'filesStorageTotal' => $usage[$metrics[2]]['total'], + 'buckets' => $usage[$metrics[0]]['data'], + 'files' => $usage[$metrics[1]]['data'], + 'storage' => $usage[$metrics[2]]['data'], + ]), Response::MODEL_USAGE_STORAGE); + } } From 8cf12f685ab6622e3e175f016a7ab6042174f8c8 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 29 Dec 2025 07:44:08 +0000 Subject: [PATCH 63/95] remove controller --- app/controllers/api/storage.php | 2052 ------------------------------- 1 file changed, 2052 deletions(-) delete mode 100644 app/controllers/api/storage.php diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php deleted file mode 100644 index ec4cc25ea3..0000000000 --- a/app/controllers/api/storage.php +++ /dev/null @@ -1,2052 +0,0 @@ -desc('Create bucket') - ->groups(['api', 'storage']) - ->label('scope', 'buckets.write') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('event', 'buckets.[bucketId].create') - ->label('audits.event', 'bucket.create') - ->label('audits.resource', 'bucket/{response.$id}') - ->label('sdk', new Method( - namespace: 'storage', - group: 'buckets', - name: 'createBucket', - description: '/docs/references/storage/create-bucket.md', - auth: [AuthType::ADMIN, AuthType::KEY], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_CREATED, - model: Response::MODEL_BUCKET, - ) - ] - )) - ->param('bucketId', '', new CustomId(), 'Unique Id. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.') - ->param('name', '', new Text(128), 'Bucket name') - ->param('permissions', null, new Nullable(new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE)), 'An array of permission strings. By default, no user is granted with any permissions. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) - ->param('fileSecurity', false, new Boolean(true), 'Enables configuring permissions for individual file. A user needs one of file or bucket level permissions to access a file. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) - ->param('enabled', true, new Boolean(true), 'Is bucket enabled? When set to \'disabled\', users cannot access the files in this bucket but Server SDKs with and API key can still access the bucket. No files are lost when this is toggled.', true) - ->param('maximumFileSize', fn (array $plan) => empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000, fn (array $plan) => new Range(1, empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000), 'Maximum file size allowed in bytes. Maximum allowed value is ' . Storage::human(System::getEnv('_APP_STORAGE_LIMIT', 0), 0) . '.', true, ['plan']) - ->param('allowedFileExtensions', [], new ArrayList(new Text(64), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Allowed file extensions. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' extensions are allowed, each 64 characters long.', true) - ->param('compression', Compression::NONE, new WhiteList([Compression::NONE, Compression::GZIP, Compression::ZSTD], true), 'Compression algorithm choosen for compression. Can be one of ' . Compression::NONE . ', [' . Compression::GZIP . '](https://en.wikipedia.org/wiki/Gzip), or [' . Compression::ZSTD . '](https://en.wikipedia.org/wiki/Zstd), For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' compression is skipped even if it\'s enabled', true) - ->param('encryption', true, new Boolean(true), 'Is encryption enabled? For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' encryption is skipped even if it\'s enabled', true) - ->param('antivirus', true, new Boolean(true), 'Is virus scanning enabled? For file size above ' . Storage::human(APP_LIMIT_ANTIVIRUS, 0) . ' AntiVirus scanning is skipped even if it\'s enabled', true) - ->param('transformations', true, new Boolean(true), 'Are image transformations enabled?', true) - ->inject('response') - ->inject('dbForProject') - ->inject('queueForEvents') - ->action(function (string $bucketId, string $name, ?array $permissions, bool $fileSecurity, bool $enabled, int $maximumFileSize, array $allowedFileExtensions, ?string $compression, ?bool $encryption, bool $antivirus, bool $transformations, Response $response, Database $dbForProject, Event $queueForEvents) { - - $bucketId = $bucketId === 'unique()' ? ID::unique() : $bucketId; - - // Map aggregate permissions into the multiple permissions they represent. - $permissions = Permission::aggregate($permissions) ?? []; - $compression ??= Compression::NONE; - $encryption ??= true; - try { - $files = (Config::getParam('collections', [])['buckets'] ?? [])['files'] ?? []; - if (empty($files)) { - throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Files collection is not configured.'); - } - - $attributes = []; - $indexes = []; - - foreach ($files['attributes'] as $attribute) { - $attributes[] = new Document([ - '$id' => $attribute['$id'], - 'type' => $attribute['type'], - 'size' => $attribute['size'], - 'required' => $attribute['required'], - 'signed' => $attribute['signed'], - 'array' => $attribute['array'], - 'filters' => $attribute['filters'], - 'default' => $attribute['default'] ?? null, - 'format' => $attribute['format'] ?? '' - ]); - } - - foreach ($files['indexes'] as $index) { - $indexes[] = new Document([ - '$id' => $index['$id'], - 'type' => $index['type'], - 'attributes' => $index['attributes'], - 'lengths' => $index['lengths'], - 'orders' => $index['orders'], - ]); - } - - $dbForProject->createDocument('buckets', new Document([ - '$id' => $bucketId, - '$collection' => 'buckets', - '$permissions' => $permissions, - 'name' => $name, - 'maximumFileSize' => $maximumFileSize, - 'allowedFileExtensions' => $allowedFileExtensions, - 'fileSecurity' => $fileSecurity, - 'enabled' => $enabled, - 'compression' => $compression, - 'encryption' => $encryption, - 'antivirus' => $antivirus, - 'transformations' => $transformations, - 'search' => implode(' ', [$bucketId, $name]), - ])); - - $bucket = $dbForProject->getDocument('buckets', $bucketId); - - $dbForProject->createCollection('bucket_' . $bucket->getSequence(), $attributes, $indexes, permissions: $permissions, documentSecurity: $fileSecurity); - } catch (DuplicateException) { - throw new Exception(Exception::STORAGE_BUCKET_ALREADY_EXISTS); - } - - $queueForEvents - ->setParam('bucketId', $bucket->getId()) - ; - - $response - ->setStatusCode(Response::STATUS_CODE_CREATED) - ->dynamic($bucket, Response::MODEL_BUCKET); - }); - -App::get('/v1/storage/buckets') - ->desc('List buckets') - ->groups(['api', 'storage']) - ->label('scope', 'buckets.read') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('sdk', new Method( - namespace: 'storage', - group: 'buckets', - name: 'listBuckets', - description: '/docs/references/storage/list-buckets.md', - auth: [AuthType::ADMIN, AuthType::KEY], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_BUCKET_LIST, - ) - ] - )) - ->param('queries', [], new Buckets(), '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(', ', Buckets::ALLOWED_ATTRIBUTES), true) - ->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true) - ->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true) - ->inject('response') - ->inject('dbForProject') - ->action(function (array $queries, string $search, bool $includeTotal, Response $response, Database $dbForProject) { - - try { - $queries = Query::parseQueries($queries); - } catch (QueryException $e) { - throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); - } - - if (!empty($search)) { - $queries[] = Query::search('search', $search); - } - - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ - - $validator = new Cursor(); - if (!$validator->isValid($cursor)) { - throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); - } - - $bucketId = $cursor->getValue(); - $cursorDocument = $dbForProject->getDocument('buckets', $bucketId); - - if ($cursorDocument->isEmpty()) { - throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "Bucket '{$bucketId}' for the 'cursor' value not found."); - } - - $cursor->setValue($cursorDocument); - } - - $filterQueries = Query::groupByType($queries)['filters']; - try { - $buckets = $dbForProject->find('buckets', $queries); - $total = $includeTotal ? $dbForProject->count('buckets', $filterQueries, APP_LIMIT_COUNT) : 0; - } catch (OrderException $e) { - throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."); - } catch (QueryException $e) { - throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); - } - $response->dynamic(new Document([ - 'buckets' => $buckets, - 'total' => $total, - ]), Response::MODEL_BUCKET_LIST); - }); - -App::get('/v1/storage/buckets/:bucketId') - ->desc('Get bucket') - ->groups(['api', 'storage']) - ->label('scope', 'buckets.read') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('sdk', new Method( - namespace: 'storage', - group: 'buckets', - name: 'getBucket', - description: '/docs/references/storage/get-bucket.md', - auth: [AuthType::ADMIN, AuthType::KEY], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_BUCKET, - ) - ] - )) - ->param('bucketId', '', new UID(), 'Bucket unique ID.') - ->inject('response') - ->inject('dbForProject') - ->action(function (string $bucketId, Response $response, Database $dbForProject) { - - $bucket = $dbForProject->getDocument('buckets', $bucketId); - - if ($bucket->isEmpty()) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - $response->dynamic($bucket, Response::MODEL_BUCKET); - }); - -App::put('/v1/storage/buckets/:bucketId') - ->desc('Update bucket') - ->groups(['api', 'storage']) - ->label('scope', 'buckets.write') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('event', 'buckets.[bucketId].update') - ->label('audits.event', 'bucket.update') - ->label('audits.resource', 'bucket/{response.$id}') - ->label('sdk', new Method( - namespace: 'storage', - group: 'buckets', - name: 'updateBucket', - description: '/docs/references/storage/update-bucket.md', - auth: [AuthType::ADMIN, AuthType::KEY], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_BUCKET, - ) - ] - )) - ->param('bucketId', '', new UID(), 'Bucket unique ID.') - ->param('name', null, new Text(128), 'Bucket name', false) - ->param('permissions', null, new Nullable(new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE)), 'An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) - ->param('fileSecurity', false, new Boolean(true), 'Enables configuring permissions for individual file. A user needs one of file or bucket level permissions to access a file. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) - ->param('enabled', true, new Boolean(true), 'Is bucket enabled? When set to \'disabled\', users cannot access the files in this bucket but Server SDKs with and API key can still access the bucket. No files are lost when this is toggled.', true) - ->param('maximumFileSize', fn (array $plan) => empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000, fn (array $plan) => new Range(1, empty($plan['fileSize']) ? (int) System::getEnv('_APP_STORAGE_LIMIT', 0) : $plan['fileSize'] * 1000 * 1000), 'Maximum file size allowed in bytes. Maximum allowed value is ' . Storage::human(System::getEnv('_APP_STORAGE_LIMIT', 0), 0) . '.', true, ['plan']) - ->param('allowedFileExtensions', [], new ArrayList(new Text(64), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Allowed file extensions. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' extensions are allowed, each 64 characters long.', true) - ->param('compression', Compression::NONE, new WhiteList([Compression::NONE, Compression::GZIP, Compression::ZSTD], true), 'Compression algorithm choosen for compression. Can be one of ' . Compression::NONE . ', [' . Compression::GZIP . '](https://en.wikipedia.org/wiki/Gzip), or [' . Compression::ZSTD . '](https://en.wikipedia.org/wiki/Zstd), For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' compression is skipped even if it\'s enabled', true) - ->param('encryption', true, new Boolean(true), 'Is encryption enabled? For file size above ' . Storage::human(APP_STORAGE_READ_BUFFER, 0) . ' encryption is skipped even if it\'s enabled', true) - ->param('antivirus', true, new Boolean(true), 'Is virus scanning enabled? For file size above ' . Storage::human(APP_LIMIT_ANTIVIRUS, 0) . ' AntiVirus scanning is skipped even if it\'s enabled', true) - ->param('transformations', true, new Boolean(true), 'Are image transformations enabled?', true) - ->inject('response') - ->inject('dbForProject') - ->inject('queueForEvents') - ->action(function (string $bucketId, string $name, ?array $permissions, bool $fileSecurity, bool $enabled, ?int $maximumFileSize, array $allowedFileExtensions, ?string $compression, ?bool $encryption, bool $antivirus, bool $transformations, Response $response, Database $dbForProject, Event $queueForEvents) { - $bucket = $dbForProject->getDocument('buckets', $bucketId); - - if ($bucket->isEmpty()) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - $permissions ??= $bucket->getPermissions(); - $maximumFileSize ??= $bucket->getAttribute('maximumFileSize', (int) System::getEnv('_APP_STORAGE_LIMIT', 0)); - $allowedFileExtensions ??= $bucket->getAttribute('allowedFileExtensions', []); - $enabled ??= $bucket->getAttribute('enabled', true); - $encryption ??= $bucket->getAttribute('encryption', true); - $antivirus ??= $bucket->getAttribute('antivirus', true); - $compression ??= $bucket->getAttribute('compression', Compression::NONE); - $transformations ??= $bucket->getAttribute('transformations', true); - - // Map aggregate permissions into the multiple permissions they represent. - $permissions = Permission::aggregate($permissions); - - $bucket = $dbForProject->updateDocument('buckets', $bucket->getId(), $bucket - ->setAttribute('name', $name) - ->setAttribute('$permissions', $permissions) - ->setAttribute('maximumFileSize', $maximumFileSize) - ->setAttribute('allowedFileExtensions', $allowedFileExtensions) - ->setAttribute('fileSecurity', $fileSecurity) - ->setAttribute('enabled', $enabled) - ->setAttribute('encryption', $encryption) - ->setAttribute('compression', $compression) - ->setAttribute('antivirus', $antivirus) - ->setAttribute('transformations', $transformations)); - - $dbForProject->updateCollection('bucket_' . $bucket->getSequence(), $permissions, $fileSecurity); - - $queueForEvents - ->setParam('bucketId', $bucket->getId()); - - $response->dynamic($bucket, Response::MODEL_BUCKET); - }); - -App::delete('/v1/storage/buckets/:bucketId') - ->desc('Delete bucket') - ->groups(['api', 'storage']) - ->label('scope', 'buckets.write') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('audits.event', 'bucket.delete') - ->label('event', 'buckets.[bucketId].delete') - ->label('audits.resource', 'bucket/{request.bucketId}') - ->label('sdk', new Method( - namespace: 'storage', - group: 'buckets', - name: 'deleteBucket', - description: '/docs/references/storage/delete-bucket.md', - auth: [AuthType::ADMIN, AuthType::KEY], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_NOCONTENT, - model: Response::MODEL_NONE, - ) - ], - contentType: ContentType::NONE - )) - ->param('bucketId', '', new UID(), 'Bucket unique ID.') - ->inject('response') - ->inject('dbForProject') - ->inject('queueForDeletes') - ->inject('queueForEvents') - ->action(function (string $bucketId, Response $response, Database $dbForProject, Delete $queueForDeletes, Event $queueForEvents) { - $bucket = $dbForProject->getDocument('buckets', $bucketId); - - if ($bucket->isEmpty()) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - if (!$dbForProject->deleteDocument('buckets', $bucketId)) { - throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to remove bucket from DB'); - } - - $queueForDeletes - ->setType(DELETE_TYPE_DOCUMENT) - ->setDocument($bucket); - - $queueForEvents - ->setParam('bucketId', $bucket->getId()) - ->setPayload($response->output($bucket, Response::MODEL_BUCKET)) - ; - - $response->noContent(); - }); - -App::post('/v1/storage/buckets/:bucketId/files') - ->alias('/v1/storage/files') - ->desc('Create file') - ->groups(['api', 'storage']) - ->label('scope', 'files.write') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('audits.event', 'file.create') - ->label('event', 'buckets.[bucketId].files.[fileId].create') - ->label('audits.resource', 'file/{response.$id}') - ->label('abuse-key', 'ip:{ip},method:{method},url:{url},userId:{userId},chunkId:{chunkId}') - ->label('abuse-limit', APP_LIMIT_WRITE_RATE_DEFAULT) - ->label('abuse-time', APP_LIMIT_WRITE_RATE_PERIOD_DEFAULT) - ->label('sdk', new Method( - namespace: 'storage', - group: 'files', - name: 'createFile', - description: '/docs/references/storage/create-file.md', - auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_CREATED, - model: Response::MODEL_FILE, - ) - ], - type: MethodType::UPLOAD, - requestType: ContentType::MULTIPART - )) - ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') - ->param('fileId', '', new CustomId(), 'File ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.') - ->param('file', [], new File(), 'Binary file. Appwrite SDKs provide helpers to handle file input. [Learn about file input](https://appwrite.io/docs/products/storage/upload-download#input-file).', skipValidation: true) - ->param('permissions', null, new Nullable(new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_UPDATE, Database::PERMISSION_DELETE, Database::PERMISSION_WRITE])), 'An array of permission strings. By default, only the current user is granted all permissions. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) - ->inject('request') - ->inject('response') - ->inject('dbForProject') - ->inject('user') - ->inject('queueForEvents') - ->inject('mode') - ->inject('deviceForFiles') - ->inject('deviceForLocal') - ->action(function (string $bucketId, string $fileId, mixed $file, ?array $permissions, Request $request, Response $response, Database $dbForProject, Document $user, Event $queueForEvents, string $mode, Device $deviceForFiles, Device $deviceForLocal) { - - $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); - - $isAPIKey = User::isApp(Authorization::getRoles()); - $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); - - if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - $validator = new Authorization(Database::PERMISSION_CREATE); - if (!$validator->isValid($bucket->getCreate())) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - $allowedPermissions = [ - Database::PERMISSION_READ, - Database::PERMISSION_UPDATE, - Database::PERMISSION_DELETE, - ]; - - // Map aggregate permissions to into the set of individual permissions they represent. - $permissions = Permission::aggregate($permissions, $allowedPermissions); - - // Add permissions for current the user if none were provided. - if (\is_null($permissions)) { - $permissions = []; - if (!empty($user->getId()) && !$isPrivilegedUser) { - foreach ($allowedPermissions as $permission) { - $permissions[] = (new Permission($permission, 'user', $user->getId()))->toString(); - } - } - } - - // Users can only manage their own roles, API keys and Admin users can manage any - $roles = Authorization::getRoles(); - if (!$isAPIKey && !$isPrivilegedUser) { - foreach (Database::PERMISSIONS as $type) { - foreach ($permissions as $permission) { - $permission = Permission::parse($permission); - if ($permission->getPermission() != $type) { - continue; - } - $role = (new Role( - $permission->getRole(), - $permission->getIdentifier(), - $permission->getDimension() - ))->toString(); - if (!Authorization::isRole($role)) { - throw new Exception(Exception::USER_UNAUTHORIZED, 'Permissions must be one of: (' . \implode(', ', $roles) . ')'); - } - } - } - } - - $maximumFileSize = $bucket->getAttribute('maximumFileSize', 0); - if ($maximumFileSize > (int) System::getEnv('_APP_STORAGE_LIMIT', 0)) { - throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Maximum bucket file size is larger than _APP_STORAGE_LIMIT'); - } - - - $file = $request->getFiles('file'); - - // GraphQL multipart spec adds files with index keys - if (empty($file)) { - $file = $request->getFiles(0); - } - - if (empty($file)) { - throw new Exception(Exception::STORAGE_FILE_EMPTY); - } - - // Make sure we handle a single file and multiple files the same way - $fileName = (\is_array($file['name']) && isset($file['name'][0])) ? $file['name'][0] : $file['name']; - $fileTmpName = (\is_array($file['tmp_name']) && isset($file['tmp_name'][0])) ? $file['tmp_name'][0] : $file['tmp_name']; - $fileSize = (\is_array($file['size']) && isset($file['size'][0])) ? $file['size'][0] : $file['size']; - - $contentRange = $request->getHeader('content-range'); - $fileId = $fileId === 'unique()' ? ID::unique() : $fileId; - $chunk = 1; - $chunks = 1; - - if (!empty($contentRange)) { - $start = $request->getContentRangeStart(); - $end = $request->getContentRangeEnd(); - $fileSize = $request->getContentRangeSize(); - $fileId = $request->getHeader('x-appwrite-id', $fileId); - // TODO make `end >= $fileSize` in next breaking version - if (is_null($start) || is_null($end) || is_null($fileSize) || $end > $fileSize) { - throw new Exception(Exception::STORAGE_INVALID_CONTENT_RANGE); - } - - $idValidator = new UID(); - if (!$idValidator->isValid($fileId)) { - throw new Exception(Exception::STORAGE_INVALID_APPWRITE_ID); - } - - // TODO remove the condition that checks `$end === $fileSize` in next breaking version - if ($end === $fileSize - 1 || $end === $fileSize) { - //if it's a last chunks the chunk size might differ, so we set the $chunks and $chunk to -1 notify it's last chunk - $chunks = $chunk = -1; - } else { - // Calculate total number of chunks based on the chunk size i.e ($rangeEnd - $rangeStart) - $chunks = (int) ceil($fileSize / ($end + 1 - $start)); - $chunk = (int) ($start / ($end + 1 - $start)) + 1; - } - } - - /** - * Validators - */ - // Check if file type is allowed - $allowedFileExtensions = $bucket->getAttribute('allowedFileExtensions', []); - $fileExt = new FileExt($allowedFileExtensions); - if (!empty($allowedFileExtensions) && !$fileExt->isValid($fileName)) { - throw new Exception(Exception::STORAGE_FILE_TYPE_UNSUPPORTED, 'File extension not allowed'); - } - - // Check if file size is exceeding allowed limit - $fileSizeValidator = new FileSize($maximumFileSize); - if (!$fileSizeValidator->isValid($fileSize)) { - throw new Exception(Exception::STORAGE_INVALID_FILE_SIZE, 'File size not allowed'); - } - - $upload = new Upload(); - if (!$upload->isValid($fileTmpName)) { - throw new Exception(Exception::STORAGE_INVALID_FILE); - } - - // Save to storage - $fileSize ??= $deviceForLocal->getFileSize($fileTmpName); - $path = $deviceForFiles->getPath($fileId . '.' . \pathinfo($fileName, PATHINFO_EXTENSION)); - $path = str_ireplace($deviceForFiles->getRoot(), $deviceForFiles->getRoot() . DIRECTORY_SEPARATOR . $bucket->getId(), $path); // Add bucket id to path after root - - $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); - - $metadata = ['content_type' => $deviceForLocal->getFileMimeType($fileTmpName)]; - if (!$file->isEmpty()) { - $chunks = $file->getAttribute('chunksTotal', 1); - $uploaded = $file->getAttribute('chunksUploaded', 0); - $metadata = $file->getAttribute('metadata', []); - - if ($chunk === -1) { - $chunk = $chunks; - } - - if ($uploaded === $chunks) { - throw new Exception(Exception::STORAGE_FILE_ALREADY_EXISTS); - } - } - - $chunksUploaded = $deviceForFiles->upload($fileTmpName, $path, $chunk, $chunks, $metadata); - - if (empty($chunksUploaded)) { - throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed uploading file'); - } - - if ($chunksUploaded === $chunks) { - if (System::getEnv('_APP_STORAGE_ANTIVIRUS') === 'enabled' && $bucket->getAttribute('antivirus', true) && $fileSize <= APP_LIMIT_ANTIVIRUS && $deviceForFiles->getType() === Storage::DEVICE_LOCAL) { - $antivirus = new Network( - System::getEnv('_APP_STORAGE_ANTIVIRUS_HOST', 'clamav'), - (int) System::getEnv('_APP_STORAGE_ANTIVIRUS_PORT', 3310) - ); - - if (!$antivirus->fileScan($path)) { - $deviceForFiles->delete($path); - throw new Exception(Exception::STORAGE_INVALID_FILE); - } - } - - $mimeType = $deviceForFiles->getFileMimeType($path); // Get mime-type before compression and encryption - $fileHash = $deviceForFiles->getFileHash($path); // Get file hash before compression and encryption - $data = ''; - // Compression - $algorithm = $bucket->getAttribute('compression', Compression::NONE); - if ($fileSize <= APP_STORAGE_READ_BUFFER && $algorithm != Compression::NONE) { - $data = $deviceForFiles->read($path); - switch ($algorithm) { - case Compression::ZSTD: - $compressor = new Zstd(); - break; - case Compression::GZIP: - default: - $compressor = new GZIP(); - break; - } - $data = $compressor->compress($data); - } else { - // reset the algorithm to none as we do not compress the file - // if file size exceedes the APP_STORAGE_READ_BUFFER - // regardless the bucket compression algoorithm - $algorithm = Compression::NONE; - } - - if ($bucket->getAttribute('encryption', true) && $fileSize <= APP_STORAGE_READ_BUFFER) { - if (empty($data)) { - $data = $deviceForFiles->read($path); - } - $key = System::getEnv('_APP_OPENSSL_KEY_V1'); - $iv = OpenSSL::randomPseudoBytes(OpenSSL::cipherIVLength(OpenSSL::CIPHER_AES_128_GCM)); - $data = OpenSSL::encrypt($data, OpenSSL::CIPHER_AES_128_GCM, $key, 0, $iv, $tag); - } - - if (!empty($data)) { - if (!$deviceForFiles->write($path, $data, $mimeType)) { - throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to save file'); - } - } - - $sizeActual = $deviceForFiles->getFileSize($path); - - $openSSLVersion = null; - $openSSLCipher = null; - $openSSLTag = null; - $openSSLIV = null; - - if ($bucket->getAttribute('encryption', true) && $fileSize <= APP_STORAGE_READ_BUFFER) { - $openSSLVersion = '1'; - $openSSLCipher = OpenSSL::CIPHER_AES_128_GCM; - $openSSLTag = \bin2hex($tag); - $openSSLIV = \bin2hex($iv); - } - - if ($file->isEmpty()) { - $doc = new Document([ - '$id' => $fileId, - '$permissions' => $permissions, - 'bucketId' => $bucket->getId(), - 'bucketInternalId' => $bucket->getSequence(), - 'name' => $fileName, - 'path' => $path, - 'signature' => $fileHash, - 'mimeType' => $mimeType, - 'sizeOriginal' => $fileSize, - 'sizeActual' => $sizeActual, - 'algorithm' => $algorithm, - 'comment' => '', - 'chunksTotal' => $chunks, - 'chunksUploaded' => $chunksUploaded, - 'openSSLVersion' => $openSSLVersion, - 'openSSLCipher' => $openSSLCipher, - 'openSSLTag' => $openSSLTag, - 'openSSLIV' => $openSSLIV, - 'search' => implode(' ', [$fileId, $fileName]), - 'metadata' => $metadata, - ]); - - try { - $file = $dbForProject->createDocument('bucket_' . $bucket->getSequence(), $doc); - } catch (DuplicateException) { - throw new Exception(Exception::STORAGE_FILE_ALREADY_EXISTS); - } catch (NotFoundException) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - } else { - $file = $file - ->setAttribute('$permissions', $permissions) - ->setAttribute('signature', $fileHash) - ->setAttribute('mimeType', $mimeType) - ->setAttribute('sizeActual', $sizeActual) - ->setAttribute('algorithm', $algorithm) - ->setAttribute('openSSLVersion', $openSSLVersion) - ->setAttribute('openSSLCipher', $openSSLCipher) - ->setAttribute('openSSLTag', $openSSLTag) - ->setAttribute('openSSLIV', $openSSLIV) - ->setAttribute('metadata', $metadata) - ->setAttribute('chunksUploaded', $chunksUploaded); - - /** - * Validate create permission and skip authorization in updateDocument - * Without this, the file creation will fail when user doesn't have update permission - * However as with chunk upload even if we are updating, we are essentially creating a file - * adding it's new chunk so we validate create permission instead of update - */ - $validator = new Authorization(Database::PERMISSION_CREATE); - if (!$validator->isValid($bucket->getCreate())) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - $file = Authorization::skip(fn () => $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file)); - } - } else { - if ($file->isEmpty()) { - $doc = new Document([ - '$id' => ID::custom($fileId), - '$permissions' => $permissions, - 'bucketId' => $bucket->getId(), - 'bucketInternalId' => $bucket->getSequence(), - 'name' => $fileName, - 'path' => $path, - 'signature' => '', - 'mimeType' => '', - 'sizeOriginal' => $fileSize, - 'sizeActual' => 0, - 'algorithm' => '', - 'comment' => '', - 'chunksTotal' => $chunks, - 'chunksUploaded' => $chunksUploaded, - 'search' => implode(' ', [$fileId, $fileName]), - 'metadata' => $metadata, - ]); - - try { - $file = $dbForProject->createDocument('bucket_' . $bucket->getSequence(), $doc); - } catch (DuplicateException) { - throw new Exception(Exception::STORAGE_FILE_ALREADY_EXISTS); - } catch (NotFoundException) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - } else { - $file = $file - ->setAttribute('chunksUploaded', $chunksUploaded) - ->setAttribute('metadata', $metadata); - - /** - * Validate create permission and skip authorization in updateDocument - * Without this, the file creation will fail when user doesn't have update permission - * However as with chunk upload even if we are updating, we are essentially creating a file - * adding it's new chunk so we validate create permission instead of update - */ - $validator = new Authorization(Database::PERMISSION_CREATE); - if (!$validator->isValid($bucket->getCreate())) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - try { - $file = Authorization::skip(fn () => $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file)); - } catch (NotFoundException) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - } - } - - $queueForEvents - ->setParam('bucketId', $bucket->getId()) - ->setParam('fileId', $file->getId()) - ->setContext('bucket', $bucket); - - $metadata = null; // was causing leaks as it was passed by reference - - $response - ->setStatusCode(Response::STATUS_CODE_CREATED) - ->dynamic($file, Response::MODEL_FILE); - }); - -App::get('/v1/storage/buckets/:bucketId/files') - ->alias('/v1/storage/files') - ->desc('List files') - ->groups(['api', 'storage']) - ->label('scope', 'files.read') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('sdk', new Method( - namespace: 'storage', - group: 'files', - name: 'listFiles', - description: '/docs/references/storage/list-files.md', - auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_FILE_LIST, - ) - ] - )) - ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') - ->param('queries', [], new Files(), '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(', ', Files::ALLOWED_ATTRIBUTES), true) - ->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true) - ->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true) - ->inject('response') - ->inject('dbForProject') - ->inject('mode') - ->action(function (string $bucketId, array $queries, string $search, bool $includeTotal, Response $response, Database $dbForProject, string $mode) { - $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); - - $isAPIKey = User::isApp(Authorization::getRoles()); - $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); - - if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - $fileSecurity = $bucket->getAttribute('fileSecurity', false); - $validator = new Authorization(Database::PERMISSION_READ); - $valid = $validator->isValid($bucket->getRead()); - if (!$fileSecurity && !$valid) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - $queries = Query::parseQueries($queries); - - if (!empty($search)) { - $queries[] = Query::search('search', $search); - } - - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ - - $validator = new Cursor(); - if (!$validator->isValid($cursor)) { - throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); - } - - $fileId = $cursor->getValue(); - - if ($fileSecurity && !$valid) { - $cursorDocument = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); - } else { - $cursorDocument = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); - } - - if ($cursorDocument->isEmpty()) { - throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "File '{$fileId}' for the 'cursor' value not found."); - } - - $cursor->setValue($cursorDocument); - } - - $filterQueries = Query::groupByType($queries)['filters']; - - try { - if ($fileSecurity && !$valid) { - $files = $dbForProject->find('bucket_' . $bucket->getSequence(), $queries); - $total = $includeTotal ? $dbForProject->count('bucket_' . $bucket->getSequence(), $filterQueries, APP_LIMIT_COUNT) : 0; - } else { - $files = Authorization::skip(fn () => $dbForProject->find('bucket_' . $bucket->getSequence(), $queries)); - $total = $includeTotal ? Authorization::skip(fn () => $dbForProject->count('bucket_' . $bucket->getSequence(), $filterQueries, APP_LIMIT_COUNT)) : 0; - } - } catch (NotFoundException) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } catch (OrderException $e) { - throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."); - } catch (QueryException $e) { - throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); - } - - $response->dynamic(new Document([ - 'files' => $files, - 'total' => $total, - ]), Response::MODEL_FILE_LIST); - }); - -App::get('/v1/storage/buckets/:bucketId/files/:fileId') - ->alias('/v1/storage/files/:fileId') - ->desc('Get file') - ->groups(['api', 'storage']) - ->label('scope', 'files.read') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('sdk', new Method( - namespace: 'storage', - group: 'files', - name: 'getFile', - description: '/docs/references/storage/get-file.md', - auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_FILE, - ) - ] - )) - ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') - ->param('fileId', '', new UID(), 'File ID.') - ->inject('response') - ->inject('dbForProject') - ->inject('mode') - ->action(function (string $bucketId, string $fileId, Response $response, Database $dbForProject, string $mode) { - $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); - - $isAPIKey = User::isApp(Authorization::getRoles()); - $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); - - if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - $fileSecurity = $bucket->getAttribute('fileSecurity', false); - $validator = new Authorization(Database::PERMISSION_READ); - $valid = $validator->isValid($bucket->getRead()); - if (!$fileSecurity && !$valid) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - if ($fileSecurity && !$valid) { - $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); - } else { - $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); - } - - if ($file->isEmpty()) { - throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); - } - - $response->dynamic($file, Response::MODEL_FILE); - }); - -App::get('/v1/storage/buckets/:bucketId/files/:fileId/preview') - ->alias('/v1/storage/files/:fileId/preview') - ->desc('Get file preview') - ->groups(['api', 'storage']) - ->label('scope', 'files.read') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('cache', true) - ->label('cache.resourceType', 'bucket/{request.bucketId}') - ->label('cache.resource', 'file/{request.fileId}') - ->label('sdk', new Method( - namespace: 'storage', - group: 'files', - name: 'getFilePreview', - description: '/docs/references/storage/get-file-preview.md', - auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_NONE - ) - ], - type: MethodType::LOCATION, - contentType: ContentType::IMAGE - )) - ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') - ->param('fileId', '', new UID(), 'File ID') - ->param('width', 0, new Range(0, 4000), 'Resize preview image width, Pass an integer between 0 to 4000.', true) - ->param('height', 0, new Range(0, 4000), 'Resize preview image height, Pass an integer between 0 to 4000.', true) - ->param('gravity', Image::GRAVITY_CENTER, new WhiteList(Image::getGravityTypes()), 'Image crop gravity. Can be one of ' . implode(",", Image::getGravityTypes()), true) - ->param('quality', -1, new Range(-1, 100), 'Preview image quality. Pass an integer between 0 to 100. Defaults to keep existing image quality.', true) - ->param('borderWidth', 0, new Range(0, 100), 'Preview image border in pixels. Pass an integer between 0 to 100. Defaults to 0.', true) - ->param('borderColor', '', new HexColor(), 'Preview image border color. Use a valid HEX color, no # is needed for prefix.', true) - ->param('borderRadius', 0, new Range(0, 4000), 'Preview image border radius in pixels. Pass an integer between 0 to 4000.', true) - ->param('opacity', 1, new Range(0, 1, Range::TYPE_FLOAT), 'Preview image opacity. Only works with images having an alpha channel (like png). Pass a number between 0 to 1.', true) - ->param('rotation', 0, new Range(-360, 360), 'Preview image rotation in degrees. Pass an integer between -360 and 360.', true) - ->param('background', '', new HexColor(), 'Preview image background color. Only works with transparent images (png). Use a valid HEX color, no # is needed for prefix.', true) - ->param('output', '', new WhiteList(\array_keys(Config::getParam('storage-outputs')), true), 'Output format type (jpeg, jpg, png, gif and webp).', true) - // NOTE: this is only for the sdk generator and is not used in the action below and is utilised in `resources.php` for `resourceToken`. - ->param('token', '', new Text(512), 'File token for accessing this file.', true) - ->inject('request') - ->inject('response') - ->inject('dbForProject') - ->inject('resourceToken') - ->inject('deviceForFiles') - ->inject('deviceForLocal') - ->inject('project') - ->action(function (string $bucketId, string $fileId, int $width, int $height, string $gravity, int $quality, int $borderWidth, string $borderColor, int $borderRadius, float $opacity, int $rotation, string $background, string $output, ?string $token, Request $request, Response $response, Database $dbForProject, Document $resourceToken, Device $deviceForFiles, Device $deviceForLocal, Document $project) { - - if (!\extension_loaded('imagick')) { - throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Imagick extension is missing'); - } - - /* @type Document $bucket */ - $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); - - $isAPIKey = User::isApp(Authorization::getRoles()); - $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); - - if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - if (!$bucket->getAttribute('transformations', true) && !$isAPIKey && !$isPrivilegedUser) { - throw new Exception(Exception::STORAGE_BUCKET_TRANSFORMATIONS_DISABLED); - } - - $isToken = !$resourceToken->isEmpty() && $resourceToken->getAttribute('bucketInternalId') === $bucket->getSequence(); - $fileSecurity = $bucket->getAttribute('fileSecurity', false); - $validator = new Authorization(Database::PERMISSION_READ); - $valid = $validator->isValid($bucket->getRead()); - if (!$fileSecurity && !$valid && !$isToken) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - if ($fileSecurity && !$valid && !$isToken) { - $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); - } else { - /* @type Document $file */ - $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); - } - - if (!$resourceToken->isEmpty() && $resourceToken->getAttribute('fileInternalId') !== $file->getSequence()) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - if ($file->isEmpty()) { - throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); - } - - $inputs = Config::getParam('storage-inputs'); - $outputs = Config::getParam('storage-outputs'); - $fileLogos = Config::getParam('storage-logos'); - - $path = $file->getAttribute('path'); - $type = \strtolower(\pathinfo($path, PATHINFO_EXTENSION)); - $algorithm = $file->getAttribute('algorithm', Compression::NONE); - $cipher = $file->getAttribute('openSSLCipher'); - $mime = $file->getAttribute('mimeType'); - if (!\in_array($mime, $inputs) || $file->getAttribute('sizeActual') > (int) System::getEnv('_APP_STORAGE_PREVIEW_LIMIT', APP_STORAGE_READ_BUFFER)) { - if (!\in_array($mime, $inputs)) { - $path = (\array_key_exists($mime, $fileLogos)) ? $fileLogos[$mime] : $fileLogos['default']; - } else { - // it was an image but the file size exceeded the limit - $path = $fileLogos['default_image']; - } - - $algorithm = Compression::NONE; - $cipher = null; - $background = (empty($background)) ? 'eceff1' : $background; - $type = \strtolower(\pathinfo($path, PATHINFO_EXTENSION)); - $deviceForFiles = $deviceForLocal; - } - - if (!$deviceForFiles->exists($path)) { - throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); - } - - if (empty($output)) { - // when file extension is provided but it's not one of our - // supported outputs we fallback to `jpg` - if (!empty($type) && !array_key_exists($type, $outputs)) { - $type = 'jpg'; - } - - // when file extension is not provided and the mime type is not one of our supported outputs - // we fallback to `jpg` output format - $output = empty($type) ? (array_search($mime, $outputs) ?? 'jpg') : $type; - } - - $startTime = \microtime(true); - - $source = $deviceForFiles->read($path); - - $downloadTime = \microtime(true) - $startTime; - - if (!empty($cipher)) { // Decrypt - $source = OpenSSL::decrypt( - $source, - $file->getAttribute('openSSLCipher'), - System::getEnv('_APP_OPENSSL_KEY_V' . $file->getAttribute('openSSLVersion')), - 0, - \hex2bin($file->getAttribute('openSSLIV')), - \hex2bin($file->getAttribute('openSSLTag')) - ); - } - - $decryptionTime = \microtime(true) - $startTime - $downloadTime; - - switch ($algorithm) { - case Compression::ZSTD: - $compressor = new Zstd(); - $source = $compressor->decompress($source); - break; - case Compression::GZIP: - $compressor = new GZIP(); - $source = $compressor->decompress($source); - break; - } - - $decompressionTime = \microtime(true) - $startTime - $downloadTime - $decryptionTime; - - try { - $image = new Image($source); - } catch (ImagickException $e) { - throw new Exception(Exception::STORAGE_FILE_TYPE_UNSUPPORTED, $e->getMessage()); - } - - $image->crop((int) $width, (int) $height, $gravity); - - if (!empty($opacity) || $opacity === 0) { - $image->setOpacity($opacity); - } - - if (!empty($background)) { - $image->setBackground('#' . $background); - } - - if (!empty($borderWidth)) { - $image->setBorder($borderWidth, '#' . $borderColor); - } - - if (!empty($borderRadius)) { - $image->setBorderRadius($borderRadius); - } - - if (!empty($rotation)) { - $image->setRotation(($rotation + 360) % 360); - } - - $data = $image->output($output, $quality); - - $renderingTime = \microtime(true) - $startTime - $downloadTime - $decryptionTime - $decompressionTime; - - $totalTime = \microtime(true) - $startTime; - - Console::info("File preview rendered,project=" . $project->getId() . ",bucket=" . $bucketId . ",file=" . $file->getId() . ",uri=" . $request->getURI() . ",total=" . $totalTime . ",rendering=" . $renderingTime . ",decryption=" . $decryptionTime . ",decompression=" . $decompressionTime . ",download=" . $downloadTime); - - $contentType = (\array_key_exists($output, $outputs)) ? $outputs[$output] : $outputs['jpg']; - - //Do not update transformedAt if it's a console user - if (!User::isPrivileged(Authorization::getRoles())) { - $transformedAt = $file->getAttribute('transformedAt', ''); - if (DateTime::formatTz(DateTime::addSeconds(new \DateTime(), -APP_PROJECT_ACCESS)) > $transformedAt) { - $file->setAttribute('transformedAt', DateTime::now()); - Authorization::skip(fn () => $dbForProject->updateDocument('bucket_' . $file->getAttribute('bucketInternalId'), $file->getId(), $file)); - } - } - - $response - ->addHeader('Cache-Control', 'private, max-age=2592000') // 30 days - ->setContentType($contentType) - ->file($data); - - unset($image); - }); - -App::get('/v1/storage/buckets/:bucketId/files/:fileId/download') - ->alias('/v1/storage/files/:fileId/download') - ->desc('Get file for download') - ->groups(['api', 'storage']) - ->label('scope', 'files.read') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('sdk', new Method( - namespace: 'storage', - group: 'files', - name: 'getFileDownload', - description: '/docs/references/storage/get-file-download.md', - auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_NONE - ) - ], - type: MethodType::LOCATION, - contentType: ContentType::ANY, - )) - ->param('bucketId', '', new UID(), 'Storage bucket ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') - ->param('fileId', '', new UID(), 'File ID.') - // NOTE: this is only for the sdk generator and is not used in the action below and is utilised in `resources.php` for `resourceToken`. - ->param('token', '', new Text(512), 'File token for accessing this file.', true) - ->inject('request') - ->inject('response') - ->inject('dbForProject') - ->inject('mode') - ->inject('resourceToken') - ->inject('deviceForFiles') - ->action(function (string $bucketId, string $fileId, ?string $token, Request $request, Response $response, Database $dbForProject, string $mode, Document $resourceToken, Device $deviceForFiles) { - /* @type Document $bucket */ - $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); - - $isAPIKey = User::isApp(Authorization::getRoles()); - $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); - - if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - $isToken = !$resourceToken->isEmpty() && $resourceToken->getAttribute('bucketInternalId') === $bucket->getSequence(); - $fileSecurity = $bucket->getAttribute('fileSecurity', false); - $validator = new Authorization(Database::PERMISSION_READ); - $valid = $validator->isValid($bucket->getRead()); - if (!$fileSecurity && !$valid && !$isToken) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - if ($fileSecurity && !$valid && !$isToken) { - $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); - } else { - /* @type Document $file */ - $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); - } - - if (!$resourceToken->isEmpty() && $resourceToken->getAttribute('fileInternalId') !== $file->getSequence()) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - if ($file->isEmpty()) { - throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); - } - - $path = $file->getAttribute('path', ''); - - if (!$deviceForFiles->exists($path)) { - throw new Exception(Exception::STORAGE_FILE_NOT_FOUND, 'File not found in ' . $path); - } - - $size = $file->getAttribute('sizeOriginal', 0); - - $rangeHeader = $request->getHeader('range'); - if (!empty($rangeHeader)) { - $start = $request->getRangeStart(); - $end = $request->getRangeEnd(); - $unit = $request->getRangeUnit(); - - if ($end === null || $end - $start > APP_STORAGE_READ_BUFFER) { - $end = min(($start + MAX_OUTPUT_CHUNK_SIZE - 1), ($size - 1)); - } - - if ($unit !== 'bytes' || $start >= $end || $end >= $size) { - throw new Exception(Exception::STORAGE_INVALID_RANGE); - } - - $response - ->addHeader('Accept-Ranges', 'bytes') - ->addHeader('Content-Range', 'bytes ' . $start . '-' . $end . '/' . $size) - ->addHeader('Content-Length', $end - $start + 1) - ->setStatusCode(Response::STATUS_CODE_PARTIALCONTENT); - } - - $response - ->setContentType($file->getAttribute('mimeType')) - ->addHeader('Cache-Control', 'private, max-age=3888000') // 45 days - ->addHeader('X-Peak', \memory_get_peak_usage()) - ->addHeader('Content-Disposition', 'attachment; filename="' . $file->getAttribute('name', '') . '"') - ; - - $source = ''; - if (!empty($file->getAttribute('openSSLCipher'))) { // Decrypt - $source = $deviceForFiles->read($path); - $source = OpenSSL::decrypt( - $source, - $file->getAttribute('openSSLCipher'), - System::getEnv('_APP_OPENSSL_KEY_V' . $file->getAttribute('openSSLVersion')), - 0, - \hex2bin($file->getAttribute('openSSLIV')), - \hex2bin($file->getAttribute('openSSLTag')) - ); - } - - switch ($file->getAttribute('algorithm', Compression::NONE)) { - case Compression::ZSTD: - if (empty($source)) { - $source = $deviceForFiles->read($path); - } - $compressor = new Zstd(); - $source = $compressor->decompress($source); - break; - case Compression::GZIP: - if (empty($source)) { - $source = $deviceForFiles->read($path); - } - $compressor = new GZIP(); - $source = $compressor->decompress($source); - break; - } - - if (!empty($source)) { - if (!empty($rangeHeader)) { - $response->send(substr($source, $start, ($end - $start + 1))); - return; - } - $response->send($source); - return; - } - - if (!empty($rangeHeader)) { - $response->send($deviceForFiles->read($path, $start, ($end - $start + 1))); - return; - } - - if ($size > APP_STORAGE_READ_BUFFER) { - for ($i = 0; $i < ceil($size / MAX_OUTPUT_CHUNK_SIZE); $i++) { - $response->chunk( - $deviceForFiles->read( - $path, - ($i * MAX_OUTPUT_CHUNK_SIZE), - min(MAX_OUTPUT_CHUNK_SIZE, $size - ($i * MAX_OUTPUT_CHUNK_SIZE)) - ), - (($i + 1) * MAX_OUTPUT_CHUNK_SIZE) >= $size - ); - } - } else { - $response->send($deviceForFiles->read($path)); - } - }); - -App::get('/v1/storage/buckets/:bucketId/files/:fileId/view') - ->alias('/v1/storage/files/:fileId/view') - ->desc('Get file for view') - ->groups(['api', 'storage']) - ->label('scope', 'files.read') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('sdk', new Method( - namespace: 'storage', - group: 'files', - name: 'getFileView', - description: '/docs/references/storage/get-file-view.md', - auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_NONE, - ) - ], - type: MethodType::LOCATION, - contentType: ContentType::ANY, - )) - ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') - ->param('fileId', '', new UID(), 'File ID.') - // NOTE: this is only for the sdk generator and is not used in the action below and is utilised in `resources.php` for `resourceToken`. - ->param('token', '', new Text(512), 'File token for accessing this file.', true) - ->inject('response') - ->inject('request') - ->inject('dbForProject') - ->inject('mode') - ->inject('resourceToken') - ->inject('deviceForFiles') - ->action(function (string $bucketId, string $fileId, ?string $token, Response $response, Request $request, Database $dbForProject, string $mode, Document $resourceToken, Device $deviceForFiles) { - /* @type Document $bucket */ - $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); - - $isAPIKey = User::isApp(Authorization::getRoles()); - $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); - - if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - $isToken = !$resourceToken->isEmpty() && $resourceToken->getAttribute('bucketInternalId') === $bucket->getSequence(); - $fileSecurity = $bucket->getAttribute('fileSecurity', false); - $validator = new Authorization(Database::PERMISSION_READ); - $valid = $validator->isValid($bucket->getRead()); - if (!$fileSecurity && !$valid && !$isToken) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - if ($fileSecurity && !$valid && !$isToken) { - $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); - } else { - /* @type Document $file */ - $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); - } - - if (!$resourceToken->isEmpty() && $resourceToken->getAttribute('fileInternalId') !== $file->getSequence()) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - if ($file->isEmpty()) { - throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); - } - - $mimes = Config::getParam('storage-mimes'); - - $path = $file->getAttribute('path', ''); - - if (!$deviceForFiles->exists($path)) { - throw new Exception(Exception::STORAGE_FILE_NOT_FOUND, 'File not found in ' . $path); - } - - $contentType = 'text/plain'; - - if (\in_array($file->getAttribute('mimeType'), $mimes)) { - $contentType = $file->getAttribute('mimeType'); - } - - $size = $file->getAttribute('sizeOriginal', 0); - - $rangeHeader = $request->getHeader('range'); - if (!empty($rangeHeader)) { - $start = $request->getRangeStart(); - $end = $request->getRangeEnd(); - $unit = $request->getRangeUnit(); - - if ($end === null || $end - $start > APP_STORAGE_READ_BUFFER) { - $end = min(($start + APP_STORAGE_READ_BUFFER - 1), ($size - 1)); - } - - if ($unit != 'bytes' || $start >= $end || $end >= $size) { - throw new Exception(Exception::STORAGE_INVALID_RANGE); - } - - $response - ->addHeader('Accept-Ranges', 'bytes') - ->addHeader('Content-Range', "bytes $start-$end/$size") - ->addHeader('Content-Length', $end - $start + 1) - ->setStatusCode(Response::STATUS_CODE_PARTIALCONTENT); - } - - $response - ->setContentType($contentType) - ->addHeader('Content-Security-Policy', 'script-src none;') - ->addHeader('X-Content-Type-Options', 'nosniff') - ->addHeader('Content-Disposition', 'inline; filename="' . $file->getAttribute('name', '') . '"') - ->addHeader('Cache-Control', 'private, max-age=3888000') // 45 days - ->addHeader('X-Peak', \memory_get_peak_usage()) - ; - - $source = ''; - if (!empty($file->getAttribute('openSSLCipher'))) { // Decrypt - $source = $deviceForFiles->read($path); - $source = OpenSSL::decrypt( - $source, - $file->getAttribute('openSSLCipher'), - System::getEnv('_APP_OPENSSL_KEY_V' . $file->getAttribute('openSSLVersion')), - 0, - \hex2bin($file->getAttribute('openSSLIV')), - \hex2bin($file->getAttribute('openSSLTag')) - ); - } - - switch ($file->getAttribute('algorithm', Compression::NONE)) { - case Compression::ZSTD: - if (empty($source)) { - $source = $deviceForFiles->read($path); - } - $compressor = new Zstd(); - $source = $compressor->decompress($source); - break; - case Compression::GZIP: - if (empty($source)) { - $source = $deviceForFiles->read($path); - } - $compressor = new GZIP(); - $source = $compressor->decompress($source); - break; - } - - if (!empty($source)) { - if (!empty($rangeHeader)) { - $response->send(substr($source, $start, ($end - $start + 1))); - return; - } - $response->send($source); - return; - } - - if (!empty($rangeHeader)) { - $response->send($deviceForFiles->read($path, $start, ($end - $start + 1))); - return; - } - - $size = $deviceForFiles->getFileSize($path); - if ($size > APP_STORAGE_READ_BUFFER) { - for ($i = 0; $i < ceil($size / MAX_OUTPUT_CHUNK_SIZE); $i++) { - $response->chunk( - $deviceForFiles->read( - $path, - ($i * MAX_OUTPUT_CHUNK_SIZE), - min(MAX_OUTPUT_CHUNK_SIZE, $size - ($i * MAX_OUTPUT_CHUNK_SIZE)) - ), - (($i + 1) * MAX_OUTPUT_CHUNK_SIZE) >= $size - ); - } - } else { - $response->send($deviceForFiles->read($path)); - } - }); - -App::get('/v1/storage/buckets/:bucketId/files/:fileId/push') - ->desc('Get file for push notification') - ->groups(['api', 'storage']) - ->label('scope', 'public') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') - ->param('fileId', '', new UID(), 'File ID.') - ->param('jwt', '', new Text(2048, 0), 'JSON Web Token to validate', true) - ->inject('response') - ->inject('request') - ->inject('dbForProject') - ->inject('dbForPlatform') - ->inject('project') - ->inject('mode') - ->inject('deviceForFiles') - ->action(function (string $bucketId, string $fileId, string $jwt, Response $response, Request $request, Database $dbForProject, Database $dbForPlatform, Document $project, string $mode, Device $deviceForFiles) { - $decoder = new JWT(System::getEnv('_APP_OPENSSL_KEY_V1'), 'HS256', 3600, 0); - - try { - $decoded = $decoder->decode($jwt); - } catch (JWTException) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - if ( - $decoded['projectId'] !== $project->getId() || - $decoded['bucketId'] !== $bucketId || - $decoded['fileId'] !== $fileId - ) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - $isInternal = $decoded['internal'] ?? false; - $disposition = $decoded['disposition'] ?? 'inline'; - $dbForProject = $isInternal ? $dbForPlatform : $dbForProject; - - $isAPIKey = User::isApp(Authorization::getRoles()); - $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); - - $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); - if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); - if ($file->isEmpty()) { - throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); - } - - $mimes = Config::getParam('storage-mimes'); - - $path = $file->getAttribute('path', ''); - - if (!$deviceForFiles->exists($path)) { - throw new Exception(Exception::STORAGE_FILE_NOT_FOUND, 'File not found in ' . $path); - } - - $contentType = 'text/plain'; - - if (\in_array($file->getAttribute('mimeType'), $mimes)) { - $contentType = $file->getAttribute('mimeType'); - } - - $size = $file->getAttribute('sizeOriginal', 0); - - $rangeHeader = $request->getHeader('range'); - if (!empty($rangeHeader)) { - $start = $request->getRangeStart(); - $end = $request->getRangeEnd(); - $unit = $request->getRangeUnit(); - - if ($end === null || $end - $start > APP_STORAGE_READ_BUFFER) { - $end = min(($start + APP_STORAGE_READ_BUFFER - 1), ($size - 1)); - } - - if ($unit != 'bytes' || $start >= $end || $end >= $size) { - throw new Exception(Exception::STORAGE_INVALID_RANGE); - } - - $response - ->addHeader('Accept-Ranges', 'bytes') - ->addHeader('Content-Range', "bytes $start-$end/$size") - ->addHeader('Content-Length', $end - $start + 1) - ->setStatusCode(Response::STATUS_CODE_PARTIALCONTENT); - } - - $response - ->setContentType($contentType) - ->addHeader('Content-Security-Policy', 'script-src none;') - ->addHeader('X-Content-Type-Options', 'nosniff') - ->addHeader('Content-Disposition', $disposition . '; filename="' . $file->getAttribute('name', '') . '"') - ->addHeader('Cache-Control', 'private, max-age=3888000') // 45 days - ->addHeader('X-Peak', \memory_get_peak_usage()); - - $source = ''; - if (!empty($file->getAttribute('openSSLCipher'))) { // Decrypt - $source = $deviceForFiles->read($path); - $source = OpenSSL::decrypt( - $source, - $file->getAttribute('openSSLCipher'), - System::getEnv('_APP_OPENSSL_KEY_V' . $file->getAttribute('openSSLVersion')), - 0, - \hex2bin($file->getAttribute('openSSLIV')), - \hex2bin($file->getAttribute('openSSLTag')) - ); - } - - switch ($file->getAttribute('algorithm', Compression::NONE)) { - case Compression::ZSTD: - if (empty($source)) { - $source = $deviceForFiles->read($path); - } - $compressor = new Zstd(); - $source = $compressor->decompress($source); - break; - case Compression::GZIP: - if (empty($source)) { - $source = $deviceForFiles->read($path); - } - $compressor = new GZIP(); - $source = $compressor->decompress($source); - break; - } - - if (!empty($source)) { - if (!empty($rangeHeader)) { - $response->send(substr($source, $start, ($end - $start + 1))); - return; - } - $response->send($source); - return; - } - - if (!empty($rangeHeader)) { - $response->send($deviceForFiles->read($path, $start, ($end - $start + 1))); - return; - } - - $size = $deviceForFiles->getFileSize($path); - if ($size > APP_STORAGE_READ_BUFFER) { - for ($i = 0; $i < ceil($size / MAX_OUTPUT_CHUNK_SIZE); $i++) { - $response->chunk( - $deviceForFiles->read( - $path, - ($i * MAX_OUTPUT_CHUNK_SIZE), - min(MAX_OUTPUT_CHUNK_SIZE, $size - ($i * MAX_OUTPUT_CHUNK_SIZE)) - ), - (($i + 1) * MAX_OUTPUT_CHUNK_SIZE) >= $size - ); - } - } else { - $response->send($deviceForFiles->read($path)); - } - }); - -App::put('/v1/storage/buckets/:bucketId/files/:fileId') - ->alias('/v1/storage/files/:fileId') - ->desc('Update file') - ->groups(['api', 'storage']) - ->label('scope', 'files.write') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('event', 'buckets.[bucketId].files.[fileId].update') - ->label('audits.event', 'file.update') - ->label('audits.resource', 'file/{response.$id}') - ->label('abuse-key', 'ip:{ip},method:{method},url:{url},userId:{userId}') - ->label('abuse-limit', APP_LIMIT_WRITE_RATE_DEFAULT) - ->label('abuse-time', APP_LIMIT_WRITE_RATE_PERIOD_DEFAULT) - ->label('sdk', new Method( - namespace: 'storage', - group: 'files', - name: 'updateFile', - description: '/docs/references/storage/update-file.md', - auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_FILE, - ) - ] - )) - ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') - ->param('fileId', '', new UID(), 'File unique ID.') - ->param('name', null, new Nullable(new Text(255)), 'Name of the file', true) - ->param('permissions', null, new Nullable(new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_UPDATE, Database::PERMISSION_DELETE, Database::PERMISSION_WRITE])), 'An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https://appwrite.io/docs/permissions).', true) - ->inject('response') - ->inject('dbForProject') - ->inject('user') - ->inject('mode') - ->inject('queueForEvents') - ->action(function (string $bucketId, string $fileId, ?string $name, ?array $permissions, Response $response, Database $dbForProject, Document $user, string $mode, Event $queueForEvents) { - - $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); - - $isAPIKey = User::isApp(Authorization::getRoles()); - $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); - - if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - $fileSecurity = $bucket->getAttribute('fileSecurity', false); - $validator = new Authorization(Database::PERMISSION_UPDATE); - $valid = $validator->isValid($bucket->getUpdate()); - if (!$fileSecurity && !$valid) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - // Read permission should not be required for update - $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); - - if ($file->isEmpty()) { - throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); - } - - // Map aggregate permissions into the multiple permissions they represent. - $permissions = Permission::aggregate($permissions, [ - Database::PERMISSION_READ, - Database::PERMISSION_UPDATE, - Database::PERMISSION_DELETE, - ]); - - // Users can only manage their own roles, API keys and Admin users can manage any - $roles = Authorization::getRoles(); - if (!User::isApp($roles) && !User::isPrivileged($roles) && !\is_null($permissions)) { - foreach (Database::PERMISSIONS as $type) { - foreach ($permissions as $permission) { - $permission = Permission::parse($permission); - if ($permission->getPermission() != $type) { - continue; - } - $role = (new Role( - $permission->getRole(), - $permission->getIdentifier(), - $permission->getDimension() - ))->toString(); - if (!Authorization::isRole($role)) { - throw new Exception(Exception::USER_UNAUTHORIZED, 'Permissions must be one of: (' . \implode(', ', $roles) . ')'); - } - } - } - } - - if (\is_null($permissions)) { - $permissions = $file->getPermissions() ?? []; - } - - $file->setAttribute('$permissions', $permissions); - - if (!is_null($name)) { - $file->setAttribute('name', $name); - } - - try { - if ($fileSecurity && !$valid) { - $file = $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file); - } else { - $file = Authorization::skip(fn () => $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file)); - } - } catch (NotFoundException) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - $queueForEvents - ->setParam('bucketId', $bucket->getId()) - ->setParam('fileId', $file->getId()) - ->setContext('bucket', $bucket) - ; - - $response->dynamic($file, Response::MODEL_FILE); - }); - -App::delete('/v1/storage/buckets/:bucketId/files/:fileId') - ->desc('Delete file') - ->groups(['api', 'storage']) - ->label('scope', 'files.write') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('event', 'buckets.[bucketId].files.[fileId].delete') - ->label('audits.event', 'file.delete') - ->label('audits.resource', 'file/{request.fileId}') - ->label('abuse-key', 'ip:{ip},method:{method},url:{url},userId:{userId}') - ->label('abuse-limit', APP_LIMIT_WRITE_RATE_DEFAULT) - ->label('abuse-time', APP_LIMIT_WRITE_RATE_PERIOD_DEFAULT) - ->label('sdk', new Method( - namespace: 'storage', - group: 'files', - name: 'deleteFile', - description: '/docs/references/storage/delete-file.md', - auth: [AuthType::ADMIN, AuthType::SESSION, AuthType::KEY, AuthType::JWT], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_NOCONTENT, - model: Response::MODEL_NONE, - ) - ], - contentType: ContentType::NONE - )) - ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') - ->param('fileId', '', new UID(), 'File ID.') - ->inject('response') - ->inject('dbForProject') - ->inject('queueForEvents') - ->inject('mode') - ->inject('deviceForFiles') - ->inject('queueForDeletes') - ->action(function (string $bucketId, string $fileId, Response $response, Database $dbForProject, Event $queueForEvents, string $mode, Device $deviceForFiles, Delete $queueForDeletes) { - $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); - - $isAPIKey = User::isApp(Authorization::getRoles()); - $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); - - if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - $fileSecurity = $bucket->getAttribute('fileSecurity', false); - $validator = new Authorization(Database::PERMISSION_DELETE); - $valid = $validator->isValid($bucket->getDelete()); - if (!$fileSecurity && !$valid) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - // Read permission should not be required for delete - $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); - - if ($file->isEmpty()) { - throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); - } - - // Make sure we don't delete the file before the document permission check occurs - if ($fileSecurity && !$valid && !$validator->isValid($file->getDelete())) { - throw new Exception(Exception::USER_UNAUTHORIZED); - } - - $deviceDeleted = false; - if ($file->getAttribute('chunksTotal') !== $file->getAttribute('chunksUploaded')) { - $deviceDeleted = $deviceForFiles->abort( - $file->getAttribute('path'), - ($file->getAttribute('metadata', [])['uploadId'] ?? '') - ); - } else { - $deviceDeleted = $deviceForFiles->delete($file->getAttribute('path')); - } - - if ($deviceDeleted) { - $queueForDeletes - ->setType(DELETE_TYPE_CACHE_BY_RESOURCE) - ->setResourceType('bucket/' . $bucket->getId()) - ->setResource('file/' . $fileId) - ; - - try { - if ($fileSecurity && !$valid) { - $deleted = $dbForProject->deleteDocument('bucket_' . $bucket->getSequence(), $fileId); - } else { - $deleted = Authorization::skip(fn () => $dbForProject->deleteDocument('bucket_' . $bucket->getSequence(), $fileId)); - } - } catch (NotFoundException) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - if (!$deleted) { - throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to remove file from DB'); - } - } else { - throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to delete file from device'); - } - - $queueForEvents - ->setParam('bucketId', $bucket->getId()) - ->setParam('fileId', $file->getId()) - ->setContext('bucket', $bucket) - ->setPayload($response->output($file, Response::MODEL_FILE)) - ; - - $response->noContent(); - }); - -/** Storage usage */ -App::get('/v1/storage/usage') - ->desc('Get storage usage stats') - ->groups(['api', 'storage']) - ->label('scope', 'files.read') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('sdk', new Method( - namespace: 'storage', - group: null, - name: 'getUsage', - description: '/docs/references/storage/get-usage.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_USAGE_STORAGE, - ) - ] - )) - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) - ->inject('response') - ->inject('dbForProject') - ->action(function (string $range, Response $response, Database $dbForProject) { - - $periods = Config::getParam('usage', []); - $stats = $usage = []; - $days = $periods[$range]; - $metrics = [ - METRIC_BUCKETS, - METRIC_FILES, - METRIC_FILES_STORAGE, - ]; - - $total = []; - Authorization::skip(function () use ($dbForProject, $days, $metrics, &$stats, &$total) { - foreach ($metrics as $metric) { - $result = $dbForProject->findOne('stats', [ - Query::equal('metric', [$metric]), - Query::equal('period', ['inf']) - ]); - - $stats[$metric]['total'] = $result['value'] ?? 0; - $limit = $days['limit']; - $period = $days['period']; - $results = $dbForProject->find('stats', [ - Query::equal('metric', [$metric]), - Query::equal('period', [$period]), - Query::limit($limit), - Query::orderDesc('time'), - ]); - $stats[$metric]['data'] = []; - foreach ($results as $result) { - $stats[$metric]['data'][$result->getAttribute('time')] = [ - 'value' => $result->getAttribute('value'), - ]; - } - } - }); - - $format = match ($days['period']) { - '1h' => 'Y-m-d\TH:00:00.000P', - '1d' => 'Y-m-d\T00:00:00.000P', - }; - - foreach ($metrics as $metric) { - $usage[$metric]['total'] = $stats[$metric]['total']; - $usage[$metric]['data'] = []; - $leap = time() - ($days['limit'] * $days['factor']); - while ($leap < time()) { - $leap += $days['factor']; - $formatDate = date($format, $leap); - $usage[$metric]['data'][] = [ - 'value' => $stats[$metric]['data'][$formatDate]['value'] ?? 0, - 'date' => $formatDate, - ]; - } - } - $response->dynamic(new Document([ - 'range' => $range, - 'bucketsTotal' => $usage[$metrics[0]]['total'], - 'filesTotal' => $usage[$metrics[1]]['total'], - 'filesStorageTotal' => $usage[$metrics[2]]['total'], - 'buckets' => $usage[$metrics[0]]['data'], - 'files' => $usage[$metrics[1]]['data'], - 'storage' => $usage[$metrics[2]]['data'], - ]), Response::MODEL_USAGE_STORAGE); - }); - -App::get('/v1/storage/:bucketId/usage') - ->desc('Get bucket usage stats') - ->groups(['api', 'storage']) - ->label('scope', 'files.read') - ->label('resourceType', RESOURCE_TYPE_BUCKETS) - ->label('sdk', new Method( - namespace: 'storage', - group: null, - name: 'getBucketUsage', - description: '/docs/references/storage/get-bucket-usage.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_USAGE_BUCKETS, - ) - ] - )) - ->param('bucketId', '', new UID(), 'Bucket ID.') - ->param('range', '30d', new WhiteList(['24h', '30d', '90d'], true), 'Date range.', true) - ->inject('response') - ->inject('project') - ->inject('dbForProject') - ->inject('getLogsDB') - ->action(function (string $bucketId, string $range, Response $response, Document $project, Database $dbForProject, callable $getLogsDB) { - - $dbForLogs = call_user_func($getLogsDB, $project); - $bucket = $dbForProject->getDocument('buckets', $bucketId); - - if ($bucket->isEmpty()) { - throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); - } - - $periods = Config::getParam('usage', []); - $stats = $usage = []; - $days = $periods[$range]; - $metrics = [ - str_replace('{bucketInternalId}', $bucket->getSequence(), METRIC_BUCKET_ID_FILES), - str_replace('{bucketInternalId}', $bucket->getSequence(), METRIC_BUCKET_ID_FILES_STORAGE), - str_replace('{bucketInternalId}', $bucket->getSequence(), METRIC_BUCKET_ID_FILES_IMAGES_TRANSFORMED), - ]; - - Authorization::skip(function () use ($dbForProject, $dbForLogs, $bucket, $days, $metrics, &$stats) { - foreach ($metrics as $metric) { - $db = ($metric === str_replace('{bucketInternalId}', $bucket->getSequence(), METRIC_BUCKET_ID_FILES_IMAGES_TRANSFORMED)) - ? $dbForLogs - : $dbForProject; - - $result = $db->findOne('stats', [ - Query::equal('metric', [$metric]), - Query::equal('period', ['inf']) - ]); - - $stats[$metric]['total'] = $result['value'] ?? 0; - $limit = $days['limit']; - $period = $days['period']; - $results = $db->find('stats', [ - Query::equal('metric', [$metric]), - Query::equal('period', [$period]), - Query::limit($limit), - Query::orderDesc('time'), - ]); - $stats[$metric]['data'] = []; - foreach ($results as $result) { - $stats[$metric]['data'][$result->getAttribute('time')] = [ - 'value' => $result->getAttribute('value'), - ]; - } - } - }); - - - $format = match ($days['period']) { - '1h' => 'Y-m-d\TH:00:00.000P', - '1d' => 'Y-m-d\T00:00:00.000P', - }; - - foreach ($metrics as $metric) { - $usage[$metric]['total'] = $stats[$metric]['total']; - $usage[$metric]['data'] = []; - $leap = time() - ($days['limit'] * $days['factor']); - while ($leap < time()) { - $leap += $days['factor']; - $formatDate = date($format, $leap); - $usage[$metric]['data'][] = [ - 'value' => $stats[$metric]['data'][$formatDate]['value'] ?? 0, - 'date' => $formatDate, - ]; - } - } - - $response->dynamic(new Document([ - 'range' => $range, - 'filesTotal' => $usage[$metrics[0]]['total'], - 'filesStorageTotal' => $usage[$metrics[1]]['total'], - 'files' => $usage[$metrics[0]]['data'], - 'storage' => $usage[$metrics[1]]['data'], - 'imageTransformations' => $usage[$metrics[2]]['data'], - 'imageTransformationsTotal' => $usage[$metrics[2]]['total'], - ]), Response::MODEL_USAGE_BUCKETS); - }); From 30373980f1c49d69881b92f13936423caf1f3a07 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 29 Dec 2025 07:56:46 +0000 Subject: [PATCH 64/95] fix update endpoint --- .../Storage/Http/Buckets/Files/Update.php | 79 ++++++++++++++----- 1 file changed, 60 insertions(+), 19 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Update.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Update.php index f961bab184..be78cc358b 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Update.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Update.php @@ -7,9 +7,12 @@ use Appwrite\Extend\Exception; use Appwrite\SDK\AuthType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; +use Appwrite\Utopia\Database\Documents\User; use Appwrite\Utopia\Response; use Utopia\Database\Database; +use Utopia\Database\Exception\NotFound as NotFoundException; use Utopia\Database\Helpers\Permission; +use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; @@ -73,42 +76,80 @@ class Update extends Action ) { $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); - if ($bucket->isEmpty()) { + $isAPIKey = User::isApp(Authorization::getRoles()); + $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); + + if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); } $fileSecurity = $bucket->getAttribute('fileSecurity', false); - - $bucketUpdateValidator = new Authorization(Database::PERMISSION_UPDATE); - $bucketUpdateValid = $bucketUpdateValidator->isValid($bucket->getUpdate()); - - if (!$bucketUpdateValid && !$fileSecurity) { + $validator = new Authorization(Database::PERMISSION_UPDATE); + $valid = $validator->isValid($bucket->getUpdate()); + if (!$fileSecurity && !$valid) { throw new Exception(Exception::USER_UNAUTHORIZED); } - // Fetch file depending on fileSecurity & bucket permission - if ($fileSecurity && !$bucketUpdateValid) { - $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); - } else { - $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); - } + // Read permission should not be required for update + $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); if ($file->isEmpty()) { throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); } - // Aggregate provided permissions with existing ones if null - $permissions = Permission::aggregate($permissions ?? $file->getPermissions()); + // Map aggregate permissions into the multiple permissions they represent. + $permissions = Permission::aggregate($permissions, [ + Database::PERMISSION_READ, + Database::PERMISSION_UPDATE, + Database::PERMISSION_DELETE, + ]); - $name ??= $file->getAttribute('name'); + // Users can only manage their own roles, API keys and Admin users can manage any + $roles = Authorization::getRoles(); + if (!User::isApp($roles) && !User::isPrivileged($roles) && !\is_null($permissions)) { + foreach (Database::PERMISSIONS as $type) { + foreach ($permissions as $permission) { + $permission = Permission::parse($permission); + if ($permission->getPermission() != $type) { + continue; + } + $role = (new Role( + $permission->getRole(), + $permission->getIdentifier(), + $permission->getDimension() + ))->toString(); + if (!Authorization::isRole($role)) { + throw new Exception(Exception::USER_UNAUTHORIZED, 'Permissions must be one of: (' . \implode(', ', $roles) . ')'); + } + } + } + } - $file = $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file - ->setAttribute('name', $name) - ->setAttribute('$permissions', $permissions)); + if (\is_null($permissions)) { + $permissions = $file->getPermissions() ?? []; + } + + $file->setAttribute('$permissions', $permissions); + + if (!is_null($name)) { + $file->setAttribute('name', $name); + } + + try { + if ($fileSecurity && !$valid) { + $file = $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file); + } else { + $file = Authorization::skip(fn () => $dbForProject->updateDocument('bucket_' . $bucket->getSequence(), $fileId, $file)); + } + } catch (NotFoundException) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } $queueForEvents ->setParam('bucketId', $bucket->getId()) - ->setParam('fileId', $file->getId()); + ->setParam('fileId', $file->getId()) + ->setContext('bucket', $bucket) + ; $response->dynamic($file, Response::MODEL_FILE); } From 774e3af61c1f333da8079beb5a5f862f7fac5d9c Mon Sep 17 00:00:00 2001 From: fogelito Date: Mon, 29 Dec 2025 10:20:32 +0200 Subject: [PATCH 65/95] skip variables subquery --- src/Appwrite/Platform/Workers/Functions.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Appwrite/Platform/Workers/Functions.php b/src/Appwrite/Platform/Workers/Functions.php index d962ddc8a8..8211a46bd5 100644 --- a/src/Appwrite/Platform/Workers/Functions.php +++ b/src/Appwrite/Platform/Workers/Functions.php @@ -122,14 +122,15 @@ class Functions extends Action $log->addTag('type', $type); if (!empty($events)) { - $limit = 30; - $sum = 30; + $limit = 100; + $sum = 100; $offset = 0; while ($sum >= $limit) { $functions = $dbForProject->find('functions', [ + Query::select(['$id', 'events']), // Skip variables subqueries Query::limit($limit), Query::offset($offset), - Query::orderAsc('name'), + Query::orderAsc('$sequence'), ]); $sum = \count($functions); @@ -147,6 +148,11 @@ class Functions extends Action continue; } + /** + * get variables subqueries cached + */ + $function = $dbForProject->getDocument('functions', $function->getId()); + Console::success('Iterating function: ' . $function->getAttribute('name')); $this->execute( From 80bb9a1f335f59e3cb6cd1324e4e5c1760498ede Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 29 Dec 2025 08:41:38 +0000 Subject: [PATCH 66/95] fixe endpoints --- .../Storage/Http/Buckets/Files/Delete.php | 80 ++++++++++++++----- .../Storage/Http/Buckets/Files/Get.php | 4 +- 2 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Delete.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Delete.php index a7ad0851d7..eccacaafd2 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Delete.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Delete.php @@ -9,12 +9,15 @@ use Appwrite\SDK\AuthType; use Appwrite\SDK\ContentType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; +use Appwrite\Utopia\Database\Documents\User; use Appwrite\Utopia\Response; use Utopia\Database\Database; +use Utopia\Database\Exception\NotFound as NotFoundException; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; +use Utopia\Storage\Device; class Delete extends Action { @@ -37,6 +40,9 @@ class Delete extends Action ->label('event', 'buckets.[bucketId].files.[fileId].delete') ->label('audits.event', 'file.delete') ->label('audits.resource', 'file/{request.fileId}') + ->label('abuse-key', 'ip:{ip},method:{method},url:{url},userId:{userId}') + ->label('abuse-limit', APP_LIMIT_WRITE_RATE_DEFAULT) + ->label('abuse-time', APP_LIMIT_WRITE_RATE_PERIOD_DEFAULT) ->label('sdk', new Method( namespace: 'storage', group: 'files', @@ -51,12 +57,13 @@ class Delete extends Action ], contentType: ContentType::NONE )) - ->param('bucketId', '', new UID(), 'Bucket unique ID.') + ->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).') ->param('fileId', '', new UID(), 'File ID.') ->inject('response') ->inject('dbForProject') - ->inject('queueForDeletes') ->inject('queueForEvents') + ->inject('deviceForFiles') + ->inject('queueForDeletes') ->callback($this->action(...)); } @@ -65,47 +72,78 @@ class Delete extends Action string $fileId, Response $response, Database $dbForProject, + Event $queueForEvents, + Device $deviceForFiles, DeleteEvent $queueForDeletes, - Event $queueForEvents ) { $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); - if ($bucket->isEmpty()) { + $isAPIKey = User::isApp(Authorization::getRoles()); + $isPrivilegedUser = User::isPrivileged(Authorization::getRoles()); + + if ($bucket->isEmpty() || (!$bucket->getAttribute('enabled') && !$isAPIKey && !$isPrivilegedUser)) { throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); } - // Validate delete permission - $validator = new Authorization(Database::PERMISSION_DELETE); - $validBucketDelete = $validator->isValid($bucket->getDelete()); $fileSecurity = $bucket->getAttribute('fileSecurity', false); - - if (!$validBucketDelete && !$fileSecurity) { + $validator = new Authorization(Database::PERMISSION_DELETE); + $valid = $validator->isValid($bucket->getDelete()); + if (!$fileSecurity && !$valid) { throw new Exception(Exception::USER_UNAUTHORIZED); } - // Fetch file based on security - if ($fileSecurity && !$validBucketDelete) { - $file = $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId); - } else { - $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); - } + // Read permission should not be required for delete + $file = Authorization::skip(fn () => $dbForProject->getDocument('bucket_' . $bucket->getSequence(), $fileId)); if ($file->isEmpty()) { throw new Exception(Exception::STORAGE_FILE_NOT_FOUND); } - if (!$dbForProject->deleteDocument('bucket_' . $bucket->getSequence(), $fileId)) { - throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to remove file from DB'); + // Make sure we don't delete the file before the document permission check occurs + if ($fileSecurity && !$valid && !$validator->isValid($file->getDelete())) { + throw new Exception(Exception::USER_UNAUTHORIZED); } - $queueForDeletes - ->setType(DELETE_TYPE_DOCUMENT) - ->setDocument($file); + $deviceDeleted = false; + if ($file->getAttribute('chunksTotal') !== $file->getAttribute('chunksUploaded')) { + $deviceDeleted = $deviceForFiles->abort( + $file->getAttribute('path'), + ($file->getAttribute('metadata', [])['uploadId'] ?? '') + ); + } else { + $deviceDeleted = $deviceForFiles->delete($file->getAttribute('path')); + } + + if ($deviceDeleted) { + $queueForDeletes + ->setType(DELETE_TYPE_CACHE_BY_RESOURCE) + ->setResourceType('bucket/' . $bucket->getId()) + ->setResource('file/' . $fileId) + ; + + try { + if ($fileSecurity && !$valid) { + $deleted = $dbForProject->deleteDocument('bucket_' . $bucket->getSequence(), $fileId); + } else { + $deleted = Authorization::skip(fn () => $dbForProject->deleteDocument('bucket_' . $bucket->getSequence(), $fileId)); + } + } catch (NotFoundException) { + throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND); + } + + if (!$deleted) { + throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to remove file from DB'); + } + } else { + throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to delete file from device'); + } $queueForEvents ->setParam('bucketId', $bucket->getId()) ->setParam('fileId', $file->getId()) - ->setPayload($response->output($file, Response::MODEL_FILE)); + ->setContext('bucket', $bucket) + ->setPayload($response->output($file, Response::MODEL_FILE)) + ; $response->noContent(); } diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Get.php index e19fa8ae88..77f163e5fb 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Get.php @@ -49,7 +49,6 @@ class Get extends Action ->param('fileId', '', new UID(), 'File ID.') ->inject('response') ->inject('dbForProject') - ->inject('mode') ->callback($this->action(...)); } @@ -58,7 +57,6 @@ class Get extends Action string $fileId, Response $response, Database $dbForProject, - string $mode ) { $bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId)); @@ -70,7 +68,7 @@ class Get extends Action } $fileSecurity = $bucket->getAttribute('fileSecurity', false); - $validator = new Authorization(\Utopia\Database\Database::PERMISSION_READ); + $validator = new Authorization(Database::PERMISSION_READ); $valid = $validator->isValid($bucket->getRead()); if (!$fileSecurity && !$valid) { throw new Exception(Exception::USER_UNAUTHORIZED); From 1b70bc812b6aa8f101e951430de91aa17cb63c7f Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Mon, 29 Dec 2025 14:51:59 +0530 Subject: [PATCH 67/95] keep certificate renewal in maintenance worker --- .env | 1 - docker-compose.yml | 1 - src/Appwrite/Platform/Tasks/Interval.php | 51 --------------------- src/Appwrite/Platform/Tasks/Maintenance.php | 45 ++++++++++++++++++ 4 files changed, 45 insertions(+), 53 deletions(-) diff --git a/.env b/.env index 19ee65350b..88dec63b1c 100644 --- a/.env +++ b/.env @@ -102,7 +102,6 @@ _APP_STATS_RESOURCES_INTERVAL=30 _APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000 _APP_MAINTENANCE_RETENTION_SCHEDULES=86400 _APP_INTERVAL_DOMAIN_VERIFICATION=60 -_APP_INTERVAL_CERTIFICATE_RENEWAL=86400 _APP_USAGE_STATS=enabled _APP_LOGGING_CONFIG= _APP_LOGGING_CONFIG_REALTIME= diff --git a/docker-compose.yml b/docker-compose.yml index 4adbd096ab..805be67340 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -823,7 +823,6 @@ services: - _APP_DB_PASS - _APP_DATABASE_SHARED_TABLES - _APP_INTERVAL_DOMAIN_VERIFICATION - - _APP_INTERVAL_CERTIFICATE_RENEWAL appwrite-task-stats-resources: container_name: appwrite-task-stats-resources diff --git a/src/Appwrite/Platform/Tasks/Interval.php b/src/Appwrite/Platform/Tasks/Interval.php index 74ab9db1f1..2aa15bf7d0 100644 --- a/src/Appwrite/Platform/Tasks/Interval.php +++ b/src/Appwrite/Platform/Tasks/Interval.php @@ -34,19 +34,12 @@ class Interval extends Action Console::success(APP_NAME . ' interval process v1 has started'); $intervalDomainVerification = (int) System::getEnv('_APP_INTERVAL_DOMAIN_VERIFICATION', '60'); // 1 minute - $intervalCertificateRenewal = (int) System::getEnv('_APP_INTERVAL_CERTIFICATE_RENEWAL', '86400'); // 1 day \go(function () use ($dbForPlatform, $queueForCertificates, $intervalDomainVerification) { Console::loop(function () use ($dbForPlatform, $queueForCertificates) { $this->verifyDomain($dbForPlatform, $queueForCertificates); }, $intervalDomainVerification); }); - - \go(function () use ($dbForPlatform, $queueForCertificates, $intervalCertificateRenewal) { - Console::loop(function () use ($dbForPlatform, $queueForCertificates) { - $this->renewCertificates($dbForPlatform, $queueForCertificates); - }, $intervalCertificateRenewal); - }); } private function verifyDomain(Database $dbForPlatform, Certificate $queueForCertificate): void @@ -79,48 +72,4 @@ class Interval extends Action ->trigger(); } } - - private function renewCertificates(Database $dbForPlatform, Certificate $queueForCertificate): void - { - $time = DatabaseDateTime::now(); - - $certificates = $dbForPlatform->find('certificates', [ - Query::lessThan('attempts', 5), // Maximum 5 attempts - Query::isNotNull('renewDate'), - Query::lessThanEqual('renewDate', $time), // includes 60 days cooldown (we have 30 days to renew) - Query::limit(200), // Limit 200 comes from LetsEncrypt (300 orders per 3 hours, keeping some for new domains) - ]); - - if (\count($certificates) === 0) { - Console::info("[{$time}] No certificates for renewal."); - return; - } - - Console::info("[{$time}] Found " . \count($certificates) . " certificates for renewal, scheduling jobs."); - - $isMd5 = System::getEnv('_APP_RULES_FORMAT') === 'md5'; - $appRegion = System::getEnv('_APP_REGION', 'default'); - - foreach ($certificates as $certificate) { - $domain = $certificate->getAttribute('domain'); - $rule = $isMd5 ? - $dbForPlatform->getDocument('rules', md5($domain)) : - $dbForPlatform->findOne('rules', [ - Query::equal('domain', [$domain]), - Query::limit(1) - ]); - - if ($rule->isEmpty() || $rule->getAttribute('region') !== $appRegion) { - continue; - } - - $queueForCertificate - ->setDomain(new Document([ - 'domain' => $rule->getAttribute('domain'), - 'domainType' => $rule->getAttribute('deploymentResourceType', $rule->getAttribute('type')), - ])) - ->setAction(Certificate::ACTION_GENERATION) - ->trigger(); - } - } } diff --git a/src/Appwrite/Platform/Tasks/Maintenance.php b/src/Appwrite/Platform/Tasks/Maintenance.php index 66d3a3d9de..c0914c6544 100644 --- a/src/Appwrite/Platform/Tasks/Maintenance.php +++ b/src/Appwrite/Platform/Tasks/Maintenance.php @@ -92,6 +92,7 @@ class Maintenance extends Action ->trigger(); $this->notifyDeleteConnections($queueForDeletes); + $this->renewCertificates($dbForPlatform, $queueForCertificates); $this->notifyDeleteCache($cacheRetention, $queueForDeletes); $this->notifyDeleteSchedules($schedulesDeletionRetention, $queueForDeletes); $this->notifyDeleteCSVExports($queueForDeletes); @@ -113,6 +114,50 @@ class Maintenance extends Action ->trigger(); } + private function renewCertificates(Database $dbForPlatform, Certificate $queueForCertificate): void + { + $time = DatabaseDateTime::now(); + + $certificates = $dbForPlatform->find('certificates', [ + Query::lessThan('attempts', 5), // Maximum 5 attempts + Query::isNotNull('renewDate'), + Query::lessThanEqual('renewDate', $time), // includes 60 days cooldown (we have 30 days to renew) + Query::limit(200), // Limit 200 comes from LetsEncrypt (300 orders per 3 hours, keeping some for new domains) + ]); + + if (\count($certificates) === 0) { + Console::info("[{$time}] No certificates for renewal."); + return; + } + + Console::info("[{$time}] Found " . \count($certificates) . " certificates for renewal, scheduling jobs."); + + $isMd5 = System::getEnv('_APP_RULES_FORMAT') === 'md5'; + $appRegion = System::getEnv('_APP_REGION', 'default'); + + foreach ($certificates as $certificate) { + $domain = $certificate->getAttribute('domain'); + $rule = $isMd5 ? + $dbForPlatform->getDocument('rules', md5($domain)) : + $dbForPlatform->findOne('rules', [ + Query::equal('domain', [$domain]), + Query::limit(1) + ]); + + if ($rule->isEmpty() || $rule->getAttribute('region') !== $appRegion) { + continue; + } + + $queueForCertificate + ->setDomain(new Document([ + 'domain' => $rule->getAttribute('domain'), + 'domainType' => $rule->getAttribute('deploymentResourceType', $rule->getAttribute('type')), + ])) + ->setAction(Certificate::ACTION_GENERATION) + ->trigger(); + } + } + private function notifyDeleteCache($interval, Delete $queueForDeletes): void { $queueForDeletes From 417bb22790a6eb631a16ab3f59952ec153c77104 Mon Sep 17 00:00:00 2001 From: fogelito Date: Mon, 29 Dec 2025 11:55:21 +0200 Subject: [PATCH 68/95] use Query::contains --- src/Appwrite/Platform/Workers/Functions.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Appwrite/Platform/Workers/Functions.php b/src/Appwrite/Platform/Workers/Functions.php index 8211a46bd5..fba5154079 100644 --- a/src/Appwrite/Platform/Workers/Functions.php +++ b/src/Appwrite/Platform/Workers/Functions.php @@ -128,6 +128,7 @@ class Functions extends Action while ($sum >= $limit) { $functions = $dbForProject->find('functions', [ Query::select(['$id', 'events']), // Skip variables subqueries + Query::contains('events', $events), Query::limit($limit), Query::offset($offset), Query::orderAsc('$sequence'), From 2b96d60c1e8babc8294517693761bf9b7c69af84 Mon Sep 17 00:00:00 2001 From: Hemachandar Date: Mon, 29 Dec 2025 16:01:19 +0530 Subject: [PATCH 69/95] copilot - code quality --- .../Certificates/Exception/CertificateStatus.php | 2 +- src/Appwrite/Certificates/LetsEncrypt.php | 2 +- src/Appwrite/Platform/Tasks/Interval.php | 4 ++-- src/Appwrite/Platform/Workers/Certificates.php | 9 +++------ 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/Appwrite/Certificates/Exception/CertificateStatus.php b/src/Appwrite/Certificates/Exception/CertificateStatus.php index 3d94109d0e..ca15a95ed8 100644 --- a/src/Appwrite/Certificates/Exception/CertificateStatus.php +++ b/src/Appwrite/Certificates/Exception/CertificateStatus.php @@ -1,6 +1,6 @@ setDomain(new Document([ 'domain' => $rule->getAttribute('domain'), 'domainType' => $rule->getAttribute('deploymentResourceType', $rule->getAttribute('type')), diff --git a/src/Appwrite/Platform/Workers/Certificates.php b/src/Appwrite/Platform/Workers/Certificates.php index 0c4d495724..5132687279 100644 --- a/src/Appwrite/Platform/Workers/Certificates.php +++ b/src/Appwrite/Platform/Workers/Certificates.php @@ -116,8 +116,6 @@ class Certificates extends Action default: throw new Exception('Invalid action: ' . $action); } - - } /** @@ -143,7 +141,7 @@ class Certificates extends Action Realtime $queueForRealtime, Certificate $queueForCertificates, Log $log, - ?string $validationDomain = null, + ?string $validationDomain = null ): void { // Get rule $rule = System::getEnv('_APP_RULES_FORMAT') === 'md5' @@ -177,7 +175,6 @@ class Certificates extends Action $this->updateRuleAndSendEvents($rule, $dbForPlatform, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime); } - // Issue a TLS certificate when domain is verified if ($rule->getAttribute('status', '') === RULE_STATUS_CERTIFICATE_GENERATING) { $queueForCertificates @@ -317,7 +314,7 @@ class Certificates extends Action $date = \date('H:i:s'); $errorMessage = "\033[90m[{$date}] \033[31mCertificate generation failed: \033[0m\n"; - $attempts = $certificate->getAttribute('attempts', 0) + 1; // // Increase attempts count + $attempts = $certificate->getAttribute('attempts', 0) + 1; // Increase attempts count // Update attributes on certificate document $certificate->setAttributes([ @@ -379,7 +376,7 @@ class Certificates extends Action /** * Update all existing domain documents so they have relation to correct certificate document. - * This solved issues: + * This solves issues: * - when adding a domain for which there is already a certificate * - when renew creates new document? It might? * - overall makes it more reliable From 57157a71b4427b9cdd890cb9b14d875d21e7c626 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Mon, 29 Dec 2025 16:44:19 +0530 Subject: [PATCH 70/95] chore: more sdk config flexibility --- src/Appwrite/Platform/Tasks/SDKs.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Platform/Tasks/SDKs.php b/src/Appwrite/Platform/Tasks/SDKs.php index 859e259b7c..d6e3efa559 100644 --- a/src/Appwrite/Platform/Tasks/SDKs.php +++ b/src/Appwrite/Platform/Tasks/SDKs.php @@ -138,7 +138,7 @@ class SDKs extends Action $target = \realpath(__DIR__ . '/../../../../app') . '/sdks/git/' . $language['key'] . '/'; $readme = \realpath(__DIR__ . '/../../../../docs/sdks/' . $language['key'] . '/README.md'); $readme = ($readme) ? \file_get_contents($readme) : ''; - $gettingStarted = \realpath(__DIR__ . '/../../../../docs/sdks/' . $language['key'] . '/GETTING_STARTED.md'); + $gettingStarted = $language['gettingStarted'] ?? \realpath(__DIR__ . '/../../../../docs/sdks/' . $language['key'] . '/GETTING_STARTED.md'); $gettingStarted = ($gettingStarted) ? \file_get_contents($gettingStarted) : ''; $examples = \realpath(__DIR__ . '/../../../../docs/sdks/' . $language['key'] . '/EXAMPLES.md'); $examples = ($examples) ? \file_get_contents($examples) : ''; @@ -381,7 +381,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ->setName($language['name']) ->setNamespace($language['namespace'] ?? 'appwrite') ->setDescription($language['description'] ?? "Appwrite is an open-source backend as a service server that abstracts and simplifies complex and repetitive development tasks behind a very simple to use REST API. Appwrite aims to help you develop your apps faster and in a more secure way. Use the {$language['name']} SDK to integrate your app with the Appwrite server to easily start interacting with all of Appwrite backend APIs and tools. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)") - ->setShortDescription('Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API') + ->setShortDescription($language['shortDescription'] ?? 'Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API') ->setLicense($license) ->setLicenseContent($licenseContent) ->setVersion($language['version']) From ca877fa71de4bd3601d23986a64a9420ec87137c Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 29 Dec 2025 13:24:24 +0000 Subject: [PATCH 71/95] Catch query parse exceptions --- .../Platform/Modules/Storage/Http/Buckets/Files/XList.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php index f9448f7d87..e46fdb2a0a 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php @@ -89,7 +89,11 @@ class XList extends Action throw new Exception(Exception::USER_UNAUTHORIZED); } - $queries = Query::parseQueries($queries); + try { + $queries = Query::parseQueries($queries); + } catch (QueryException $e) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); + } if (!empty($search)) { $queries[] = Query::search('search', $search); From 7581019e765fa34b9c777710db0612126031bbfc Mon Sep 17 00:00:00 2001 From: loks0n <22452787+loks0n@users.noreply.github.com> Date: Mon, 29 Dec 2025 18:51:37 +0000 Subject: [PATCH 72/95] chore: remove proxy container --- docker-compose.yml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 805be67340..9e831f4360 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1067,27 +1067,6 @@ services: - OPR_EXECUTOR_STORAGE_WASABI_REGION=$_APP_STORAGE_WASABI_REGION - OPR_EXECUTOR_STORAGE_WASABI_BUCKET=$_APP_STORAGE_WASABI_BUCKET - openruntimes-proxy: - container_name: openruntimes-proxy - hostname: proxy - <<: *x-logging - stop_signal: SIGINT - image: openruntimes/proxy:0.5.5 - networks: - - appwrite - - runtimes - environment: - - OPR_PROXY_WORKER_PER_CORE=$_APP_WORKER_PER_CORE - - OPR_PROXY_ENV=$_APP_ENV - - OPR_PROXY_EXECUTOR_SECRET=$_APP_EXECUTOR_SECRET - - OPR_PROXY_SECRET=$_APP_EXECUTOR_SECRET - - OPR_PROXY_LOGGING_CONFIG=$_APP_LOGGING_CONFIG - - OPR_PROXY_ALGORITHM=random - - OPR_PROXY_EXECUTORS=exc1 - - OPR_PROXY_HEALTHCHECK_INTERVAL=10000 - - OPR_PROXY_MAX_TIMEOUT=600 - - OPR_PROXY_HEALTHCHECK=enabled - mariadb: image: mariadb:10.11 # fix issues when upgrading using: mysql_upgrade -u root -p container_name: appwrite-mariadb From d8d3f22883858dd4480c3aa9b653c3a62431c925 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 30 Dec 2025 13:42:39 +0530 Subject: [PATCH 73/95] fix: remove storage service from include_once --- app/config/services.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/services.php b/app/config/services.php index 840ee294e9..8c3a20cf15 100644 --- a/app/config/services.php +++ b/app/config/services.php @@ -146,7 +146,7 @@ return [ 'name' => 'Storage', 'subtitle' => 'The Storage service allows you to manage your project files.', 'description' => '/docs/services/storage.md', - 'controller' => 'api/storage.php', + 'controller' => '', 'sdk' => true, 'docs' => true, 'docsUrl' => 'https://appwrite.io/docs/client/storage', From 55fbd77bf195bc8946663c36595db7421fca87b9 Mon Sep 17 00:00:00 2001 From: loks0n <22452787+loks0n@users.noreply.github.com> Date: Mon, 29 Dec 2025 21:54:21 +0000 Subject: [PATCH 74/95] fix: task subprocesses --- bin/doctor | 2 +- bin/install | 2 +- bin/interval | 2 +- bin/maintenance | 2 +- bin/migrate | 2 +- bin/queue-count-failed | 2 +- bin/queue-count-processing | 2 +- bin/queue-count-success | 2 +- bin/queue-retry | 2 +- bin/realtime | 2 +- bin/schedule-executions | 2 +- bin/schedule-functions | 2 +- bin/schedule-messages | 2 +- bin/screenshot | 2 +- bin/sdks | 2 +- bin/specs | 2 +- bin/ssl | 2 +- bin/stats-resources | 2 +- bin/test | 2 +- bin/upgrade | 2 +- bin/vars | 2 +- bin/worker-audits | 2 +- bin/worker-builds | 2 +- bin/worker-certificates | 2 +- bin/worker-databases | 2 +- bin/worker-deletes | 2 +- bin/worker-functions | 2 +- bin/worker-mails | 2 +- bin/worker-messaging | 2 +- bin/worker-migrations | 2 +- bin/worker-stats-resources | 2 +- bin/worker-stats-usage | 2 +- bin/worker-webhooks | 2 +- 33 files changed, 33 insertions(+), 33 deletions(-) diff --git a/bin/doctor b/bin/doctor index b2a4547156..16a693381c 100755 --- a/bin/doctor +++ b/bin/doctor @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php doctor $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php doctor "$@" diff --git a/bin/install b/bin/install index e669e91e6b..115f088014 100755 --- a/bin/install +++ b/bin/install @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php install $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php install "$@" \ No newline at end of file diff --git a/bin/interval b/bin/interval index e4355b1dc3..c7afa68c51 100644 --- a/bin/interval +++ b/bin/interval @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php interval $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php interval "$@" \ No newline at end of file diff --git a/bin/maintenance b/bin/maintenance index 099551cb32..2311a834e0 100644 --- a/bin/maintenance +++ b/bin/maintenance @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php maintenance $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php maintenance "$@" \ No newline at end of file diff --git a/bin/migrate b/bin/migrate index 28ebbd19e7..6527f1f8f8 100755 --- a/bin/migrate +++ b/bin/migrate @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php migrate $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php migrate "$@" \ No newline at end of file diff --git a/bin/queue-count-failed b/bin/queue-count-failed index ca8f2b4291..904514e4c2 100644 --- a/bin/queue-count-failed +++ b/bin/queue-count-failed @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php queue-count --type=failed $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php queue-count --type=failed "$@" \ No newline at end of file diff --git a/bin/queue-count-processing b/bin/queue-count-processing index 325d86111d..2bc906d3d0 100644 --- a/bin/queue-count-processing +++ b/bin/queue-count-processing @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php queue-count --type=processing $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php queue-count --type=processing "$@" \ No newline at end of file diff --git a/bin/queue-count-success b/bin/queue-count-success index 34fc54b4c1..71cafa990b 100644 --- a/bin/queue-count-success +++ b/bin/queue-count-success @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php queue-count --type=success $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php queue-count --type=success "$@" \ No newline at end of file diff --git a/bin/queue-retry b/bin/queue-retry index f9473e6b07..357917915d 100644 --- a/bin/queue-retry +++ b/bin/queue-retry @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php queue-retry $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php queue-retry "$@" \ No newline at end of file diff --git a/bin/realtime b/bin/realtime index e43dc269e0..2022808e2a 100644 --- a/bin/realtime +++ b/bin/realtime @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/realtime.php $@ \ No newline at end of file +exec php /usr/src/code/app/realtime.php "$@" \ No newline at end of file diff --git a/bin/schedule-executions b/bin/schedule-executions index f239cad206..b15fad0e69 100644 --- a/bin/schedule-executions +++ b/bin/schedule-executions @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php schedule-executions $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php schedule-executions "$@" \ No newline at end of file diff --git a/bin/schedule-functions b/bin/schedule-functions index 10edbe8226..3183b24351 100644 --- a/bin/schedule-functions +++ b/bin/schedule-functions @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php schedule-functions $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php schedule-functions "$@" \ No newline at end of file diff --git a/bin/schedule-messages b/bin/schedule-messages index fa7219f6ea..08f7c7b5f5 100644 --- a/bin/schedule-messages +++ b/bin/schedule-messages @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php schedule-messages $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php schedule-messages "$@" \ No newline at end of file diff --git a/bin/screenshot b/bin/screenshot index 4d8ceb998f..ee6f0932cc 100755 --- a/bin/screenshot +++ b/bin/screenshot @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php screenshot $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php screenshot "$@" \ No newline at end of file diff --git a/bin/sdks b/bin/sdks index ab73414829..f5ae6a186d 100644 --- a/bin/sdks +++ b/bin/sdks @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php sdks $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php sdks "$@" \ No newline at end of file diff --git a/bin/specs b/bin/specs index e77d1487d4..ffc0fc22e8 100644 --- a/bin/specs +++ b/bin/specs @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php specs $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php specs "$@" \ No newline at end of file diff --git a/bin/ssl b/bin/ssl index 83dcf6a026..99748bb27d 100755 --- a/bin/ssl +++ b/bin/ssl @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php ssl $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php ssl "$@" \ No newline at end of file diff --git a/bin/stats-resources b/bin/stats-resources index 3104bab896..622a3b2b05 100644 --- a/bin/stats-resources +++ b/bin/stats-resources @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php stats-resources $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php stats-resources "$@" \ No newline at end of file diff --git a/bin/test b/bin/test index a2153fc536..0c0ec83efe 100755 --- a/bin/test +++ b/bin/test @@ -1,3 +1,3 @@ #!/bin/sh -/usr/src/code/vendor/bin/phpunit --configuration /usr/src/code/phpunit.xml $@ \ No newline at end of file +exec /usr/src/code/vendor/bin/phpunit --configuration /usr/src/code/phpunit.xml "$@" \ No newline at end of file diff --git a/bin/upgrade b/bin/upgrade index ce32b9ca30..df5f60216b 100755 --- a/bin/upgrade +++ b/bin/upgrade @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php upgrade $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php upgrade "$@" \ No newline at end of file diff --git a/bin/vars b/bin/vars index 19e3f1ebf2..d7bb615117 100644 --- a/bin/vars +++ b/bin/vars @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/cli.php vars $@ \ No newline at end of file +exec php /usr/src/code/app/cli.php vars "$@" \ No newline at end of file diff --git a/bin/worker-audits b/bin/worker-audits index 3df65d65e8..b7eb47f417 100644 --- a/bin/worker-audits +++ b/bin/worker-audits @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/worker.php audits $@ \ No newline at end of file +exec php /usr/src/code/app/worker.php audits "$@" \ No newline at end of file diff --git a/bin/worker-builds b/bin/worker-builds index 3400111cb5..a646625678 100644 --- a/bin/worker-builds +++ b/bin/worker-builds @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/worker.php builds $@ \ No newline at end of file +exec php /usr/src/code/app/worker.php builds "$@" \ No newline at end of file diff --git a/bin/worker-certificates b/bin/worker-certificates index 901688c4c8..33be1a3c9b 100755 --- a/bin/worker-certificates +++ b/bin/worker-certificates @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/worker.php certificates $@ \ No newline at end of file +exec php /usr/src/code/app/worker.php certificates "$@" \ No newline at end of file diff --git a/bin/worker-databases b/bin/worker-databases index 61e09aa9f1..32822ed068 100644 --- a/bin/worker-databases +++ b/bin/worker-databases @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/worker.php databases $@ +exec php /usr/src/code/app/worker.php databases "$@" diff --git a/bin/worker-deletes b/bin/worker-deletes index 7c9793e6cb..00c216f2e9 100644 --- a/bin/worker-deletes +++ b/bin/worker-deletes @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/worker.php deletes $@ \ No newline at end of file +exec php /usr/src/code/app/worker.php deletes "$@" \ No newline at end of file diff --git a/bin/worker-functions b/bin/worker-functions index 4757b1b72a..c24cb08821 100644 --- a/bin/worker-functions +++ b/bin/worker-functions @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/worker.php functions $@ \ No newline at end of file +exec php /usr/src/code/app/worker.php functions "$@" \ No newline at end of file diff --git a/bin/worker-mails b/bin/worker-mails index fee8a96da7..3b1415f45f 100644 --- a/bin/worker-mails +++ b/bin/worker-mails @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/worker.php mails $@ \ No newline at end of file +exec php /usr/src/code/app/worker.php mails "$@" \ No newline at end of file diff --git a/bin/worker-messaging b/bin/worker-messaging index e6edf80f06..34e85ac485 100644 --- a/bin/worker-messaging +++ b/bin/worker-messaging @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/worker.php messaging $@ \ No newline at end of file +exec php /usr/src/code/app/worker.php messaging "$@" \ No newline at end of file diff --git a/bin/worker-migrations b/bin/worker-migrations index 32d4aef468..3fa669edc6 100644 --- a/bin/worker-migrations +++ b/bin/worker-migrations @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/worker.php migrations $@ \ No newline at end of file +exec php /usr/src/code/app/worker.php migrations "$@" \ No newline at end of file diff --git a/bin/worker-stats-resources b/bin/worker-stats-resources index 9c5d2bebff..44bfa6e15f 100644 --- a/bin/worker-stats-resources +++ b/bin/worker-stats-resources @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/worker.php stats-resources $@ \ No newline at end of file +exec php /usr/src/code/app/worker.php stats-resources "$@" \ No newline at end of file diff --git a/bin/worker-stats-usage b/bin/worker-stats-usage index 2c267d805e..544ea71ee3 100644 --- a/bin/worker-stats-usage +++ b/bin/worker-stats-usage @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/worker.php stats-usage $@ \ No newline at end of file +exec php /usr/src/code/app/worker.php stats-usage "$@" \ No newline at end of file diff --git a/bin/worker-webhooks b/bin/worker-webhooks index 93f8027a81..e3c9e9471e 100644 --- a/bin/worker-webhooks +++ b/bin/worker-webhooks @@ -1,3 +1,3 @@ #!/bin/sh -php /usr/src/code/app/worker.php webhooks $@ \ No newline at end of file +exec php /usr/src/code/app/worker.php webhooks "$@" \ No newline at end of file From c1e50c7abdac8f017dc6be70bdce7dcbfeb63c24 Mon Sep 17 00:00:00 2001 From: Hemachandar <132386067+hmacr@users.noreply.github.com> Date: Tue, 30 Dec 2025 17:09:59 +0530 Subject: [PATCH 75/95] Write to new resource attributes in `keys` (#11003) * Write to new resource attributes in `keys` * temp for tests * list keys * add subqueries * lint --- app/config/collections/platform.php | 70 ++++++++++++++++++- app/controllers/api/projects.php | 35 ++++++++-- app/init/database/filters.php | 8 ++- src/Appwrite/Platform/Workers/Deletes.php | 8 ++- .../Platform/Workers/StatsResources.php | 8 ++- 5 files changed, 121 insertions(+), 8 deletions(-) diff --git a/app/config/collections/platform.php b/app/config/collections/platform.php index d44d9b725c..e919df8e1a 100644 --- a/app/config/collections/platform.php +++ b/app/config/collections/platform.php @@ -6,7 +6,7 @@ use Utopia\Database\Helpers\ID; $providers = Config::getParam('oAuthProviders', []); -return [ +$platformCollections = [ 'projects' => [ '$collection' => ID::custom(Database::METADATA), '$id' => ID::custom('projects'), @@ -643,6 +643,39 @@ return [ 'array' => false, 'filters' => [], ], + [ + '$id' => 'resourceType', + 'type' => Database::VAR_STRING, + 'format' => '', + 'size' => Database::LENGTH_KEY, + 'signed' => true, + 'required' => false, + 'default' => null, + 'array' => false, + 'filters' => [], + ], + [ + '$id' => 'resourceId', + 'type' => Database::VAR_STRING, + 'format' => '', + 'size' => Database::LENGTH_KEY, + 'signed' => true, + 'required' => false, + 'default' => null, + 'array' => false, + 'filters' => [], + ], + [ + '$id' => 'resourceInternalId', + 'type' => Database::VAR_STRING, + 'format' => '', + 'size' => Database::LENGTH_KEY, + 'signed' => true, + 'required' => false, + 'default' => null, + 'array' => false, + 'filters' => [], + ], [ '$id' => ID::custom('name'), 'type' => Database::VAR_STRING, @@ -718,6 +751,13 @@ return [ 'lengths' => [Database::LENGTH_KEY], 'orders' => [Database::ORDER_ASC], ], + [ + '$id' => '_key_resource', + 'type' => Database::INDEX_KEY, + 'attributes' => ['resourceType', 'resourceInternalId'], + 'lengths' => [Database::LENGTH_KEY], + 'orders' => [Database::ORDER_ASC], + ], [ '$id' => '_key_accessedAt', 'type' => Database::INDEX_KEY, @@ -1903,3 +1943,31 @@ return [ 'indexes' => [] ], ]; + +// Organization API keys subquery +$platformCollections['teams']['attributes'][] = [ + '$id' => ID::custom('keys'), + 'type' => Database::VAR_STRING, + 'format' => '', + 'size' => 16384, + 'signed' => true, + 'required' => false, + 'default' => null, + 'array' => false, + 'filters' => ['subQueryOrganizationKeys'], +]; + +// Account API keys subquery +$platformCollections['users']['attributes'][] = [ + '$id' => ID::custom('keys'), + 'type' => Database::VAR_STRING, + 'format' => '', + 'size' => 16384, + 'signed' => true, + 'required' => false, + 'default' => null, + 'array' => false, + 'filters' => ['subQueryAccountKeys'], +]; + +return $platformCollections; diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index c4d703d744..a49f594301 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -1499,6 +1499,9 @@ App::post('/v1/projects/:projectId/keys') ], 'projectInternalId' => $project->getSequence(), 'projectId' => $project->getId(), + 'resourceInternalId' => $project->getSequence(), + 'resourceId' => $project->getId(), + 'resourceType' => 'projects', 'name' => $name, 'scopes' => $scopes, 'expire' => $expire, @@ -1546,7 +1549,13 @@ App::get('/v1/projects/:projectId/keys') } $keys = $dbForPlatform->find('keys', [ - Query::equal('projectInternalId', [$project->getSequence()]), + Query::or([ + Query::equal('projectInternalId', [$project->getSequence()]), + Query::and([ + Query::equal('resourceType', ['projects']), + Query::equal('resourceInternalId', [$project->getSequence()]), + ]) + ]), Query::limit(5000), ]); @@ -1587,7 +1596,13 @@ App::get('/v1/projects/:projectId/keys/:keyId') $key = $dbForPlatform->findOne('keys', [ Query::equal('$id', [$keyId]), - Query::equal('projectInternalId', [$project->getSequence()]), + Query::or([ + Query::equal('projectInternalId', [$project->getSequence()]), + Query::and([ + Query::equal('resourceType', ['projects']), + Query::equal('resourceInternalId', [$project->getSequence()]), + ]) + ]) ]); if ($key->isEmpty()) { @@ -1631,7 +1646,13 @@ App::put('/v1/projects/:projectId/keys/:keyId') $key = $dbForPlatform->findOne('keys', [ Query::equal('$id', [$keyId]), - Query::equal('projectInternalId', [$project->getSequence()]), + Query::or([ + Query::equal('projectInternalId', [$project->getSequence()]), + Query::and([ + Query::equal('resourceType', ['projects']), + Query::equal('resourceInternalId', [$project->getSequence()]), + ]) + ]) ]); if ($key->isEmpty()) { @@ -1682,7 +1703,13 @@ App::delete('/v1/projects/:projectId/keys/:keyId') $key = $dbForPlatform->findOne('keys', [ Query::equal('$id', [$keyId]), - Query::equal('projectInternalId', [$project->getSequence()]), + Query::or([ + Query::equal('projectInternalId', [$project->getSequence()]), + Query::and([ + Query::equal('resourceType', ['projects']), + Query::equal('resourceInternalId', [$project->getSequence()]), + ]) + ]) ]); if ($key->isEmpty()) { diff --git a/app/init/database/filters.php b/app/init/database/filters.php index c4cfd1ac81..49c13c9a0b 100644 --- a/app/init/database/filters.php +++ b/app/init/database/filters.php @@ -136,7 +136,13 @@ Database::addFilter( function (mixed $value, Document $document, Database $database) { return $database ->find('keys', [ - Query::equal('projectInternalId', [$document->getSequence()]), + Query::or([ + Query::equal('projectInternalId', [$document->getSequence()]), + Query::and([ + Query::equal('resourceType', ['projects']), + Query::equal('resourceInternalId', [$document->getSequence()]), + ]) + ]), Query::limit(APP_LIMIT_SUBQUERY), ]); } diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index 5729bdc2c7..dfd9aebbf5 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -565,7 +565,13 @@ class Deletes extends Action // Delete Keys $this->deleteByGroup('keys', [ - Query::equal('projectInternalId', [$projectInternalId]), + Query::or([ + Query::equal('projectInternalId', [$projectInternalId]), + Query::and([ + Query::equal('resourceType', ['projects']), + Query::equal('resourceInternalId', [$projectInternalId]), + ]) + ]), Query::orderAsc() ], $dbForPlatform); diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index e465f9cca2..967dbc59a4 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -111,7 +111,13 @@ class StatsResources extends Action Query::equal('projectInternalId', [$project->getSequence()]) ]); $keys = $dbForPlatform->count('keys', [ - Query::equal('projectInternalId', [$project->getSequence()]) + Query::or([ + Query::equal('projectInternalId', [$project->getSequence()]), + Query::and([ + Query::equal('resourceType', ['projects']), + Query::equal('resourceInternalId', [$project->getSequence()]), + ]) + ]), ]); $domains = $dbForPlatform->count('rules', [ From e3412bc554670d4ffcb1df59fbab77cc42cfce2d Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 30 Dec 2025 18:25:11 +0530 Subject: [PATCH 76/95] chore: reduce sdk release steps --- src/Appwrite/Platform/Tasks/SDKs.php | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/Appwrite/Platform/Tasks/SDKs.php b/src/Appwrite/Platform/Tasks/SDKs.php index d6e3efa559..96c502d6d2 100644 --- a/src/Appwrite/Platform/Tasks/SDKs.php +++ b/src/Appwrite/Platform/Tasks/SDKs.php @@ -75,15 +75,10 @@ class SDKs extends Action $git = ($git === 'yes'); $prUrls = []; - $createPr = false; if ($git) { - $production ??= Console::confirm('Type "Appwrite" to push code to production git repos'); - $production = $production === 'Appwrite'; + $production = ($production === 'yes'); $message ??= Console::confirm('Please enter your commit message:'); - - $createPr = Console::confirm('Should we create pull request automatically? (yes/no)'); - $createPr = ($createPr === 'yes'); } } @@ -452,7 +447,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND '); Console::success("Pushed {$language['name']} SDK to {$gitUrl}"); - if ($createPr) { + if ($git) { $prTitle = "feat: {$language['name']} SDK update for version {$language['version']}"; $prBody = "This PR contains updates to the {$language['name']} SDK for version {$language['version']}."; From 73173a7f8c22f52d7faebe98a74d07f4e4e58658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 30 Dec 2025 15:04:26 +0100 Subject: [PATCH 77/95] Add module docs --- AGENTS.md | 4 +++ src/Appwrite/Platform/AGENTS.md | 56 +++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 src/Appwrite/Platform/AGENTS.md diff --git a/AGENTS.md b/AGENTS.md index a0ffdbea4c..993b0b5ad0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -58,6 +58,10 @@ Examples: Avoid introducing new dependencies other than utopia-php. +## Adding new endpoints + +When adding new endpoints, make sure to use modules and follow its patterns. Find instruction in [Modules AGENTS.md](src/Appwrite/Platform/AGENTS.md) file. + ## Pull Request Guidelines ### Before Submitting diff --git a/src/Appwrite/Platform/AGENTS.md b/src/Appwrite/Platform/AGENTS.md new file mode 100644 index 0000000000..81a127c4f7 --- /dev/null +++ b/src/Appwrite/Platform/AGENTS.md @@ -0,0 +1,56 @@ +# Modules AGENTS.md + +> Before reading this file, also read Appwrite's base [AGENTS.md](../../../AGENTS.md). + +Modules are the building blocks of the Appwrite platform. They are responsible for handling specific tasks and providing APIs for other modules to use. Each module should have its own directory within the `src/Appwrite/Platform` directory. + +Generally-speaking, each service is it's own module, but there are some exceptions. The goal is to always put related code that achieves a specific goal under one roof. + +## Structure and Naming Conventions + +When adding a module, always add a new directory under `src/Appwrite/Platform`. The directory name should be PascalCase, and if possible, only include one word. For example, `User`, `Database`, `Storage`, etc. Avoid using shorthands, unless they are standardized, such as `DB`, `JWT`, or `SMTP`. + +A module consists of: + +- `Module.php` - Simple register class registering all module's services (from `Services` directory) +- `Workers` directory - Contains behaviour for module-specific workers +- `Tasks` directory - Contains behaviour for module-specific CLI tasks +- `Http` directory - Contains HTTP endpoints for the module +- `Services` directory - Contains register classes for all relevant types of services + +Inside module, the `Services` directory can contain: + +- `Http.php` - Register HTTP endpoints and hooks from `Http` directory +- `Workers.php` - Register workers from `Workers` directory +- `Tasks.php` - Register CLI tasks from `Tasks` directory + +> After implementing a module, make sure to register it in `src/Appwrite/Platform/Appwrite.php`. + +### HTTP directory structure + +Inside module's `Http` directory, there are multiple rules to follow: + +1. Directly in `Http` directory, there should only be directories for services (and hooks, check point number 2). If a module is a single service, it's okay to only have one directory. with same name as service, for example `src/Appwrite/Platform/Account/Http/Account.php`. An example with multiple services is `src/Appwrite/Platform/Databases/Http/Databases` and `src/Appwrite/Platform/Databases/Http/TablesDB`. + +2. Hooks should live in `Hooks` directory, under `Init`, `Shutdown`, or `Error` directories, inside `Http` directory. For example, an init hook to prevent unauthorized access might live in `src/Appwrite/Platform/Functions/Http/Hooks/Init/Authentication.php`. + +3. Inside `Http` directories for services, file names can only be `Get.php`, `Update.php`, `Create.php`, `Delete.php` or `XList.php`. We call it `XList`, because `List` is reserved keyword and PHP would not like that. Never use any other words! Let's say you want a method to be `blockUser`, tempting to add `Users/Block.php`, instead, think of resource and property it affects. Better naming would be `Users/Status/Update.php` (update user's status). Doing so also nicely reflects to HTTP endpoint, `PATCH /v1/users/:userId/status`. + +4. It's allowed to nest directories in `Http` service directories. For example, if you want to create a new deployment for a function based on a template, an endpoint might live in `src/Appwrite/Platform/Functions/Http/Functions/Deployments/Template/Create.php`. + +### Sample module directory structure + +``` +src/Appwrite/Platform/Functions +├── Module.php +├── Workers +│ └── Builds.php +├── Tasks +│ └── Block.php +├── Http +│ └── MyEndpoint.php +└── Services + ├── Http.php + ├── Workers.php + └── Tasks.php +``` \ No newline at end of file From 18a49ccc449bd07af3b94e9f53d7db30423db64a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 30 Dec 2025 15:07:54 +0100 Subject: [PATCH 78/95] Update grammar --- src/Appwrite/Platform/AGENTS.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/Appwrite/Platform/AGENTS.md b/src/Appwrite/Platform/AGENTS.md index 81a127c4f7..3c6e0d79ae 100644 --- a/src/Appwrite/Platform/AGENTS.md +++ b/src/Appwrite/Platform/AGENTS.md @@ -4,11 +4,11 @@ Modules are the building blocks of the Appwrite platform. They are responsible for handling specific tasks and providing APIs for other modules to use. Each module should have its own directory within the `src/Appwrite/Platform` directory. -Generally-speaking, each service is it's own module, but there are some exceptions. The goal is to always put related code that achieves a specific goal under one roof. +Generally-speaking, each service is its own module, but there are some exceptions. The goal is to always put related code that achieves a specific goal under one roof. ## Structure and Naming Conventions -When adding a module, always add a new directory under `src/Appwrite/Platform`. The directory name should be PascalCase, and if possible, only include one word. For example, `User`, `Database`, `Storage`, etc. Avoid using shorthands, unless they are standardized, such as `DB`, `JWT`, or `SMTP`. +When adding a module, always add a new directory under `src/Appwrite/Platform`. The directory name should be PascalCase, and if possible, use only one word. For example, `User`, `Database`, `Storage`, etc. Avoid using shorthands, unless they are standardized, such as `DB`, `JWT`, or `SMTP`. A module consists of: @@ -30,11 +30,11 @@ Inside module, the `Services` directory can contain: Inside module's `Http` directory, there are multiple rules to follow: -1. Directly in `Http` directory, there should only be directories for services (and hooks, check point number 2). If a module is a single service, it's okay to only have one directory. with same name as service, for example `src/Appwrite/Platform/Account/Http/Account.php`. An example with multiple services is `src/Appwrite/Platform/Databases/Http/Databases` and `src/Appwrite/Platform/Databases/Http/TablesDB`. +1. Directly in `Http` directory, there should only be directories for services (and hooks, check point number 2). If a module is a single service, it's okay to only have one directory, with the same name as the service, for example `src/Appwrite/Platform/Account/Http/Account.php`. An example with multiple services is `src/Appwrite/Platform/Databases/Http/Databases` and `src/Appwrite/Platform/Databases/Http/TablesDB`. 2. Hooks should live in `Hooks` directory, under `Init`, `Shutdown`, or `Error` directories, inside `Http` directory. For example, an init hook to prevent unauthorized access might live in `src/Appwrite/Platform/Functions/Http/Hooks/Init/Authentication.php`. -3. Inside `Http` directories for services, file names can only be `Get.php`, `Update.php`, `Create.php`, `Delete.php` or `XList.php`. We call it `XList`, because `List` is reserved keyword and PHP would not like that. Never use any other words! Let's say you want a method to be `blockUser`, tempting to add `Users/Block.php`, instead, think of resource and property it affects. Better naming would be `Users/Status/Update.php` (update user's status). Doing so also nicely reflects to HTTP endpoint, `PATCH /v1/users/:userId/status`. +3. Inside `Http` directories for services, file names can only be `Get.php`, `Update.php`, `Create.php`, `Delete.php` or `XList.php`. We call it `XList`, because `List` is a reserved keyword and PHP would not like that. Never use any other words! Let's say you want a method to be `blockUser`, tempting to add `Users/Block.php`, instead, think of the resource and property it affects. Better naming would be `Users/Status/Update.php` (update user's status). Doing so also nicely reflects in the HTTP endpoint, `PATCH /v1/users/:userId/status`. 4. It's allowed to nest directories in `Http` service directories. For example, if you want to create a new deployment for a function based on a template, an endpoint might live in `src/Appwrite/Platform/Functions/Http/Functions/Deployments/Template/Create.php`. @@ -48,7 +48,18 @@ src/Appwrite/Platform/Functions ├── Tasks │ └── Block.php ├── Http -│ └── MyEndpoint.php +│ └── Functions +│ ├── Create.php +│ ├── XList.php +│ ├── Update.php +│ ├── Delete.php +│ ├── Get.php +│ └── Deployments +│ ├── XList.php +│ ├── Delete.php +│ ├── Get.php +│ └── Template +│ └── Create.php └── Services ├── Http.php ├── Workers.php From 49989f38f716a12c45a5257c2500af61bb9d23a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 30 Dec 2025 15:09:47 +0100 Subject: [PATCH 79/95] Update AGENTS.md --- src/Appwrite/Platform/AGENTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/AGENTS.md b/src/Appwrite/Platform/AGENTS.md index 3c6e0d79ae..a812a014b2 100644 --- a/src/Appwrite/Platform/AGENTS.md +++ b/src/Appwrite/Platform/AGENTS.md @@ -2,7 +2,7 @@ > Before reading this file, also read Appwrite's base [AGENTS.md](../../../AGENTS.md). -Modules are the building blocks of the Appwrite platform. They are responsible for handling specific tasks and providing APIs for other modules to use. Each module should have its own directory within the `src/Appwrite/Platform` directory. +Modules are the building blocks of the Appwrite platform. They are responsible for handling specific tasks, defining background workers, and providing API endpoints. Each module should have its own directory within the `src/Appwrite/Platform` directory. Generally-speaking, each service is its own module, but there are some exceptions. The goal is to always put related code that achieves a specific goal under one roof. From 77eb3d4bcd0b6958119968f169d6d7bf64f0822c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 30 Dec 2025 15:12:57 +0100 Subject: [PATCH 80/95] Update AGENTS.md --- src/Appwrite/Platform/AGENTS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Platform/AGENTS.md b/src/Appwrite/Platform/AGENTS.md index a812a014b2..3838ce275a 100644 --- a/src/Appwrite/Platform/AGENTS.md +++ b/src/Appwrite/Platform/AGENTS.md @@ -30,13 +30,13 @@ Inside module, the `Services` directory can contain: Inside module's `Http` directory, there are multiple rules to follow: -1. Directly in `Http` directory, there should only be directories for services (and hooks, check point number 2). If a module is a single service, it's okay to only have one directory, with the same name as the service, for example `src/Appwrite/Platform/Account/Http/Account.php`. An example with multiple services is `src/Appwrite/Platform/Databases/Http/Databases` and `src/Appwrite/Platform/Databases/Http/TablesDB`. +1. Directly in `Http` directory, there should only be directories for services (and hooks, check point number 2). If a module is a single service, it's okay to only have one directory, with the same name as the service, for example `src/Appwrite/Platform/Account/Http/Account`. An example with multiple services is `src/Appwrite/Platform/Databases/Http/Databases` and `src/Appwrite/Platform/Databases/Http/TablesDB`. 2. Hooks should live in `Hooks` directory, under `Init`, `Shutdown`, or `Error` directories, inside `Http` directory. For example, an init hook to prevent unauthorized access might live in `src/Appwrite/Platform/Functions/Http/Hooks/Init/Authentication.php`. 3. Inside `Http` directories for services, file names can only be `Get.php`, `Update.php`, `Create.php`, `Delete.php` or `XList.php`. We call it `XList`, because `List` is a reserved keyword and PHP would not like that. Never use any other words! Let's say you want a method to be `blockUser`, tempting to add `Users/Block.php`, instead, think of the resource and property it affects. Better naming would be `Users/Status/Update.php` (update user's status). Doing so also nicely reflects in the HTTP endpoint, `PATCH /v1/users/:userId/status`. -4. It's allowed to nest directories in `Http` service directories. For example, if you want to create a new deployment for a function based on a template, an endpoint might live in `src/Appwrite/Platform/Functions/Http/Functions/Deployments/Template/Create.php`. +4. It's allowed to nest directories in `Http` service directories. For example, if you want to create a new deployment for a function based on a template, an endpoint might live in `src/Appwrite/Platform/Functions/Http/Functions/Deployments/Template/Create.php`. In this example, notice functions and deployments are resources, and template is property - both resources and properties can be nested, and have separate directories. ### Sample module directory structure From 33ffe4aca727c894b995ae5032e22b6ccdfd3772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 30 Dec 2025 15:13:22 +0100 Subject: [PATCH 81/95] AI suggestions --- src/Appwrite/Platform/AGENTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/AGENTS.md b/src/Appwrite/Platform/AGENTS.md index 3838ce275a..429a92f7b0 100644 --- a/src/Appwrite/Platform/AGENTS.md +++ b/src/Appwrite/Platform/AGENTS.md @@ -40,7 +40,7 @@ Inside module's `Http` directory, there are multiple rules to follow: ### Sample module directory structure -``` +```bash src/Appwrite/Platform/Functions ├── Module.php ├── Workers From 69ce99d1b43dd9cb5e33d17136cad689f95090c2 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 31 Dec 2025 11:52:41 +0530 Subject: [PATCH 82/95] feat: console module. --- app/config/services.php | 6 +- app/controllers/api/console.php | 147 ------------------ app/controllers/web/console.php | 43 ----- .../Modules/Console/Http/Assistant/Create.php | 92 +++++++++++ .../Modules/Console/Http/Init/API.php | 28 ++++ .../Modules/Console/Http/Init/Web.php | 31 ++++ .../Console/Http/Redirects/Auth/Get.php | 18 +++ .../Modules/Console/Http/Redirects/Base.php | 51 ++++++ .../Console/Http/Redirects/Card/Get.php | 18 +++ .../Console/Http/Redirects/Invite/Get.php | 18 +++ .../Console/Http/Redirects/Login/Get.php | 18 +++ .../Console/Http/Redirects/MFA/Get.php | 18 +++ .../Console/Http/Redirects/Recover/Get.php | 18 +++ .../Console/Http/Redirects/Register/Get.php | 18 +++ .../Console/Http/Redirects/Root/Get.php | 18 +++ .../Modules/Console/Http/Variables/Get.php | 93 +++++++++++ .../Modules/Console/Services/Http.php | 30 +++- 17 files changed, 471 insertions(+), 194 deletions(-) delete mode 100644 app/controllers/api/console.php delete mode 100644 app/controllers/web/console.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Assistant/Create.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Init/API.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Init/Web.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Redirects/Auth/Get.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Redirects/Base.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Redirects/Card/Get.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Redirects/Invite/Get.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Redirects/Login/Get.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Redirects/MFA/Get.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Redirects/Recover/Get.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Redirects/Register/Get.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Redirects/Root/Get.php create mode 100644 src/Appwrite/Platform/Modules/Console/Http/Variables/Get.php diff --git a/app/config/services.php b/app/config/services.php index 8c3a20cf15..e4bbf9b6f6 100644 --- a/app/config/services.php +++ b/app/config/services.php @@ -20,7 +20,7 @@ return [ 'name' => 'Console', 'subtitle' => '', 'description' => '', - 'controller' => 'web/console.php', + 'controller' => '', // Uses modules 'sdk' => false, 'docs' => false, 'docsUrl' => '', @@ -270,9 +270,9 @@ return [ 'console' => [ 'key' => 'console', 'name' => 'Console', - 'subtitle' => 'The Console service allows you to interact with console relevant informations.', + 'subtitle' => 'The Console service allows you to interact with console relevant information.', 'description' => '', - 'controller' => 'api/console.php', + 'controller' => '', // Uses modules 'sdk' => true, 'docs' => true, 'docsUrl' => '', diff --git a/app/controllers/api/console.php b/app/controllers/api/console.php deleted file mode 100644 index 5bc8325794..0000000000 --- a/app/controllers/api/console.php +++ /dev/null @@ -1,147 +0,0 @@ -groups(['console']) - ->inject('project') - ->action(function (Document $project) { - if ($project->getId() !== 'console') { - throw new Exception(Exception::GENERAL_ACCESS_FORBIDDEN); - } - }); - - -App::get('/v1/console/variables') - ->desc('Get variables') - ->groups(['api', 'projects']) - ->label('scope', 'projects.read') - ->label('sdk', new Method( - namespace: 'console', - group: 'console', - name: 'variables', - description: '/docs/references/console/variables.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_CONSOLE_VARIABLES, - ) - ], - contentType: ContentType::JSON - )) - ->inject('response') - ->action(function (Response $response) { - $validator = new Domain(System::getEnv('_APP_DOMAIN_TARGET_CNAME')); - $isCNAMEValid = !empty(System::getEnv('_APP_DOMAIN_TARGET_CNAME', '')) && $validator->isKnown() && !$validator->isTest(); - - $validator = new IP(IP::V4); - $isAValid = !empty(System::getEnv('_APP_DOMAIN_TARGET_A', '')) && ($validator->isValid(System::getEnv('_APP_DOMAIN_TARGET_A'))); - - $validator = new IP(IP::V6); - $isAAAAValid = !empty(System::getEnv('_APP_DOMAIN_TARGET_AAAA', '')) && $validator->isValid(System::getEnv('_APP_DOMAIN_TARGET_AAAA')); - - $isDomainEnabled = $isAAAAValid || $isAValid || $isCNAMEValid; - - $isVcsEnabled = !empty(System::getEnv('_APP_VCS_GITHUB_APP_NAME', '')) - && !empty(System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY', '')) - && !empty(System::getEnv('_APP_VCS_GITHUB_APP_ID', '')) - && !empty(System::getEnv('_APP_VCS_GITHUB_CLIENT_ID', '')) - && !empty(System::getEnv('_APP_VCS_GITHUB_CLIENT_SECRET', '')); - - $isAssistantEnabled = !empty(System::getEnv('_APP_ASSISTANT_OPENAI_API_KEY', '')); - - $variables = new Document([ - '_APP_DOMAIN_TARGET_CNAME' => System::getEnv('_APP_DOMAIN_TARGET_CNAME'), - '_APP_DOMAIN_TARGET_AAAA' => System::getEnv('_APP_DOMAIN_TARGET_AAAA'), - '_APP_DOMAIN_TARGET_A' => System::getEnv('_APP_DOMAIN_TARGET_A'), - // Combine CAA domain with most common flags and tag (no parameters) - '_APP_DOMAIN_TARGET_CAA' => '0 issue "' . System::getEnv('_APP_DOMAIN_TARGET_CAA') . '"', - '_APP_STORAGE_LIMIT' => +System::getEnv('_APP_STORAGE_LIMIT'), - '_APP_COMPUTE_BUILD_TIMEOUT' => +System::getEnv('_APP_COMPUTE_BUILD_TIMEOUT'), - '_APP_COMPUTE_SIZE_LIMIT' => +System::getEnv('_APP_COMPUTE_SIZE_LIMIT'), - '_APP_USAGE_STATS' => System::getEnv('_APP_USAGE_STATS'), - '_APP_VCS_ENABLED' => $isVcsEnabled, - '_APP_DOMAIN_ENABLED' => $isDomainEnabled, - '_APP_ASSISTANT_ENABLED' => $isAssistantEnabled, - '_APP_DOMAIN_SITES' => System::getEnv('_APP_DOMAIN_SITES'), - '_APP_DOMAIN_FUNCTIONS' => System::getEnv('_APP_DOMAIN_FUNCTIONS'), - '_APP_OPTIONS_FORCE_HTTPS' => System::getEnv('_APP_OPTIONS_FORCE_HTTPS'), - '_APP_DOMAINS_NAMESERVERS' => System::getEnv('_APP_DOMAINS_NAMESERVERS'), - ]); - - $response->dynamic($variables, Response::MODEL_CONSOLE_VARIABLES); - }); - -App::post('/v1/console/assistant') - ->desc('Create assistant query') - ->groups(['api', 'assistant']) - ->label('scope', 'assistant.read') - ->label('sdk', new Method( - namespace: 'assistant', - group: 'console', - name: 'chat', - description: '/docs/references/assistant/chat.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_NONE, - ) - ], - contentType: ContentType::TEXT - )) - ->label('abuse-limit', 15) - ->label('abuse-key', 'userId:{userId}') - ->param('prompt', '', new Text(2000), 'Prompt. A string containing questions asked to the AI assistant.') - ->inject('response') - ->action(function (string $prompt, Response $response) { - $ch = curl_init('http://appwrite-assistant:3003/v1/models/assistant/prompt'); - $responseHeaders = []; - $query = json_encode(['prompt' => $prompt]); - $headers = ['accept: text/event-stream']; - $handleEvent = function ($ch, $data) use ($response) { - $response->chunk($data); - - return \strlen($data); - }; - - curl_setopt($ch, CURLOPT_WRITEFUNCTION, $handleEvent); - - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); - curl_setopt($ch, CURLOPT_TIMEOUT, 9000); - curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$responseHeaders) { - $len = strlen($header); - $header = explode(':', $header, 2); - - if (count($header) < 2) { // ignore invalid headers - return $len; - } - - $responseHeaders[strtolower(trim($header[0]))] = trim($header[1]); - - return $len; - }); - - curl_setopt($ch, CURLOPT_POSTFIELDS, $query); - - curl_exec($ch); - - curl_close($ch); - - $response->chunk('', true); - }); diff --git a/app/controllers/web/console.php b/app/controllers/web/console.php deleted file mode 100644 index c02e140270..0000000000 --- a/app/controllers/web/console.php +++ /dev/null @@ -1,43 +0,0 @@ -groups(['web']) - ->inject('request') - ->inject('response') - ->action(function (Request $request, Response $response) { - $response - ->addHeader('X-Frame-Options', 'SAMEORIGIN') // Avoid console and homepage from showing in iframes - ->addHeader('X-XSS-Protection', '1; mode=block; report=/v1/xss?url=' . \urlencode($request->getURI())) - ->addHeader('X-UA-Compatible', 'IE=Edge') // Deny IE browsers from going into quirks mode - ; - }); - -App::get('/') - ->alias('auth/*') - ->alias('/invite') - ->alias('/login') - ->alias('/mfa') - ->alias('/card/*') - ->alias('/recover') - ->alias('/register/*') - ->groups(['web']) - ->label('permission', 'public') - ->label('scope', 'home') - ->inject('request') - ->inject('response') - ->action(function (Request $request, Response $response) { - $url = parse_url($request->getURI()); - $target = "/console{$url['path']}"; - $params = $request->getParams(); - if (!empty($params)) { - $target .= "?" . \http_build_query($params); - } - if ($url['fragment'] ?? false) { - $target .= "#{$url['fragment']}"; - } - $response->redirect($target); - }); diff --git a/src/Appwrite/Platform/Modules/Console/Http/Assistant/Create.php b/src/Appwrite/Platform/Modules/Console/Http/Assistant/Create.php new file mode 100644 index 0000000000..554456b041 --- /dev/null +++ b/src/Appwrite/Platform/Modules/Console/Http/Assistant/Create.php @@ -0,0 +1,92 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_POST) + ->setHttpPath('/v1/console/assistant') + ->desc('Create assistant query') + ->groups(['api', 'assistant']) + ->label('scope', 'assistant.read') + ->label('sdk', new Method( + namespace: 'assistant', + group: 'console', + name: 'chat', + description: '/docs/references/assistant/chat.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_NONE, + ) + ], + contentType: ContentType::TEXT + )) + ->label('abuse-limit', 15) + ->label('abuse-key', 'userId:{userId}') + ->param('prompt', '', new Text(2000), 'Prompt. A string containing questions asked to the AI assistant.') + ->inject('response') + ->callback($this->action(...)); + } + + public function action(string $prompt, Response $response) + { + $ch = curl_init('http://appwrite-assistant:3003/v1/models/assistant/prompt'); + $responseHeaders = []; + $query = json_encode(['prompt' => $prompt]); + $headers = ['accept: text/event-stream']; + $handleEvent = function ($ch, $data) use ($response) { + $response->chunk($data); + + return \strlen($data); + }; + + curl_setopt($ch, CURLOPT_WRITEFUNCTION, $handleEvent); + + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); + curl_setopt($ch, CURLOPT_TIMEOUT, 9000); + curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$responseHeaders) { + $len = strlen($header); + $header = explode(':', $header, 2); + + if (count($header) < 2) { // ignore invalid headers + return $len; + } + + $responseHeaders[strtolower(trim($header[0]))] = trim($header[1]); + + return $len; + }); + + curl_setopt($ch, CURLOPT_POSTFIELDS, $query); + + curl_exec($ch); + + curl_close($ch); + + $response->chunk('', true); + } +} diff --git a/src/Appwrite/Platform/Modules/Console/Http/Init/API.php b/src/Appwrite/Platform/Modules/Console/Http/Init/API.php new file mode 100644 index 0000000000..824ef4c3d5 --- /dev/null +++ b/src/Appwrite/Platform/Modules/Console/Http/Init/API.php @@ -0,0 +1,28 @@ +setType(Action::TYPE_INIT) + ->groups(['console']) + ->inject('project') + ->callback(function (Document $project) { + if ($project->getId() !== 'console') { + throw new Exception(Exception::GENERAL_ACCESS_FORBIDDEN); + } + }); + } +} diff --git a/src/Appwrite/Platform/Modules/Console/Http/Init/Web.php b/src/Appwrite/Platform/Modules/Console/Http/Init/Web.php new file mode 100644 index 0000000000..587610883a --- /dev/null +++ b/src/Appwrite/Platform/Modules/Console/Http/Init/Web.php @@ -0,0 +1,31 @@ +setType(Action::TYPE_INIT) + ->groups(['web']) + ->inject('request') + ->inject('response') + ->callback(function (Request $request, Response $response) { + $response + ->addHeader('X-Frame-Options', 'SAMEORIGIN') // Avoid console and homepage from showing in iframes + ->addHeader('X-XSS-Protection', '1; mode=block; report=/v1/xss?url=' . \urlencode($request->getURI())) + ->addHeader('X-UA-Compatible', 'IE=Edge') // Deny IE browsers from going into quirks mode + ; + }); + } +} diff --git a/src/Appwrite/Platform/Modules/Console/Http/Redirects/Auth/Get.php b/src/Appwrite/Platform/Modules/Console/Http/Redirects/Auth/Get.php new file mode 100644 index 0000000000..9bce88ef92 --- /dev/null +++ b/src/Appwrite/Platform/Modules/Console/Http/Redirects/Auth/Get.php @@ -0,0 +1,18 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath($this->getPath()) + ->groups(['web']) + ->label('permission', 'public') + ->label('scope', 'home') + ->inject('request') + ->inject('response') + ->callback($this->action(...)); + } + + public function action(Request $request, Response $response): void + { + $url = parse_url($request->getURI()); + $target = "/console{$url['path']}"; + $params = $request->getParams(); + if (!empty($params)) { + $target .= "?" . \http_build_query($params); + } + if ($url['fragment'] ?? false) { + $target .= "#{$url['fragment']}"; + } + + $response->redirect($target); + } +} diff --git a/src/Appwrite/Platform/Modules/Console/Http/Redirects/Card/Get.php b/src/Appwrite/Platform/Modules/Console/Http/Redirects/Card/Get.php new file mode 100644 index 0000000000..c98c125f4e --- /dev/null +++ b/src/Appwrite/Platform/Modules/Console/Http/Redirects/Card/Get.php @@ -0,0 +1,18 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/console/variables') + ->desc('Get variables') + ->groups(['api', 'projects']) + ->label('scope', 'projects.read') + ->label('sdk', new Method( + namespace: 'console', + group: 'console', + name: 'variables', + description: '/docs/references/console/variables.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_CONSOLE_VARIABLES, + ) + ], + contentType: ContentType::JSON + )) + ->inject('response') + ->callback($this->action(...)); + } + + public function action(Response $response) + { + $validator = new Domain(System::getEnv('_APP_DOMAIN_TARGET_CNAME')); + $isCNAMEValid = !empty(System::getEnv('_APP_DOMAIN_TARGET_CNAME', '')) && $validator->isKnown() && !$validator->isTest(); + + $validator = new IP(IP::V4); + $isAValid = !empty(System::getEnv('_APP_DOMAIN_TARGET_A', '')) && ($validator->isValid(System::getEnv('_APP_DOMAIN_TARGET_A'))); + + $validator = new IP(IP::V6); + $isAAAAValid = !empty(System::getEnv('_APP_DOMAIN_TARGET_AAAA', '')) && $validator->isValid(System::getEnv('_APP_DOMAIN_TARGET_AAAA')); + + $isDomainEnabled = $isAAAAValid || $isAValid || $isCNAMEValid; + + $isVcsEnabled = !empty(System::getEnv('_APP_VCS_GITHUB_APP_NAME', '')) + && !empty(System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY', '')) + && !empty(System::getEnv('_APP_VCS_GITHUB_APP_ID', '')) + && !empty(System::getEnv('_APP_VCS_GITHUB_CLIENT_ID', '')) + && !empty(System::getEnv('_APP_VCS_GITHUB_CLIENT_SECRET', '')); + + $isAssistantEnabled = !empty(System::getEnv('_APP_ASSISTANT_OPENAI_API_KEY', '')); + + $variables = new Document([ + '_APP_DOMAIN_TARGET_CNAME' => System::getEnv('_APP_DOMAIN_TARGET_CNAME'), + '_APP_DOMAIN_TARGET_AAAA' => System::getEnv('_APP_DOMAIN_TARGET_AAAA'), + '_APP_DOMAIN_TARGET_A' => System::getEnv('_APP_DOMAIN_TARGET_A'), + '_APP_DOMAIN_TARGET_CAA' => '0 issue "' . System::getEnv('_APP_DOMAIN_TARGET_CAA') . '"', + '_APP_STORAGE_LIMIT' => +System::getEnv('_APP_STORAGE_LIMIT'), + '_APP_COMPUTE_BUILD_TIMEOUT' => +System::getEnv('_APP_COMPUTE_BUILD_TIMEOUT'), + '_APP_COMPUTE_SIZE_LIMIT' => +System::getEnv('_APP_COMPUTE_SIZE_LIMIT'), + '_APP_USAGE_STATS' => System::getEnv('_APP_USAGE_STATS'), + '_APP_VCS_ENABLED' => $isVcsEnabled, + '_APP_DOMAIN_ENABLED' => $isDomainEnabled, + '_APP_ASSISTANT_ENABLED' => $isAssistantEnabled, + '_APP_DOMAIN_SITES' => System::getEnv('_APP_DOMAIN_SITES'), + '_APP_DOMAIN_FUNCTIONS' => System::getEnv('_APP_DOMAIN_FUNCTIONS'), + '_APP_OPTIONS_FORCE_HTTPS' => System::getEnv('_APP_OPTIONS_FORCE_HTTPS'), + '_APP_DOMAINS_NAMESERVERS' => System::getEnv('_APP_DOMAINS_NAMESERVERS'), + ]); + + $response->dynamic($variables, Response::MODEL_CONSOLE_VARIABLES); + } +} diff --git a/src/Appwrite/Platform/Modules/Console/Services/Http.php b/src/Appwrite/Platform/Modules/Console/Services/Http.php index 6221db6a96..f3ca6218f2 100644 --- a/src/Appwrite/Platform/Modules/Console/Services/Http.php +++ b/src/Appwrite/Platform/Modules/Console/Services/Http.php @@ -2,7 +2,19 @@ namespace Appwrite\Platform\Modules\Console\Services; +use Appwrite\Platform\Modules\Console\Http\Assistant\Create as CreateAssistantQuery; +use Appwrite\Platform\Modules\Console\Http\Init\API; +use Appwrite\Platform\Modules\Console\Http\Init\Web; +use Appwrite\Platform\Modules\Console\Http\Redirects\Auth\Get as RedirectAuth; +use Appwrite\Platform\Modules\Console\Http\Redirects\Card\Get as RedirectCard; +use Appwrite\Platform\Modules\Console\Http\Redirects\Invite\Get as RedirectInvite; +use Appwrite\Platform\Modules\Console\Http\Redirects\Login\Get as RedirectLogin; +use Appwrite\Platform\Modules\Console\Http\Redirects\MFA\Get as RedirectMFA; +use Appwrite\Platform\Modules\Console\Http\Redirects\Recover\Get as RedirectRecover; +use Appwrite\Platform\Modules\Console\Http\Redirects\Register\Get as RedirectRegister; +use Appwrite\Platform\Modules\Console\Http\Redirects\Root\Get as RedirectRoot; use Appwrite\Platform\Modules\Console\Http\Resources\Get as GetResourceAvailability; +use Appwrite\Platform\Modules\Console\Http\Variables\Get as GetVariables; use Utopia\Platform\Service; class Http extends Service @@ -10,7 +22,23 @@ class Http extends Service public function __construct() { $this->type = Service::TYPE_HTTP; - // Resources + + // API and Web init hooks! + $this->addAction(API::getName(), new API()); + $this->addAction(Web::getName(), new Web()); + + $this->addAction(GetVariables::getName(), new GetVariables()); + $this->addAction(CreateAssistantQuery::getName(), new CreateAssistantQuery()); $this->addAction(GetResourceAvailability::getName(), new GetResourceAvailability()); + + // web redirects to /console + $this->addAction(RedirectRoot::getName(), new RedirectRoot()); + $this->addAction(RedirectAuth::getName(), new RedirectAuth()); + $this->addAction(RedirectInvite::getName(), new RedirectInvite()); + $this->addAction(RedirectLogin::getName(), new RedirectLogin()); + $this->addAction(RedirectMFA::getName(), new RedirectMFA()); + $this->addAction(RedirectCard::getName(), new RedirectCard()); + $this->addAction(RedirectRecover::getName(), new RedirectRecover()); + $this->addAction(RedirectRegister::getName(), new RedirectRegister()); } } From 2e57e5a868d33ff6c51cc83c6d1a7338ce7248e5 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 31 Dec 2025 11:59:01 +0530 Subject: [PATCH 83/95] fix: url. --- .../Platform/Modules/Console/Http/Redirects/Auth/Get.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Modules/Console/Http/Redirects/Auth/Get.php b/src/Appwrite/Platform/Modules/Console/Http/Redirects/Auth/Get.php index 9bce88ef92..f88486d6bb 100644 --- a/src/Appwrite/Platform/Modules/Console/Http/Redirects/Auth/Get.php +++ b/src/Appwrite/Platform/Modules/Console/Http/Redirects/Auth/Get.php @@ -13,6 +13,6 @@ class Get extends Base protected function getPath(): string { - return 'auth/*'; + return '/auth/*'; } } From 2a38eedc98c22e58bfc8cc7d3f6ec9cf5600e9f1 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 31 Dec 2025 15:00:23 +0530 Subject: [PATCH 84/95] fix: flaky test! fix: get resource report what we want. --- src/Appwrite/Platform/Workers/Migrations.php | 3 ++- tests/e2e/Services/Projects/ProjectsConsoleClientTest.php | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Appwrite/Platform/Workers/Migrations.php b/src/Appwrite/Platform/Workers/Migrations.php index e252b77a5f..d655672368 100644 --- a/src/Appwrite/Platform/Workers/Migrations.php +++ b/src/Appwrite/Platform/Workers/Migrations.php @@ -200,7 +200,8 @@ class Migrations extends Action default => throw new \Exception('Invalid source type'), }; - $this->sourceReport = $migrationSource->report(); + $resources = $migration->getAttribute('resources', []); + $this->sourceReport = $migrationSource->report($resources); return $migrationSource; } diff --git a/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php b/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php index 769d3a4c85..fae6031672 100644 --- a/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php +++ b/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php @@ -1851,6 +1851,8 @@ class ProjectsConsoleClientTest extends Scope $sessionCookie = $response['headers']['set-cookie']; $sessionId2 = $response['body']['$id']; + sleep(5); // fixes flaky tests. + /** * List sessions */ From 910bd69b1603dd1b7c494ec49bf41ff12f83dc28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 31 Dec 2025 10:57:10 +0100 Subject: [PATCH 85/95] Ai review fixes --- src/Appwrite/Platform/AGENTS.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Appwrite/Platform/AGENTS.md b/src/Appwrite/Platform/AGENTS.md index 429a92f7b0..09bb7b784e 100644 --- a/src/Appwrite/Platform/AGENTS.md +++ b/src/Appwrite/Platform/AGENTS.md @@ -2,19 +2,19 @@ > Before reading this file, also read Appwrite's base [AGENTS.md](../../../AGENTS.md). -Modules are the building blocks of the Appwrite platform. They are responsible for handling specific tasks, defining background workers, and providing API endpoints. Each module should have its own directory within the `src/Appwrite/Platform` directory. +Modules are the building blocks of the Appwrite platform. They are responsible for handling specific tasks, defining background workers, and providing API endpoints. Each module should have its own directory within the `src/Appwrite/Platform/Modules` directory. Generally-speaking, each service is its own module, but there are some exceptions. The goal is to always put related code that achieves a specific goal under one roof. ## Structure and Naming Conventions -When adding a module, always add a new directory under `src/Appwrite/Platform`. The directory name should be PascalCase, and if possible, use only one word. For example, `User`, `Database`, `Storage`, etc. Avoid using shorthands, unless they are standardized, such as `DB`, `JWT`, or `SMTP`. +When adding a module, always add a new directory under `src/Appwrite/Platform/Modules`. The directory name should be PascalCase, and if possible, use only one word. For example, `User`, `Database`, `Storage`, etc. Avoid using shorthands, unless they are standardized, such as `DB`, `JWT`, or `SMTP`. A module consists of: - `Module.php` - Simple register class registering all module's services (from `Services` directory) -- `Workers` directory - Contains behaviour for module-specific workers -- `Tasks` directory - Contains behaviour for module-specific CLI tasks +- `Workers` directory - Contains behavior for module-specific workers +- `Tasks` directory - Contains behavior for module-specific CLI tasks - `Http` directory - Contains HTTP endpoints for the module - `Services` directory - Contains register classes for all relevant types of services @@ -30,18 +30,18 @@ Inside module, the `Services` directory can contain: Inside module's `Http` directory, there are multiple rules to follow: -1. Directly in `Http` directory, there should only be directories for services (and hooks, check point number 2). If a module is a single service, it's okay to only have one directory, with the same name as the service, for example `src/Appwrite/Platform/Account/Http/Account`. An example with multiple services is `src/Appwrite/Platform/Databases/Http/Databases` and `src/Appwrite/Platform/Databases/Http/TablesDB`. +1. Directly in `Http` directory, there should only be directories for services (and hooks, check point number 2). If a module is a single service, it's okay to only have one directory, with the same name as the service, for example `src/Appwrite/Platform/Modules/Account/Http/Account`. An example with multiple services is `src/Appwrite/Platform/Modules/Databases/Http/Databases` and `src/Appwrite/Platform/Modules/Databases/Http/TablesDB`. -2. Hooks should live in `Hooks` directory, under `Init`, `Shutdown`, or `Error` directories, inside `Http` directory. For example, an init hook to prevent unauthorized access might live in `src/Appwrite/Platform/Functions/Http/Hooks/Init/Authentication.php`. +2. Hooks should live in `Hooks` directory, under `Init`, `Shutdown`, or `Error` directories, inside `Http` directory. For example, an init hook to prevent unauthorized access might live in `src/Appwrite/Platform/Modules/Functions/Http/Hooks/Init/Authentication.php`. 3. Inside `Http` directories for services, file names can only be `Get.php`, `Update.php`, `Create.php`, `Delete.php` or `XList.php`. We call it `XList`, because `List` is a reserved keyword and PHP would not like that. Never use any other words! Let's say you want a method to be `blockUser`, tempting to add `Users/Block.php`, instead, think of the resource and property it affects. Better naming would be `Users/Status/Update.php` (update user's status). Doing so also nicely reflects in the HTTP endpoint, `PATCH /v1/users/:userId/status`. -4. It's allowed to nest directories in `Http` service directories. For example, if you want to create a new deployment for a function based on a template, an endpoint might live in `src/Appwrite/Platform/Functions/Http/Functions/Deployments/Template/Create.php`. In this example, notice functions and deployments are resources, and template is property - both resources and properties can be nested, and have separate directories. +4. It's allowed to nest directories in `Http` service directories. For example, if you want to create a new deployment for a function based on a template, an endpoint might live in `src/Appwrite/Platform/Modules/Functions/Http/Functions/Deployments/Template/Create.php`. In this example, notice functions and deployments are resources, and template is property - both resources and properties can be nested, and have separate directories. ### Sample module directory structure ```bash -src/Appwrite/Platform/Functions +src/Appwrite/Platform/Modules/Functions ├── Module.php ├── Workers │ └── Builds.php From 408f9c2d3985a3b56340a0533fe563910896c10b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 31 Dec 2025 11:54:22 +0100 Subject: [PATCH 86/95] Upgrade VCS with getCommit fix --- composer.lock | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/composer.lock b/composer.lock index f637488a9a..c678d1c01e 100644 --- a/composer.lock +++ b/composer.lock @@ -2673,16 +2673,16 @@ }, { "name": "symfony/http-client", - "version": "v7.4.1", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "26cc224ea7103dda90e9694d9e139a389092d007" + "reference": "d01dfac1e0dc99f18da48b18101c23ce57929616" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/26cc224ea7103dda90e9694d9e139a389092d007", - "reference": "26cc224ea7103dda90e9694d9e139a389092d007", + "url": "https://api.github.com/repos/symfony/http-client/zipball/d01dfac1e0dc99f18da48b18101c23ce57929616", + "reference": "d01dfac1e0dc99f18da48b18101c23ce57929616", "shasum": "" }, "require": { @@ -2750,7 +2750,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.4.1" + "source": "https://github.com/symfony/http-client/tree/v7.4.3" }, "funding": [ { @@ -2770,7 +2770,7 @@ "type": "tidelift" } ], - "time": "2025-12-04T21:12:57+00:00" + "time": "2025-12-23T14:50:43+00:00" }, { "name": "symfony/http-client-contracts", @@ -5438,16 +5438,16 @@ "packages-dev": [ { "name": "appwrite/sdk-generator", - "version": "1.7.2", + "version": "1.8.6", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "3876d486e2c00b788fbda677ef9fcc77391b8898" + "reference": "b6cc29d3bd247e193f3c06b4168dc69d884645f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/3876d486e2c00b788fbda677ef9fcc77391b8898", - "reference": "3876d486e2c00b788fbda677ef9fcc77391b8898", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/b6cc29d3bd247e193f3c06b4168dc69d884645f0", + "reference": "b6cc29d3bd247e193f3c06b4168dc69d884645f0", "shasum": "" }, "require": { @@ -5483,9 +5483,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/1.7.2" + "source": "https://github.com/appwrite/sdk-generator/tree/1.8.6" }, - "time": "2025-12-24T07:49:12+00:00" + "time": "2025-12-31T10:22:17+00:00" }, { "name": "doctrine/annotations", @@ -7933,16 +7933,16 @@ }, { "name": "symfony/console", - "version": "v8.0.1", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "fcb73f69d655b48fcb894a262f074218df08bd58" + "reference": "6145b304a5c1ea0bdbd0b04d297a5864f9a7d587" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/fcb73f69d655b48fcb894a262f074218df08bd58", - "reference": "fcb73f69d655b48fcb894a262f074218df08bd58", + "url": "https://api.github.com/repos/symfony/console/zipball/6145b304a5c1ea0bdbd0b04d297a5864f9a7d587", + "reference": "6145b304a5c1ea0bdbd0b04d297a5864f9a7d587", "shasum": "" }, "require": { @@ -7999,7 +7999,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v8.0.1" + "source": "https://github.com/symfony/console/tree/v8.0.3" }, "funding": [ { @@ -8019,7 +8019,7 @@ "type": "tidelift" } ], - "time": "2025-12-05T15:25:33+00:00" + "time": "2025-12-23T14:52:06+00:00" }, { "name": "symfony/filesystem", @@ -8093,16 +8093,16 @@ }, { "name": "symfony/finder", - "version": "v8.0.0", + "version": "v8.0.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7598dd5770580fa3517ec83e8da0c9b9e01f4291" + "reference": "dd3a2953570a283a2ba4e17063bb98c734cf5b12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7598dd5770580fa3517ec83e8da0c9b9e01f4291", - "reference": "7598dd5770580fa3517ec83e8da0c9b9e01f4291", + "url": "https://api.github.com/repos/symfony/finder/zipball/dd3a2953570a283a2ba4e17063bb98c734cf5b12", + "reference": "dd3a2953570a283a2ba4e17063bb98c734cf5b12", "shasum": "" }, "require": { @@ -8137,7 +8137,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v8.0.0" + "source": "https://github.com/symfony/finder/tree/v8.0.3" }, "funding": [ { @@ -8157,7 +8157,7 @@ "type": "tidelift" } ], - "time": "2025-11-05T14:36:47+00:00" + "time": "2025-12-23T14:52:06+00:00" }, { "name": "symfony/options-resolver", From b5a363a2a7022a68914ba9d810bb6875c7b50181 Mon Sep 17 00:00:00 2001 From: fogelito Date: Wed, 31 Dec 2025 14:01:56 +0200 Subject: [PATCH 87/95] skip shutdown --- src/Appwrite/Platform/Workers/Migrations.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Appwrite/Platform/Workers/Migrations.php b/src/Appwrite/Platform/Workers/Migrations.php index d655672368..972757408e 100644 --- a/src/Appwrite/Platform/Workers/Migrations.php +++ b/src/Appwrite/Platform/Workers/Migrations.php @@ -363,10 +363,10 @@ class Migrations extends Action $migration->getAttribute('resourceId'), $migration->getAttribute('resourceType') ); - } - $destination->shutdown(); - $source->shutdown(); + $destination->shutdown(); + $source->shutdown(); + } $sourceErrors = $source->getErrors(); $destinationErrors = $destination->getErrors(); From ff160871aed3f0d66a9bf9ced0ae473c5ae4cc70 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 31 Dec 2025 19:21:19 +0530 Subject: [PATCH 88/95] update: check assistant status on upgrade as well. --- src/Appwrite/Platform/Tasks/Install.php | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Platform/Tasks/Install.php b/src/Appwrite/Platform/Tasks/Install.php index 1173a8ce27..e51ea3188a 100644 --- a/src/Appwrite/Platform/Tasks/Install.php +++ b/src/Appwrite/Platform/Tasks/Install.php @@ -149,9 +149,28 @@ class Install extends Action } $enableAssistant = false; + $assistantExistsInOldCompose = false; + + if ($data !== false && isset($compose)) { + try { + $assistantService = $compose->getService('appwrite-assistant'); + $assistantExistsInOldCompose = $assistantService !== null; + } catch (\Throwable) { + // assistant service doesn't exist, keep default false + } + } + if ($interactive == 'Y' && Console::isInteractive()) { - $answer = Console::confirm('Add Appwrite Assistant? (Y/n)'); - $enableAssistant = !empty($answer) && \strtolower($answer) === 'y'; + $prompt = 'Add Appwrite Assistant? (Y/n)' . ($assistantExistsInOldCompose ? ' [Currently enabled]' : ''); + $answer = Console::confirm($prompt); + + if (empty($answer)) { + $enableAssistant = $assistantExistsInOldCompose; + } else { + $enableAssistant = \strtolower($answer) === 'y'; + } + } elseif ($assistantExistsInOldCompose) { + $enableAssistant = true; } $input = []; From 0209d40a38994e529502be5bb02414eaf60a8c8a Mon Sep 17 00:00:00 2001 From: fogelito Date: Thu, 1 Jan 2026 12:17:20 +0200 Subject: [PATCH 89/95] Cli previous errors --- app/cli.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/cli.php b/app/cli.php index 73134887ea..07966b2450 100644 --- a/app/cli.php +++ b/app/cli.php @@ -257,6 +257,14 @@ CLI::setResource('logError', function (Registry $register) { $log->addExtra('trace', $error->getTraceAsString()); $log->addExtra('detailedTrace', $error->getTrace()); + if ($error->getPrevious() !== null) { + if ($error->getPrevious()->getMessage() != $error->getMessage()) { + $log->addExtra('previousMessage', $error->getPrevious()->getMessage()); + } + $log->addExtra('previousFile', $error->getPrevious()->getFile()); + $log->addExtra('previousLine', $error->getPrevious()->getLine()); + } + $log->setAction($action); $isProduction = System::getEnv('_APP_ENV', 'development') === 'production'; From b76a4bdd2f8c1ad071c0d47871a41a947b0db9db Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Fri, 2 Jan 2026 11:32:53 +0530 Subject: [PATCH 90/95] fix: remove production attribute when releasing sdks --- src/Appwrite/Platform/Tasks/SDKs.php | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src/Appwrite/Platform/Tasks/SDKs.php b/src/Appwrite/Platform/Tasks/SDKs.php index 96c502d6d2..c3a67d7fbb 100644 --- a/src/Appwrite/Platform/Tasks/SDKs.php +++ b/src/Appwrite/Platform/Tasks/SDKs.php @@ -49,7 +49,6 @@ class SDKs extends Action ->param('sdk', null, new Nullable(new Text(256)), 'Selected SDK', optional: true) ->param('version', null, new Nullable(new Text(256)), 'Selected SDK', optional: true) ->param('git', null, new Nullable(new WhiteList(['yes', 'no'])), 'Should we use git push?', optional: true) - ->param('production', null, new Nullable(new WhiteList(['yes', 'no'])), 'Should we push to production?', optional: true) ->param('message', null, new Nullable(new Text(256)), 'Commit Message', optional: true) ->param('release', null, new Nullable(new WhiteList(['yes', 'no'])), 'Should we create releases?', optional: true) ->param('commit', null, new Nullable(new WhiteList(['yes', 'no'])), 'Actually create releases (yes) or dry-run (no)?', optional: true) @@ -57,7 +56,7 @@ class SDKs extends Action ->callback($this->action(...)); } - public function action(?string $selectedPlatform, ?string $selectedSDK, ?string $version, ?string $git, ?string $production, ?string $message, ?string $release, ?string $commit, ?string $sdks): void + public function action(?string $selectedPlatform, ?string $selectedSDK, ?string $version, ?string $git, ?string $message, ?string $release, ?string $commit, ?string $sdks): void { if (!$sdks) { $selectedPlatform ??= Console::confirm('Choose Platform ("' . implode('", "', static::getPlatforms()) . '" or "*" for all):'); @@ -77,7 +76,6 @@ class SDKs extends Action $prUrls = []; if ($git) { - $production = ($production === 'yes'); $message ??= Console::confirm('Please enter your commit message:'); } } @@ -417,10 +415,6 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND $gitUrl = $language['gitUrl']; $gitBranch = $language['gitBranch']; - if (!$production) { - $gitUrl = 'git@github.com:aw-tests/' . $language['gitRepoName'] . '.git'; - } - $repoBranch = $language['repoBranch'] ?? 'main'; if ($git && !empty($gitUrl)) { \exec('rm -rf ' . $target . ' && \ @@ -440,7 +434,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND git rm -rf --cached . && \ git clean -fdx -e .git -e .github && \ cp -r ' . $result . '/. ' . $target . '/ && \ - (test -d /tmp/.github-backup-$$ && cp -r /tmp/.github-backup-$$/.github . && rm -rf /tmp/.github-backup-$$ || true) && \ + (test -d /tmp/.github-backup-$$ && cp -rn /tmp/.github-backup-$$/.github . && rm -rf /tmp/.github-backup-$$ || true) && \ git add -A && \ git commit -m "' . $message . '" && \ git push -u origin ' . $gitBranch . ' @@ -450,13 +444,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND if ($git) { $prTitle = "feat: {$language['name']} SDK update for version {$language['version']}"; $prBody = "This PR contains updates to the {$language['name']} SDK for version {$language['version']}."; - - $repoName = $language['gitRepoName']; - if (!$production) { - $repoName = 'aw-tests/' . $language['gitRepoName']; - } else { - $repoName = $language['gitUserName'] . '/' . $language['gitRepoName']; - } + $repoName = $language['gitUserName'] . '/' . $language['gitRepoName']; Console::info("Creating pull request for {$language['name']} SDK..."); From 06c4ba81e9506bb68e50f903587f561348230611 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Fri, 2 Jan 2026 15:20:45 +0530 Subject: [PATCH 91/95] chore: sync specs + allow cookie auth in console platform --- app/config/specs/open-api3-1.8.x-client.json | 257 +++-- app/config/specs/open-api3-1.8.x-console.json | 1017 +++++++++-------- app/config/specs/open-api3-1.8.x-server.json | 769 +++++++------ app/config/specs/open-api3-latest-client.json | 257 +++-- .../specs/open-api3-latest-console.json | 1017 +++++++++-------- app/config/specs/open-api3-latest-server.json | 769 +++++++------ app/config/specs/swagger2-1.8.x-client.json | 257 +++-- app/config/specs/swagger2-1.8.x-console.json | 1017 +++++++++-------- app/config/specs/swagger2-1.8.x-server.json | 769 +++++++------ app/config/specs/swagger2-latest-client.json | 257 +++-- app/config/specs/swagger2-latest-console.json | 1017 +++++++++-------- app/config/specs/swagger2-latest-server.json | 769 +++++++------ src/Appwrite/Platform/Tasks/Specs.php | 6 + 13 files changed, 4098 insertions(+), 4080 deletions(-) diff --git a/app/config/specs/open-api3-1.8.x-client.json b/app/config/specs/open-api3-1.8.x-client.json index 953c76da26..052fe536c9 100644 --- a/app/config/specs/open-api3-1.8.x-client.json +++ b/app/config/specs/open-api3-1.8.x-client.json @@ -48,7 +48,7 @@ "x-appwrite": { "method": "get", "group": "account", - "weight": 10, + "weight": 9, "cookies": false, "type": "", "demo": "account\/get.md", @@ -99,7 +99,7 @@ "x-appwrite": { "method": "create", "group": "account", - "weight": 9, + "weight": 8, "cookies": false, "type": "", "demo": "account\/create.md", @@ -188,7 +188,7 @@ "x-appwrite": { "method": "updateEmail", "group": "account", - "weight": 35, + "weight": 34, "cookies": false, "type": "", "demo": "account\/update-email.md", @@ -266,7 +266,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 48, + "weight": 47, "cookies": false, "type": "", "demo": "account\/list-identities.md", @@ -338,7 +338,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 49, + "weight": 48, "cookies": false, "type": "", "demo": "account\/delete-identity.md", @@ -403,7 +403,7 @@ "x-appwrite": { "method": "createJWT", "group": "tokens", - "weight": 30, + "weight": 29, "cookies": false, "type": "", "demo": "account\/create-jwt.md", @@ -472,7 +472,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 32, + "weight": 31, "cookies": false, "type": "", "demo": "account\/list-logs.md", @@ -551,7 +551,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 307, + "weight": 288, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -623,7 +623,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 309, + "weight": 290, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -747,7 +747,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 310, + "weight": 291, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -887,7 +887,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 311, + "weight": 292, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1011,7 +1011,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 315, + "weight": 296, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1145,7 +1145,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 316, + "weight": 297, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1283,7 +1283,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 308, + "weight": 289, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1384,7 +1384,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 314, + "weight": 295, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1483,7 +1483,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 312, + "weight": 293, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1582,7 +1582,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 313, + "weight": 294, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -1683,7 +1683,7 @@ "x-appwrite": { "method": "updateName", "group": "account", - "weight": 33, + "weight": 32, "cookies": false, "type": "", "demo": "account\/update-name.md", @@ -1755,7 +1755,7 @@ "x-appwrite": { "method": "updatePassword", "group": "account", - "weight": 34, + "weight": 33, "cookies": false, "type": "", "demo": "account\/update-password.md", @@ -1832,7 +1832,7 @@ "x-appwrite": { "method": "updatePhone", "group": "account", - "weight": 36, + "weight": 35, "cookies": false, "type": "", "demo": "account\/update-phone.md", @@ -1910,7 +1910,7 @@ "x-appwrite": { "method": "getPrefs", "group": "account", - "weight": 31, + "weight": 30, "cookies": false, "type": "", "demo": "account\/get-prefs.md", @@ -1961,7 +1961,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "account", - "weight": 37, + "weight": 36, "cookies": false, "type": "", "demo": "account\/update-prefs.md", @@ -2033,7 +2033,7 @@ "x-appwrite": { "method": "createRecovery", "group": "recovery", - "weight": 39, + "weight": 38, "cookies": false, "type": "", "demo": "account\/create-recovery.md", @@ -2112,7 +2112,7 @@ "x-appwrite": { "method": "updateRecovery", "group": "recovery", - "weight": 40, + "weight": 39, "cookies": false, "type": "", "demo": "account\/update-recovery.md", @@ -2196,7 +2196,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 12, + "weight": 11, "cookies": false, "type": "", "demo": "account\/list-sessions.md", @@ -2240,7 +2240,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 13, + "weight": 12, "cookies": false, "type": "", "demo": "account\/delete-sessions.md", @@ -2293,7 +2293,7 @@ "x-appwrite": { "method": "createAnonymousSession", "group": "sessions", - "weight": 18, + "weight": 17, "cookies": false, "type": "", "demo": "account\/create-anonymous-session.md", @@ -2346,7 +2346,7 @@ "x-appwrite": { "method": "createEmailPasswordSession", "group": "sessions", - "weight": 17, + "weight": 16, "cookies": false, "type": "", "demo": "account\/create-email-password-session.md", @@ -2424,7 +2424,7 @@ "x-appwrite": { "method": "updateMagicURLSession", "group": "sessions", - "weight": 27, + "weight": 26, "cookies": false, "type": "", "demo": "account\/update-magic-url-session.md", @@ -2499,7 +2499,7 @@ "x-appwrite": { "method": "createOAuth2Session", "group": "sessions", - "weight": 20, + "weight": 19, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-session.md", @@ -2646,7 +2646,7 @@ "x-appwrite": { "method": "updatePhoneSession", "group": "sessions", - "weight": 28, + "weight": 27, "cookies": false, "type": "", "demo": "account\/update-phone-session.md", @@ -2728,7 +2728,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 19, + "weight": 18, "cookies": false, "type": "", "demo": "account\/create-session.md", @@ -2806,7 +2806,7 @@ "x-appwrite": { "method": "getSession", "group": "sessions", - "weight": 14, + "weight": 13, "cookies": false, "type": "", "demo": "account\/get-session.md", @@ -2869,7 +2869,7 @@ "x-appwrite": { "method": "updateSession", "group": "sessions", - "weight": 16, + "weight": 15, "cookies": false, "type": "", "demo": "account\/update-session.md", @@ -2925,7 +2925,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 15, + "weight": 14, "cookies": false, "type": "", "demo": "account\/delete-session.md", @@ -2990,7 +2990,7 @@ "x-appwrite": { "method": "updateStatus", "group": "account", - "weight": 38, + "weight": 37, "cookies": false, "type": "", "demo": "account\/update-status.md", @@ -3043,7 +3043,7 @@ "x-appwrite": { "method": "createPushTarget", "group": "pushTargets", - "weight": 45, + "weight": 44, "cookies": false, "type": "", "demo": "account\/create-push-target.md", @@ -3124,7 +3124,7 @@ "x-appwrite": { "method": "updatePushTarget", "group": "pushTargets", - "weight": 46, + "weight": 45, "cookies": false, "type": "", "demo": "account\/update-push-target.md", @@ -3197,7 +3197,7 @@ "x-appwrite": { "method": "deletePushTarget", "group": "pushTargets", - "weight": 47, + "weight": 46, "cookies": false, "type": "", "demo": "account\/delete-push-target.md", @@ -3260,7 +3260,7 @@ "x-appwrite": { "method": "createEmailToken", "group": "tokens", - "weight": 26, + "weight": 25, "cookies": false, "type": "", "demo": "account\/create-email-token.md", @@ -3346,7 +3346,7 @@ "x-appwrite": { "method": "createMagicURLToken", "group": "tokens", - "weight": 25, + "weight": 24, "cookies": false, "type": "", "demo": "account\/create-magic-url-token.md", @@ -3430,7 +3430,7 @@ "x-appwrite": { "method": "createOAuth2Token", "group": "tokens", - "weight": 24, + "weight": 23, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-token.md", @@ -3577,7 +3577,7 @@ "x-appwrite": { "method": "createPhoneToken", "group": "tokens", - "weight": 29, + "weight": 28, "cookies": false, "type": "", "demo": "account\/create-phone-token.md", @@ -3658,7 +3658,7 @@ "x-appwrite": { "method": "createEmailVerification", "group": "verification", - "weight": 41, + "weight": 40, "cookies": false, "type": "", "demo": "account\/create-email-verification.md", @@ -3780,7 +3780,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "verification", - "weight": 42, + "weight": 41, "cookies": false, "type": "", "demo": "account\/update-email-verification.md", @@ -3914,7 +3914,7 @@ "x-appwrite": { "method": "createPhoneVerification", "group": "verification", - "weight": 43, + "weight": 42, "cookies": false, "type": "", "demo": "account\/create-phone-verification.md", @@ -3968,7 +3968,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "verification", - "weight": 44, + "weight": 43, "cookies": false, "type": "", "demo": "account\/update-phone-verification.md", @@ -4039,7 +4039,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 51, + "weight": 50, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4167,7 +4167,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 50, + "weight": 49, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4301,7 +4301,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 54, + "weight": 53, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4361,7 +4361,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 52, + "weight": 51, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4851,7 +4851,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 53, + "weight": 52, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4935,7 +4935,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 56, + "weight": 55, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5029,7 +5029,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 55, + "weight": 54, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5123,7 +5123,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 57, + "weight": 56, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5876,7 +5876,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 381, + "weight": 362, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -5943,7 +5943,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 377, + "weight": 358, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6013,7 +6013,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 378, + "weight": 359, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6077,7 +6077,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 379, + "weight": 360, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6155,7 +6155,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 380, + "weight": 361, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6221,7 +6221,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 382, + "weight": 363, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6306,7 +6306,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 340, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -6418,7 +6418,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 332, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -6579,7 +6579,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 333, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -6690,7 +6690,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 336, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -6845,7 +6845,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 334, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -6957,7 +6957,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 338, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -7064,7 +7064,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 343, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -7191,7 +7191,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 342, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -7318,7 +7318,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 473, + "weight": 454, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -7405,7 +7405,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 471, + "weight": 452, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -7523,7 +7523,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 472, + "weight": 453, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -7598,7 +7598,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 242, + "weight": 225, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -7652,7 +7652,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 241, + "weight": 224, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -7706,7 +7706,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 61, + "weight": 60, "cookies": false, "type": "", "demo": "locale\/get.md", @@ -7760,7 +7760,7 @@ "x-appwrite": { "method": "listCodes", "group": null, - "weight": 62, + "weight": 61, "cookies": false, "type": "", "demo": "locale\/list-codes.md", @@ -7814,7 +7814,7 @@ "x-appwrite": { "method": "listContinents", "group": null, - "weight": 66, + "weight": 65, "cookies": false, "type": "", "demo": "locale\/list-continents.md", @@ -7868,7 +7868,7 @@ "x-appwrite": { "method": "listCountries", "group": null, - "weight": 63, + "weight": 62, "cookies": false, "type": "", "demo": "locale\/list-countries.md", @@ -7922,7 +7922,7 @@ "x-appwrite": { "method": "listCountriesEU", "group": null, - "weight": 64, + "weight": 63, "cookies": false, "type": "", "demo": "locale\/list-countries-eu.md", @@ -7976,7 +7976,7 @@ "x-appwrite": { "method": "listCountriesPhones", "group": null, - "weight": 65, + "weight": 64, "cookies": false, "type": "", "demo": "locale\/list-countries-phones.md", @@ -8030,7 +8030,7 @@ "x-appwrite": { "method": "listCurrencies", "group": null, - "weight": 67, + "weight": 66, "cookies": false, "type": "", "demo": "locale\/list-currencies.md", @@ -8084,7 +8084,7 @@ "x-appwrite": { "method": "listLanguages", "group": null, - "weight": 68, + "weight": 67, "cookies": false, "type": "", "demo": "locale\/list-languages.md", @@ -8138,7 +8138,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 291, + "weight": 272, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -8222,7 +8222,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 295, + "weight": 276, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -8298,7 +8298,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 151, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -8397,7 +8397,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 150, + "weight": 523, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -8498,7 +8498,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 152, + "weight": 524, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -8572,13 +8572,13 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 157, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/update-file.md", - "rate-limit": 60, - "rate-time": 60, - "rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}", + "rate-limit": 0, + "rate-time": 3600, + "rate-key": "url:{url},ip:{ip}", "scope": "files.write", "platforms": [ "console", @@ -8603,7 +8603,7 @@ "parameters": [ { "name": "bucketId", - "description": "Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https:\/\/appwrite.io\/docs\/server\/storage#createBucket).", + "description": "Bucket unique ID.", "required": true, "schema": { "type": "string", @@ -8613,7 +8613,7 @@ }, { "name": "fileId", - "description": "File unique ID.", + "description": "File ID.", "required": true, "schema": { "type": "string", @@ -8630,13 +8630,12 @@ "properties": { "name": { "type": "string", - "description": "Name of the file", - "x-example": "", - "x-nullable": true + "description": "File name.", + "x-example": "" }, "permissions": { "type": "array", - "description": "An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", + "description": "An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", "x-example": "[\"read(\"any\")\"]", "items": { "type": "string" @@ -8665,7 +8664,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 158, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -8734,7 +8733,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 154, + "weight": 529, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -8814,7 +8813,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 153, + "weight": 528, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -9044,7 +9043,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 155, + "weight": 530, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -9131,7 +9130,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 446, + "weight": 427, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -9201,7 +9200,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 442, + "weight": 423, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -9274,7 +9273,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 443, + "weight": 424, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -9341,7 +9340,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 444, + "weight": 425, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -9422,7 +9421,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 445, + "weight": 426, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -9491,7 +9490,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 447, + "weight": 428, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -9579,7 +9578,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 438, + "weight": 419, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -9690,7 +9689,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 430, + "weight": 411, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -9846,7 +9845,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 431, + "weight": 412, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -9956,7 +9955,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 434, + "weight": 415, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -10106,7 +10105,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 432, + "weight": 413, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -10217,7 +10216,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 436, + "weight": 417, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -10323,7 +10322,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 441, + "weight": 422, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -10449,7 +10448,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 440, + "weight": 421, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -10575,7 +10574,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 162, + "weight": 145, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -10664,7 +10663,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 161, + "weight": 144, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -10751,7 +10750,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 163, + "weight": 146, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -10815,7 +10814,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 165, + "weight": 148, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -10891,7 +10890,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 167, + "weight": 150, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -10957,7 +10956,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 169, + "weight": 152, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -11056,7 +11055,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 168, + "weight": 151, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -11176,7 +11175,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 170, + "weight": 153, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -11250,7 +11249,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 171, + "weight": 154, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -11346,7 +11345,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 173, + "weight": 156, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -11422,7 +11421,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 172, + "weight": 155, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -11522,7 +11521,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 164, + "weight": 147, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -11585,7 +11584,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 166, + "weight": 149, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -11709,7 +11708,7 @@ }, { "name": "console", - "description": "The Console service allows you to interact with console relevant informations." + "description": "The Console service allows you to interact with console relevant information." }, { "name": "migrations", diff --git a/app/config/specs/open-api3-1.8.x-console.json b/app/config/specs/open-api3-1.8.x-console.json index e0ab50c73a..de68c4db48 100644 --- a/app/config/specs/open-api3-1.8.x-console.json +++ b/app/config/specs/open-api3-1.8.x-console.json @@ -48,7 +48,7 @@ "x-appwrite": { "method": "get", "group": "account", - "weight": 10, + "weight": 9, "cookies": false, "type": "", "demo": "account\/get.md", @@ -98,7 +98,7 @@ "x-appwrite": { "method": "create", "group": "account", - "weight": 9, + "weight": 8, "cookies": false, "type": "", "demo": "account\/create.md", @@ -177,7 +177,7 @@ "x-appwrite": { "method": "delete", "group": "account", - "weight": 11, + "weight": 10, "cookies": false, "type": "", "demo": "account\/delete.md", @@ -226,7 +226,7 @@ "x-appwrite": { "method": "updateEmail", "group": "account", - "weight": 35, + "weight": 34, "cookies": false, "type": "", "demo": "account\/update-email.md", @@ -303,7 +303,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 48, + "weight": 47, "cookies": false, "type": "", "demo": "account\/list-identities.md", @@ -374,7 +374,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 49, + "weight": 48, "cookies": false, "type": "", "demo": "account\/delete-identity.md", @@ -438,7 +438,7 @@ "x-appwrite": { "method": "createJWT", "group": "tokens", - "weight": 30, + "weight": 29, "cookies": false, "type": "", "demo": "account\/create-jwt.md", @@ -506,7 +506,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 32, + "weight": 31, "cookies": false, "type": "", "demo": "account\/list-logs.md", @@ -584,7 +584,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 307, + "weight": 288, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -655,7 +655,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 309, + "weight": 290, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -778,7 +778,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 310, + "weight": 291, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -917,7 +917,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 311, + "weight": 292, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1040,7 +1040,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 315, + "weight": 296, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1173,7 +1173,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 316, + "weight": 297, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1310,7 +1310,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 308, + "weight": 289, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1410,7 +1410,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 314, + "weight": 295, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1508,7 +1508,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 312, + "weight": 293, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1606,7 +1606,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 313, + "weight": 294, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -1706,7 +1706,7 @@ "x-appwrite": { "method": "updateName", "group": "account", - "weight": 33, + "weight": 32, "cookies": false, "type": "", "demo": "account\/update-name.md", @@ -1777,7 +1777,7 @@ "x-appwrite": { "method": "updatePassword", "group": "account", - "weight": 34, + "weight": 33, "cookies": false, "type": "", "demo": "account\/update-password.md", @@ -1853,7 +1853,7 @@ "x-appwrite": { "method": "updatePhone", "group": "account", - "weight": 36, + "weight": 35, "cookies": false, "type": "", "demo": "account\/update-phone.md", @@ -1930,7 +1930,7 @@ "x-appwrite": { "method": "getPrefs", "group": "account", - "weight": 31, + "weight": 30, "cookies": false, "type": "", "demo": "account\/get-prefs.md", @@ -1980,7 +1980,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "account", - "weight": 37, + "weight": 36, "cookies": false, "type": "", "demo": "account\/update-prefs.md", @@ -2051,7 +2051,7 @@ "x-appwrite": { "method": "createRecovery", "group": "recovery", - "weight": 39, + "weight": 38, "cookies": false, "type": "", "demo": "account\/create-recovery.md", @@ -2129,7 +2129,7 @@ "x-appwrite": { "method": "updateRecovery", "group": "recovery", - "weight": 40, + "weight": 39, "cookies": false, "type": "", "demo": "account\/update-recovery.md", @@ -2212,7 +2212,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 12, + "weight": 11, "cookies": false, "type": "", "demo": "account\/list-sessions.md", @@ -2255,7 +2255,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 13, + "weight": 12, "cookies": false, "type": "", "demo": "account\/delete-sessions.md", @@ -2307,7 +2307,7 @@ "x-appwrite": { "method": "createAnonymousSession", "group": "sessions", - "weight": 18, + "weight": 17, "cookies": false, "type": "", "demo": "account\/create-anonymous-session.md", @@ -2359,7 +2359,7 @@ "x-appwrite": { "method": "createEmailPasswordSession", "group": "sessions", - "weight": 17, + "weight": 16, "cookies": false, "type": "", "demo": "account\/create-email-password-session.md", @@ -2436,7 +2436,7 @@ "x-appwrite": { "method": "updateMagicURLSession", "group": "sessions", - "weight": 27, + "weight": 26, "cookies": false, "type": "", "demo": "account\/update-magic-url-session.md", @@ -2510,7 +2510,7 @@ "x-appwrite": { "method": "createOAuth2Session", "group": "sessions", - "weight": 20, + "weight": 19, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-session.md", @@ -2656,7 +2656,7 @@ "x-appwrite": { "method": "updatePhoneSession", "group": "sessions", - "weight": 28, + "weight": 27, "cookies": false, "type": "", "demo": "account\/update-phone-session.md", @@ -2737,7 +2737,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 19, + "weight": 18, "cookies": false, "type": "", "demo": "account\/create-session.md", @@ -2814,7 +2814,7 @@ "x-appwrite": { "method": "getSession", "group": "sessions", - "weight": 14, + "weight": 13, "cookies": false, "type": "", "demo": "account\/get-session.md", @@ -2876,7 +2876,7 @@ "x-appwrite": { "method": "updateSession", "group": "sessions", - "weight": 16, + "weight": 15, "cookies": false, "type": "", "demo": "account\/update-session.md", @@ -2931,7 +2931,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 15, + "weight": 14, "cookies": false, "type": "", "demo": "account\/delete-session.md", @@ -2995,7 +2995,7 @@ "x-appwrite": { "method": "updateStatus", "group": "account", - "weight": 38, + "weight": 37, "cookies": false, "type": "", "demo": "account\/update-status.md", @@ -3047,7 +3047,7 @@ "x-appwrite": { "method": "createPushTarget", "group": "pushTargets", - "weight": 45, + "weight": 44, "cookies": false, "type": "", "demo": "account\/create-push-target.md", @@ -3127,7 +3127,7 @@ "x-appwrite": { "method": "updatePushTarget", "group": "pushTargets", - "weight": 46, + "weight": 45, "cookies": false, "type": "", "demo": "account\/update-push-target.md", @@ -3199,7 +3199,7 @@ "x-appwrite": { "method": "deletePushTarget", "group": "pushTargets", - "weight": 47, + "weight": 46, "cookies": false, "type": "", "demo": "account\/delete-push-target.md", @@ -3261,7 +3261,7 @@ "x-appwrite": { "method": "createEmailToken", "group": "tokens", - "weight": 26, + "weight": 25, "cookies": false, "type": "", "demo": "account\/create-email-token.md", @@ -3346,7 +3346,7 @@ "x-appwrite": { "method": "createMagicURLToken", "group": "tokens", - "weight": 25, + "weight": 24, "cookies": false, "type": "", "demo": "account\/create-magic-url-token.md", @@ -3429,7 +3429,7 @@ "x-appwrite": { "method": "createOAuth2Token", "group": "tokens", - "weight": 24, + "weight": 23, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-token.md", @@ -3575,7 +3575,7 @@ "x-appwrite": { "method": "createPhoneToken", "group": "tokens", - "weight": 29, + "weight": 28, "cookies": false, "type": "", "demo": "account\/create-phone-token.md", @@ -3655,7 +3655,7 @@ "x-appwrite": { "method": "createEmailVerification", "group": "verification", - "weight": 41, + "weight": 40, "cookies": false, "type": "", "demo": "account\/create-email-verification.md", @@ -3776,7 +3776,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "verification", - "weight": 42, + "weight": 41, "cookies": false, "type": "", "demo": "account\/update-email-verification.md", @@ -3909,7 +3909,7 @@ "x-appwrite": { "method": "createPhoneVerification", "group": "verification", - "weight": 43, + "weight": 42, "cookies": false, "type": "", "demo": "account\/create-phone-verification.md", @@ -3962,7 +3962,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "verification", - "weight": 44, + "weight": 43, "cookies": false, "type": "", "demo": "account\/update-phone-verification.md", @@ -4032,7 +4032,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 51, + "weight": 50, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4160,7 +4160,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 50, + "weight": 49, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4294,7 +4294,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 54, + "weight": 53, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4354,7 +4354,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 52, + "weight": 51, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4844,7 +4844,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 53, + "weight": 52, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4928,7 +4928,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 56, + "weight": 55, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5022,7 +5022,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 55, + "weight": 54, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5116,7 +5116,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 57, + "weight": 56, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5862,7 +5862,7 @@ "x-appwrite": { "method": "chat", "group": "console", - "weight": 244, + "weight": 495, "cookies": false, "type": "", "demo": "assistant\/chat.md", @@ -5923,7 +5923,7 @@ "x-appwrite": { "method": "getResource", "group": null, - "weight": 513, + "weight": 496, "cookies": false, "type": "", "demo": "console\/get-resource.md", @@ -5998,7 +5998,7 @@ "x-appwrite": { "method": "variables", "group": "console", - "weight": 243, + "weight": 494, "cookies": false, "type": "", "demo": "console\/variables.md", @@ -6047,7 +6047,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 321, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -6166,7 +6166,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 317, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -6283,7 +6283,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 381, + "weight": 362, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6350,7 +6350,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 377, + "weight": 358, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6420,7 +6420,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 378, + "weight": 359, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6484,7 +6484,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 379, + "weight": 360, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6562,7 +6562,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 380, + "weight": 361, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6628,7 +6628,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 382, + "weight": 363, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6713,7 +6713,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 324, + "weight": 305, "cookies": false, "type": "", "demo": "databases\/list-usage.md", @@ -6817,7 +6817,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 318, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -6911,7 +6911,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 319, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -7025,7 +7025,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 320, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -7120,7 +7120,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 329, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -7220,7 +7220,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 325, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -7347,7 +7347,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 326, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -7422,7 +7422,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 327, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7528,7 +7528,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 328, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7605,7 +7605,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 346, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7706,7 +7706,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 347, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7819,7 +7819,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 348, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -7937,7 +7937,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 349, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -8050,7 +8050,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 350, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -8168,7 +8168,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 351, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -8281,7 +8281,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 352, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -8399,7 +8399,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 353, + "weight": 334, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8521,7 +8521,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 354, + "weight": 335, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8648,7 +8648,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 355, + "weight": 336, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8773,7 +8773,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 356, + "weight": 337, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -8903,7 +8903,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 357, + "weight": 338, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -9028,7 +9028,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 358, + "weight": 339, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -9158,7 +9158,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 359, + "weight": 340, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -9271,7 +9271,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 360, + "weight": 341, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -9389,7 +9389,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 361, + "weight": 342, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9504,7 +9504,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 362, + "weight": 343, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9628,7 +9628,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 363, + "weight": 344, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -9743,7 +9743,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 364, + "weight": 345, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -9867,7 +9867,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 365, + "weight": 346, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -9982,7 +9982,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 366, + "weight": 347, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -10106,7 +10106,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 367, + "weight": 348, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -10245,7 +10245,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 369, + "weight": 350, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -10369,7 +10369,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 370, + "weight": 351, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -10493,7 +10493,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 371, + "weight": 352, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -10606,7 +10606,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 372, + "weight": 353, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -10755,7 +10755,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 344, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -10832,7 +10832,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 345, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -10918,7 +10918,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 368, + "weight": 349, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -11034,7 +11034,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 340, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -11146,7 +11146,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 332, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -11337,7 +11337,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 337, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -11474,7 +11474,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 335, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -11579,7 +11579,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 339, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -11681,7 +11681,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 333, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -11792,7 +11792,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 336, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -11947,7 +11947,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 334, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -12059,7 +12059,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 338, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -12166,7 +12166,7 @@ "x-appwrite": { "method": "listDocumentLogs", "group": "logs", - "weight": 341, + "weight": 322, "cookies": false, "type": "", "demo": "databases\/list-document-logs.md", @@ -12264,7 +12264,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 343, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -12391,7 +12391,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 342, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -12518,7 +12518,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 376, + "weight": 357, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -12617,7 +12617,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 373, + "weight": 354, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -12758,7 +12758,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 374, + "weight": 355, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -12835,7 +12835,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 375, + "weight": 356, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -12921,7 +12921,7 @@ "x-appwrite": { "method": "listCollectionLogs", "group": "collections", - "weight": 330, + "weight": 311, "cookies": false, "type": "", "demo": "databases\/list-collection-logs.md", @@ -13009,7 +13009,7 @@ "x-appwrite": { "method": "getCollectionUsage", "group": null, - "weight": 331, + "weight": 312, "cookies": false, "type": "", "demo": "databases\/get-collection-usage.md", @@ -13106,7 +13106,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 322, + "weight": 303, "cookies": false, "type": "", "demo": "databases\/list-logs.md", @@ -13214,7 +13214,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 323, + "weight": 304, "cookies": false, "type": "", "demo": "databases\/get-usage.md", @@ -13331,7 +13331,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 457, + "weight": 438, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -13416,7 +13416,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 454, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -13711,7 +13711,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 459, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -13761,7 +13761,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 460, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -13811,7 +13811,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 483, + "weight": 464, "cookies": false, "type": "", "demo": "functions\/list-templates.md", @@ -14003,7 +14003,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 482, + "weight": 463, "cookies": false, "type": "", "demo": "functions\/get-template.md", @@ -14063,7 +14063,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 476, + "weight": 457, "cookies": false, "type": "", "demo": "functions\/list-usage.md", @@ -14135,7 +14135,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 455, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -14195,7 +14195,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 456, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -14487,7 +14487,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 458, + "weight": 439, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -14549,7 +14549,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 463, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -14630,7 +14630,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 464, + "weight": 445, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -14725,7 +14725,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 461, + "weight": 442, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -14824,7 +14824,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 469, + "weight": 450, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -14910,7 +14910,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 466, + "weight": 447, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -15027,7 +15027,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 467, + "weight": 448, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -15125,7 +15125,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 462, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -15188,7 +15188,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 465, + "weight": 446, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -15253,7 +15253,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 468, + "weight": 449, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -15344,7 +15344,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 470, + "weight": 451, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -15416,7 +15416,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 473, + "weight": 454, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -15503,7 +15503,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 471, + "weight": 452, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -15621,7 +15621,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 472, + "weight": 453, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -15687,7 +15687,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 474, + "weight": 455, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -15759,7 +15759,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 475, + "weight": 456, "cookies": false, "type": "", "demo": "functions\/get-usage.md", @@ -15841,7 +15841,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 479, + "weight": 460, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -15901,7 +15901,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 477, + "weight": 458, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -15993,7 +15993,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 478, + "weight": 459, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -16063,7 +16063,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 480, + "weight": 461, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -16157,7 +16157,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 481, + "weight": 462, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -16229,7 +16229,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 242, + "weight": 225, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -16283,7 +16283,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 241, + "weight": 224, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -16337,7 +16337,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 69, + "weight": 68, "cookies": false, "type": "", "demo": "health\/get.md", @@ -16388,7 +16388,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 90, + "weight": 89, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -16439,7 +16439,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 72, + "weight": 71, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -16490,7 +16490,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 77, + "weight": 76, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -16552,7 +16552,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 71, + "weight": 70, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -16603,7 +16603,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 73, + "weight": 72, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -16654,7 +16654,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 79, + "weight": 78, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -16718,7 +16718,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 78, + "weight": 77, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -16782,7 +16782,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 80, + "weight": 79, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -16857,7 +16857,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 81, + "weight": 80, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -16921,7 +16921,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 91, + "weight": 90, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -17011,7 +17011,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 85, + "weight": 84, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -17075,7 +17075,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 76, + "weight": 75, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -17139,7 +17139,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 82, + "weight": 81, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -17203,7 +17203,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 83, + "weight": 82, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -17267,7 +17267,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 84, + "weight": 83, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -17331,7 +17331,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 86, + "weight": 85, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -17395,7 +17395,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 87, + "weight": 86, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -17459,7 +17459,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 75, + "weight": 74, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -17523,7 +17523,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 89, + "weight": 88, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -17574,7 +17574,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 88, + "weight": 87, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -17625,7 +17625,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 74, + "weight": 73, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -17676,7 +17676,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 61, + "weight": 60, "cookies": false, "type": "", "demo": "locale\/get.md", @@ -17730,7 +17730,7 @@ "x-appwrite": { "method": "listCodes", "group": null, - "weight": 62, + "weight": 61, "cookies": false, "type": "", "demo": "locale\/list-codes.md", @@ -17784,7 +17784,7 @@ "x-appwrite": { "method": "listContinents", "group": null, - "weight": 66, + "weight": 65, "cookies": false, "type": "", "demo": "locale\/list-continents.md", @@ -17838,7 +17838,7 @@ "x-appwrite": { "method": "listCountries", "group": null, - "weight": 63, + "weight": 62, "cookies": false, "type": "", "demo": "locale\/list-countries.md", @@ -17892,7 +17892,7 @@ "x-appwrite": { "method": "listCountriesEU", "group": null, - "weight": 64, + "weight": 63, "cookies": false, "type": "", "demo": "locale\/list-countries-eu.md", @@ -17946,7 +17946,7 @@ "x-appwrite": { "method": "listCountriesPhones", "group": null, - "weight": 65, + "weight": 64, "cookies": false, "type": "", "demo": "locale\/list-countries-phones.md", @@ -18000,7 +18000,7 @@ "x-appwrite": { "method": "listCurrencies", "group": null, - "weight": 67, + "weight": 66, "cookies": false, "type": "", "demo": "locale\/list-currencies.md", @@ -18054,7 +18054,7 @@ "x-appwrite": { "method": "listLanguages", "group": null, - "weight": 68, + "weight": 67, "cookies": false, "type": "", "demo": "locale\/list-languages.md", @@ -18108,7 +18108,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 299, + "weight": 280, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -18196,7 +18196,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 296, + "weight": 277, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -18342,7 +18342,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 303, + "weight": 284, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -18500,7 +18500,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 298, + "weight": 279, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -18677,7 +18677,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 305, + "weight": 286, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -18874,7 +18874,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 297, + "weight": 278, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -19055,7 +19055,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 304, + "weight": 285, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -19242,7 +19242,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 302, + "weight": 283, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -19296,7 +19296,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 306, + "weight": 287, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -19359,7 +19359,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 300, + "weight": 281, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -19446,7 +19446,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 301, + "weight": 282, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -19533,7 +19533,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 270, + "weight": 251, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -19621,7 +19621,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 269, + "weight": 250, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -19800,7 +19800,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 283, + "weight": 264, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -19981,7 +19981,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 268, + "weight": 249, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -20133,7 +20133,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 282, + "weight": 263, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -20286,7 +20286,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 259, + "weight": 240, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -20404,7 +20404,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 273, + "weight": 254, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -20525,7 +20525,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 263, + "weight": 244, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -20622,7 +20622,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 277, + "weight": 258, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -20722,7 +20722,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 261, + "weight": 242, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -20829,7 +20829,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 275, + "weight": 256, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -20939,7 +20939,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 260, + "weight": 241, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -21046,7 +21046,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 274, + "weight": 255, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -21156,7 +21156,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 262, + "weight": 243, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -21387,7 +21387,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 276, + "weight": 257, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -21618,7 +21618,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 264, + "weight": 245, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -21715,7 +21715,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 278, + "weight": 259, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -21815,7 +21815,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 265, + "weight": 246, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -21912,7 +21912,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 279, + "weight": 260, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -22012,7 +22012,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 266, + "weight": 247, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -22109,7 +22109,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 280, + "weight": 261, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -22209,7 +22209,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 267, + "weight": 248, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -22306,7 +22306,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 281, + "weight": 262, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -22406,7 +22406,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 272, + "weight": 253, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -22460,7 +22460,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 284, + "weight": 265, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -22523,7 +22523,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 271, + "weight": 252, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -22610,7 +22610,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 293, + "weight": 274, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -22697,7 +22697,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 286, + "weight": 267, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -22783,7 +22783,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 285, + "weight": 266, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -22867,7 +22867,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 288, + "weight": 269, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -22928,7 +22928,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 289, + "weight": 270, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -23008,7 +23008,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 290, + "weight": 271, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -23071,7 +23071,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 287, + "weight": 268, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -23158,7 +23158,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 292, + "weight": 273, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -23254,7 +23254,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 291, + "weight": 272, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -23345,7 +23345,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 294, + "weight": 275, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -23409,7 +23409,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 295, + "weight": 276, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -23485,7 +23485,7 @@ "x-appwrite": { "method": "list", "group": null, - "weight": 251, + "weight": 232, "cookies": false, "type": "", "demo": "migrations\/list.md", @@ -23571,7 +23571,7 @@ "x-appwrite": { "method": "createAppwriteMigration", "group": null, - "weight": 245, + "weight": 226, "cookies": false, "type": "", "demo": "migrations\/create-appwrite-migration.md", @@ -23680,7 +23680,7 @@ "x-appwrite": { "method": "getAppwriteReport", "group": null, - "weight": 253, + "weight": 234, "cookies": false, "type": "", "demo": "migrations\/get-appwrite-report.md", @@ -23794,7 +23794,7 @@ "x-appwrite": { "method": "createCSVExport", "group": null, - "weight": 250, + "weight": 231, "cookies": false, "type": "", "demo": "migrations\/create-csv-export.md", @@ -23909,7 +23909,7 @@ "x-appwrite": { "method": "createCSVImport", "group": null, - "weight": 249, + "weight": 230, "cookies": false, "type": "", "demo": "migrations\/create-csv-import.md", @@ -23994,7 +23994,7 @@ "x-appwrite": { "method": "createFirebaseMigration", "group": null, - "weight": 246, + "weight": 227, "cookies": false, "type": "", "demo": "migrations\/create-firebase-migration.md", @@ -24085,7 +24085,7 @@ "x-appwrite": { "method": "getFirebaseReport", "group": null, - "weight": 254, + "weight": 235, "cookies": false, "type": "", "demo": "migrations\/get-firebase-report.md", @@ -24172,7 +24172,7 @@ "x-appwrite": { "method": "createNHostMigration", "group": null, - "weight": 248, + "weight": 229, "cookies": false, "type": "", "demo": "migrations\/create-n-host-migration.md", @@ -24299,7 +24299,7 @@ "x-appwrite": { "method": "getNHostReport", "group": null, - "weight": 256, + "weight": 237, "cookies": false, "type": "", "demo": "migrations\/get-n-host-report.md", @@ -24448,7 +24448,7 @@ "x-appwrite": { "method": "createSupabaseMigration", "group": null, - "weight": 247, + "weight": 228, "cookies": false, "type": "", "demo": "migrations\/create-supabase-migration.md", @@ -24569,7 +24569,7 @@ "x-appwrite": { "method": "getSupabaseReport", "group": null, - "weight": 255, + "weight": 236, "cookies": false, "type": "", "demo": "migrations\/get-supabase-report.md", @@ -24709,7 +24709,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 252, + "weight": 233, "cookies": false, "type": "", "demo": "migrations\/get.md", @@ -24768,7 +24768,7 @@ "x-appwrite": { "method": "retry", "group": null, - "weight": 257, + "weight": 238, "cookies": false, "type": "", "demo": "migrations\/retry.md", @@ -24820,7 +24820,7 @@ "x-appwrite": { "method": "delete", "group": null, - "weight": 258, + "weight": 239, "cookies": false, "type": "", "demo": "migrations\/delete.md", @@ -24881,7 +24881,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 139, + "weight": 138, "cookies": false, "type": "", "demo": "project\/get-usage.md", @@ -24970,7 +24970,7 @@ "x-appwrite": { "method": "listVariables", "group": null, - "weight": 141, + "weight": 140, "cookies": false, "type": "", "demo": "project\/list-variables.md", @@ -25017,7 +25017,7 @@ "x-appwrite": { "method": "createVariable", "group": null, - "weight": 140, + "weight": 139, "cookies": false, "type": "", "demo": "project\/create-variable.md", @@ -25096,7 +25096,7 @@ "x-appwrite": { "method": "getVariable", "group": null, - "weight": 142, + "weight": 141, "cookies": false, "type": "", "demo": "project\/get-variable.md", @@ -25155,7 +25155,7 @@ "x-appwrite": { "method": "updateVariable", "group": null, - "weight": 143, + "weight": 142, "cookies": false, "type": "", "demo": "project\/update-variable.md", @@ -25238,7 +25238,7 @@ "x-appwrite": { "method": "deleteVariable", "group": null, - "weight": 144, + "weight": 143, "cookies": false, "type": "", "demo": "project\/delete-variable.md", @@ -25299,7 +25299,7 @@ "x-appwrite": { "method": "list", "group": "projects", - "weight": 453, + "weight": 434, "cookies": false, "type": "", "demo": "projects\/list.md", @@ -25382,7 +25382,7 @@ "x-appwrite": { "method": "create", "group": "projects", - "weight": 93, + "weight": 92, "cookies": false, "type": "", "demo": "projects\/create.md", @@ -25517,7 +25517,7 @@ "x-appwrite": { "method": "get", "group": "projects", - "weight": 94, + "weight": 93, "cookies": false, "type": "", "demo": "projects\/get.md", @@ -25576,7 +25576,7 @@ "x-appwrite": { "method": "update", "group": "projects", - "weight": 95, + "weight": 94, "cookies": false, "type": "", "demo": "projects\/update.md", @@ -25692,7 +25692,7 @@ "x-appwrite": { "method": "delete", "group": "projects", - "weight": 112, + "weight": 111, "cookies": false, "type": "", "demo": "projects\/delete.md", @@ -25753,7 +25753,7 @@ "x-appwrite": { "method": "updateApiStatus", "group": "projects", - "weight": 99, + "weight": 98, "cookies": false, "type": "", "demo": "projects\/update-api-status.md", @@ -25910,7 +25910,7 @@ "x-appwrite": { "method": "updateApiStatusAll", "group": "projects", - "weight": 100, + "weight": 99, "cookies": false, "type": "", "demo": "projects\/update-api-status-all.md", @@ -26050,7 +26050,7 @@ "x-appwrite": { "method": "updateAuthDuration", "group": "auth", - "weight": 105, + "weight": 104, "cookies": false, "type": "", "demo": "projects\/update-auth-duration.md", @@ -26130,7 +26130,7 @@ "x-appwrite": { "method": "updateAuthLimit", "group": "auth", - "weight": 104, + "weight": 103, "cookies": false, "type": "", "demo": "projects\/update-auth-limit.md", @@ -26210,7 +26210,7 @@ "x-appwrite": { "method": "updateAuthSessionsLimit", "group": "auth", - "weight": 110, + "weight": 109, "cookies": false, "type": "", "demo": "projects\/update-auth-sessions-limit.md", @@ -26290,7 +26290,7 @@ "x-appwrite": { "method": "updateMembershipsPrivacy", "group": "auth", - "weight": 103, + "weight": 102, "cookies": false, "type": "", "demo": "projects\/update-memberships-privacy.md", @@ -26382,7 +26382,7 @@ "x-appwrite": { "method": "updateMockNumbers", "group": "auth", - "weight": 111, + "weight": 110, "cookies": false, "type": "", "demo": "projects\/update-mock-numbers.md", @@ -26465,7 +26465,7 @@ "x-appwrite": { "method": "updateAuthPasswordDictionary", "group": "auth", - "weight": 108, + "weight": 107, "cookies": false, "type": "", "demo": "projects\/update-auth-password-dictionary.md", @@ -26545,7 +26545,7 @@ "x-appwrite": { "method": "updateAuthPasswordHistory", "group": "auth", - "weight": 107, + "weight": 106, "cookies": false, "type": "", "demo": "projects\/update-auth-password-history.md", @@ -26625,7 +26625,7 @@ "x-appwrite": { "method": "updatePersonalDataCheck", "group": "auth", - "weight": 109, + "weight": 108, "cookies": false, "type": "", "demo": "projects\/update-personal-data-check.md", @@ -26705,7 +26705,7 @@ "x-appwrite": { "method": "updateSessionAlerts", "group": "auth", - "weight": 102, + "weight": 101, "cookies": false, "type": "", "demo": "projects\/update-session-alerts.md", @@ -26785,7 +26785,7 @@ "x-appwrite": { "method": "updateSessionInvalidation", "group": "auth", - "weight": 138, + "weight": 137, "cookies": false, "type": "", "demo": "projects\/update-session-invalidation.md", @@ -26865,7 +26865,7 @@ "x-appwrite": { "method": "updateAuthStatus", "group": "auth", - "weight": 106, + "weight": 105, "cookies": false, "type": "", "demo": "projects\/update-auth-status.md", @@ -26966,7 +26966,7 @@ "x-appwrite": { "method": "listDevKeys", "group": "devKeys", - "weight": 451, + "weight": 432, "cookies": false, "type": "", "demo": "projects\/list-dev-keys.md", @@ -27037,7 +27037,7 @@ "x-appwrite": { "method": "createDevKey", "group": "devKeys", - "weight": 448, + "weight": 429, "cookies": false, "type": "", "demo": "projects\/create-dev-key.md", @@ -27122,7 +27122,7 @@ "x-appwrite": { "method": "getDevKey", "group": "devKeys", - "weight": 450, + "weight": 431, "cookies": false, "type": "", "demo": "projects\/get-dev-key.md", @@ -27190,7 +27190,7 @@ "x-appwrite": { "method": "updateDevKey", "group": "devKeys", - "weight": 449, + "weight": 430, "cookies": false, "type": "", "demo": "projects\/update-dev-key.md", @@ -27276,7 +27276,7 @@ "x-appwrite": { "method": "deleteDevKey", "group": "devKeys", - "weight": 452, + "weight": 433, "cookies": false, "type": "", "demo": "projects\/delete-dev-key.md", @@ -27346,7 +27346,7 @@ "x-appwrite": { "method": "createJWT", "group": "auth", - "weight": 124, + "weight": 123, "cookies": false, "type": "", "demo": "projects\/create-jwt.md", @@ -27493,7 +27493,7 @@ "x-appwrite": { "method": "listKeys", "group": "keys", - "weight": 120, + "weight": 119, "cookies": false, "type": "", "demo": "projects\/list-keys.md", @@ -27563,7 +27563,7 @@ "x-appwrite": { "method": "createKey", "group": "keys", - "weight": 119, + "weight": 118, "cookies": false, "type": "", "demo": "projects\/create-key.md", @@ -27718,7 +27718,7 @@ "x-appwrite": { "method": "getKey", "group": "keys", - "weight": 121, + "weight": 120, "cookies": false, "type": "", "demo": "projects\/get-key.md", @@ -27787,7 +27787,7 @@ "x-appwrite": { "method": "updateKey", "group": "keys", - "weight": 122, + "weight": 121, "cookies": false, "type": "", "demo": "projects\/update-key.md", @@ -27943,7 +27943,7 @@ "x-appwrite": { "method": "deleteKey", "group": "keys", - "weight": 123, + "weight": 122, "cookies": false, "type": "", "demo": "projects\/delete-key.md", @@ -28014,7 +28014,7 @@ "x-appwrite": { "method": "updateOAuth2", "group": "auth", - "weight": 101, + "weight": 100, "cookies": false, "type": "", "demo": "projects\/update-o-auth-2.md", @@ -28157,7 +28157,7 @@ "x-appwrite": { "method": "listPlatforms", "group": "platforms", - "weight": 126, + "weight": 125, "cookies": false, "type": "", "demo": "projects\/list-platforms.md", @@ -28227,7 +28227,7 @@ "x-appwrite": { "method": "createPlatform", "group": "platforms", - "weight": 125, + "weight": 124, "cookies": false, "type": "", "demo": "projects\/create-platform.md", @@ -28347,7 +28347,7 @@ "x-appwrite": { "method": "getPlatform", "group": "platforms", - "weight": 127, + "weight": 126, "cookies": false, "type": "", "demo": "projects\/get-platform.md", @@ -28416,7 +28416,7 @@ "x-appwrite": { "method": "updatePlatform", "group": "platforms", - "weight": 128, + "weight": 127, "cookies": false, "type": "", "demo": "projects\/update-platform.md", @@ -28512,7 +28512,7 @@ "x-appwrite": { "method": "deletePlatform", "group": "platforms", - "weight": 129, + "weight": 128, "cookies": false, "type": "", "demo": "projects\/delete-platform.md", @@ -28583,7 +28583,7 @@ "x-appwrite": { "method": "updateServiceStatus", "group": "projects", - "weight": 97, + "weight": 96, "cookies": false, "type": "", "demo": "projects\/update-service-status.md", @@ -28686,7 +28686,7 @@ "x-appwrite": { "method": "updateServiceStatusAll", "group": "projects", - "weight": 98, + "weight": 97, "cookies": false, "type": "", "demo": "projects\/update-service-status-all.md", @@ -28766,7 +28766,7 @@ "x-appwrite": { "method": "updateSmtp", "group": "templates", - "weight": 130, + "weight": 129, "cookies": false, "type": "", "demo": "projects\/update-smtp.md", @@ -28961,7 +28961,7 @@ "x-appwrite": { "method": "createSmtpTest", "group": "templates", - "weight": 131, + "weight": 130, "cookies": false, "type": "", "demo": "projects\/create-smtp-test.md", @@ -29173,7 +29173,7 @@ "x-appwrite": { "method": "updateTeam", "group": "projects", - "weight": 96, + "weight": 95, "cookies": false, "type": "", "demo": "projects\/update-team.md", @@ -29253,7 +29253,7 @@ "x-appwrite": { "method": "getEmailTemplate", "group": "templates", - "weight": 133, + "weight": 132, "cookies": false, "type": "", "demo": "projects\/get-email-template.md", @@ -29478,7 +29478,7 @@ "x-appwrite": { "method": "updateEmailTemplate", "group": "templates", - "weight": 135, + "weight": 134, "cookies": false, "type": "", "demo": "projects\/update-email-template.md", @@ -29743,7 +29743,7 @@ "x-appwrite": { "method": "deleteEmailTemplate", "group": "templates", - "weight": 137, + "weight": 136, "cookies": false, "type": "", "demo": "projects\/delete-email-template.md", @@ -29970,7 +29970,7 @@ "x-appwrite": { "method": "getSmsTemplate", "group": "templates", - "weight": 132, + "weight": 131, "cookies": false, "type": "", "demo": "projects\/get-sms-template.md", @@ -30256,7 +30256,7 @@ "x-appwrite": { "method": "updateSmsTemplate", "group": "templates", - "weight": 134, + "weight": 133, "cookies": false, "type": "", "demo": "projects\/update-sms-template.md", @@ -30565,7 +30565,7 @@ "x-appwrite": { "method": "deleteSmsTemplate", "group": "templates", - "weight": 136, + "weight": 135, "cookies": false, "type": "", "demo": "projects\/delete-sms-template.md", @@ -30853,7 +30853,7 @@ "x-appwrite": { "method": "listWebhooks", "group": "webhooks", - "weight": 114, + "weight": 113, "cookies": false, "type": "", "demo": "projects\/list-webhooks.md", @@ -30923,7 +30923,7 @@ "x-appwrite": { "method": "createWebhook", "group": "webhooks", - "weight": 113, + "weight": 112, "cookies": false, "type": "", "demo": "projects\/create-webhook.md", @@ -31039,7 +31039,7 @@ "x-appwrite": { "method": "getWebhook", "group": "webhooks", - "weight": 115, + "weight": 114, "cookies": false, "type": "", "demo": "projects\/get-webhook.md", @@ -31108,7 +31108,7 @@ "x-appwrite": { "method": "updateWebhook", "group": "webhooks", - "weight": 116, + "weight": 115, "cookies": false, "type": "", "demo": "projects\/update-webhook.md", @@ -31225,7 +31225,7 @@ "x-appwrite": { "method": "deleteWebhook", "group": "webhooks", - "weight": 118, + "weight": 117, "cookies": false, "type": "", "demo": "projects\/delete-webhook.md", @@ -31296,7 +31296,7 @@ "x-appwrite": { "method": "updateWebhookSignature", "group": "webhooks", - "weight": 117, + "weight": 116, "cookies": false, "type": "", "demo": "projects\/update-webhook-signature.md", @@ -31367,7 +31367,7 @@ "x-appwrite": { "method": "listRules", "group": null, - "weight": 519, + "weight": 510, "cookies": false, "type": "", "demo": "proxy\/list-rules.md", @@ -31452,7 +31452,7 @@ "x-appwrite": { "method": "createAPIRule", "group": null, - "weight": 514, + "weight": 505, "cookies": false, "type": "", "demo": "proxy\/create-api-rule.md", @@ -31519,7 +31519,7 @@ "x-appwrite": { "method": "createFunctionRule", "group": null, - "weight": 516, + "weight": 507, "cookies": false, "type": "", "demo": "proxy\/create-function-rule.md", @@ -31597,7 +31597,7 @@ "x-appwrite": { "method": "createRedirectRule", "group": null, - "weight": 517, + "weight": 508, "cookies": false, "type": "", "demo": "proxy\/create-redirect-rule.md", @@ -31710,7 +31710,7 @@ "x-appwrite": { "method": "createSiteRule", "group": null, - "weight": 515, + "weight": 506, "cookies": false, "type": "", "demo": "proxy\/create-site-rule.md", @@ -31788,7 +31788,7 @@ "x-appwrite": { "method": "getRule", "group": null, - "weight": 518, + "weight": 509, "cookies": false, "type": "", "demo": "proxy\/get-rule.md", @@ -31839,7 +31839,7 @@ "x-appwrite": { "method": "deleteRule", "group": null, - "weight": 520, + "weight": 511, "cookies": false, "type": "", "demo": "proxy\/delete-rule.md", @@ -31899,7 +31899,7 @@ "x-appwrite": { "method": "updateRuleVerification", "group": null, - "weight": 521, + "weight": 512, "cookies": false, "type": "", "demo": "proxy\/update-rule-verification.md", @@ -31959,7 +31959,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 486, + "weight": 467, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -32044,7 +32044,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 484, + "weight": 465, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -32297,7 +32297,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 489, + "weight": 470, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -32347,7 +32347,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 512, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -32397,7 +32397,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 508, + "weight": 489, "cookies": false, "type": "", "demo": "sites\/list-templates.md", @@ -32526,7 +32526,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 509, + "weight": 490, "cookies": false, "type": "", "demo": "sites\/get-template.md", @@ -32586,7 +32586,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 510, + "weight": 491, "cookies": false, "type": "", "demo": "sites\/list-usage.md", @@ -32658,7 +32658,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 485, + "weight": 466, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -32718,7 +32718,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 487, + "weight": 468, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -32967,7 +32967,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 488, + "weight": 469, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -33029,7 +33029,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 495, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -33110,7 +33110,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 494, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -33205,7 +33205,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 490, + "weight": 471, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -33310,7 +33310,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 498, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -33391,7 +33391,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 491, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -33508,7 +33508,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 492, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -33607,7 +33607,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 493, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -33670,7 +33670,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 496, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -33735,7 +33735,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 497, + "weight": 478, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -33826,7 +33826,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 499, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -33898,7 +33898,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 501, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -33984,7 +33984,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 500, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -34047,7 +34047,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 502, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -34119,7 +34119,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 511, + "weight": 492, "cookies": false, "type": "", "demo": "sites\/get-usage.md", @@ -34201,7 +34201,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 505, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -34261,7 +34261,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 503, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -34353,7 +34353,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 504, + "weight": 485, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -34423,7 +34423,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 506, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -34517,7 +34517,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 507, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -34589,7 +34589,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 146, + "weight": 520, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -34675,7 +34675,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 145, + "weight": 518, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -34810,7 +34810,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 147, + "weight": 519, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -34871,7 +34871,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 148, + "weight": 521, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -35003,7 +35003,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 149, + "weight": 522, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -35066,7 +35066,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 151, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -35165,7 +35165,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 150, + "weight": 523, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -35266,7 +35266,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 152, + "weight": 524, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -35340,13 +35340,13 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 157, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/update-file.md", - "rate-limit": 60, - "rate-time": 60, - "rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}", + "rate-limit": 0, + "rate-time": 3600, + "rate-key": "url:{url},ip:{ip}", "scope": "files.write", "platforms": [ "console", @@ -35371,7 +35371,7 @@ "parameters": [ { "name": "bucketId", - "description": "Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https:\/\/appwrite.io\/docs\/server\/storage#createBucket).", + "description": "Bucket unique ID.", "required": true, "schema": { "type": "string", @@ -35381,7 +35381,7 @@ }, { "name": "fileId", - "description": "File unique ID.", + "description": "File ID.", "required": true, "schema": { "type": "string", @@ -35398,13 +35398,12 @@ "properties": { "name": { "type": "string", - "description": "Name of the file", - "x-example": "", - "x-nullable": true + "description": "File name.", + "x-example": "" }, "permissions": { "type": "array", - "description": "An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", + "description": "An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", "x-example": "[\"read(\"any\")\"]", "items": { "type": "string" @@ -35433,7 +35432,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 158, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -35502,7 +35501,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 154, + "weight": 529, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -35582,7 +35581,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 153, + "weight": 528, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -35812,7 +35811,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 155, + "weight": 530, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -35899,7 +35898,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 159, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/get-usage.md", @@ -35972,7 +35971,7 @@ "x-appwrite": { "method": "getBucketUsage", "group": null, - "weight": 160, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/get-bucket-usage.md", @@ -36055,7 +36054,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 387, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -36141,7 +36140,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 383, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -36222,7 +36221,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 446, + "weight": 427, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -36292,7 +36291,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 442, + "weight": 423, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -36365,7 +36364,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 443, + "weight": 424, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -36432,7 +36431,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 444, + "weight": 425, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -36513,7 +36512,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 445, + "weight": 426, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -36582,7 +36581,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 447, + "weight": 428, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -36670,7 +36669,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 389, + "weight": 370, "cookies": false, "type": "", "demo": "tablesdb\/list-usage.md", @@ -36769,7 +36768,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 384, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -36830,7 +36829,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 385, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -36908,7 +36907,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 386, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -36971,7 +36970,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 394, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -37070,7 +37069,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 390, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -37196,7 +37195,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 391, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -37270,7 +37269,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 392, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -37375,7 +37374,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 393, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -37451,7 +37450,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 399, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -37551,7 +37550,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 400, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -37663,7 +37662,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 401, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -37780,7 +37779,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 402, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -37892,7 +37891,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 403, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -38009,7 +38008,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 404, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -38121,7 +38120,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 405, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -38238,7 +38237,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 406, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -38359,7 +38358,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 407, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -38485,7 +38484,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 408, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -38609,7 +38608,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 409, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -38738,7 +38737,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 410, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -38862,7 +38861,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 411, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -38991,7 +38990,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 412, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -39103,7 +39102,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 413, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -39220,7 +39219,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 414, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -39334,7 +39333,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 415, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -39457,7 +39456,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 416, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -39571,7 +39570,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 417, + "weight": 398, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -39694,7 +39693,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 418, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -39808,7 +39807,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 419, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -39931,7 +39930,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 420, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -40069,7 +40068,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 422, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -40192,7 +40191,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 423, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -40315,7 +40314,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 424, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -40427,7 +40426,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 425, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -40575,7 +40574,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 397, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -40651,7 +40650,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 398, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -40736,7 +40735,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 421, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -40851,7 +40850,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 429, + "weight": 410, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -40949,7 +40948,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 426, + "weight": 407, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -41089,7 +41088,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 427, + "weight": 408, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -41165,7 +41164,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 428, + "weight": 409, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -41250,7 +41249,7 @@ "x-appwrite": { "method": "listTableLogs", "group": "tables", - "weight": 395, + "weight": 376, "cookies": false, "type": "", "demo": "tablesdb\/list-table-logs.md", @@ -41337,7 +41336,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 438, + "weight": 419, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -41448,7 +41447,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 430, + "weight": 411, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -41630,7 +41629,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 435, + "weight": 416, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -41762,7 +41761,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 433, + "weight": 414, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -41866,7 +41865,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 437, + "weight": 418, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -41967,7 +41966,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 431, + "weight": 412, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -42077,7 +42076,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 434, + "weight": 415, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -42227,7 +42226,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 432, + "weight": 413, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -42338,7 +42337,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 436, + "weight": 417, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -42444,7 +42443,7 @@ "x-appwrite": { "method": "listRowLogs", "group": "logs", - "weight": 439, + "weight": 420, "cookies": false, "type": "", "demo": "tablesdb\/list-row-logs.md", @@ -42541,7 +42540,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 441, + "weight": 422, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -42667,7 +42666,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 440, + "weight": 421, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -42793,7 +42792,7 @@ "x-appwrite": { "method": "getTableUsage", "group": null, - "weight": 396, + "weight": 377, "cookies": false, "type": "", "demo": "tablesdb\/get-table-usage.md", @@ -42889,7 +42888,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 388, + "weight": 369, "cookies": false, "type": "", "demo": "tablesdb\/get-usage.md", @@ -43001,7 +43000,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 162, + "weight": 145, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -43090,7 +43089,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 161, + "weight": 144, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -43177,7 +43176,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 163, + "weight": 146, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -43241,7 +43240,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 165, + "weight": 148, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -43317,7 +43316,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 167, + "weight": 150, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -43383,7 +43382,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 174, + "weight": 157, "cookies": false, "type": "", "demo": "teams\/list-logs.md", @@ -43468,7 +43467,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 169, + "weight": 152, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -43567,7 +43566,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 168, + "weight": 151, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -43687,7 +43686,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 170, + "weight": 153, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -43761,7 +43760,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 171, + "weight": 154, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -43857,7 +43856,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 173, + "weight": 156, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -43933,7 +43932,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 172, + "weight": 155, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -44032,7 +44031,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 164, + "weight": 147, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -44094,7 +44093,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 166, + "weight": 149, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -44177,7 +44176,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 524, + "weight": 515, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -44271,7 +44270,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 522, + "weight": 513, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -44360,7 +44359,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 523, + "weight": 514, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -44420,7 +44419,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 525, + "weight": 516, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -44490,7 +44489,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 526, + "weight": 517, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -44552,7 +44551,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 184, + "weight": 167, "cookies": false, "type": "", "demo": "users\/list.md", @@ -44638,7 +44637,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 175, + "weight": 158, "cookies": false, "type": "", "demo": "users\/create.md", @@ -44730,7 +44729,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 178, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -44817,7 +44816,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 176, + "weight": 159, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -44904,7 +44903,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 192, + "weight": 175, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -44985,7 +44984,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 215, + "weight": 198, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -45048,7 +45047,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 177, + "weight": 160, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -45135,7 +45134,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 180, + "weight": 163, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -45222,7 +45221,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 181, + "weight": 164, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -45339,7 +45338,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 182, + "weight": 165, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -45444,7 +45443,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 179, + "weight": 162, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -45551,7 +45550,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 217, + "weight": 200, "cookies": false, "type": "", "demo": "users\/get-usage.md", @@ -45624,7 +45623,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 185, + "weight": 168, "cookies": false, "type": "", "demo": "users\/get.md", @@ -45678,7 +45677,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 213, + "weight": 196, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -45741,7 +45740,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 198, + "weight": 181, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -45823,7 +45822,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 216, + "weight": 199, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -45907,7 +45906,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 194, + "weight": 177, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -45992,7 +45991,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 190, + "weight": 173, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -46079,7 +46078,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 189, + "weight": 172, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -46177,7 +46176,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 203, + "weight": 186, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -46312,7 +46311,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 208, + "weight": 191, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -46448,7 +46447,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 204, + "weight": 187, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -46567,7 +46566,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 205, + "weight": 188, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -46684,7 +46683,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 207, + "weight": 190, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -46801,7 +46800,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 206, + "weight": 189, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -46920,7 +46919,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 196, + "weight": 179, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -47002,7 +47001,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 197, + "weight": 180, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -47084,7 +47083,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 199, + "weight": 182, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -47166,7 +47165,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 186, + "weight": 169, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -47227,7 +47226,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 201, + "weight": 184, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -47309,7 +47308,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 188, + "weight": 171, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -47381,7 +47380,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 209, + "weight": 192, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -47435,7 +47434,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 212, + "weight": 195, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -47491,7 +47490,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 211, + "weight": 194, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -47564,7 +47563,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 193, + "weight": 176, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -47646,7 +47645,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 191, + "weight": 174, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -47731,7 +47730,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 183, + "weight": 166, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -47842,7 +47841,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 187, + "weight": 170, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -47913,7 +47912,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 202, + "weight": 185, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -48003,7 +48002,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 214, + "weight": 197, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -48076,7 +48075,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 210, + "weight": 193, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -48160,7 +48159,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 200, + "weight": 183, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -48242,7 +48241,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 195, + "weight": 178, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -48324,7 +48323,7 @@ "x-appwrite": { "method": "createRepositoryDetection", "group": "repositories", - "weight": 221, + "weight": 204, "cookies": false, "type": "", "demo": "vcs\/create-repository-detection.md", @@ -48421,7 +48420,7 @@ "x-appwrite": { "method": "listRepositories", "group": "repositories", - "weight": 222, + "weight": 205, "cookies": false, "type": "", "demo": "vcs\/list-repositories.md", @@ -48520,7 +48519,7 @@ "x-appwrite": { "method": "createRepository", "group": "repositories", - "weight": 223, + "weight": 206, "cookies": false, "type": "", "demo": "vcs\/create-repository.md", @@ -48606,7 +48605,7 @@ "x-appwrite": { "method": "getRepository", "group": "repositories", - "weight": 224, + "weight": 207, "cookies": false, "type": "", "demo": "vcs\/get-repository.md", @@ -48677,7 +48676,7 @@ "x-appwrite": { "method": "listRepositoryBranches", "group": "repositories", - "weight": 225, + "weight": 208, "cookies": false, "type": "", "demo": "vcs\/list-repository-branches.md", @@ -48748,7 +48747,7 @@ "x-appwrite": { "method": "getRepositoryContents", "group": "repositories", - "weight": 220, + "weight": 203, "cookies": false, "type": "", "demo": "vcs\/get-repository-contents.md", @@ -48834,7 +48833,7 @@ "x-appwrite": { "method": "updateExternalDeployments", "group": "repositories", - "weight": 230, + "weight": 213, "cookies": false, "type": "", "demo": "vcs\/update-external-deployments.md", @@ -48924,7 +48923,7 @@ "x-appwrite": { "method": "listInstallations", "group": "installations", - "weight": 227, + "weight": 210, "cookies": false, "type": "", "demo": "vcs\/list-installations.md", @@ -49010,7 +49009,7 @@ "x-appwrite": { "method": "getInstallation", "group": "installations", - "weight": 228, + "weight": 211, "cookies": false, "type": "", "demo": "vcs\/get-installation.md", @@ -49062,7 +49061,7 @@ "x-appwrite": { "method": "deleteInstallation", "group": "installations", - "weight": 229, + "weight": 212, "cookies": false, "type": "", "demo": "vcs\/delete-installation.md", @@ -49163,7 +49162,7 @@ }, { "name": "console", - "description": "The Console service allows you to interact with console relevant informations." + "description": "The Console service allows you to interact with console relevant information." }, { "name": "migrations", @@ -61778,6 +61777,12 @@ "x-appwrite": { "demo": "" } + }, + "Cookie": { + "type": "apiKey", + "name": "Cookie", + "description": "The user cookie to authenticate with", + "in": "header" } } }, diff --git a/app/config/specs/open-api3-1.8.x-server.json b/app/config/specs/open-api3-1.8.x-server.json index 3c9c19bd5d..2a0081b378 100644 --- a/app/config/specs/open-api3-1.8.x-server.json +++ b/app/config/specs/open-api3-1.8.x-server.json @@ -48,7 +48,7 @@ "x-appwrite": { "method": "get", "group": "account", - "weight": 10, + "weight": 9, "cookies": false, "type": "", "demo": "account\/get.md", @@ -100,7 +100,7 @@ "x-appwrite": { "method": "create", "group": "account", - "weight": 9, + "weight": 8, "cookies": false, "type": "", "demo": "account\/create.md", @@ -190,7 +190,7 @@ "x-appwrite": { "method": "updateEmail", "group": "account", - "weight": 35, + "weight": 34, "cookies": false, "type": "", "demo": "account\/update-email.md", @@ -269,7 +269,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 48, + "weight": 47, "cookies": false, "type": "", "demo": "account\/list-identities.md", @@ -342,7 +342,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 49, + "weight": 48, "cookies": false, "type": "", "demo": "account\/delete-identity.md", @@ -408,7 +408,7 @@ "x-appwrite": { "method": "createJWT", "group": "tokens", - "weight": 30, + "weight": 29, "cookies": false, "type": "", "demo": "account\/create-jwt.md", @@ -478,7 +478,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 32, + "weight": 31, "cookies": false, "type": "", "demo": "account\/list-logs.md", @@ -558,7 +558,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 307, + "weight": 288, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -631,7 +631,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 309, + "weight": 290, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -758,7 +758,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 310, + "weight": 291, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -901,7 +901,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 311, + "weight": 292, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1028,7 +1028,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 315, + "weight": 296, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1165,7 +1165,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 316, + "weight": 297, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1306,7 +1306,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 308, + "weight": 289, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1410,7 +1410,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 314, + "weight": 295, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1512,7 +1512,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 312, + "weight": 293, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1614,7 +1614,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 313, + "weight": 294, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -1718,7 +1718,7 @@ "x-appwrite": { "method": "updateName", "group": "account", - "weight": 33, + "weight": 32, "cookies": false, "type": "", "demo": "account\/update-name.md", @@ -1791,7 +1791,7 @@ "x-appwrite": { "method": "updatePassword", "group": "account", - "weight": 34, + "weight": 33, "cookies": false, "type": "", "demo": "account\/update-password.md", @@ -1869,7 +1869,7 @@ "x-appwrite": { "method": "updatePhone", "group": "account", - "weight": 36, + "weight": 35, "cookies": false, "type": "", "demo": "account\/update-phone.md", @@ -1948,7 +1948,7 @@ "x-appwrite": { "method": "getPrefs", "group": "account", - "weight": 31, + "weight": 30, "cookies": false, "type": "", "demo": "account\/get-prefs.md", @@ -2000,7 +2000,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "account", - "weight": 37, + "weight": 36, "cookies": false, "type": "", "demo": "account\/update-prefs.md", @@ -2073,7 +2073,7 @@ "x-appwrite": { "method": "createRecovery", "group": "recovery", - "weight": 39, + "weight": 38, "cookies": false, "type": "", "demo": "account\/create-recovery.md", @@ -2153,7 +2153,7 @@ "x-appwrite": { "method": "updateRecovery", "group": "recovery", - "weight": 40, + "weight": 39, "cookies": false, "type": "", "demo": "account\/update-recovery.md", @@ -2238,7 +2238,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 12, + "weight": 11, "cookies": false, "type": "", "demo": "account\/list-sessions.md", @@ -2283,7 +2283,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 13, + "weight": 12, "cookies": false, "type": "", "demo": "account\/delete-sessions.md", @@ -2337,7 +2337,7 @@ "x-appwrite": { "method": "createAnonymousSession", "group": "sessions", - "weight": 18, + "weight": 17, "cookies": false, "type": "", "demo": "account\/create-anonymous-session.md", @@ -2391,7 +2391,7 @@ "x-appwrite": { "method": "createEmailPasswordSession", "group": "sessions", - "weight": 17, + "weight": 16, "cookies": false, "type": "", "demo": "account\/create-email-password-session.md", @@ -2470,7 +2470,7 @@ "x-appwrite": { "method": "updateMagicURLSession", "group": "sessions", - "weight": 27, + "weight": 26, "cookies": false, "type": "", "demo": "account\/update-magic-url-session.md", @@ -2553,7 +2553,7 @@ "x-appwrite": { "method": "updatePhoneSession", "group": "sessions", - "weight": 28, + "weight": 27, "cookies": false, "type": "", "demo": "account\/update-phone-session.md", @@ -2636,7 +2636,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 19, + "weight": 18, "cookies": false, "type": "", "demo": "account\/create-session.md", @@ -2715,7 +2715,7 @@ "x-appwrite": { "method": "getSession", "group": "sessions", - "weight": 14, + "weight": 13, "cookies": false, "type": "", "demo": "account\/get-session.md", @@ -2779,7 +2779,7 @@ "x-appwrite": { "method": "updateSession", "group": "sessions", - "weight": 16, + "weight": 15, "cookies": false, "type": "", "demo": "account\/update-session.md", @@ -2836,7 +2836,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 15, + "weight": 14, "cookies": false, "type": "", "demo": "account\/delete-session.md", @@ -2902,7 +2902,7 @@ "x-appwrite": { "method": "updateStatus", "group": "account", - "weight": 38, + "weight": 37, "cookies": false, "type": "", "demo": "account\/update-status.md", @@ -2956,7 +2956,7 @@ "x-appwrite": { "method": "createEmailToken", "group": "tokens", - "weight": 26, + "weight": 25, "cookies": false, "type": "", "demo": "account\/create-email-token.md", @@ -3043,7 +3043,7 @@ "x-appwrite": { "method": "createMagicURLToken", "group": "tokens", - "weight": 25, + "weight": 24, "cookies": false, "type": "", "demo": "account\/create-magic-url-token.md", @@ -3128,7 +3128,7 @@ "x-appwrite": { "method": "createOAuth2Token", "group": "tokens", - "weight": 24, + "weight": 23, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-token.md", @@ -3276,7 +3276,7 @@ "x-appwrite": { "method": "createPhoneToken", "group": "tokens", - "weight": 29, + "weight": 28, "cookies": false, "type": "", "demo": "account\/create-phone-token.md", @@ -3358,7 +3358,7 @@ "x-appwrite": { "method": "createEmailVerification", "group": "verification", - "weight": 41, + "weight": 40, "cookies": false, "type": "", "demo": "account\/create-email-verification.md", @@ -3483,7 +3483,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "verification", - "weight": 42, + "weight": 41, "cookies": false, "type": "", "demo": "account\/update-email-verification.md", @@ -3620,7 +3620,7 @@ "x-appwrite": { "method": "createPhoneVerification", "group": "verification", - "weight": 43, + "weight": 42, "cookies": false, "type": "", "demo": "account\/create-phone-verification.md", @@ -3675,7 +3675,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "verification", - "weight": 44, + "weight": 43, "cookies": false, "type": "", "demo": "account\/update-phone-verification.md", @@ -3747,7 +3747,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 51, + "weight": 50, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -3877,7 +3877,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 50, + "weight": 49, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4013,7 +4013,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 54, + "weight": 53, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4075,7 +4075,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 52, + "weight": 51, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4567,7 +4567,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 53, + "weight": 52, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4653,7 +4653,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 56, + "weight": 55, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -4749,7 +4749,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 55, + "weight": 54, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -4845,7 +4845,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 57, + "weight": 56, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5600,7 +5600,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 321, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -5721,7 +5721,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 317, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -5840,7 +5840,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 381, + "weight": 362, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -5909,7 +5909,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 377, + "weight": 358, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -5981,7 +5981,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 378, + "weight": 359, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6047,7 +6047,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 379, + "weight": 360, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6127,7 +6127,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 380, + "weight": 361, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6195,7 +6195,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 382, + "weight": 363, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6282,7 +6282,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 318, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -6378,7 +6378,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 319, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -6494,7 +6494,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 320, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -6591,7 +6591,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 329, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -6692,7 +6692,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 325, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -6820,7 +6820,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 326, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -6896,7 +6896,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 327, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7003,7 +7003,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 328, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7081,7 +7081,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 346, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7183,7 +7183,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 347, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7297,7 +7297,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 348, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -7416,7 +7416,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 349, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -7530,7 +7530,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 350, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -7649,7 +7649,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 351, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -7763,7 +7763,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 352, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -7882,7 +7882,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 353, + "weight": 334, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8005,7 +8005,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 354, + "weight": 335, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8133,7 +8133,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 355, + "weight": 336, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8259,7 +8259,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 356, + "weight": 337, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -8390,7 +8390,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 357, + "weight": 338, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -8516,7 +8516,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 358, + "weight": 339, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -8647,7 +8647,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 359, + "weight": 340, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -8761,7 +8761,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 360, + "weight": 341, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -8880,7 +8880,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 361, + "weight": 342, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -8996,7 +8996,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 362, + "weight": 343, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9121,7 +9121,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 363, + "weight": 344, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -9237,7 +9237,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 364, + "weight": 345, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -9362,7 +9362,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 365, + "weight": 346, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -9478,7 +9478,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 366, + "weight": 347, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -9603,7 +9603,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 367, + "weight": 348, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -9743,7 +9743,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 369, + "weight": 350, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -9868,7 +9868,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 370, + "weight": 351, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -9993,7 +9993,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 371, + "weight": 352, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -10107,7 +10107,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 372, + "weight": 353, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -10257,7 +10257,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 344, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -10335,7 +10335,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 345, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -10422,7 +10422,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 368, + "weight": 349, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -10539,7 +10539,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 340, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -10653,7 +10653,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 332, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -10848,7 +10848,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 337, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -10987,7 +10987,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 335, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -11093,7 +11093,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 339, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -11196,7 +11196,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 333, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -11309,7 +11309,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 336, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -11467,7 +11467,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 334, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -11581,7 +11581,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 338, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -11690,7 +11690,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 343, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -11819,7 +11819,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 342, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -11948,7 +11948,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 376, + "weight": 357, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -12048,7 +12048,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 373, + "weight": 354, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -12190,7 +12190,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 374, + "weight": 355, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -12268,7 +12268,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 375, + "weight": 356, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -12355,7 +12355,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 457, + "weight": 438, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -12441,7 +12441,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 454, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -12737,7 +12737,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 459, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -12788,7 +12788,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 460, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -12839,7 +12839,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 455, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -12900,7 +12900,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 456, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -13193,7 +13193,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 458, + "weight": 439, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -13256,7 +13256,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 463, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -13338,7 +13338,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 464, + "weight": 445, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -13434,7 +13434,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 461, + "weight": 442, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -13534,7 +13534,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 469, + "weight": 450, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -13621,7 +13621,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 466, + "weight": 447, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -13739,7 +13739,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 467, + "weight": 448, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -13838,7 +13838,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 462, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -13902,7 +13902,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 465, + "weight": 446, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -13968,7 +13968,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 468, + "weight": 449, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -14060,7 +14060,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 470, + "weight": 451, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -14133,7 +14133,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 473, + "weight": 454, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -14222,7 +14222,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 471, + "weight": 452, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -14342,7 +14342,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 472, + "weight": 453, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -14410,7 +14410,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 474, + "weight": 455, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -14483,7 +14483,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 479, + "weight": 460, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -14544,7 +14544,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 477, + "weight": 458, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -14637,7 +14637,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 478, + "weight": 459, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -14708,7 +14708,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 480, + "weight": 461, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -14803,7 +14803,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 481, + "weight": 462, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -14876,7 +14876,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 242, + "weight": 225, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -14932,7 +14932,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 241, + "weight": 224, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -14988,7 +14988,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 69, + "weight": 68, "cookies": false, "type": "", "demo": "health\/get.md", @@ -15040,7 +15040,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 90, + "weight": 89, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -15092,7 +15092,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 72, + "weight": 71, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -15144,7 +15144,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 77, + "weight": 76, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -15207,7 +15207,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 71, + "weight": 70, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -15259,7 +15259,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 73, + "weight": 72, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -15311,7 +15311,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 79, + "weight": 78, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -15376,7 +15376,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 78, + "weight": 77, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -15441,7 +15441,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 80, + "weight": 79, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -15517,7 +15517,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 81, + "weight": 80, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -15582,7 +15582,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 91, + "weight": 90, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -15673,7 +15673,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 85, + "weight": 84, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -15738,7 +15738,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 76, + "weight": 75, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -15803,7 +15803,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 82, + "weight": 81, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -15868,7 +15868,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 83, + "weight": 82, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -15933,7 +15933,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 84, + "weight": 83, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -15998,7 +15998,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 86, + "weight": 85, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -16063,7 +16063,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 87, + "weight": 86, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -16128,7 +16128,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 75, + "weight": 74, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -16193,7 +16193,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 89, + "weight": 88, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -16245,7 +16245,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 88, + "weight": 87, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -16297,7 +16297,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 74, + "weight": 73, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -16349,7 +16349,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 61, + "weight": 60, "cookies": false, "type": "", "demo": "locale\/get.md", @@ -16405,7 +16405,7 @@ "x-appwrite": { "method": "listCodes", "group": null, - "weight": 62, + "weight": 61, "cookies": false, "type": "", "demo": "locale\/list-codes.md", @@ -16461,7 +16461,7 @@ "x-appwrite": { "method": "listContinents", "group": null, - "weight": 66, + "weight": 65, "cookies": false, "type": "", "demo": "locale\/list-continents.md", @@ -16517,7 +16517,7 @@ "x-appwrite": { "method": "listCountries", "group": null, - "weight": 63, + "weight": 62, "cookies": false, "type": "", "demo": "locale\/list-countries.md", @@ -16573,7 +16573,7 @@ "x-appwrite": { "method": "listCountriesEU", "group": null, - "weight": 64, + "weight": 63, "cookies": false, "type": "", "demo": "locale\/list-countries-eu.md", @@ -16629,7 +16629,7 @@ "x-appwrite": { "method": "listCountriesPhones", "group": null, - "weight": 65, + "weight": 64, "cookies": false, "type": "", "demo": "locale\/list-countries-phones.md", @@ -16685,7 +16685,7 @@ "x-appwrite": { "method": "listCurrencies", "group": null, - "weight": 67, + "weight": 66, "cookies": false, "type": "", "demo": "locale\/list-currencies.md", @@ -16741,7 +16741,7 @@ "x-appwrite": { "method": "listLanguages", "group": null, - "weight": 68, + "weight": 67, "cookies": false, "type": "", "demo": "locale\/list-languages.md", @@ -16797,7 +16797,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 299, + "weight": 280, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -16886,7 +16886,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 296, + "weight": 277, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -17033,7 +17033,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 303, + "weight": 284, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -17192,7 +17192,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 298, + "weight": 279, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -17370,7 +17370,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 305, + "weight": 286, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -17568,7 +17568,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 297, + "weight": 278, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -17752,7 +17752,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 304, + "weight": 285, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -17942,7 +17942,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 302, + "weight": 283, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -17997,7 +17997,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 306, + "weight": 287, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -18061,7 +18061,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 300, + "weight": 281, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -18149,7 +18149,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 301, + "weight": 282, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -18237,7 +18237,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 270, + "weight": 251, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -18326,7 +18326,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 269, + "weight": 250, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -18508,7 +18508,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 283, + "weight": 264, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -18692,7 +18692,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 268, + "weight": 249, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -18847,7 +18847,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 282, + "weight": 263, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -19003,7 +19003,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 259, + "weight": 240, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -19122,7 +19122,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 273, + "weight": 254, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -19244,7 +19244,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 263, + "weight": 244, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -19342,7 +19342,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 277, + "weight": 258, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -19443,7 +19443,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 261, + "weight": 242, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -19551,7 +19551,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 275, + "weight": 256, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -19662,7 +19662,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 260, + "weight": 241, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -19770,7 +19770,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 274, + "weight": 255, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -19881,7 +19881,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 262, + "weight": 243, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -20115,7 +20115,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 276, + "weight": 257, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -20349,7 +20349,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 264, + "weight": 245, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -20447,7 +20447,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 278, + "weight": 259, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -20548,7 +20548,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 265, + "weight": 246, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -20646,7 +20646,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 279, + "weight": 260, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -20747,7 +20747,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 266, + "weight": 247, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -20845,7 +20845,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 280, + "weight": 261, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -20946,7 +20946,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 267, + "weight": 248, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -21044,7 +21044,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 281, + "weight": 262, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -21145,7 +21145,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 272, + "weight": 253, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -21200,7 +21200,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 284, + "weight": 265, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -21264,7 +21264,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 271, + "weight": 252, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -21352,7 +21352,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 293, + "weight": 274, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -21440,7 +21440,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 286, + "weight": 267, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -21527,7 +21527,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 285, + "weight": 266, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -21612,7 +21612,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 288, + "weight": 269, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -21674,7 +21674,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 289, + "weight": 270, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -21755,7 +21755,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 290, + "weight": 271, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -21819,7 +21819,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 287, + "weight": 268, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -21907,7 +21907,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 292, + "weight": 273, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -22004,7 +22004,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 291, + "weight": 272, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -22097,7 +22097,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 294, + "weight": 275, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -22162,7 +22162,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 295, + "weight": 276, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -22240,7 +22240,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 486, + "weight": 467, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -22326,7 +22326,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 484, + "weight": 465, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -22580,7 +22580,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 489, + "weight": 470, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -22631,7 +22631,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 512, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -22682,7 +22682,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 485, + "weight": 466, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -22743,7 +22743,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 487, + "weight": 468, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -22993,7 +22993,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 488, + "weight": 469, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -23056,7 +23056,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 495, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -23138,7 +23138,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 494, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -23234,7 +23234,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 490, + "weight": 471, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -23340,7 +23340,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 498, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -23422,7 +23422,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 491, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -23540,7 +23540,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 492, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -23640,7 +23640,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 493, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -23704,7 +23704,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 496, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -23770,7 +23770,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 497, + "weight": 478, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -23862,7 +23862,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 499, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -23935,7 +23935,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 501, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -24022,7 +24022,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 500, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -24086,7 +24086,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 502, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -24159,7 +24159,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 505, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -24220,7 +24220,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 503, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -24313,7 +24313,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 504, + "weight": 485, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -24384,7 +24384,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 506, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -24479,7 +24479,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 507, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -24552,7 +24552,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 146, + "weight": 520, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -24639,7 +24639,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 145, + "weight": 518, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -24775,7 +24775,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 147, + "weight": 519, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -24837,7 +24837,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 148, + "weight": 521, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -24970,7 +24970,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 149, + "weight": 522, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -25034,7 +25034,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 151, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -25135,7 +25135,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 150, + "weight": 523, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -25238,7 +25238,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 152, + "weight": 524, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -25314,13 +25314,13 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 157, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/update-file.md", - "rate-limit": 60, - "rate-time": 60, - "rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}", + "rate-limit": 0, + "rate-time": 3600, + "rate-key": "url:{url},ip:{ip}", "scope": "files.write", "platforms": [ "console", @@ -25347,7 +25347,7 @@ "parameters": [ { "name": "bucketId", - "description": "Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https:\/\/appwrite.io\/docs\/server\/storage#createBucket).", + "description": "Bucket unique ID.", "required": true, "schema": { "type": "string", @@ -25357,7 +25357,7 @@ }, { "name": "fileId", - "description": "File unique ID.", + "description": "File ID.", "required": true, "schema": { "type": "string", @@ -25374,13 +25374,12 @@ "properties": { "name": { "type": "string", - "description": "Name of the file", - "x-example": "", - "x-nullable": true + "description": "File name.", + "x-example": "" }, "permissions": { "type": "array", - "description": "An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", + "description": "An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", "x-example": "[\"read(\"any\")\"]", "items": { "type": "string" @@ -25409,7 +25408,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 158, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -25480,7 +25479,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 154, + "weight": 529, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -25562,7 +25561,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 153, + "weight": 528, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -25794,7 +25793,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 155, + "weight": 530, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -25883,7 +25882,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 387, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -25970,7 +25969,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 383, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -26052,7 +26051,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 446, + "weight": 427, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -26124,7 +26123,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 442, + "weight": 423, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -26199,7 +26198,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 443, + "weight": 424, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -26268,7 +26267,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 444, + "weight": 425, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -26351,7 +26350,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 445, + "weight": 426, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -26422,7 +26421,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 447, + "weight": 428, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -26512,7 +26511,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 384, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -26574,7 +26573,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 385, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -26653,7 +26652,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 386, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -26717,7 +26716,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 394, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -26817,7 +26816,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 390, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -26944,7 +26943,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 391, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -27019,7 +27018,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 392, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -27125,7 +27124,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 393, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -27202,7 +27201,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 399, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -27303,7 +27302,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 400, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -27416,7 +27415,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 401, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -27534,7 +27533,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 402, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -27647,7 +27646,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 403, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -27765,7 +27764,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 404, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -27878,7 +27877,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 405, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -27996,7 +27995,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 406, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -28118,7 +28117,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 407, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -28245,7 +28244,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 408, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -28370,7 +28369,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 409, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -28500,7 +28499,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 410, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -28625,7 +28624,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 411, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -28755,7 +28754,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 412, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -28868,7 +28867,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 413, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -28986,7 +28985,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 414, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -29101,7 +29100,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 415, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -29225,7 +29224,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 416, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -29340,7 +29339,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 417, + "weight": 398, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -29464,7 +29463,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 418, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -29579,7 +29578,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 419, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -29703,7 +29702,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 420, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -29842,7 +29841,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 422, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -29966,7 +29965,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 423, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -30090,7 +30089,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 424, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -30203,7 +30202,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 425, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -30352,7 +30351,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 397, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -30429,7 +30428,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 398, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -30515,7 +30514,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 421, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -30631,7 +30630,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 429, + "weight": 410, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -30730,7 +30729,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 426, + "weight": 407, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -30871,7 +30870,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 427, + "weight": 408, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -30948,7 +30947,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 428, + "weight": 409, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -31034,7 +31033,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 438, + "weight": 419, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -31147,7 +31146,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 430, + "weight": 411, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -31333,7 +31332,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 435, + "weight": 416, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -31467,7 +31466,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 433, + "weight": 414, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -31572,7 +31571,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 437, + "weight": 418, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -31674,7 +31673,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 431, + "weight": 412, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -31786,7 +31785,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 434, + "weight": 415, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -31939,7 +31938,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 432, + "weight": 413, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -32052,7 +32051,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 436, + "weight": 417, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -32160,7 +32159,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 441, + "weight": 422, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -32288,7 +32287,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 440, + "weight": 421, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -32416,7 +32415,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 162, + "weight": 145, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -32507,7 +32506,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 161, + "weight": 144, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -32596,7 +32595,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 163, + "weight": 146, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -32662,7 +32661,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 165, + "weight": 148, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -32740,7 +32739,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 167, + "weight": 150, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -32808,7 +32807,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 169, + "weight": 152, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -32909,7 +32908,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 168, + "weight": 151, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -33031,7 +33030,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 170, + "weight": 153, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -33107,7 +33106,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 171, + "weight": 154, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -33205,7 +33204,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 173, + "weight": 156, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -33283,7 +33282,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 172, + "weight": 155, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -33384,7 +33383,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 164, + "weight": 147, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -33448,7 +33447,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 166, + "weight": 149, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -33533,7 +33532,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 524, + "weight": 515, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -33628,7 +33627,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 522, + "weight": 513, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -33718,7 +33717,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 523, + "weight": 514, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -33779,7 +33778,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 525, + "weight": 516, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -33850,7 +33849,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 526, + "weight": 517, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -33913,7 +33912,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 184, + "weight": 167, "cookies": false, "type": "", "demo": "users\/list.md", @@ -34000,7 +33999,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 175, + "weight": 158, "cookies": false, "type": "", "demo": "users\/create.md", @@ -34093,7 +34092,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 178, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -34181,7 +34180,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 176, + "weight": 159, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -34269,7 +34268,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 192, + "weight": 175, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -34351,7 +34350,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 215, + "weight": 198, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -34415,7 +34414,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 177, + "weight": 160, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -34503,7 +34502,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 180, + "weight": 163, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -34591,7 +34590,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 181, + "weight": 164, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -34709,7 +34708,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 182, + "weight": 165, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -34815,7 +34814,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 179, + "weight": 162, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -34923,7 +34922,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 185, + "weight": 168, "cookies": false, "type": "", "demo": "users\/get.md", @@ -34978,7 +34977,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 213, + "weight": 196, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -35042,7 +35041,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 198, + "weight": 181, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -35125,7 +35124,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 216, + "weight": 199, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -35210,7 +35209,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 194, + "weight": 177, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -35296,7 +35295,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 190, + "weight": 173, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -35384,7 +35383,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 189, + "weight": 172, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -35483,7 +35482,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 203, + "weight": 186, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -35621,7 +35620,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 208, + "weight": 191, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -35760,7 +35759,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 204, + "weight": 187, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -35882,7 +35881,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 205, + "weight": 188, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -36002,7 +36001,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 207, + "weight": 190, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -36122,7 +36121,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 206, + "weight": 189, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -36244,7 +36243,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 196, + "weight": 179, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -36327,7 +36326,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 197, + "weight": 180, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -36410,7 +36409,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 199, + "weight": 182, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -36493,7 +36492,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 186, + "weight": 169, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -36555,7 +36554,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 201, + "weight": 184, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -36638,7 +36637,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 188, + "weight": 171, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -36711,7 +36710,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 209, + "weight": 192, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -36766,7 +36765,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 212, + "weight": 195, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -36823,7 +36822,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 211, + "weight": 194, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -36897,7 +36896,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 193, + "weight": 176, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -36980,7 +36979,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 191, + "weight": 174, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -37066,7 +37065,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 183, + "weight": 166, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -37178,7 +37177,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 187, + "weight": 170, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -37250,7 +37249,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 202, + "weight": 185, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -37341,7 +37340,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 214, + "weight": 197, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -37415,7 +37414,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 210, + "weight": 193, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -37500,7 +37499,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 200, + "weight": 183, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -37583,7 +37582,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 195, + "weight": 178, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -37706,7 +37705,7 @@ }, { "name": "console", - "description": "The Console service allows you to interact with console relevant informations." + "description": "The Console service allows you to interact with console relevant information." }, { "name": "migrations", diff --git a/app/config/specs/open-api3-latest-client.json b/app/config/specs/open-api3-latest-client.json index 953c76da26..052fe536c9 100644 --- a/app/config/specs/open-api3-latest-client.json +++ b/app/config/specs/open-api3-latest-client.json @@ -48,7 +48,7 @@ "x-appwrite": { "method": "get", "group": "account", - "weight": 10, + "weight": 9, "cookies": false, "type": "", "demo": "account\/get.md", @@ -99,7 +99,7 @@ "x-appwrite": { "method": "create", "group": "account", - "weight": 9, + "weight": 8, "cookies": false, "type": "", "demo": "account\/create.md", @@ -188,7 +188,7 @@ "x-appwrite": { "method": "updateEmail", "group": "account", - "weight": 35, + "weight": 34, "cookies": false, "type": "", "demo": "account\/update-email.md", @@ -266,7 +266,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 48, + "weight": 47, "cookies": false, "type": "", "demo": "account\/list-identities.md", @@ -338,7 +338,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 49, + "weight": 48, "cookies": false, "type": "", "demo": "account\/delete-identity.md", @@ -403,7 +403,7 @@ "x-appwrite": { "method": "createJWT", "group": "tokens", - "weight": 30, + "weight": 29, "cookies": false, "type": "", "demo": "account\/create-jwt.md", @@ -472,7 +472,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 32, + "weight": 31, "cookies": false, "type": "", "demo": "account\/list-logs.md", @@ -551,7 +551,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 307, + "weight": 288, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -623,7 +623,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 309, + "weight": 290, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -747,7 +747,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 310, + "weight": 291, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -887,7 +887,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 311, + "weight": 292, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1011,7 +1011,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 315, + "weight": 296, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1145,7 +1145,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 316, + "weight": 297, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1283,7 +1283,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 308, + "weight": 289, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1384,7 +1384,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 314, + "weight": 295, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1483,7 +1483,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 312, + "weight": 293, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1582,7 +1582,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 313, + "weight": 294, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -1683,7 +1683,7 @@ "x-appwrite": { "method": "updateName", "group": "account", - "weight": 33, + "weight": 32, "cookies": false, "type": "", "demo": "account\/update-name.md", @@ -1755,7 +1755,7 @@ "x-appwrite": { "method": "updatePassword", "group": "account", - "weight": 34, + "weight": 33, "cookies": false, "type": "", "demo": "account\/update-password.md", @@ -1832,7 +1832,7 @@ "x-appwrite": { "method": "updatePhone", "group": "account", - "weight": 36, + "weight": 35, "cookies": false, "type": "", "demo": "account\/update-phone.md", @@ -1910,7 +1910,7 @@ "x-appwrite": { "method": "getPrefs", "group": "account", - "weight": 31, + "weight": 30, "cookies": false, "type": "", "demo": "account\/get-prefs.md", @@ -1961,7 +1961,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "account", - "weight": 37, + "weight": 36, "cookies": false, "type": "", "demo": "account\/update-prefs.md", @@ -2033,7 +2033,7 @@ "x-appwrite": { "method": "createRecovery", "group": "recovery", - "weight": 39, + "weight": 38, "cookies": false, "type": "", "demo": "account\/create-recovery.md", @@ -2112,7 +2112,7 @@ "x-appwrite": { "method": "updateRecovery", "group": "recovery", - "weight": 40, + "weight": 39, "cookies": false, "type": "", "demo": "account\/update-recovery.md", @@ -2196,7 +2196,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 12, + "weight": 11, "cookies": false, "type": "", "demo": "account\/list-sessions.md", @@ -2240,7 +2240,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 13, + "weight": 12, "cookies": false, "type": "", "demo": "account\/delete-sessions.md", @@ -2293,7 +2293,7 @@ "x-appwrite": { "method": "createAnonymousSession", "group": "sessions", - "weight": 18, + "weight": 17, "cookies": false, "type": "", "demo": "account\/create-anonymous-session.md", @@ -2346,7 +2346,7 @@ "x-appwrite": { "method": "createEmailPasswordSession", "group": "sessions", - "weight": 17, + "weight": 16, "cookies": false, "type": "", "demo": "account\/create-email-password-session.md", @@ -2424,7 +2424,7 @@ "x-appwrite": { "method": "updateMagicURLSession", "group": "sessions", - "weight": 27, + "weight": 26, "cookies": false, "type": "", "demo": "account\/update-magic-url-session.md", @@ -2499,7 +2499,7 @@ "x-appwrite": { "method": "createOAuth2Session", "group": "sessions", - "weight": 20, + "weight": 19, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-session.md", @@ -2646,7 +2646,7 @@ "x-appwrite": { "method": "updatePhoneSession", "group": "sessions", - "weight": 28, + "weight": 27, "cookies": false, "type": "", "demo": "account\/update-phone-session.md", @@ -2728,7 +2728,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 19, + "weight": 18, "cookies": false, "type": "", "demo": "account\/create-session.md", @@ -2806,7 +2806,7 @@ "x-appwrite": { "method": "getSession", "group": "sessions", - "weight": 14, + "weight": 13, "cookies": false, "type": "", "demo": "account\/get-session.md", @@ -2869,7 +2869,7 @@ "x-appwrite": { "method": "updateSession", "group": "sessions", - "weight": 16, + "weight": 15, "cookies": false, "type": "", "demo": "account\/update-session.md", @@ -2925,7 +2925,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 15, + "weight": 14, "cookies": false, "type": "", "demo": "account\/delete-session.md", @@ -2990,7 +2990,7 @@ "x-appwrite": { "method": "updateStatus", "group": "account", - "weight": 38, + "weight": 37, "cookies": false, "type": "", "demo": "account\/update-status.md", @@ -3043,7 +3043,7 @@ "x-appwrite": { "method": "createPushTarget", "group": "pushTargets", - "weight": 45, + "weight": 44, "cookies": false, "type": "", "demo": "account\/create-push-target.md", @@ -3124,7 +3124,7 @@ "x-appwrite": { "method": "updatePushTarget", "group": "pushTargets", - "weight": 46, + "weight": 45, "cookies": false, "type": "", "demo": "account\/update-push-target.md", @@ -3197,7 +3197,7 @@ "x-appwrite": { "method": "deletePushTarget", "group": "pushTargets", - "weight": 47, + "weight": 46, "cookies": false, "type": "", "demo": "account\/delete-push-target.md", @@ -3260,7 +3260,7 @@ "x-appwrite": { "method": "createEmailToken", "group": "tokens", - "weight": 26, + "weight": 25, "cookies": false, "type": "", "demo": "account\/create-email-token.md", @@ -3346,7 +3346,7 @@ "x-appwrite": { "method": "createMagicURLToken", "group": "tokens", - "weight": 25, + "weight": 24, "cookies": false, "type": "", "demo": "account\/create-magic-url-token.md", @@ -3430,7 +3430,7 @@ "x-appwrite": { "method": "createOAuth2Token", "group": "tokens", - "weight": 24, + "weight": 23, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-token.md", @@ -3577,7 +3577,7 @@ "x-appwrite": { "method": "createPhoneToken", "group": "tokens", - "weight": 29, + "weight": 28, "cookies": false, "type": "", "demo": "account\/create-phone-token.md", @@ -3658,7 +3658,7 @@ "x-appwrite": { "method": "createEmailVerification", "group": "verification", - "weight": 41, + "weight": 40, "cookies": false, "type": "", "demo": "account\/create-email-verification.md", @@ -3780,7 +3780,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "verification", - "weight": 42, + "weight": 41, "cookies": false, "type": "", "demo": "account\/update-email-verification.md", @@ -3914,7 +3914,7 @@ "x-appwrite": { "method": "createPhoneVerification", "group": "verification", - "weight": 43, + "weight": 42, "cookies": false, "type": "", "demo": "account\/create-phone-verification.md", @@ -3968,7 +3968,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "verification", - "weight": 44, + "weight": 43, "cookies": false, "type": "", "demo": "account\/update-phone-verification.md", @@ -4039,7 +4039,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 51, + "weight": 50, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4167,7 +4167,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 50, + "weight": 49, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4301,7 +4301,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 54, + "weight": 53, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4361,7 +4361,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 52, + "weight": 51, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4851,7 +4851,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 53, + "weight": 52, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4935,7 +4935,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 56, + "weight": 55, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5029,7 +5029,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 55, + "weight": 54, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5123,7 +5123,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 57, + "weight": 56, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5876,7 +5876,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 381, + "weight": 362, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -5943,7 +5943,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 377, + "weight": 358, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6013,7 +6013,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 378, + "weight": 359, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6077,7 +6077,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 379, + "weight": 360, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6155,7 +6155,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 380, + "weight": 361, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6221,7 +6221,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 382, + "weight": 363, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6306,7 +6306,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 340, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -6418,7 +6418,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 332, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -6579,7 +6579,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 333, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -6690,7 +6690,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 336, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -6845,7 +6845,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 334, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -6957,7 +6957,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 338, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -7064,7 +7064,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 343, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -7191,7 +7191,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 342, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -7318,7 +7318,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 473, + "weight": 454, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -7405,7 +7405,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 471, + "weight": 452, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -7523,7 +7523,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 472, + "weight": 453, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -7598,7 +7598,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 242, + "weight": 225, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -7652,7 +7652,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 241, + "weight": 224, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -7706,7 +7706,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 61, + "weight": 60, "cookies": false, "type": "", "demo": "locale\/get.md", @@ -7760,7 +7760,7 @@ "x-appwrite": { "method": "listCodes", "group": null, - "weight": 62, + "weight": 61, "cookies": false, "type": "", "demo": "locale\/list-codes.md", @@ -7814,7 +7814,7 @@ "x-appwrite": { "method": "listContinents", "group": null, - "weight": 66, + "weight": 65, "cookies": false, "type": "", "demo": "locale\/list-continents.md", @@ -7868,7 +7868,7 @@ "x-appwrite": { "method": "listCountries", "group": null, - "weight": 63, + "weight": 62, "cookies": false, "type": "", "demo": "locale\/list-countries.md", @@ -7922,7 +7922,7 @@ "x-appwrite": { "method": "listCountriesEU", "group": null, - "weight": 64, + "weight": 63, "cookies": false, "type": "", "demo": "locale\/list-countries-eu.md", @@ -7976,7 +7976,7 @@ "x-appwrite": { "method": "listCountriesPhones", "group": null, - "weight": 65, + "weight": 64, "cookies": false, "type": "", "demo": "locale\/list-countries-phones.md", @@ -8030,7 +8030,7 @@ "x-appwrite": { "method": "listCurrencies", "group": null, - "weight": 67, + "weight": 66, "cookies": false, "type": "", "demo": "locale\/list-currencies.md", @@ -8084,7 +8084,7 @@ "x-appwrite": { "method": "listLanguages", "group": null, - "weight": 68, + "weight": 67, "cookies": false, "type": "", "demo": "locale\/list-languages.md", @@ -8138,7 +8138,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 291, + "weight": 272, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -8222,7 +8222,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 295, + "weight": 276, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -8298,7 +8298,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 151, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -8397,7 +8397,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 150, + "weight": 523, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -8498,7 +8498,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 152, + "weight": 524, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -8572,13 +8572,13 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 157, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/update-file.md", - "rate-limit": 60, - "rate-time": 60, - "rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}", + "rate-limit": 0, + "rate-time": 3600, + "rate-key": "url:{url},ip:{ip}", "scope": "files.write", "platforms": [ "console", @@ -8603,7 +8603,7 @@ "parameters": [ { "name": "bucketId", - "description": "Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https:\/\/appwrite.io\/docs\/server\/storage#createBucket).", + "description": "Bucket unique ID.", "required": true, "schema": { "type": "string", @@ -8613,7 +8613,7 @@ }, { "name": "fileId", - "description": "File unique ID.", + "description": "File ID.", "required": true, "schema": { "type": "string", @@ -8630,13 +8630,12 @@ "properties": { "name": { "type": "string", - "description": "Name of the file", - "x-example": "", - "x-nullable": true + "description": "File name.", + "x-example": "" }, "permissions": { "type": "array", - "description": "An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", + "description": "An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", "x-example": "[\"read(\"any\")\"]", "items": { "type": "string" @@ -8665,7 +8664,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 158, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -8734,7 +8733,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 154, + "weight": 529, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -8814,7 +8813,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 153, + "weight": 528, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -9044,7 +9043,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 155, + "weight": 530, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -9131,7 +9130,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 446, + "weight": 427, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -9201,7 +9200,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 442, + "weight": 423, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -9274,7 +9273,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 443, + "weight": 424, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -9341,7 +9340,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 444, + "weight": 425, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -9422,7 +9421,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 445, + "weight": 426, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -9491,7 +9490,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 447, + "weight": 428, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -9579,7 +9578,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 438, + "weight": 419, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -9690,7 +9689,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 430, + "weight": 411, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -9846,7 +9845,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 431, + "weight": 412, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -9956,7 +9955,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 434, + "weight": 415, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -10106,7 +10105,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 432, + "weight": 413, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -10217,7 +10216,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 436, + "weight": 417, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -10323,7 +10322,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 441, + "weight": 422, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -10449,7 +10448,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 440, + "weight": 421, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -10575,7 +10574,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 162, + "weight": 145, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -10664,7 +10663,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 161, + "weight": 144, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -10751,7 +10750,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 163, + "weight": 146, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -10815,7 +10814,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 165, + "weight": 148, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -10891,7 +10890,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 167, + "weight": 150, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -10957,7 +10956,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 169, + "weight": 152, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -11056,7 +11055,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 168, + "weight": 151, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -11176,7 +11175,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 170, + "weight": 153, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -11250,7 +11249,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 171, + "weight": 154, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -11346,7 +11345,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 173, + "weight": 156, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -11422,7 +11421,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 172, + "weight": 155, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -11522,7 +11521,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 164, + "weight": 147, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -11585,7 +11584,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 166, + "weight": 149, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -11709,7 +11708,7 @@ }, { "name": "console", - "description": "The Console service allows you to interact with console relevant informations." + "description": "The Console service allows you to interact with console relevant information." }, { "name": "migrations", diff --git a/app/config/specs/open-api3-latest-console.json b/app/config/specs/open-api3-latest-console.json index e0ab50c73a..de68c4db48 100644 --- a/app/config/specs/open-api3-latest-console.json +++ b/app/config/specs/open-api3-latest-console.json @@ -48,7 +48,7 @@ "x-appwrite": { "method": "get", "group": "account", - "weight": 10, + "weight": 9, "cookies": false, "type": "", "demo": "account\/get.md", @@ -98,7 +98,7 @@ "x-appwrite": { "method": "create", "group": "account", - "weight": 9, + "weight": 8, "cookies": false, "type": "", "demo": "account\/create.md", @@ -177,7 +177,7 @@ "x-appwrite": { "method": "delete", "group": "account", - "weight": 11, + "weight": 10, "cookies": false, "type": "", "demo": "account\/delete.md", @@ -226,7 +226,7 @@ "x-appwrite": { "method": "updateEmail", "group": "account", - "weight": 35, + "weight": 34, "cookies": false, "type": "", "demo": "account\/update-email.md", @@ -303,7 +303,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 48, + "weight": 47, "cookies": false, "type": "", "demo": "account\/list-identities.md", @@ -374,7 +374,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 49, + "weight": 48, "cookies": false, "type": "", "demo": "account\/delete-identity.md", @@ -438,7 +438,7 @@ "x-appwrite": { "method": "createJWT", "group": "tokens", - "weight": 30, + "weight": 29, "cookies": false, "type": "", "demo": "account\/create-jwt.md", @@ -506,7 +506,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 32, + "weight": 31, "cookies": false, "type": "", "demo": "account\/list-logs.md", @@ -584,7 +584,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 307, + "weight": 288, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -655,7 +655,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 309, + "weight": 290, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -778,7 +778,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 310, + "weight": 291, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -917,7 +917,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 311, + "weight": 292, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1040,7 +1040,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 315, + "weight": 296, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1173,7 +1173,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 316, + "weight": 297, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1310,7 +1310,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 308, + "weight": 289, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1410,7 +1410,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 314, + "weight": 295, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1508,7 +1508,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 312, + "weight": 293, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1606,7 +1606,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 313, + "weight": 294, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -1706,7 +1706,7 @@ "x-appwrite": { "method": "updateName", "group": "account", - "weight": 33, + "weight": 32, "cookies": false, "type": "", "demo": "account\/update-name.md", @@ -1777,7 +1777,7 @@ "x-appwrite": { "method": "updatePassword", "group": "account", - "weight": 34, + "weight": 33, "cookies": false, "type": "", "demo": "account\/update-password.md", @@ -1853,7 +1853,7 @@ "x-appwrite": { "method": "updatePhone", "group": "account", - "weight": 36, + "weight": 35, "cookies": false, "type": "", "demo": "account\/update-phone.md", @@ -1930,7 +1930,7 @@ "x-appwrite": { "method": "getPrefs", "group": "account", - "weight": 31, + "weight": 30, "cookies": false, "type": "", "demo": "account\/get-prefs.md", @@ -1980,7 +1980,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "account", - "weight": 37, + "weight": 36, "cookies": false, "type": "", "demo": "account\/update-prefs.md", @@ -2051,7 +2051,7 @@ "x-appwrite": { "method": "createRecovery", "group": "recovery", - "weight": 39, + "weight": 38, "cookies": false, "type": "", "demo": "account\/create-recovery.md", @@ -2129,7 +2129,7 @@ "x-appwrite": { "method": "updateRecovery", "group": "recovery", - "weight": 40, + "weight": 39, "cookies": false, "type": "", "demo": "account\/update-recovery.md", @@ -2212,7 +2212,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 12, + "weight": 11, "cookies": false, "type": "", "demo": "account\/list-sessions.md", @@ -2255,7 +2255,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 13, + "weight": 12, "cookies": false, "type": "", "demo": "account\/delete-sessions.md", @@ -2307,7 +2307,7 @@ "x-appwrite": { "method": "createAnonymousSession", "group": "sessions", - "weight": 18, + "weight": 17, "cookies": false, "type": "", "demo": "account\/create-anonymous-session.md", @@ -2359,7 +2359,7 @@ "x-appwrite": { "method": "createEmailPasswordSession", "group": "sessions", - "weight": 17, + "weight": 16, "cookies": false, "type": "", "demo": "account\/create-email-password-session.md", @@ -2436,7 +2436,7 @@ "x-appwrite": { "method": "updateMagicURLSession", "group": "sessions", - "weight": 27, + "weight": 26, "cookies": false, "type": "", "demo": "account\/update-magic-url-session.md", @@ -2510,7 +2510,7 @@ "x-appwrite": { "method": "createOAuth2Session", "group": "sessions", - "weight": 20, + "weight": 19, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-session.md", @@ -2656,7 +2656,7 @@ "x-appwrite": { "method": "updatePhoneSession", "group": "sessions", - "weight": 28, + "weight": 27, "cookies": false, "type": "", "demo": "account\/update-phone-session.md", @@ -2737,7 +2737,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 19, + "weight": 18, "cookies": false, "type": "", "demo": "account\/create-session.md", @@ -2814,7 +2814,7 @@ "x-appwrite": { "method": "getSession", "group": "sessions", - "weight": 14, + "weight": 13, "cookies": false, "type": "", "demo": "account\/get-session.md", @@ -2876,7 +2876,7 @@ "x-appwrite": { "method": "updateSession", "group": "sessions", - "weight": 16, + "weight": 15, "cookies": false, "type": "", "demo": "account\/update-session.md", @@ -2931,7 +2931,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 15, + "weight": 14, "cookies": false, "type": "", "demo": "account\/delete-session.md", @@ -2995,7 +2995,7 @@ "x-appwrite": { "method": "updateStatus", "group": "account", - "weight": 38, + "weight": 37, "cookies": false, "type": "", "demo": "account\/update-status.md", @@ -3047,7 +3047,7 @@ "x-appwrite": { "method": "createPushTarget", "group": "pushTargets", - "weight": 45, + "weight": 44, "cookies": false, "type": "", "demo": "account\/create-push-target.md", @@ -3127,7 +3127,7 @@ "x-appwrite": { "method": "updatePushTarget", "group": "pushTargets", - "weight": 46, + "weight": 45, "cookies": false, "type": "", "demo": "account\/update-push-target.md", @@ -3199,7 +3199,7 @@ "x-appwrite": { "method": "deletePushTarget", "group": "pushTargets", - "weight": 47, + "weight": 46, "cookies": false, "type": "", "demo": "account\/delete-push-target.md", @@ -3261,7 +3261,7 @@ "x-appwrite": { "method": "createEmailToken", "group": "tokens", - "weight": 26, + "weight": 25, "cookies": false, "type": "", "demo": "account\/create-email-token.md", @@ -3346,7 +3346,7 @@ "x-appwrite": { "method": "createMagicURLToken", "group": "tokens", - "weight": 25, + "weight": 24, "cookies": false, "type": "", "demo": "account\/create-magic-url-token.md", @@ -3429,7 +3429,7 @@ "x-appwrite": { "method": "createOAuth2Token", "group": "tokens", - "weight": 24, + "weight": 23, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-token.md", @@ -3575,7 +3575,7 @@ "x-appwrite": { "method": "createPhoneToken", "group": "tokens", - "weight": 29, + "weight": 28, "cookies": false, "type": "", "demo": "account\/create-phone-token.md", @@ -3655,7 +3655,7 @@ "x-appwrite": { "method": "createEmailVerification", "group": "verification", - "weight": 41, + "weight": 40, "cookies": false, "type": "", "demo": "account\/create-email-verification.md", @@ -3776,7 +3776,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "verification", - "weight": 42, + "weight": 41, "cookies": false, "type": "", "demo": "account\/update-email-verification.md", @@ -3909,7 +3909,7 @@ "x-appwrite": { "method": "createPhoneVerification", "group": "verification", - "weight": 43, + "weight": 42, "cookies": false, "type": "", "demo": "account\/create-phone-verification.md", @@ -3962,7 +3962,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "verification", - "weight": 44, + "weight": 43, "cookies": false, "type": "", "demo": "account\/update-phone-verification.md", @@ -4032,7 +4032,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 51, + "weight": 50, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4160,7 +4160,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 50, + "weight": 49, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4294,7 +4294,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 54, + "weight": 53, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4354,7 +4354,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 52, + "weight": 51, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4844,7 +4844,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 53, + "weight": 52, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4928,7 +4928,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 56, + "weight": 55, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5022,7 +5022,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 55, + "weight": 54, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5116,7 +5116,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 57, + "weight": 56, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5862,7 +5862,7 @@ "x-appwrite": { "method": "chat", "group": "console", - "weight": 244, + "weight": 495, "cookies": false, "type": "", "demo": "assistant\/chat.md", @@ -5923,7 +5923,7 @@ "x-appwrite": { "method": "getResource", "group": null, - "weight": 513, + "weight": 496, "cookies": false, "type": "", "demo": "console\/get-resource.md", @@ -5998,7 +5998,7 @@ "x-appwrite": { "method": "variables", "group": "console", - "weight": 243, + "weight": 494, "cookies": false, "type": "", "demo": "console\/variables.md", @@ -6047,7 +6047,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 321, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -6166,7 +6166,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 317, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -6283,7 +6283,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 381, + "weight": 362, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6350,7 +6350,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 377, + "weight": 358, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6420,7 +6420,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 378, + "weight": 359, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6484,7 +6484,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 379, + "weight": 360, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6562,7 +6562,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 380, + "weight": 361, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6628,7 +6628,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 382, + "weight": 363, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6713,7 +6713,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 324, + "weight": 305, "cookies": false, "type": "", "demo": "databases\/list-usage.md", @@ -6817,7 +6817,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 318, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -6911,7 +6911,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 319, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -7025,7 +7025,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 320, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -7120,7 +7120,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 329, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -7220,7 +7220,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 325, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -7347,7 +7347,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 326, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -7422,7 +7422,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 327, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7528,7 +7528,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 328, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7605,7 +7605,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 346, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7706,7 +7706,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 347, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7819,7 +7819,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 348, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -7937,7 +7937,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 349, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -8050,7 +8050,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 350, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -8168,7 +8168,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 351, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -8281,7 +8281,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 352, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -8399,7 +8399,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 353, + "weight": 334, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8521,7 +8521,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 354, + "weight": 335, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8648,7 +8648,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 355, + "weight": 336, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8773,7 +8773,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 356, + "weight": 337, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -8903,7 +8903,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 357, + "weight": 338, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -9028,7 +9028,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 358, + "weight": 339, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -9158,7 +9158,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 359, + "weight": 340, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -9271,7 +9271,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 360, + "weight": 341, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -9389,7 +9389,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 361, + "weight": 342, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9504,7 +9504,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 362, + "weight": 343, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9628,7 +9628,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 363, + "weight": 344, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -9743,7 +9743,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 364, + "weight": 345, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -9867,7 +9867,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 365, + "weight": 346, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -9982,7 +9982,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 366, + "weight": 347, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -10106,7 +10106,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 367, + "weight": 348, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -10245,7 +10245,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 369, + "weight": 350, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -10369,7 +10369,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 370, + "weight": 351, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -10493,7 +10493,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 371, + "weight": 352, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -10606,7 +10606,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 372, + "weight": 353, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -10755,7 +10755,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 344, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -10832,7 +10832,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 345, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -10918,7 +10918,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 368, + "weight": 349, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -11034,7 +11034,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 340, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -11146,7 +11146,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 332, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -11337,7 +11337,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 337, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -11474,7 +11474,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 335, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -11579,7 +11579,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 339, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -11681,7 +11681,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 333, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -11792,7 +11792,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 336, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -11947,7 +11947,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 334, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -12059,7 +12059,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 338, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -12166,7 +12166,7 @@ "x-appwrite": { "method": "listDocumentLogs", "group": "logs", - "weight": 341, + "weight": 322, "cookies": false, "type": "", "demo": "databases\/list-document-logs.md", @@ -12264,7 +12264,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 343, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -12391,7 +12391,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 342, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -12518,7 +12518,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 376, + "weight": 357, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -12617,7 +12617,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 373, + "weight": 354, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -12758,7 +12758,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 374, + "weight": 355, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -12835,7 +12835,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 375, + "weight": 356, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -12921,7 +12921,7 @@ "x-appwrite": { "method": "listCollectionLogs", "group": "collections", - "weight": 330, + "weight": 311, "cookies": false, "type": "", "demo": "databases\/list-collection-logs.md", @@ -13009,7 +13009,7 @@ "x-appwrite": { "method": "getCollectionUsage", "group": null, - "weight": 331, + "weight": 312, "cookies": false, "type": "", "demo": "databases\/get-collection-usage.md", @@ -13106,7 +13106,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 322, + "weight": 303, "cookies": false, "type": "", "demo": "databases\/list-logs.md", @@ -13214,7 +13214,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 323, + "weight": 304, "cookies": false, "type": "", "demo": "databases\/get-usage.md", @@ -13331,7 +13331,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 457, + "weight": 438, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -13416,7 +13416,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 454, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -13711,7 +13711,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 459, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -13761,7 +13761,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 460, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -13811,7 +13811,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 483, + "weight": 464, "cookies": false, "type": "", "demo": "functions\/list-templates.md", @@ -14003,7 +14003,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 482, + "weight": 463, "cookies": false, "type": "", "demo": "functions\/get-template.md", @@ -14063,7 +14063,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 476, + "weight": 457, "cookies": false, "type": "", "demo": "functions\/list-usage.md", @@ -14135,7 +14135,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 455, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -14195,7 +14195,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 456, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -14487,7 +14487,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 458, + "weight": 439, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -14549,7 +14549,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 463, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -14630,7 +14630,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 464, + "weight": 445, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -14725,7 +14725,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 461, + "weight": 442, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -14824,7 +14824,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 469, + "weight": 450, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -14910,7 +14910,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 466, + "weight": 447, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -15027,7 +15027,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 467, + "weight": 448, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -15125,7 +15125,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 462, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -15188,7 +15188,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 465, + "weight": 446, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -15253,7 +15253,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 468, + "weight": 449, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -15344,7 +15344,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 470, + "weight": 451, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -15416,7 +15416,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 473, + "weight": 454, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -15503,7 +15503,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 471, + "weight": 452, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -15621,7 +15621,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 472, + "weight": 453, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -15687,7 +15687,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 474, + "weight": 455, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -15759,7 +15759,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 475, + "weight": 456, "cookies": false, "type": "", "demo": "functions\/get-usage.md", @@ -15841,7 +15841,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 479, + "weight": 460, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -15901,7 +15901,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 477, + "weight": 458, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -15993,7 +15993,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 478, + "weight": 459, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -16063,7 +16063,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 480, + "weight": 461, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -16157,7 +16157,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 481, + "weight": 462, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -16229,7 +16229,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 242, + "weight": 225, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -16283,7 +16283,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 241, + "weight": 224, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -16337,7 +16337,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 69, + "weight": 68, "cookies": false, "type": "", "demo": "health\/get.md", @@ -16388,7 +16388,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 90, + "weight": 89, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -16439,7 +16439,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 72, + "weight": 71, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -16490,7 +16490,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 77, + "weight": 76, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -16552,7 +16552,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 71, + "weight": 70, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -16603,7 +16603,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 73, + "weight": 72, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -16654,7 +16654,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 79, + "weight": 78, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -16718,7 +16718,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 78, + "weight": 77, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -16782,7 +16782,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 80, + "weight": 79, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -16857,7 +16857,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 81, + "weight": 80, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -16921,7 +16921,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 91, + "weight": 90, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -17011,7 +17011,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 85, + "weight": 84, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -17075,7 +17075,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 76, + "weight": 75, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -17139,7 +17139,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 82, + "weight": 81, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -17203,7 +17203,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 83, + "weight": 82, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -17267,7 +17267,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 84, + "weight": 83, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -17331,7 +17331,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 86, + "weight": 85, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -17395,7 +17395,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 87, + "weight": 86, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -17459,7 +17459,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 75, + "weight": 74, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -17523,7 +17523,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 89, + "weight": 88, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -17574,7 +17574,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 88, + "weight": 87, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -17625,7 +17625,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 74, + "weight": 73, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -17676,7 +17676,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 61, + "weight": 60, "cookies": false, "type": "", "demo": "locale\/get.md", @@ -17730,7 +17730,7 @@ "x-appwrite": { "method": "listCodes", "group": null, - "weight": 62, + "weight": 61, "cookies": false, "type": "", "demo": "locale\/list-codes.md", @@ -17784,7 +17784,7 @@ "x-appwrite": { "method": "listContinents", "group": null, - "weight": 66, + "weight": 65, "cookies": false, "type": "", "demo": "locale\/list-continents.md", @@ -17838,7 +17838,7 @@ "x-appwrite": { "method": "listCountries", "group": null, - "weight": 63, + "weight": 62, "cookies": false, "type": "", "demo": "locale\/list-countries.md", @@ -17892,7 +17892,7 @@ "x-appwrite": { "method": "listCountriesEU", "group": null, - "weight": 64, + "weight": 63, "cookies": false, "type": "", "demo": "locale\/list-countries-eu.md", @@ -17946,7 +17946,7 @@ "x-appwrite": { "method": "listCountriesPhones", "group": null, - "weight": 65, + "weight": 64, "cookies": false, "type": "", "demo": "locale\/list-countries-phones.md", @@ -18000,7 +18000,7 @@ "x-appwrite": { "method": "listCurrencies", "group": null, - "weight": 67, + "weight": 66, "cookies": false, "type": "", "demo": "locale\/list-currencies.md", @@ -18054,7 +18054,7 @@ "x-appwrite": { "method": "listLanguages", "group": null, - "weight": 68, + "weight": 67, "cookies": false, "type": "", "demo": "locale\/list-languages.md", @@ -18108,7 +18108,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 299, + "weight": 280, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -18196,7 +18196,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 296, + "weight": 277, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -18342,7 +18342,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 303, + "weight": 284, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -18500,7 +18500,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 298, + "weight": 279, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -18677,7 +18677,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 305, + "weight": 286, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -18874,7 +18874,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 297, + "weight": 278, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -19055,7 +19055,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 304, + "weight": 285, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -19242,7 +19242,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 302, + "weight": 283, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -19296,7 +19296,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 306, + "weight": 287, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -19359,7 +19359,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 300, + "weight": 281, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -19446,7 +19446,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 301, + "weight": 282, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -19533,7 +19533,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 270, + "weight": 251, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -19621,7 +19621,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 269, + "weight": 250, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -19800,7 +19800,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 283, + "weight": 264, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -19981,7 +19981,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 268, + "weight": 249, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -20133,7 +20133,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 282, + "weight": 263, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -20286,7 +20286,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 259, + "weight": 240, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -20404,7 +20404,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 273, + "weight": 254, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -20525,7 +20525,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 263, + "weight": 244, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -20622,7 +20622,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 277, + "weight": 258, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -20722,7 +20722,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 261, + "weight": 242, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -20829,7 +20829,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 275, + "weight": 256, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -20939,7 +20939,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 260, + "weight": 241, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -21046,7 +21046,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 274, + "weight": 255, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -21156,7 +21156,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 262, + "weight": 243, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -21387,7 +21387,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 276, + "weight": 257, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -21618,7 +21618,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 264, + "weight": 245, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -21715,7 +21715,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 278, + "weight": 259, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -21815,7 +21815,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 265, + "weight": 246, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -21912,7 +21912,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 279, + "weight": 260, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -22012,7 +22012,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 266, + "weight": 247, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -22109,7 +22109,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 280, + "weight": 261, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -22209,7 +22209,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 267, + "weight": 248, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -22306,7 +22306,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 281, + "weight": 262, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -22406,7 +22406,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 272, + "weight": 253, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -22460,7 +22460,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 284, + "weight": 265, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -22523,7 +22523,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 271, + "weight": 252, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -22610,7 +22610,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 293, + "weight": 274, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -22697,7 +22697,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 286, + "weight": 267, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -22783,7 +22783,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 285, + "weight": 266, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -22867,7 +22867,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 288, + "weight": 269, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -22928,7 +22928,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 289, + "weight": 270, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -23008,7 +23008,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 290, + "weight": 271, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -23071,7 +23071,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 287, + "weight": 268, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -23158,7 +23158,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 292, + "weight": 273, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -23254,7 +23254,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 291, + "weight": 272, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -23345,7 +23345,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 294, + "weight": 275, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -23409,7 +23409,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 295, + "weight": 276, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -23485,7 +23485,7 @@ "x-appwrite": { "method": "list", "group": null, - "weight": 251, + "weight": 232, "cookies": false, "type": "", "demo": "migrations\/list.md", @@ -23571,7 +23571,7 @@ "x-appwrite": { "method": "createAppwriteMigration", "group": null, - "weight": 245, + "weight": 226, "cookies": false, "type": "", "demo": "migrations\/create-appwrite-migration.md", @@ -23680,7 +23680,7 @@ "x-appwrite": { "method": "getAppwriteReport", "group": null, - "weight": 253, + "weight": 234, "cookies": false, "type": "", "demo": "migrations\/get-appwrite-report.md", @@ -23794,7 +23794,7 @@ "x-appwrite": { "method": "createCSVExport", "group": null, - "weight": 250, + "weight": 231, "cookies": false, "type": "", "demo": "migrations\/create-csv-export.md", @@ -23909,7 +23909,7 @@ "x-appwrite": { "method": "createCSVImport", "group": null, - "weight": 249, + "weight": 230, "cookies": false, "type": "", "demo": "migrations\/create-csv-import.md", @@ -23994,7 +23994,7 @@ "x-appwrite": { "method": "createFirebaseMigration", "group": null, - "weight": 246, + "weight": 227, "cookies": false, "type": "", "demo": "migrations\/create-firebase-migration.md", @@ -24085,7 +24085,7 @@ "x-appwrite": { "method": "getFirebaseReport", "group": null, - "weight": 254, + "weight": 235, "cookies": false, "type": "", "demo": "migrations\/get-firebase-report.md", @@ -24172,7 +24172,7 @@ "x-appwrite": { "method": "createNHostMigration", "group": null, - "weight": 248, + "weight": 229, "cookies": false, "type": "", "demo": "migrations\/create-n-host-migration.md", @@ -24299,7 +24299,7 @@ "x-appwrite": { "method": "getNHostReport", "group": null, - "weight": 256, + "weight": 237, "cookies": false, "type": "", "demo": "migrations\/get-n-host-report.md", @@ -24448,7 +24448,7 @@ "x-appwrite": { "method": "createSupabaseMigration", "group": null, - "weight": 247, + "weight": 228, "cookies": false, "type": "", "demo": "migrations\/create-supabase-migration.md", @@ -24569,7 +24569,7 @@ "x-appwrite": { "method": "getSupabaseReport", "group": null, - "weight": 255, + "weight": 236, "cookies": false, "type": "", "demo": "migrations\/get-supabase-report.md", @@ -24709,7 +24709,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 252, + "weight": 233, "cookies": false, "type": "", "demo": "migrations\/get.md", @@ -24768,7 +24768,7 @@ "x-appwrite": { "method": "retry", "group": null, - "weight": 257, + "weight": 238, "cookies": false, "type": "", "demo": "migrations\/retry.md", @@ -24820,7 +24820,7 @@ "x-appwrite": { "method": "delete", "group": null, - "weight": 258, + "weight": 239, "cookies": false, "type": "", "demo": "migrations\/delete.md", @@ -24881,7 +24881,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 139, + "weight": 138, "cookies": false, "type": "", "demo": "project\/get-usage.md", @@ -24970,7 +24970,7 @@ "x-appwrite": { "method": "listVariables", "group": null, - "weight": 141, + "weight": 140, "cookies": false, "type": "", "demo": "project\/list-variables.md", @@ -25017,7 +25017,7 @@ "x-appwrite": { "method": "createVariable", "group": null, - "weight": 140, + "weight": 139, "cookies": false, "type": "", "demo": "project\/create-variable.md", @@ -25096,7 +25096,7 @@ "x-appwrite": { "method": "getVariable", "group": null, - "weight": 142, + "weight": 141, "cookies": false, "type": "", "demo": "project\/get-variable.md", @@ -25155,7 +25155,7 @@ "x-appwrite": { "method": "updateVariable", "group": null, - "weight": 143, + "weight": 142, "cookies": false, "type": "", "demo": "project\/update-variable.md", @@ -25238,7 +25238,7 @@ "x-appwrite": { "method": "deleteVariable", "group": null, - "weight": 144, + "weight": 143, "cookies": false, "type": "", "demo": "project\/delete-variable.md", @@ -25299,7 +25299,7 @@ "x-appwrite": { "method": "list", "group": "projects", - "weight": 453, + "weight": 434, "cookies": false, "type": "", "demo": "projects\/list.md", @@ -25382,7 +25382,7 @@ "x-appwrite": { "method": "create", "group": "projects", - "weight": 93, + "weight": 92, "cookies": false, "type": "", "demo": "projects\/create.md", @@ -25517,7 +25517,7 @@ "x-appwrite": { "method": "get", "group": "projects", - "weight": 94, + "weight": 93, "cookies": false, "type": "", "demo": "projects\/get.md", @@ -25576,7 +25576,7 @@ "x-appwrite": { "method": "update", "group": "projects", - "weight": 95, + "weight": 94, "cookies": false, "type": "", "demo": "projects\/update.md", @@ -25692,7 +25692,7 @@ "x-appwrite": { "method": "delete", "group": "projects", - "weight": 112, + "weight": 111, "cookies": false, "type": "", "demo": "projects\/delete.md", @@ -25753,7 +25753,7 @@ "x-appwrite": { "method": "updateApiStatus", "group": "projects", - "weight": 99, + "weight": 98, "cookies": false, "type": "", "demo": "projects\/update-api-status.md", @@ -25910,7 +25910,7 @@ "x-appwrite": { "method": "updateApiStatusAll", "group": "projects", - "weight": 100, + "weight": 99, "cookies": false, "type": "", "demo": "projects\/update-api-status-all.md", @@ -26050,7 +26050,7 @@ "x-appwrite": { "method": "updateAuthDuration", "group": "auth", - "weight": 105, + "weight": 104, "cookies": false, "type": "", "demo": "projects\/update-auth-duration.md", @@ -26130,7 +26130,7 @@ "x-appwrite": { "method": "updateAuthLimit", "group": "auth", - "weight": 104, + "weight": 103, "cookies": false, "type": "", "demo": "projects\/update-auth-limit.md", @@ -26210,7 +26210,7 @@ "x-appwrite": { "method": "updateAuthSessionsLimit", "group": "auth", - "weight": 110, + "weight": 109, "cookies": false, "type": "", "demo": "projects\/update-auth-sessions-limit.md", @@ -26290,7 +26290,7 @@ "x-appwrite": { "method": "updateMembershipsPrivacy", "group": "auth", - "weight": 103, + "weight": 102, "cookies": false, "type": "", "demo": "projects\/update-memberships-privacy.md", @@ -26382,7 +26382,7 @@ "x-appwrite": { "method": "updateMockNumbers", "group": "auth", - "weight": 111, + "weight": 110, "cookies": false, "type": "", "demo": "projects\/update-mock-numbers.md", @@ -26465,7 +26465,7 @@ "x-appwrite": { "method": "updateAuthPasswordDictionary", "group": "auth", - "weight": 108, + "weight": 107, "cookies": false, "type": "", "demo": "projects\/update-auth-password-dictionary.md", @@ -26545,7 +26545,7 @@ "x-appwrite": { "method": "updateAuthPasswordHistory", "group": "auth", - "weight": 107, + "weight": 106, "cookies": false, "type": "", "demo": "projects\/update-auth-password-history.md", @@ -26625,7 +26625,7 @@ "x-appwrite": { "method": "updatePersonalDataCheck", "group": "auth", - "weight": 109, + "weight": 108, "cookies": false, "type": "", "demo": "projects\/update-personal-data-check.md", @@ -26705,7 +26705,7 @@ "x-appwrite": { "method": "updateSessionAlerts", "group": "auth", - "weight": 102, + "weight": 101, "cookies": false, "type": "", "demo": "projects\/update-session-alerts.md", @@ -26785,7 +26785,7 @@ "x-appwrite": { "method": "updateSessionInvalidation", "group": "auth", - "weight": 138, + "weight": 137, "cookies": false, "type": "", "demo": "projects\/update-session-invalidation.md", @@ -26865,7 +26865,7 @@ "x-appwrite": { "method": "updateAuthStatus", "group": "auth", - "weight": 106, + "weight": 105, "cookies": false, "type": "", "demo": "projects\/update-auth-status.md", @@ -26966,7 +26966,7 @@ "x-appwrite": { "method": "listDevKeys", "group": "devKeys", - "weight": 451, + "weight": 432, "cookies": false, "type": "", "demo": "projects\/list-dev-keys.md", @@ -27037,7 +27037,7 @@ "x-appwrite": { "method": "createDevKey", "group": "devKeys", - "weight": 448, + "weight": 429, "cookies": false, "type": "", "demo": "projects\/create-dev-key.md", @@ -27122,7 +27122,7 @@ "x-appwrite": { "method": "getDevKey", "group": "devKeys", - "weight": 450, + "weight": 431, "cookies": false, "type": "", "demo": "projects\/get-dev-key.md", @@ -27190,7 +27190,7 @@ "x-appwrite": { "method": "updateDevKey", "group": "devKeys", - "weight": 449, + "weight": 430, "cookies": false, "type": "", "demo": "projects\/update-dev-key.md", @@ -27276,7 +27276,7 @@ "x-appwrite": { "method": "deleteDevKey", "group": "devKeys", - "weight": 452, + "weight": 433, "cookies": false, "type": "", "demo": "projects\/delete-dev-key.md", @@ -27346,7 +27346,7 @@ "x-appwrite": { "method": "createJWT", "group": "auth", - "weight": 124, + "weight": 123, "cookies": false, "type": "", "demo": "projects\/create-jwt.md", @@ -27493,7 +27493,7 @@ "x-appwrite": { "method": "listKeys", "group": "keys", - "weight": 120, + "weight": 119, "cookies": false, "type": "", "demo": "projects\/list-keys.md", @@ -27563,7 +27563,7 @@ "x-appwrite": { "method": "createKey", "group": "keys", - "weight": 119, + "weight": 118, "cookies": false, "type": "", "demo": "projects\/create-key.md", @@ -27718,7 +27718,7 @@ "x-appwrite": { "method": "getKey", "group": "keys", - "weight": 121, + "weight": 120, "cookies": false, "type": "", "demo": "projects\/get-key.md", @@ -27787,7 +27787,7 @@ "x-appwrite": { "method": "updateKey", "group": "keys", - "weight": 122, + "weight": 121, "cookies": false, "type": "", "demo": "projects\/update-key.md", @@ -27943,7 +27943,7 @@ "x-appwrite": { "method": "deleteKey", "group": "keys", - "weight": 123, + "weight": 122, "cookies": false, "type": "", "demo": "projects\/delete-key.md", @@ -28014,7 +28014,7 @@ "x-appwrite": { "method": "updateOAuth2", "group": "auth", - "weight": 101, + "weight": 100, "cookies": false, "type": "", "demo": "projects\/update-o-auth-2.md", @@ -28157,7 +28157,7 @@ "x-appwrite": { "method": "listPlatforms", "group": "platforms", - "weight": 126, + "weight": 125, "cookies": false, "type": "", "demo": "projects\/list-platforms.md", @@ -28227,7 +28227,7 @@ "x-appwrite": { "method": "createPlatform", "group": "platforms", - "weight": 125, + "weight": 124, "cookies": false, "type": "", "demo": "projects\/create-platform.md", @@ -28347,7 +28347,7 @@ "x-appwrite": { "method": "getPlatform", "group": "platforms", - "weight": 127, + "weight": 126, "cookies": false, "type": "", "demo": "projects\/get-platform.md", @@ -28416,7 +28416,7 @@ "x-appwrite": { "method": "updatePlatform", "group": "platforms", - "weight": 128, + "weight": 127, "cookies": false, "type": "", "demo": "projects\/update-platform.md", @@ -28512,7 +28512,7 @@ "x-appwrite": { "method": "deletePlatform", "group": "platforms", - "weight": 129, + "weight": 128, "cookies": false, "type": "", "demo": "projects\/delete-platform.md", @@ -28583,7 +28583,7 @@ "x-appwrite": { "method": "updateServiceStatus", "group": "projects", - "weight": 97, + "weight": 96, "cookies": false, "type": "", "demo": "projects\/update-service-status.md", @@ -28686,7 +28686,7 @@ "x-appwrite": { "method": "updateServiceStatusAll", "group": "projects", - "weight": 98, + "weight": 97, "cookies": false, "type": "", "demo": "projects\/update-service-status-all.md", @@ -28766,7 +28766,7 @@ "x-appwrite": { "method": "updateSmtp", "group": "templates", - "weight": 130, + "weight": 129, "cookies": false, "type": "", "demo": "projects\/update-smtp.md", @@ -28961,7 +28961,7 @@ "x-appwrite": { "method": "createSmtpTest", "group": "templates", - "weight": 131, + "weight": 130, "cookies": false, "type": "", "demo": "projects\/create-smtp-test.md", @@ -29173,7 +29173,7 @@ "x-appwrite": { "method": "updateTeam", "group": "projects", - "weight": 96, + "weight": 95, "cookies": false, "type": "", "demo": "projects\/update-team.md", @@ -29253,7 +29253,7 @@ "x-appwrite": { "method": "getEmailTemplate", "group": "templates", - "weight": 133, + "weight": 132, "cookies": false, "type": "", "demo": "projects\/get-email-template.md", @@ -29478,7 +29478,7 @@ "x-appwrite": { "method": "updateEmailTemplate", "group": "templates", - "weight": 135, + "weight": 134, "cookies": false, "type": "", "demo": "projects\/update-email-template.md", @@ -29743,7 +29743,7 @@ "x-appwrite": { "method": "deleteEmailTemplate", "group": "templates", - "weight": 137, + "weight": 136, "cookies": false, "type": "", "demo": "projects\/delete-email-template.md", @@ -29970,7 +29970,7 @@ "x-appwrite": { "method": "getSmsTemplate", "group": "templates", - "weight": 132, + "weight": 131, "cookies": false, "type": "", "demo": "projects\/get-sms-template.md", @@ -30256,7 +30256,7 @@ "x-appwrite": { "method": "updateSmsTemplate", "group": "templates", - "weight": 134, + "weight": 133, "cookies": false, "type": "", "demo": "projects\/update-sms-template.md", @@ -30565,7 +30565,7 @@ "x-appwrite": { "method": "deleteSmsTemplate", "group": "templates", - "weight": 136, + "weight": 135, "cookies": false, "type": "", "demo": "projects\/delete-sms-template.md", @@ -30853,7 +30853,7 @@ "x-appwrite": { "method": "listWebhooks", "group": "webhooks", - "weight": 114, + "weight": 113, "cookies": false, "type": "", "demo": "projects\/list-webhooks.md", @@ -30923,7 +30923,7 @@ "x-appwrite": { "method": "createWebhook", "group": "webhooks", - "weight": 113, + "weight": 112, "cookies": false, "type": "", "demo": "projects\/create-webhook.md", @@ -31039,7 +31039,7 @@ "x-appwrite": { "method": "getWebhook", "group": "webhooks", - "weight": 115, + "weight": 114, "cookies": false, "type": "", "demo": "projects\/get-webhook.md", @@ -31108,7 +31108,7 @@ "x-appwrite": { "method": "updateWebhook", "group": "webhooks", - "weight": 116, + "weight": 115, "cookies": false, "type": "", "demo": "projects\/update-webhook.md", @@ -31225,7 +31225,7 @@ "x-appwrite": { "method": "deleteWebhook", "group": "webhooks", - "weight": 118, + "weight": 117, "cookies": false, "type": "", "demo": "projects\/delete-webhook.md", @@ -31296,7 +31296,7 @@ "x-appwrite": { "method": "updateWebhookSignature", "group": "webhooks", - "weight": 117, + "weight": 116, "cookies": false, "type": "", "demo": "projects\/update-webhook-signature.md", @@ -31367,7 +31367,7 @@ "x-appwrite": { "method": "listRules", "group": null, - "weight": 519, + "weight": 510, "cookies": false, "type": "", "demo": "proxy\/list-rules.md", @@ -31452,7 +31452,7 @@ "x-appwrite": { "method": "createAPIRule", "group": null, - "weight": 514, + "weight": 505, "cookies": false, "type": "", "demo": "proxy\/create-api-rule.md", @@ -31519,7 +31519,7 @@ "x-appwrite": { "method": "createFunctionRule", "group": null, - "weight": 516, + "weight": 507, "cookies": false, "type": "", "demo": "proxy\/create-function-rule.md", @@ -31597,7 +31597,7 @@ "x-appwrite": { "method": "createRedirectRule", "group": null, - "weight": 517, + "weight": 508, "cookies": false, "type": "", "demo": "proxy\/create-redirect-rule.md", @@ -31710,7 +31710,7 @@ "x-appwrite": { "method": "createSiteRule", "group": null, - "weight": 515, + "weight": 506, "cookies": false, "type": "", "demo": "proxy\/create-site-rule.md", @@ -31788,7 +31788,7 @@ "x-appwrite": { "method": "getRule", "group": null, - "weight": 518, + "weight": 509, "cookies": false, "type": "", "demo": "proxy\/get-rule.md", @@ -31839,7 +31839,7 @@ "x-appwrite": { "method": "deleteRule", "group": null, - "weight": 520, + "weight": 511, "cookies": false, "type": "", "demo": "proxy\/delete-rule.md", @@ -31899,7 +31899,7 @@ "x-appwrite": { "method": "updateRuleVerification", "group": null, - "weight": 521, + "weight": 512, "cookies": false, "type": "", "demo": "proxy\/update-rule-verification.md", @@ -31959,7 +31959,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 486, + "weight": 467, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -32044,7 +32044,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 484, + "weight": 465, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -32297,7 +32297,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 489, + "weight": 470, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -32347,7 +32347,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 512, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -32397,7 +32397,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 508, + "weight": 489, "cookies": false, "type": "", "demo": "sites\/list-templates.md", @@ -32526,7 +32526,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 509, + "weight": 490, "cookies": false, "type": "", "demo": "sites\/get-template.md", @@ -32586,7 +32586,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 510, + "weight": 491, "cookies": false, "type": "", "demo": "sites\/list-usage.md", @@ -32658,7 +32658,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 485, + "weight": 466, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -32718,7 +32718,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 487, + "weight": 468, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -32967,7 +32967,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 488, + "weight": 469, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -33029,7 +33029,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 495, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -33110,7 +33110,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 494, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -33205,7 +33205,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 490, + "weight": 471, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -33310,7 +33310,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 498, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -33391,7 +33391,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 491, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -33508,7 +33508,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 492, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -33607,7 +33607,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 493, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -33670,7 +33670,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 496, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -33735,7 +33735,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 497, + "weight": 478, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -33826,7 +33826,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 499, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -33898,7 +33898,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 501, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -33984,7 +33984,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 500, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -34047,7 +34047,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 502, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -34119,7 +34119,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 511, + "weight": 492, "cookies": false, "type": "", "demo": "sites\/get-usage.md", @@ -34201,7 +34201,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 505, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -34261,7 +34261,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 503, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -34353,7 +34353,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 504, + "weight": 485, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -34423,7 +34423,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 506, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -34517,7 +34517,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 507, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -34589,7 +34589,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 146, + "weight": 520, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -34675,7 +34675,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 145, + "weight": 518, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -34810,7 +34810,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 147, + "weight": 519, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -34871,7 +34871,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 148, + "weight": 521, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -35003,7 +35003,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 149, + "weight": 522, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -35066,7 +35066,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 151, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -35165,7 +35165,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 150, + "weight": 523, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -35266,7 +35266,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 152, + "weight": 524, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -35340,13 +35340,13 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 157, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/update-file.md", - "rate-limit": 60, - "rate-time": 60, - "rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}", + "rate-limit": 0, + "rate-time": 3600, + "rate-key": "url:{url},ip:{ip}", "scope": "files.write", "platforms": [ "console", @@ -35371,7 +35371,7 @@ "parameters": [ { "name": "bucketId", - "description": "Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https:\/\/appwrite.io\/docs\/server\/storage#createBucket).", + "description": "Bucket unique ID.", "required": true, "schema": { "type": "string", @@ -35381,7 +35381,7 @@ }, { "name": "fileId", - "description": "File unique ID.", + "description": "File ID.", "required": true, "schema": { "type": "string", @@ -35398,13 +35398,12 @@ "properties": { "name": { "type": "string", - "description": "Name of the file", - "x-example": "", - "x-nullable": true + "description": "File name.", + "x-example": "" }, "permissions": { "type": "array", - "description": "An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", + "description": "An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", "x-example": "[\"read(\"any\")\"]", "items": { "type": "string" @@ -35433,7 +35432,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 158, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -35502,7 +35501,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 154, + "weight": 529, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -35582,7 +35581,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 153, + "weight": 528, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -35812,7 +35811,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 155, + "weight": 530, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -35899,7 +35898,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 159, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/get-usage.md", @@ -35972,7 +35971,7 @@ "x-appwrite": { "method": "getBucketUsage", "group": null, - "weight": 160, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/get-bucket-usage.md", @@ -36055,7 +36054,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 387, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -36141,7 +36140,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 383, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -36222,7 +36221,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 446, + "weight": 427, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -36292,7 +36291,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 442, + "weight": 423, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -36365,7 +36364,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 443, + "weight": 424, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -36432,7 +36431,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 444, + "weight": 425, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -36513,7 +36512,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 445, + "weight": 426, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -36582,7 +36581,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 447, + "weight": 428, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -36670,7 +36669,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 389, + "weight": 370, "cookies": false, "type": "", "demo": "tablesdb\/list-usage.md", @@ -36769,7 +36768,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 384, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -36830,7 +36829,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 385, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -36908,7 +36907,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 386, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -36971,7 +36970,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 394, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -37070,7 +37069,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 390, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -37196,7 +37195,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 391, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -37270,7 +37269,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 392, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -37375,7 +37374,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 393, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -37451,7 +37450,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 399, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -37551,7 +37550,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 400, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -37663,7 +37662,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 401, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -37780,7 +37779,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 402, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -37892,7 +37891,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 403, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -38009,7 +38008,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 404, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -38121,7 +38120,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 405, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -38238,7 +38237,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 406, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -38359,7 +38358,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 407, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -38485,7 +38484,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 408, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -38609,7 +38608,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 409, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -38738,7 +38737,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 410, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -38862,7 +38861,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 411, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -38991,7 +38990,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 412, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -39103,7 +39102,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 413, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -39220,7 +39219,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 414, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -39334,7 +39333,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 415, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -39457,7 +39456,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 416, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -39571,7 +39570,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 417, + "weight": 398, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -39694,7 +39693,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 418, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -39808,7 +39807,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 419, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -39931,7 +39930,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 420, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -40069,7 +40068,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 422, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -40192,7 +40191,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 423, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -40315,7 +40314,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 424, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -40427,7 +40426,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 425, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -40575,7 +40574,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 397, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -40651,7 +40650,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 398, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -40736,7 +40735,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 421, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -40851,7 +40850,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 429, + "weight": 410, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -40949,7 +40948,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 426, + "weight": 407, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -41089,7 +41088,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 427, + "weight": 408, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -41165,7 +41164,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 428, + "weight": 409, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -41250,7 +41249,7 @@ "x-appwrite": { "method": "listTableLogs", "group": "tables", - "weight": 395, + "weight": 376, "cookies": false, "type": "", "demo": "tablesdb\/list-table-logs.md", @@ -41337,7 +41336,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 438, + "weight": 419, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -41448,7 +41447,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 430, + "weight": 411, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -41630,7 +41629,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 435, + "weight": 416, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -41762,7 +41761,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 433, + "weight": 414, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -41866,7 +41865,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 437, + "weight": 418, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -41967,7 +41966,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 431, + "weight": 412, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -42077,7 +42076,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 434, + "weight": 415, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -42227,7 +42226,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 432, + "weight": 413, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -42338,7 +42337,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 436, + "weight": 417, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -42444,7 +42443,7 @@ "x-appwrite": { "method": "listRowLogs", "group": "logs", - "weight": 439, + "weight": 420, "cookies": false, "type": "", "demo": "tablesdb\/list-row-logs.md", @@ -42541,7 +42540,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 441, + "weight": 422, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -42667,7 +42666,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 440, + "weight": 421, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -42793,7 +42792,7 @@ "x-appwrite": { "method": "getTableUsage", "group": null, - "weight": 396, + "weight": 377, "cookies": false, "type": "", "demo": "tablesdb\/get-table-usage.md", @@ -42889,7 +42888,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 388, + "weight": 369, "cookies": false, "type": "", "demo": "tablesdb\/get-usage.md", @@ -43001,7 +43000,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 162, + "weight": 145, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -43090,7 +43089,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 161, + "weight": 144, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -43177,7 +43176,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 163, + "weight": 146, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -43241,7 +43240,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 165, + "weight": 148, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -43317,7 +43316,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 167, + "weight": 150, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -43383,7 +43382,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 174, + "weight": 157, "cookies": false, "type": "", "demo": "teams\/list-logs.md", @@ -43468,7 +43467,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 169, + "weight": 152, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -43567,7 +43566,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 168, + "weight": 151, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -43687,7 +43686,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 170, + "weight": 153, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -43761,7 +43760,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 171, + "weight": 154, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -43857,7 +43856,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 173, + "weight": 156, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -43933,7 +43932,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 172, + "weight": 155, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -44032,7 +44031,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 164, + "weight": 147, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -44094,7 +44093,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 166, + "weight": 149, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -44177,7 +44176,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 524, + "weight": 515, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -44271,7 +44270,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 522, + "weight": 513, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -44360,7 +44359,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 523, + "weight": 514, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -44420,7 +44419,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 525, + "weight": 516, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -44490,7 +44489,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 526, + "weight": 517, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -44552,7 +44551,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 184, + "weight": 167, "cookies": false, "type": "", "demo": "users\/list.md", @@ -44638,7 +44637,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 175, + "weight": 158, "cookies": false, "type": "", "demo": "users\/create.md", @@ -44730,7 +44729,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 178, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -44817,7 +44816,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 176, + "weight": 159, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -44904,7 +44903,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 192, + "weight": 175, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -44985,7 +44984,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 215, + "weight": 198, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -45048,7 +45047,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 177, + "weight": 160, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -45135,7 +45134,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 180, + "weight": 163, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -45222,7 +45221,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 181, + "weight": 164, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -45339,7 +45338,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 182, + "weight": 165, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -45444,7 +45443,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 179, + "weight": 162, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -45551,7 +45550,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 217, + "weight": 200, "cookies": false, "type": "", "demo": "users\/get-usage.md", @@ -45624,7 +45623,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 185, + "weight": 168, "cookies": false, "type": "", "demo": "users\/get.md", @@ -45678,7 +45677,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 213, + "weight": 196, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -45741,7 +45740,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 198, + "weight": 181, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -45823,7 +45822,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 216, + "weight": 199, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -45907,7 +45906,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 194, + "weight": 177, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -45992,7 +45991,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 190, + "weight": 173, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -46079,7 +46078,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 189, + "weight": 172, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -46177,7 +46176,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 203, + "weight": 186, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -46312,7 +46311,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 208, + "weight": 191, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -46448,7 +46447,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 204, + "weight": 187, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -46567,7 +46566,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 205, + "weight": 188, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -46684,7 +46683,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 207, + "weight": 190, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -46801,7 +46800,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 206, + "weight": 189, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -46920,7 +46919,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 196, + "weight": 179, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -47002,7 +47001,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 197, + "weight": 180, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -47084,7 +47083,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 199, + "weight": 182, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -47166,7 +47165,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 186, + "weight": 169, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -47227,7 +47226,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 201, + "weight": 184, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -47309,7 +47308,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 188, + "weight": 171, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -47381,7 +47380,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 209, + "weight": 192, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -47435,7 +47434,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 212, + "weight": 195, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -47491,7 +47490,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 211, + "weight": 194, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -47564,7 +47563,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 193, + "weight": 176, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -47646,7 +47645,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 191, + "weight": 174, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -47731,7 +47730,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 183, + "weight": 166, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -47842,7 +47841,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 187, + "weight": 170, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -47913,7 +47912,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 202, + "weight": 185, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -48003,7 +48002,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 214, + "weight": 197, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -48076,7 +48075,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 210, + "weight": 193, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -48160,7 +48159,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 200, + "weight": 183, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -48242,7 +48241,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 195, + "weight": 178, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -48324,7 +48323,7 @@ "x-appwrite": { "method": "createRepositoryDetection", "group": "repositories", - "weight": 221, + "weight": 204, "cookies": false, "type": "", "demo": "vcs\/create-repository-detection.md", @@ -48421,7 +48420,7 @@ "x-appwrite": { "method": "listRepositories", "group": "repositories", - "weight": 222, + "weight": 205, "cookies": false, "type": "", "demo": "vcs\/list-repositories.md", @@ -48520,7 +48519,7 @@ "x-appwrite": { "method": "createRepository", "group": "repositories", - "weight": 223, + "weight": 206, "cookies": false, "type": "", "demo": "vcs\/create-repository.md", @@ -48606,7 +48605,7 @@ "x-appwrite": { "method": "getRepository", "group": "repositories", - "weight": 224, + "weight": 207, "cookies": false, "type": "", "demo": "vcs\/get-repository.md", @@ -48677,7 +48676,7 @@ "x-appwrite": { "method": "listRepositoryBranches", "group": "repositories", - "weight": 225, + "weight": 208, "cookies": false, "type": "", "demo": "vcs\/list-repository-branches.md", @@ -48748,7 +48747,7 @@ "x-appwrite": { "method": "getRepositoryContents", "group": "repositories", - "weight": 220, + "weight": 203, "cookies": false, "type": "", "demo": "vcs\/get-repository-contents.md", @@ -48834,7 +48833,7 @@ "x-appwrite": { "method": "updateExternalDeployments", "group": "repositories", - "weight": 230, + "weight": 213, "cookies": false, "type": "", "demo": "vcs\/update-external-deployments.md", @@ -48924,7 +48923,7 @@ "x-appwrite": { "method": "listInstallations", "group": "installations", - "weight": 227, + "weight": 210, "cookies": false, "type": "", "demo": "vcs\/list-installations.md", @@ -49010,7 +49009,7 @@ "x-appwrite": { "method": "getInstallation", "group": "installations", - "weight": 228, + "weight": 211, "cookies": false, "type": "", "demo": "vcs\/get-installation.md", @@ -49062,7 +49061,7 @@ "x-appwrite": { "method": "deleteInstallation", "group": "installations", - "weight": 229, + "weight": 212, "cookies": false, "type": "", "demo": "vcs\/delete-installation.md", @@ -49163,7 +49162,7 @@ }, { "name": "console", - "description": "The Console service allows you to interact with console relevant informations." + "description": "The Console service allows you to interact with console relevant information." }, { "name": "migrations", @@ -61778,6 +61777,12 @@ "x-appwrite": { "demo": "" } + }, + "Cookie": { + "type": "apiKey", + "name": "Cookie", + "description": "The user cookie to authenticate with", + "in": "header" } } }, diff --git a/app/config/specs/open-api3-latest-server.json b/app/config/specs/open-api3-latest-server.json index 3c9c19bd5d..2a0081b378 100644 --- a/app/config/specs/open-api3-latest-server.json +++ b/app/config/specs/open-api3-latest-server.json @@ -48,7 +48,7 @@ "x-appwrite": { "method": "get", "group": "account", - "weight": 10, + "weight": 9, "cookies": false, "type": "", "demo": "account\/get.md", @@ -100,7 +100,7 @@ "x-appwrite": { "method": "create", "group": "account", - "weight": 9, + "weight": 8, "cookies": false, "type": "", "demo": "account\/create.md", @@ -190,7 +190,7 @@ "x-appwrite": { "method": "updateEmail", "group": "account", - "weight": 35, + "weight": 34, "cookies": false, "type": "", "demo": "account\/update-email.md", @@ -269,7 +269,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 48, + "weight": 47, "cookies": false, "type": "", "demo": "account\/list-identities.md", @@ -342,7 +342,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 49, + "weight": 48, "cookies": false, "type": "", "demo": "account\/delete-identity.md", @@ -408,7 +408,7 @@ "x-appwrite": { "method": "createJWT", "group": "tokens", - "weight": 30, + "weight": 29, "cookies": false, "type": "", "demo": "account\/create-jwt.md", @@ -478,7 +478,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 32, + "weight": 31, "cookies": false, "type": "", "demo": "account\/list-logs.md", @@ -558,7 +558,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 307, + "weight": 288, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -631,7 +631,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 309, + "weight": 290, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -758,7 +758,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 310, + "weight": 291, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -901,7 +901,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 311, + "weight": 292, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1028,7 +1028,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 315, + "weight": 296, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1165,7 +1165,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 316, + "weight": 297, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1306,7 +1306,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 308, + "weight": 289, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1410,7 +1410,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 314, + "weight": 295, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1512,7 +1512,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 312, + "weight": 293, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1614,7 +1614,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 313, + "weight": 294, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -1718,7 +1718,7 @@ "x-appwrite": { "method": "updateName", "group": "account", - "weight": 33, + "weight": 32, "cookies": false, "type": "", "demo": "account\/update-name.md", @@ -1791,7 +1791,7 @@ "x-appwrite": { "method": "updatePassword", "group": "account", - "weight": 34, + "weight": 33, "cookies": false, "type": "", "demo": "account\/update-password.md", @@ -1869,7 +1869,7 @@ "x-appwrite": { "method": "updatePhone", "group": "account", - "weight": 36, + "weight": 35, "cookies": false, "type": "", "demo": "account\/update-phone.md", @@ -1948,7 +1948,7 @@ "x-appwrite": { "method": "getPrefs", "group": "account", - "weight": 31, + "weight": 30, "cookies": false, "type": "", "demo": "account\/get-prefs.md", @@ -2000,7 +2000,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "account", - "weight": 37, + "weight": 36, "cookies": false, "type": "", "demo": "account\/update-prefs.md", @@ -2073,7 +2073,7 @@ "x-appwrite": { "method": "createRecovery", "group": "recovery", - "weight": 39, + "weight": 38, "cookies": false, "type": "", "demo": "account\/create-recovery.md", @@ -2153,7 +2153,7 @@ "x-appwrite": { "method": "updateRecovery", "group": "recovery", - "weight": 40, + "weight": 39, "cookies": false, "type": "", "demo": "account\/update-recovery.md", @@ -2238,7 +2238,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 12, + "weight": 11, "cookies": false, "type": "", "demo": "account\/list-sessions.md", @@ -2283,7 +2283,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 13, + "weight": 12, "cookies": false, "type": "", "demo": "account\/delete-sessions.md", @@ -2337,7 +2337,7 @@ "x-appwrite": { "method": "createAnonymousSession", "group": "sessions", - "weight": 18, + "weight": 17, "cookies": false, "type": "", "demo": "account\/create-anonymous-session.md", @@ -2391,7 +2391,7 @@ "x-appwrite": { "method": "createEmailPasswordSession", "group": "sessions", - "weight": 17, + "weight": 16, "cookies": false, "type": "", "demo": "account\/create-email-password-session.md", @@ -2470,7 +2470,7 @@ "x-appwrite": { "method": "updateMagicURLSession", "group": "sessions", - "weight": 27, + "weight": 26, "cookies": false, "type": "", "demo": "account\/update-magic-url-session.md", @@ -2553,7 +2553,7 @@ "x-appwrite": { "method": "updatePhoneSession", "group": "sessions", - "weight": 28, + "weight": 27, "cookies": false, "type": "", "demo": "account\/update-phone-session.md", @@ -2636,7 +2636,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 19, + "weight": 18, "cookies": false, "type": "", "demo": "account\/create-session.md", @@ -2715,7 +2715,7 @@ "x-appwrite": { "method": "getSession", "group": "sessions", - "weight": 14, + "weight": 13, "cookies": false, "type": "", "demo": "account\/get-session.md", @@ -2779,7 +2779,7 @@ "x-appwrite": { "method": "updateSession", "group": "sessions", - "weight": 16, + "weight": 15, "cookies": false, "type": "", "demo": "account\/update-session.md", @@ -2836,7 +2836,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 15, + "weight": 14, "cookies": false, "type": "", "demo": "account\/delete-session.md", @@ -2902,7 +2902,7 @@ "x-appwrite": { "method": "updateStatus", "group": "account", - "weight": 38, + "weight": 37, "cookies": false, "type": "", "demo": "account\/update-status.md", @@ -2956,7 +2956,7 @@ "x-appwrite": { "method": "createEmailToken", "group": "tokens", - "weight": 26, + "weight": 25, "cookies": false, "type": "", "demo": "account\/create-email-token.md", @@ -3043,7 +3043,7 @@ "x-appwrite": { "method": "createMagicURLToken", "group": "tokens", - "weight": 25, + "weight": 24, "cookies": false, "type": "", "demo": "account\/create-magic-url-token.md", @@ -3128,7 +3128,7 @@ "x-appwrite": { "method": "createOAuth2Token", "group": "tokens", - "weight": 24, + "weight": 23, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-token.md", @@ -3276,7 +3276,7 @@ "x-appwrite": { "method": "createPhoneToken", "group": "tokens", - "weight": 29, + "weight": 28, "cookies": false, "type": "", "demo": "account\/create-phone-token.md", @@ -3358,7 +3358,7 @@ "x-appwrite": { "method": "createEmailVerification", "group": "verification", - "weight": 41, + "weight": 40, "cookies": false, "type": "", "demo": "account\/create-email-verification.md", @@ -3483,7 +3483,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "verification", - "weight": 42, + "weight": 41, "cookies": false, "type": "", "demo": "account\/update-email-verification.md", @@ -3620,7 +3620,7 @@ "x-appwrite": { "method": "createPhoneVerification", "group": "verification", - "weight": 43, + "weight": 42, "cookies": false, "type": "", "demo": "account\/create-phone-verification.md", @@ -3675,7 +3675,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "verification", - "weight": 44, + "weight": 43, "cookies": false, "type": "", "demo": "account\/update-phone-verification.md", @@ -3747,7 +3747,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 51, + "weight": 50, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -3877,7 +3877,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 50, + "weight": 49, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4013,7 +4013,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 54, + "weight": 53, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4075,7 +4075,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 52, + "weight": 51, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4567,7 +4567,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 53, + "weight": 52, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4653,7 +4653,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 56, + "weight": 55, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -4749,7 +4749,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 55, + "weight": 54, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -4845,7 +4845,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 57, + "weight": 56, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5600,7 +5600,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 321, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -5721,7 +5721,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 317, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -5840,7 +5840,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 381, + "weight": 362, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -5909,7 +5909,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 377, + "weight": 358, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -5981,7 +5981,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 378, + "weight": 359, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6047,7 +6047,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 379, + "weight": 360, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6127,7 +6127,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 380, + "weight": 361, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6195,7 +6195,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 382, + "weight": 363, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6282,7 +6282,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 318, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -6378,7 +6378,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 319, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -6494,7 +6494,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 320, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -6591,7 +6591,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 329, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -6692,7 +6692,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 325, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -6820,7 +6820,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 326, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -6896,7 +6896,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 327, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7003,7 +7003,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 328, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7081,7 +7081,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 346, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7183,7 +7183,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 347, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7297,7 +7297,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 348, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -7416,7 +7416,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 349, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -7530,7 +7530,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 350, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -7649,7 +7649,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 351, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -7763,7 +7763,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 352, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -7882,7 +7882,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 353, + "weight": 334, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8005,7 +8005,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 354, + "weight": 335, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8133,7 +8133,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 355, + "weight": 336, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8259,7 +8259,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 356, + "weight": 337, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -8390,7 +8390,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 357, + "weight": 338, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -8516,7 +8516,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 358, + "weight": 339, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -8647,7 +8647,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 359, + "weight": 340, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -8761,7 +8761,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 360, + "weight": 341, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -8880,7 +8880,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 361, + "weight": 342, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -8996,7 +8996,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 362, + "weight": 343, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9121,7 +9121,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 363, + "weight": 344, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -9237,7 +9237,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 364, + "weight": 345, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -9362,7 +9362,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 365, + "weight": 346, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -9478,7 +9478,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 366, + "weight": 347, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -9603,7 +9603,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 367, + "weight": 348, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -9743,7 +9743,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 369, + "weight": 350, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -9868,7 +9868,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 370, + "weight": 351, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -9993,7 +9993,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 371, + "weight": 352, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -10107,7 +10107,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 372, + "weight": 353, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -10257,7 +10257,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 344, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -10335,7 +10335,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 345, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -10422,7 +10422,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 368, + "weight": 349, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -10539,7 +10539,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 340, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -10653,7 +10653,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 332, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -10848,7 +10848,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 337, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -10987,7 +10987,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 335, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -11093,7 +11093,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 339, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -11196,7 +11196,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 333, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -11309,7 +11309,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 336, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -11467,7 +11467,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 334, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -11581,7 +11581,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 338, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -11690,7 +11690,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 343, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -11819,7 +11819,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 342, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -11948,7 +11948,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 376, + "weight": 357, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -12048,7 +12048,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 373, + "weight": 354, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -12190,7 +12190,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 374, + "weight": 355, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -12268,7 +12268,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 375, + "weight": 356, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -12355,7 +12355,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 457, + "weight": 438, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -12441,7 +12441,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 454, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -12737,7 +12737,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 459, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -12788,7 +12788,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 460, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -12839,7 +12839,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 455, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -12900,7 +12900,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 456, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -13193,7 +13193,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 458, + "weight": 439, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -13256,7 +13256,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 463, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -13338,7 +13338,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 464, + "weight": 445, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -13434,7 +13434,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 461, + "weight": 442, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -13534,7 +13534,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 469, + "weight": 450, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -13621,7 +13621,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 466, + "weight": 447, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -13739,7 +13739,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 467, + "weight": 448, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -13838,7 +13838,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 462, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -13902,7 +13902,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 465, + "weight": 446, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -13968,7 +13968,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 468, + "weight": 449, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -14060,7 +14060,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 470, + "weight": 451, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -14133,7 +14133,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 473, + "weight": 454, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -14222,7 +14222,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 471, + "weight": 452, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -14342,7 +14342,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 472, + "weight": 453, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -14410,7 +14410,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 474, + "weight": 455, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -14483,7 +14483,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 479, + "weight": 460, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -14544,7 +14544,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 477, + "weight": 458, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -14637,7 +14637,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 478, + "weight": 459, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -14708,7 +14708,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 480, + "weight": 461, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -14803,7 +14803,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 481, + "weight": 462, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -14876,7 +14876,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 242, + "weight": 225, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -14932,7 +14932,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 241, + "weight": 224, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -14988,7 +14988,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 69, + "weight": 68, "cookies": false, "type": "", "demo": "health\/get.md", @@ -15040,7 +15040,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 90, + "weight": 89, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -15092,7 +15092,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 72, + "weight": 71, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -15144,7 +15144,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 77, + "weight": 76, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -15207,7 +15207,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 71, + "weight": 70, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -15259,7 +15259,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 73, + "weight": 72, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -15311,7 +15311,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 79, + "weight": 78, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -15376,7 +15376,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 78, + "weight": 77, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -15441,7 +15441,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 80, + "weight": 79, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -15517,7 +15517,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 81, + "weight": 80, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -15582,7 +15582,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 91, + "weight": 90, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -15673,7 +15673,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 85, + "weight": 84, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -15738,7 +15738,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 76, + "weight": 75, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -15803,7 +15803,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 82, + "weight": 81, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -15868,7 +15868,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 83, + "weight": 82, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -15933,7 +15933,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 84, + "weight": 83, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -15998,7 +15998,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 86, + "weight": 85, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -16063,7 +16063,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 87, + "weight": 86, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -16128,7 +16128,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 75, + "weight": 74, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -16193,7 +16193,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 89, + "weight": 88, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -16245,7 +16245,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 88, + "weight": 87, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -16297,7 +16297,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 74, + "weight": 73, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -16349,7 +16349,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 61, + "weight": 60, "cookies": false, "type": "", "demo": "locale\/get.md", @@ -16405,7 +16405,7 @@ "x-appwrite": { "method": "listCodes", "group": null, - "weight": 62, + "weight": 61, "cookies": false, "type": "", "demo": "locale\/list-codes.md", @@ -16461,7 +16461,7 @@ "x-appwrite": { "method": "listContinents", "group": null, - "weight": 66, + "weight": 65, "cookies": false, "type": "", "demo": "locale\/list-continents.md", @@ -16517,7 +16517,7 @@ "x-appwrite": { "method": "listCountries", "group": null, - "weight": 63, + "weight": 62, "cookies": false, "type": "", "demo": "locale\/list-countries.md", @@ -16573,7 +16573,7 @@ "x-appwrite": { "method": "listCountriesEU", "group": null, - "weight": 64, + "weight": 63, "cookies": false, "type": "", "demo": "locale\/list-countries-eu.md", @@ -16629,7 +16629,7 @@ "x-appwrite": { "method": "listCountriesPhones", "group": null, - "weight": 65, + "weight": 64, "cookies": false, "type": "", "demo": "locale\/list-countries-phones.md", @@ -16685,7 +16685,7 @@ "x-appwrite": { "method": "listCurrencies", "group": null, - "weight": 67, + "weight": 66, "cookies": false, "type": "", "demo": "locale\/list-currencies.md", @@ -16741,7 +16741,7 @@ "x-appwrite": { "method": "listLanguages", "group": null, - "weight": 68, + "weight": 67, "cookies": false, "type": "", "demo": "locale\/list-languages.md", @@ -16797,7 +16797,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 299, + "weight": 280, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -16886,7 +16886,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 296, + "weight": 277, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -17033,7 +17033,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 303, + "weight": 284, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -17192,7 +17192,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 298, + "weight": 279, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -17370,7 +17370,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 305, + "weight": 286, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -17568,7 +17568,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 297, + "weight": 278, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -17752,7 +17752,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 304, + "weight": 285, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -17942,7 +17942,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 302, + "weight": 283, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -17997,7 +17997,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 306, + "weight": 287, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -18061,7 +18061,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 300, + "weight": 281, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -18149,7 +18149,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 301, + "weight": 282, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -18237,7 +18237,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 270, + "weight": 251, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -18326,7 +18326,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 269, + "weight": 250, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -18508,7 +18508,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 283, + "weight": 264, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -18692,7 +18692,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 268, + "weight": 249, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -18847,7 +18847,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 282, + "weight": 263, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -19003,7 +19003,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 259, + "weight": 240, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -19122,7 +19122,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 273, + "weight": 254, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -19244,7 +19244,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 263, + "weight": 244, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -19342,7 +19342,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 277, + "weight": 258, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -19443,7 +19443,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 261, + "weight": 242, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -19551,7 +19551,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 275, + "weight": 256, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -19662,7 +19662,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 260, + "weight": 241, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -19770,7 +19770,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 274, + "weight": 255, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -19881,7 +19881,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 262, + "weight": 243, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -20115,7 +20115,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 276, + "weight": 257, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -20349,7 +20349,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 264, + "weight": 245, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -20447,7 +20447,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 278, + "weight": 259, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -20548,7 +20548,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 265, + "weight": 246, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -20646,7 +20646,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 279, + "weight": 260, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -20747,7 +20747,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 266, + "weight": 247, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -20845,7 +20845,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 280, + "weight": 261, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -20946,7 +20946,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 267, + "weight": 248, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -21044,7 +21044,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 281, + "weight": 262, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -21145,7 +21145,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 272, + "weight": 253, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -21200,7 +21200,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 284, + "weight": 265, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -21264,7 +21264,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 271, + "weight": 252, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -21352,7 +21352,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 293, + "weight": 274, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -21440,7 +21440,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 286, + "weight": 267, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -21527,7 +21527,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 285, + "weight": 266, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -21612,7 +21612,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 288, + "weight": 269, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -21674,7 +21674,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 289, + "weight": 270, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -21755,7 +21755,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 290, + "weight": 271, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -21819,7 +21819,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 287, + "weight": 268, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -21907,7 +21907,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 292, + "weight": 273, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -22004,7 +22004,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 291, + "weight": 272, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -22097,7 +22097,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 294, + "weight": 275, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -22162,7 +22162,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 295, + "weight": 276, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -22240,7 +22240,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 486, + "weight": 467, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -22326,7 +22326,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 484, + "weight": 465, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -22580,7 +22580,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 489, + "weight": 470, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -22631,7 +22631,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 512, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -22682,7 +22682,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 485, + "weight": 466, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -22743,7 +22743,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 487, + "weight": 468, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -22993,7 +22993,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 488, + "weight": 469, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -23056,7 +23056,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 495, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -23138,7 +23138,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 494, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -23234,7 +23234,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 490, + "weight": 471, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -23340,7 +23340,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 498, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -23422,7 +23422,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 491, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -23540,7 +23540,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 492, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -23640,7 +23640,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 493, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -23704,7 +23704,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 496, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -23770,7 +23770,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 497, + "weight": 478, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -23862,7 +23862,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 499, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -23935,7 +23935,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 501, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -24022,7 +24022,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 500, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -24086,7 +24086,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 502, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -24159,7 +24159,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 505, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -24220,7 +24220,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 503, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -24313,7 +24313,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 504, + "weight": 485, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -24384,7 +24384,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 506, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -24479,7 +24479,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 507, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -24552,7 +24552,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 146, + "weight": 520, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -24639,7 +24639,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 145, + "weight": 518, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -24775,7 +24775,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 147, + "weight": 519, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -24837,7 +24837,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 148, + "weight": 521, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -24970,7 +24970,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 149, + "weight": 522, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -25034,7 +25034,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 151, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -25135,7 +25135,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 150, + "weight": 523, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -25238,7 +25238,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 152, + "weight": 524, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -25314,13 +25314,13 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 157, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/update-file.md", - "rate-limit": 60, - "rate-time": 60, - "rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}", + "rate-limit": 0, + "rate-time": 3600, + "rate-key": "url:{url},ip:{ip}", "scope": "files.write", "platforms": [ "console", @@ -25347,7 +25347,7 @@ "parameters": [ { "name": "bucketId", - "description": "Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https:\/\/appwrite.io\/docs\/server\/storage#createBucket).", + "description": "Bucket unique ID.", "required": true, "schema": { "type": "string", @@ -25357,7 +25357,7 @@ }, { "name": "fileId", - "description": "File unique ID.", + "description": "File ID.", "required": true, "schema": { "type": "string", @@ -25374,13 +25374,12 @@ "properties": { "name": { "type": "string", - "description": "Name of the file", - "x-example": "", - "x-nullable": true + "description": "File name.", + "x-example": "" }, "permissions": { "type": "array", - "description": "An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", + "description": "An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", "x-example": "[\"read(\"any\")\"]", "items": { "type": "string" @@ -25409,7 +25408,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 158, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -25480,7 +25479,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 154, + "weight": 529, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -25562,7 +25561,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 153, + "weight": 528, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -25794,7 +25793,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 155, + "weight": 530, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -25883,7 +25882,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 387, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -25970,7 +25969,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 383, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -26052,7 +26051,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 446, + "weight": 427, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -26124,7 +26123,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 442, + "weight": 423, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -26199,7 +26198,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 443, + "weight": 424, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -26268,7 +26267,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 444, + "weight": 425, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -26351,7 +26350,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 445, + "weight": 426, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -26422,7 +26421,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 447, + "weight": 428, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -26512,7 +26511,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 384, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -26574,7 +26573,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 385, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -26653,7 +26652,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 386, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -26717,7 +26716,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 394, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -26817,7 +26816,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 390, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -26944,7 +26943,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 391, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -27019,7 +27018,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 392, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -27125,7 +27124,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 393, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -27202,7 +27201,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 399, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -27303,7 +27302,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 400, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -27416,7 +27415,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 401, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -27534,7 +27533,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 402, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -27647,7 +27646,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 403, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -27765,7 +27764,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 404, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -27878,7 +27877,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 405, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -27996,7 +27995,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 406, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -28118,7 +28117,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 407, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -28245,7 +28244,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 408, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -28370,7 +28369,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 409, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -28500,7 +28499,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 410, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -28625,7 +28624,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 411, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -28755,7 +28754,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 412, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -28868,7 +28867,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 413, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -28986,7 +28985,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 414, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -29101,7 +29100,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 415, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -29225,7 +29224,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 416, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -29340,7 +29339,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 417, + "weight": 398, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -29464,7 +29463,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 418, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -29579,7 +29578,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 419, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -29703,7 +29702,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 420, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -29842,7 +29841,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 422, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -29966,7 +29965,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 423, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -30090,7 +30089,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 424, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -30203,7 +30202,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 425, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -30352,7 +30351,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 397, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -30429,7 +30428,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 398, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -30515,7 +30514,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 421, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -30631,7 +30630,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 429, + "weight": 410, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -30730,7 +30729,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 426, + "weight": 407, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -30871,7 +30870,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 427, + "weight": 408, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -30948,7 +30947,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 428, + "weight": 409, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -31034,7 +31033,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 438, + "weight": 419, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -31147,7 +31146,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 430, + "weight": 411, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -31333,7 +31332,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 435, + "weight": 416, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -31467,7 +31466,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 433, + "weight": 414, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -31572,7 +31571,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 437, + "weight": 418, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -31674,7 +31673,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 431, + "weight": 412, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -31786,7 +31785,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 434, + "weight": 415, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -31939,7 +31938,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 432, + "weight": 413, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -32052,7 +32051,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 436, + "weight": 417, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -32160,7 +32159,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 441, + "weight": 422, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -32288,7 +32287,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 440, + "weight": 421, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -32416,7 +32415,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 162, + "weight": 145, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -32507,7 +32506,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 161, + "weight": 144, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -32596,7 +32595,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 163, + "weight": 146, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -32662,7 +32661,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 165, + "weight": 148, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -32740,7 +32739,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 167, + "weight": 150, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -32808,7 +32807,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 169, + "weight": 152, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -32909,7 +32908,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 168, + "weight": 151, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -33031,7 +33030,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 170, + "weight": 153, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -33107,7 +33106,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 171, + "weight": 154, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -33205,7 +33204,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 173, + "weight": 156, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -33283,7 +33282,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 172, + "weight": 155, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -33384,7 +33383,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 164, + "weight": 147, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -33448,7 +33447,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 166, + "weight": 149, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -33533,7 +33532,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 524, + "weight": 515, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -33628,7 +33627,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 522, + "weight": 513, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -33718,7 +33717,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 523, + "weight": 514, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -33779,7 +33778,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 525, + "weight": 516, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -33850,7 +33849,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 526, + "weight": 517, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -33913,7 +33912,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 184, + "weight": 167, "cookies": false, "type": "", "demo": "users\/list.md", @@ -34000,7 +33999,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 175, + "weight": 158, "cookies": false, "type": "", "demo": "users\/create.md", @@ -34093,7 +34092,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 178, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -34181,7 +34180,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 176, + "weight": 159, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -34269,7 +34268,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 192, + "weight": 175, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -34351,7 +34350,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 215, + "weight": 198, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -34415,7 +34414,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 177, + "weight": 160, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -34503,7 +34502,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 180, + "weight": 163, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -34591,7 +34590,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 181, + "weight": 164, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -34709,7 +34708,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 182, + "weight": 165, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -34815,7 +34814,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 179, + "weight": 162, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -34923,7 +34922,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 185, + "weight": 168, "cookies": false, "type": "", "demo": "users\/get.md", @@ -34978,7 +34977,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 213, + "weight": 196, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -35042,7 +35041,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 198, + "weight": 181, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -35125,7 +35124,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 216, + "weight": 199, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -35210,7 +35209,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 194, + "weight": 177, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -35296,7 +35295,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 190, + "weight": 173, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -35384,7 +35383,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 189, + "weight": 172, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -35483,7 +35482,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 203, + "weight": 186, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -35621,7 +35620,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 208, + "weight": 191, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -35760,7 +35759,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 204, + "weight": 187, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -35882,7 +35881,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 205, + "weight": 188, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -36002,7 +36001,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 207, + "weight": 190, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -36122,7 +36121,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 206, + "weight": 189, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -36244,7 +36243,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 196, + "weight": 179, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -36327,7 +36326,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 197, + "weight": 180, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -36410,7 +36409,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 199, + "weight": 182, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -36493,7 +36492,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 186, + "weight": 169, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -36555,7 +36554,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 201, + "weight": 184, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -36638,7 +36637,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 188, + "weight": 171, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -36711,7 +36710,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 209, + "weight": 192, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -36766,7 +36765,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 212, + "weight": 195, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -36823,7 +36822,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 211, + "weight": 194, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -36897,7 +36896,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 193, + "weight": 176, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -36980,7 +36979,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 191, + "weight": 174, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -37066,7 +37065,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 183, + "weight": 166, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -37178,7 +37177,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 187, + "weight": 170, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -37250,7 +37249,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 202, + "weight": 185, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -37341,7 +37340,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 214, + "weight": 197, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -37415,7 +37414,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 210, + "weight": 193, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -37500,7 +37499,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 200, + "weight": 183, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -37583,7 +37582,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 195, + "weight": 178, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -37706,7 +37705,7 @@ }, { "name": "console", - "description": "The Console service allows you to interact with console relevant informations." + "description": "The Console service allows you to interact with console relevant information." }, { "name": "migrations", diff --git a/app/config/specs/swagger2-1.8.x-client.json b/app/config/specs/swagger2-1.8.x-client.json index 671dfe85d8..e11d5053a4 100644 --- a/app/config/specs/swagger2-1.8.x-client.json +++ b/app/config/specs/swagger2-1.8.x-client.json @@ -94,7 +94,7 @@ "x-appwrite": { "method": "get", "group": "account", - "weight": 10, + "weight": 9, "cookies": false, "type": "", "demo": "account\/get.md", @@ -147,7 +147,7 @@ "x-appwrite": { "method": "create", "group": "account", - "weight": 9, + "weight": 8, "cookies": false, "type": "", "demo": "account\/create.md", @@ -242,7 +242,7 @@ "x-appwrite": { "method": "updateEmail", "group": "account", - "weight": 35, + "weight": 34, "cookies": false, "type": "", "demo": "account\/update-email.md", @@ -322,7 +322,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 48, + "weight": 47, "cookies": false, "type": "", "demo": "account\/list-identities.md", @@ -395,7 +395,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 49, + "weight": 48, "cookies": false, "type": "", "demo": "account\/delete-identity.md", @@ -460,7 +460,7 @@ "x-appwrite": { "method": "createJWT", "group": "tokens", - "weight": 30, + "weight": 29, "cookies": false, "type": "", "demo": "account\/create-jwt.md", @@ -530,7 +530,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 32, + "weight": 31, "cookies": false, "type": "", "demo": "account\/list-logs.md", @@ -608,7 +608,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 307, + "weight": 288, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -683,7 +683,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 309, + "weight": 290, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -807,7 +807,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 310, + "weight": 291, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -948,7 +948,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 311, + "weight": 292, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1072,7 +1072,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 315, + "weight": 296, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1209,7 +1209,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 316, + "weight": 297, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1349,7 +1349,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 308, + "weight": 289, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1450,7 +1450,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 314, + "weight": 295, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1551,7 +1551,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 312, + "weight": 293, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1652,7 +1652,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 313, + "weight": 294, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -1755,7 +1755,7 @@ "x-appwrite": { "method": "updateName", "group": "account", - "weight": 33, + "weight": 32, "cookies": false, "type": "", "demo": "account\/update-name.md", @@ -1830,7 +1830,7 @@ "x-appwrite": { "method": "updatePassword", "group": "account", - "weight": 34, + "weight": 33, "cookies": false, "type": "", "demo": "account\/update-password.md", @@ -1911,7 +1911,7 @@ "x-appwrite": { "method": "updatePhone", "group": "account", - "weight": 36, + "weight": 35, "cookies": false, "type": "", "demo": "account\/update-phone.md", @@ -1991,7 +1991,7 @@ "x-appwrite": { "method": "getPrefs", "group": "account", - "weight": 31, + "weight": 30, "cookies": false, "type": "", "demo": "account\/get-prefs.md", @@ -2044,7 +2044,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "account", - "weight": 37, + "weight": 36, "cookies": false, "type": "", "demo": "account\/update-prefs.md", @@ -2119,7 +2119,7 @@ "x-appwrite": { "method": "createRecovery", "group": "recovery", - "weight": 39, + "weight": 38, "cookies": false, "type": "", "demo": "account\/create-recovery.md", @@ -2202,7 +2202,7 @@ "x-appwrite": { "method": "updateRecovery", "group": "recovery", - "weight": 40, + "weight": 39, "cookies": false, "type": "", "demo": "account\/update-recovery.md", @@ -2289,7 +2289,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 12, + "weight": 11, "cookies": false, "type": "", "demo": "account\/list-sessions.md", @@ -2337,7 +2337,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 13, + "weight": 12, "cookies": false, "type": "", "demo": "account\/delete-sessions.md", @@ -2392,7 +2392,7 @@ "x-appwrite": { "method": "createAnonymousSession", "group": "sessions", - "weight": 18, + "weight": 17, "cookies": false, "type": "", "demo": "account\/create-anonymous-session.md", @@ -2447,7 +2447,7 @@ "x-appwrite": { "method": "createEmailPasswordSession", "group": "sessions", - "weight": 17, + "weight": 16, "cookies": false, "type": "", "demo": "account\/create-email-password-session.md", @@ -2529,7 +2529,7 @@ "x-appwrite": { "method": "updateMagicURLSession", "group": "sessions", - "weight": 27, + "weight": 26, "cookies": false, "type": "", "demo": "account\/update-magic-url-session.md", @@ -2610,7 +2610,7 @@ "x-appwrite": { "method": "createOAuth2Session", "group": "sessions", - "weight": 20, + "weight": 19, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-session.md", @@ -2752,7 +2752,7 @@ "x-appwrite": { "method": "updatePhoneSession", "group": "sessions", - "weight": 28, + "weight": 27, "cookies": false, "type": "", "demo": "account\/update-phone-session.md", @@ -2838,7 +2838,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 19, + "weight": 18, "cookies": false, "type": "", "demo": "account\/create-session.md", @@ -2918,7 +2918,7 @@ "x-appwrite": { "method": "getSession", "group": "sessions", - "weight": 14, + "weight": 13, "cookies": false, "type": "", "demo": "account\/get-session.md", @@ -2981,7 +2981,7 @@ "x-appwrite": { "method": "updateSession", "group": "sessions", - "weight": 16, + "weight": 15, "cookies": false, "type": "", "demo": "account\/update-session.md", @@ -3039,7 +3039,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 15, + "weight": 14, "cookies": false, "type": "", "demo": "account\/delete-session.md", @@ -3104,7 +3104,7 @@ "x-appwrite": { "method": "updateStatus", "group": "account", - "weight": 38, + "weight": 37, "cookies": false, "type": "", "demo": "account\/update-status.md", @@ -3159,7 +3159,7 @@ "x-appwrite": { "method": "createPushTarget", "group": "pushTargets", - "weight": 45, + "weight": 44, "cookies": false, "type": "", "demo": "account\/create-push-target.md", @@ -3245,7 +3245,7 @@ "x-appwrite": { "method": "updatePushTarget", "group": "pushTargets", - "weight": 46, + "weight": 45, "cookies": false, "type": "", "demo": "account\/update-push-target.md", @@ -3319,7 +3319,7 @@ "x-appwrite": { "method": "deletePushTarget", "group": "pushTargets", - "weight": 47, + "weight": 46, "cookies": false, "type": "", "demo": "account\/delete-push-target.md", @@ -3382,7 +3382,7 @@ "x-appwrite": { "method": "createEmailToken", "group": "tokens", - "weight": 26, + "weight": 25, "cookies": false, "type": "", "demo": "account\/create-email-token.md", @@ -3473,7 +3473,7 @@ "x-appwrite": { "method": "createMagicURLToken", "group": "tokens", - "weight": 25, + "weight": 24, "cookies": false, "type": "", "demo": "account\/create-magic-url-token.md", @@ -3565,7 +3565,7 @@ "x-appwrite": { "method": "createOAuth2Token", "group": "tokens", - "weight": 24, + "weight": 23, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-token.md", @@ -3707,7 +3707,7 @@ "x-appwrite": { "method": "createPhoneToken", "group": "tokens", - "weight": 29, + "weight": 28, "cookies": false, "type": "", "demo": "account\/create-phone-token.md", @@ -3792,7 +3792,7 @@ "x-appwrite": { "method": "createEmailVerification", "group": "verification", - "weight": 41, + "weight": 40, "cookies": false, "type": "", "demo": "account\/create-email-verification.md", @@ -3917,7 +3917,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "verification", - "weight": 42, + "weight": 41, "cookies": false, "type": "", "demo": "account\/update-email-verification.md", @@ -4055,7 +4055,7 @@ "x-appwrite": { "method": "createPhoneVerification", "group": "verification", - "weight": 43, + "weight": 42, "cookies": false, "type": "", "demo": "account\/create-phone-verification.md", @@ -4111,7 +4111,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "verification", - "weight": 44, + "weight": 43, "cookies": false, "type": "", "demo": "account\/update-phone-verification.md", @@ -4191,7 +4191,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 51, + "weight": 50, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4317,7 +4317,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 50, + "weight": 49, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4449,7 +4449,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 54, + "weight": 53, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4513,7 +4513,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 52, + "weight": 51, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -5001,7 +5001,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 53, + "weight": 52, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -5085,7 +5085,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 56, + "weight": 55, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5177,7 +5177,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 55, + "weight": 54, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5269,7 +5269,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 57, + "weight": 56, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5982,7 +5982,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 381, + "weight": 362, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6049,7 +6049,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 377, + "weight": 358, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6119,7 +6119,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 378, + "weight": 359, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6182,7 +6182,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 379, + "weight": 360, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6261,7 +6261,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 380, + "weight": 361, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6326,7 +6326,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 382, + "weight": 363, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6407,7 +6407,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 340, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -6511,7 +6511,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 332, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -6670,7 +6670,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 333, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -6773,7 +6773,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 336, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -6924,7 +6924,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 334, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -7034,7 +7034,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 338, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -7135,7 +7135,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 343, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -7256,7 +7256,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 342, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -7375,7 +7375,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 473, + "weight": 454, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -7458,7 +7458,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 471, + "weight": 452, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -7577,7 +7577,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 472, + "weight": 453, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -7649,7 +7649,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 242, + "weight": 225, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -7724,7 +7724,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 241, + "weight": 224, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -7797,7 +7797,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 61, + "weight": 60, "cookies": false, "type": "", "demo": "locale\/get.md", @@ -7850,7 +7850,7 @@ "x-appwrite": { "method": "listCodes", "group": null, - "weight": 62, + "weight": 61, "cookies": false, "type": "", "demo": "locale\/list-codes.md", @@ -7903,7 +7903,7 @@ "x-appwrite": { "method": "listContinents", "group": null, - "weight": 66, + "weight": 65, "cookies": false, "type": "", "demo": "locale\/list-continents.md", @@ -7956,7 +7956,7 @@ "x-appwrite": { "method": "listCountries", "group": null, - "weight": 63, + "weight": 62, "cookies": false, "type": "", "demo": "locale\/list-countries.md", @@ -8009,7 +8009,7 @@ "x-appwrite": { "method": "listCountriesEU", "group": null, - "weight": 64, + "weight": 63, "cookies": false, "type": "", "demo": "locale\/list-countries-eu.md", @@ -8062,7 +8062,7 @@ "x-appwrite": { "method": "listCountriesPhones", "group": null, - "weight": 65, + "weight": 64, "cookies": false, "type": "", "demo": "locale\/list-countries-phones.md", @@ -8115,7 +8115,7 @@ "x-appwrite": { "method": "listCurrencies", "group": null, - "weight": 67, + "weight": 66, "cookies": false, "type": "", "demo": "locale\/list-currencies.md", @@ -8168,7 +8168,7 @@ "x-appwrite": { "method": "listLanguages", "group": null, - "weight": 68, + "weight": 67, "cookies": false, "type": "", "demo": "locale\/list-languages.md", @@ -8223,7 +8223,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 291, + "weight": 272, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -8308,7 +8308,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 295, + "weight": 276, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -8379,7 +8379,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 151, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -8472,7 +8472,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 150, + "weight": 523, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -8563,7 +8563,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 152, + "weight": 524, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -8634,13 +8634,13 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 157, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/update-file.md", - "rate-limit": 60, - "rate-time": 60, - "rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}", + "rate-limit": 0, + "rate-time": 3600, + "rate-key": "url:{url},ip:{ip}", "scope": "files.write", "platforms": [ "console", @@ -8664,7 +8664,7 @@ "parameters": [ { "name": "bucketId", - "description": "Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https:\/\/appwrite.io\/docs\/server\/storage#createBucket).", + "description": "Bucket unique ID.", "required": true, "type": "string", "x-example": "", @@ -8672,7 +8672,7 @@ }, { "name": "fileId", - "description": "File unique ID.", + "description": "File ID.", "required": true, "type": "string", "x-example": "", @@ -8686,14 +8686,13 @@ "properties": { "name": { "type": "string", - "description": "Name of the file", + "description": "File name.", "default": null, - "x-example": "", - "x-nullable": true + "x-example": "" }, "permissions": { "type": "array", - "description": "An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", + "description": "An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", "default": null, "x-example": "[\"read(\"any\")\"]", "x-nullable": true, @@ -8726,7 +8725,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 158, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -8797,7 +8796,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 154, + "weight": 529, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -8877,7 +8876,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 153, + "weight": 528, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -9085,7 +9084,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 155, + "weight": 530, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -9165,7 +9164,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 446, + "weight": 427, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -9235,7 +9234,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 442, + "weight": 423, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -9308,7 +9307,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 443, + "weight": 424, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -9374,7 +9373,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 444, + "weight": 425, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -9456,7 +9455,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 445, + "weight": 426, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -9524,7 +9523,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 447, + "weight": 428, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -9608,7 +9607,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 438, + "weight": 419, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -9711,7 +9710,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 430, + "weight": 411, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -9865,7 +9864,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 431, + "weight": 412, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -9967,7 +9966,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 434, + "weight": 415, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -10113,7 +10112,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 432, + "weight": 413, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -10222,7 +10221,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 436, + "weight": 417, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -10322,7 +10321,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 441, + "weight": 422, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -10442,7 +10441,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 440, + "weight": 421, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -10560,7 +10559,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 162, + "weight": 145, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -10645,7 +10644,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 161, + "weight": 144, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -10736,7 +10735,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 163, + "weight": 146, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -10799,7 +10798,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 165, + "weight": 148, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -10875,7 +10874,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 167, + "weight": 150, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -10938,7 +10937,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 169, + "weight": 152, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -11031,7 +11030,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 168, + "weight": 151, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -11152,7 +11151,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 170, + "weight": 153, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -11223,7 +11222,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 171, + "weight": 154, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -11317,7 +11316,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 173, + "weight": 156, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -11390,7 +11389,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 172, + "weight": 155, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -11486,7 +11485,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 164, + "weight": 147, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -11549,7 +11548,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 166, + "weight": 149, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -11670,7 +11669,7 @@ }, { "name": "console", - "description": "The Console service allows you to interact with console relevant informations." + "description": "The Console service allows you to interact with console relevant information." }, { "name": "migrations", diff --git a/app/config/specs/swagger2-1.8.x-console.json b/app/config/specs/swagger2-1.8.x-console.json index ee057d33ff..21f8513e16 100644 --- a/app/config/specs/swagger2-1.8.x-console.json +++ b/app/config/specs/swagger2-1.8.x-console.json @@ -73,6 +73,12 @@ "x-appwrite": { "demo": "" } + }, + "Cookie": { + "type": "apiKey", + "name": "Cookie", + "description": "The user cookie to authenticate with", + "in": "header" } }, "paths": { @@ -100,7 +106,7 @@ "x-appwrite": { "method": "get", "group": "account", - "weight": 10, + "weight": 9, "cookies": false, "type": "", "demo": "account\/get.md", @@ -152,7 +158,7 @@ "x-appwrite": { "method": "create", "group": "account", - "weight": 9, + "weight": 8, "cookies": false, "type": "", "demo": "account\/create.md", @@ -239,7 +245,7 @@ "x-appwrite": { "method": "delete", "group": "account", - "weight": 11, + "weight": 10, "cookies": false, "type": "", "demo": "account\/delete.md", @@ -290,7 +296,7 @@ "x-appwrite": { "method": "updateEmail", "group": "account", - "weight": 35, + "weight": 34, "cookies": false, "type": "", "demo": "account\/update-email.md", @@ -369,7 +375,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 48, + "weight": 47, "cookies": false, "type": "", "demo": "account\/list-identities.md", @@ -441,7 +447,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 49, + "weight": 48, "cookies": false, "type": "", "demo": "account\/delete-identity.md", @@ -505,7 +511,7 @@ "x-appwrite": { "method": "createJWT", "group": "tokens", - "weight": 30, + "weight": 29, "cookies": false, "type": "", "demo": "account\/create-jwt.md", @@ -574,7 +580,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 32, + "weight": 31, "cookies": false, "type": "", "demo": "account\/list-logs.md", @@ -651,7 +657,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 307, + "weight": 288, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -725,7 +731,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 309, + "weight": 290, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -848,7 +854,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 310, + "weight": 291, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -988,7 +994,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 311, + "weight": 292, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1111,7 +1117,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 315, + "weight": 296, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1247,7 +1253,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 316, + "weight": 297, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1386,7 +1392,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 308, + "weight": 289, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1486,7 +1492,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 314, + "weight": 295, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1586,7 +1592,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 312, + "weight": 293, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1686,7 +1692,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 313, + "weight": 294, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -1788,7 +1794,7 @@ "x-appwrite": { "method": "updateName", "group": "account", - "weight": 33, + "weight": 32, "cookies": false, "type": "", "demo": "account\/update-name.md", @@ -1862,7 +1868,7 @@ "x-appwrite": { "method": "updatePassword", "group": "account", - "weight": 34, + "weight": 33, "cookies": false, "type": "", "demo": "account\/update-password.md", @@ -1942,7 +1948,7 @@ "x-appwrite": { "method": "updatePhone", "group": "account", - "weight": 36, + "weight": 35, "cookies": false, "type": "", "demo": "account\/update-phone.md", @@ -2021,7 +2027,7 @@ "x-appwrite": { "method": "getPrefs", "group": "account", - "weight": 31, + "weight": 30, "cookies": false, "type": "", "demo": "account\/get-prefs.md", @@ -2073,7 +2079,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "account", - "weight": 37, + "weight": 36, "cookies": false, "type": "", "demo": "account\/update-prefs.md", @@ -2147,7 +2153,7 @@ "x-appwrite": { "method": "createRecovery", "group": "recovery", - "weight": 39, + "weight": 38, "cookies": false, "type": "", "demo": "account\/create-recovery.md", @@ -2229,7 +2235,7 @@ "x-appwrite": { "method": "updateRecovery", "group": "recovery", - "weight": 40, + "weight": 39, "cookies": false, "type": "", "demo": "account\/update-recovery.md", @@ -2315,7 +2321,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 12, + "weight": 11, "cookies": false, "type": "", "demo": "account\/list-sessions.md", @@ -2362,7 +2368,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 13, + "weight": 12, "cookies": false, "type": "", "demo": "account\/delete-sessions.md", @@ -2416,7 +2422,7 @@ "x-appwrite": { "method": "createAnonymousSession", "group": "sessions", - "weight": 18, + "weight": 17, "cookies": false, "type": "", "demo": "account\/create-anonymous-session.md", @@ -2470,7 +2476,7 @@ "x-appwrite": { "method": "createEmailPasswordSession", "group": "sessions", - "weight": 17, + "weight": 16, "cookies": false, "type": "", "demo": "account\/create-email-password-session.md", @@ -2551,7 +2557,7 @@ "x-appwrite": { "method": "updateMagicURLSession", "group": "sessions", - "weight": 27, + "weight": 26, "cookies": false, "type": "", "demo": "account\/update-magic-url-session.md", @@ -2631,7 +2637,7 @@ "x-appwrite": { "method": "createOAuth2Session", "group": "sessions", - "weight": 20, + "weight": 19, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-session.md", @@ -2772,7 +2778,7 @@ "x-appwrite": { "method": "updatePhoneSession", "group": "sessions", - "weight": 28, + "weight": 27, "cookies": false, "type": "", "demo": "account\/update-phone-session.md", @@ -2857,7 +2863,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 19, + "weight": 18, "cookies": false, "type": "", "demo": "account\/create-session.md", @@ -2936,7 +2942,7 @@ "x-appwrite": { "method": "getSession", "group": "sessions", - "weight": 14, + "weight": 13, "cookies": false, "type": "", "demo": "account\/get-session.md", @@ -2998,7 +3004,7 @@ "x-appwrite": { "method": "updateSession", "group": "sessions", - "weight": 16, + "weight": 15, "cookies": false, "type": "", "demo": "account\/update-session.md", @@ -3055,7 +3061,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 15, + "weight": 14, "cookies": false, "type": "", "demo": "account\/delete-session.md", @@ -3119,7 +3125,7 @@ "x-appwrite": { "method": "updateStatus", "group": "account", - "weight": 38, + "weight": 37, "cookies": false, "type": "", "demo": "account\/update-status.md", @@ -3173,7 +3179,7 @@ "x-appwrite": { "method": "createPushTarget", "group": "pushTargets", - "weight": 45, + "weight": 44, "cookies": false, "type": "", "demo": "account\/create-push-target.md", @@ -3258,7 +3264,7 @@ "x-appwrite": { "method": "updatePushTarget", "group": "pushTargets", - "weight": 46, + "weight": 45, "cookies": false, "type": "", "demo": "account\/update-push-target.md", @@ -3331,7 +3337,7 @@ "x-appwrite": { "method": "deletePushTarget", "group": "pushTargets", - "weight": 47, + "weight": 46, "cookies": false, "type": "", "demo": "account\/delete-push-target.md", @@ -3393,7 +3399,7 @@ "x-appwrite": { "method": "createEmailToken", "group": "tokens", - "weight": 26, + "weight": 25, "cookies": false, "type": "", "demo": "account\/create-email-token.md", @@ -3483,7 +3489,7 @@ "x-appwrite": { "method": "createMagicURLToken", "group": "tokens", - "weight": 25, + "weight": 24, "cookies": false, "type": "", "demo": "account\/create-magic-url-token.md", @@ -3574,7 +3580,7 @@ "x-appwrite": { "method": "createOAuth2Token", "group": "tokens", - "weight": 24, + "weight": 23, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-token.md", @@ -3715,7 +3721,7 @@ "x-appwrite": { "method": "createPhoneToken", "group": "tokens", - "weight": 29, + "weight": 28, "cookies": false, "type": "", "demo": "account\/create-phone-token.md", @@ -3799,7 +3805,7 @@ "x-appwrite": { "method": "createEmailVerification", "group": "verification", - "weight": 41, + "weight": 40, "cookies": false, "type": "", "demo": "account\/create-email-verification.md", @@ -3923,7 +3929,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "verification", - "weight": 42, + "weight": 41, "cookies": false, "type": "", "demo": "account\/update-email-verification.md", @@ -4060,7 +4066,7 @@ "x-appwrite": { "method": "createPhoneVerification", "group": "verification", - "weight": 43, + "weight": 42, "cookies": false, "type": "", "demo": "account\/create-phone-verification.md", @@ -4115,7 +4121,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "verification", - "weight": 44, + "weight": 43, "cookies": false, "type": "", "demo": "account\/update-phone-verification.md", @@ -4194,7 +4200,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 51, + "weight": 50, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4320,7 +4326,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 50, + "weight": 49, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4452,7 +4458,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 54, + "weight": 53, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4516,7 +4522,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 52, + "weight": 51, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -5004,7 +5010,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 53, + "weight": 52, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -5088,7 +5094,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 56, + "weight": 55, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5180,7 +5186,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 55, + "weight": 54, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5272,7 +5278,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 57, + "weight": 56, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5987,7 +5993,7 @@ "x-appwrite": { "method": "chat", "group": "console", - "weight": 244, + "weight": 495, "cookies": false, "type": "", "demo": "assistant\/chat.md", @@ -6051,7 +6057,7 @@ "x-appwrite": { "method": "getResource", "group": null, - "weight": 513, + "weight": 496, "cookies": false, "type": "", "demo": "console\/get-resource.md", @@ -6122,7 +6128,7 @@ "x-appwrite": { "method": "variables", "group": "console", - "weight": 243, + "weight": 494, "cookies": false, "type": "", "demo": "console\/variables.md", @@ -6171,7 +6177,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 321, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -6287,7 +6293,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 317, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -6407,7 +6413,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 381, + "weight": 362, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6474,7 +6480,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 377, + "weight": 358, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6544,7 +6550,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 378, + "weight": 359, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6607,7 +6613,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 379, + "weight": 360, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6686,7 +6692,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 380, + "weight": 361, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6751,7 +6757,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 382, + "weight": 363, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6832,7 +6838,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 324, + "weight": 305, "cookies": false, "type": "", "demo": "databases\/list-usage.md", @@ -6934,7 +6940,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 318, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -7028,7 +7034,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 319, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -7144,7 +7150,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 320, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -7237,7 +7243,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 329, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -7332,7 +7338,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 325, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -7462,7 +7468,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 326, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -7535,7 +7541,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 327, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7643,7 +7649,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 328, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7716,7 +7722,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 346, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7812,7 +7818,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 347, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7925,7 +7931,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 348, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -8040,7 +8046,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 349, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -8153,7 +8159,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 350, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -8268,7 +8274,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 351, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -8381,7 +8387,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 352, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -8496,7 +8502,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 353, + "weight": 334, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8619,7 +8625,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 354, + "weight": 335, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8744,7 +8750,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 355, + "weight": 336, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8871,7 +8877,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 356, + "weight": 337, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -9000,7 +9006,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 357, + "weight": 338, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -9127,7 +9133,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 358, + "weight": 339, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -9256,7 +9262,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 359, + "weight": 340, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -9369,7 +9375,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 360, + "weight": 341, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -9484,7 +9490,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 361, + "weight": 342, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9591,7 +9597,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 362, + "weight": 343, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9705,7 +9711,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 363, + "weight": 344, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -9812,7 +9818,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 364, + "weight": 345, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -9926,7 +9932,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 365, + "weight": 346, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -10033,7 +10039,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 366, + "weight": 347, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -10147,7 +10153,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 367, + "weight": 348, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -10288,7 +10294,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 369, + "weight": 350, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -10414,7 +10420,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 370, + "weight": 351, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -10536,7 +10542,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 371, + "weight": 352, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -10649,7 +10655,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 372, + "weight": 353, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -10793,7 +10799,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 344, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -10868,7 +10874,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 345, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -10950,7 +10956,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 368, + "weight": 349, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -11060,7 +11066,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 340, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -11164,7 +11170,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 332, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -11355,7 +11361,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 337, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -11490,7 +11496,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 335, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -11594,7 +11600,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 339, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -11692,7 +11698,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 333, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -11795,7 +11801,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 336, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -11946,7 +11952,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 334, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -12056,7 +12062,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 338, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -12155,7 +12161,7 @@ "x-appwrite": { "method": "listDocumentLogs", "group": "logs", - "weight": 341, + "weight": 322, "cookies": false, "type": "", "demo": "databases\/list-document-logs.md", @@ -12248,7 +12254,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 343, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -12369,7 +12375,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 342, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -12488,7 +12494,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 376, + "weight": 357, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -12582,7 +12588,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 373, + "weight": 354, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -12722,7 +12728,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 374, + "weight": 355, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -12797,7 +12803,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 375, + "weight": 356, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -12877,7 +12883,7 @@ "x-appwrite": { "method": "listCollectionLogs", "group": "collections", - "weight": 330, + "weight": 311, "cookies": false, "type": "", "demo": "databases\/list-collection-logs.md", @@ -12960,7 +12966,7 @@ "x-appwrite": { "method": "getCollectionUsage", "group": null, - "weight": 331, + "weight": 312, "cookies": false, "type": "", "demo": "databases\/get-collection-usage.md", @@ -13051,7 +13057,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 322, + "weight": 303, "cookies": false, "type": "", "demo": "databases\/list-logs.md", @@ -13156,7 +13162,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 323, + "weight": 304, "cookies": false, "type": "", "demo": "databases\/get-usage.md", @@ -13269,7 +13275,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 457, + "weight": 438, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -13351,7 +13357,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 454, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -13664,7 +13670,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 459, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -13714,7 +13720,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 460, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -13764,7 +13770,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 483, + "weight": 464, "cookies": false, "type": "", "demo": "functions\/list-templates.md", @@ -13948,7 +13954,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 482, + "weight": 463, "cookies": false, "type": "", "demo": "functions\/get-template.md", @@ -14006,7 +14012,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 476, + "weight": 457, "cookies": false, "type": "", "demo": "functions\/list-usage.md", @@ -14076,7 +14082,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 455, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -14136,7 +14142,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 456, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -14445,7 +14451,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 458, + "weight": 439, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -14507,7 +14513,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 463, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -14585,7 +14591,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 464, + "weight": 445, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -14675,7 +14681,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 461, + "weight": 442, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -14768,7 +14774,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 469, + "weight": 450, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -14854,7 +14860,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 466, + "weight": 447, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -14975,7 +14981,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 467, + "weight": 448, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -15072,7 +15078,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 462, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -15135,7 +15141,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 465, + "weight": 446, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -15203,7 +15209,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 468, + "weight": 449, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -15289,7 +15295,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 470, + "weight": 451, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -15357,7 +15363,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 473, + "weight": 454, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -15440,7 +15446,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 471, + "weight": 452, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -15559,7 +15565,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 472, + "weight": 453, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -15624,7 +15630,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 474, + "weight": 455, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -15692,7 +15698,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 475, + "weight": 456, "cookies": false, "type": "", "demo": "functions\/get-usage.md", @@ -15770,7 +15776,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 479, + "weight": 460, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -15830,7 +15836,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 477, + "weight": 458, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -15921,7 +15927,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 478, + "weight": 459, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -15989,7 +15995,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 480, + "weight": 461, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -16084,7 +16090,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 481, + "weight": 462, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -16154,7 +16160,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 242, + "weight": 225, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -16229,7 +16235,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 241, + "weight": 224, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -16302,7 +16308,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 69, + "weight": 68, "cookies": false, "type": "", "demo": "health\/get.md", @@ -16353,7 +16359,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 90, + "weight": 89, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -16404,7 +16410,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 72, + "weight": 71, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -16455,7 +16461,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 77, + "weight": 76, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -16515,7 +16521,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 71, + "weight": 70, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -16566,7 +16572,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 73, + "weight": 72, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -16617,7 +16623,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 79, + "weight": 78, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -16679,7 +16685,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 78, + "weight": 77, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -16741,7 +16747,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 80, + "weight": 79, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -16812,7 +16818,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 81, + "weight": 80, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -16874,7 +16880,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 91, + "weight": 90, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -16960,7 +16966,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 85, + "weight": 84, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -17022,7 +17028,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 76, + "weight": 75, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -17084,7 +17090,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 82, + "weight": 81, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -17146,7 +17152,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 83, + "weight": 82, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -17208,7 +17214,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 84, + "weight": 83, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -17270,7 +17276,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 86, + "weight": 85, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -17332,7 +17338,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 87, + "weight": 86, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -17394,7 +17400,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 75, + "weight": 74, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -17456,7 +17462,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 89, + "weight": 88, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -17507,7 +17513,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 88, + "weight": 87, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -17558,7 +17564,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 74, + "weight": 73, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -17609,7 +17615,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 61, + "weight": 60, "cookies": false, "type": "", "demo": "locale\/get.md", @@ -17662,7 +17668,7 @@ "x-appwrite": { "method": "listCodes", "group": null, - "weight": 62, + "weight": 61, "cookies": false, "type": "", "demo": "locale\/list-codes.md", @@ -17715,7 +17721,7 @@ "x-appwrite": { "method": "listContinents", "group": null, - "weight": 66, + "weight": 65, "cookies": false, "type": "", "demo": "locale\/list-continents.md", @@ -17768,7 +17774,7 @@ "x-appwrite": { "method": "listCountries", "group": null, - "weight": 63, + "weight": 62, "cookies": false, "type": "", "demo": "locale\/list-countries.md", @@ -17821,7 +17827,7 @@ "x-appwrite": { "method": "listCountriesEU", "group": null, - "weight": 64, + "weight": 63, "cookies": false, "type": "", "demo": "locale\/list-countries-eu.md", @@ -17874,7 +17880,7 @@ "x-appwrite": { "method": "listCountriesPhones", "group": null, - "weight": 65, + "weight": 64, "cookies": false, "type": "", "demo": "locale\/list-countries-phones.md", @@ -17927,7 +17933,7 @@ "x-appwrite": { "method": "listCurrencies", "group": null, - "weight": 67, + "weight": 66, "cookies": false, "type": "", "demo": "locale\/list-currencies.md", @@ -17980,7 +17986,7 @@ "x-appwrite": { "method": "listLanguages", "group": null, - "weight": 68, + "weight": 67, "cookies": false, "type": "", "demo": "locale\/list-languages.md", @@ -18033,7 +18039,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 299, + "weight": 280, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -18118,7 +18124,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 296, + "weight": 277, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -18278,7 +18284,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 303, + "weight": 284, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -18445,7 +18451,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 298, + "weight": 279, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -18643,7 +18649,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 305, + "weight": 286, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -18856,7 +18862,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 297, + "weight": 278, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -19046,7 +19052,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 304, + "weight": 285, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -19235,7 +19241,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 302, + "weight": 283, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -19291,7 +19297,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 306, + "weight": 287, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -19352,7 +19358,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 300, + "weight": 281, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -19434,7 +19440,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 301, + "weight": 282, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -19516,7 +19522,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 270, + "weight": 251, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -19601,7 +19607,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 269, + "weight": 250, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -19790,7 +19796,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 283, + "weight": 264, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -19976,7 +19982,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 268, + "weight": 249, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -20134,7 +20140,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 282, + "weight": 263, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -20288,7 +20294,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 259, + "weight": 240, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -20418,7 +20424,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 273, + "weight": 254, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -20546,7 +20552,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 263, + "weight": 244, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -20651,7 +20657,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 277, + "weight": 258, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -20754,7 +20760,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 261, + "weight": 242, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -20871,7 +20877,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 275, + "weight": 256, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -20986,7 +20992,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 260, + "weight": 241, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -21103,7 +21109,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 274, + "weight": 255, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -21218,7 +21224,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 262, + "weight": 243, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -21465,7 +21471,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 276, + "weight": 257, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -21707,7 +21713,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 264, + "weight": 245, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -21812,7 +21818,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 278, + "weight": 259, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -21915,7 +21921,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 265, + "weight": 246, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -22020,7 +22026,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 279, + "weight": 260, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -22123,7 +22129,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 266, + "weight": 247, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -22228,7 +22234,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 280, + "weight": 261, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -22331,7 +22337,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 267, + "weight": 248, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -22436,7 +22442,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 281, + "weight": 262, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -22537,7 +22543,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 272, + "weight": 253, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -22593,7 +22599,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 284, + "weight": 265, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -22654,7 +22660,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 271, + "weight": 252, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -22736,7 +22742,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 293, + "weight": 274, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -22818,7 +22824,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 286, + "weight": 267, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -22901,7 +22907,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 285, + "weight": 266, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -22990,7 +22996,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 288, + "weight": 269, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -23051,7 +23057,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 289, + "weight": 270, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -23133,7 +23139,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 290, + "weight": 271, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -23194,7 +23200,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 287, + "weight": 268, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -23276,7 +23282,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 292, + "weight": 273, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -23367,7 +23373,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 291, + "weight": 272, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -23455,7 +23461,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 294, + "weight": 275, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -23519,7 +23525,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 295, + "weight": 276, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -23590,7 +23596,7 @@ "x-appwrite": { "method": "list", "group": null, - "weight": 251, + "weight": 232, "cookies": false, "type": "", "demo": "migrations\/list.md", @@ -23673,7 +23679,7 @@ "x-appwrite": { "method": "createAppwriteMigration", "group": null, - "weight": 245, + "weight": 226, "cookies": false, "type": "", "demo": "migrations\/create-appwrite-migration.md", @@ -23786,7 +23792,7 @@ "x-appwrite": { "method": "getAppwriteReport", "group": null, - "weight": 253, + "weight": 234, "cookies": false, "type": "", "demo": "migrations\/get-appwrite-report.md", @@ -23895,7 +23901,7 @@ "x-appwrite": { "method": "createCSVExport", "group": null, - "weight": 250, + "weight": 231, "cookies": false, "type": "", "demo": "migrations\/create-csv-export.md", @@ -24021,7 +24027,7 @@ "x-appwrite": { "method": "createCSVImport", "group": null, - "weight": 249, + "weight": 230, "cookies": false, "type": "", "demo": "migrations\/create-csv-import.md", @@ -24112,7 +24118,7 @@ "x-appwrite": { "method": "createFirebaseMigration", "group": null, - "weight": 246, + "weight": 227, "cookies": false, "type": "", "demo": "migrations\/create-firebase-migration.md", @@ -24205,7 +24211,7 @@ "x-appwrite": { "method": "getFirebaseReport", "group": null, - "weight": 254, + "weight": 235, "cookies": false, "type": "", "demo": "migrations\/get-firebase-report.md", @@ -24291,7 +24297,7 @@ "x-appwrite": { "method": "createNHostMigration", "group": null, - "weight": 248, + "weight": 229, "cookies": false, "type": "", "demo": "migrations\/create-n-host-migration.md", @@ -24426,7 +24432,7 @@ "x-appwrite": { "method": "getNHostReport", "group": null, - "weight": 256, + "weight": 237, "cookies": false, "type": "", "demo": "migrations\/get-n-host-report.md", @@ -24562,7 +24568,7 @@ "x-appwrite": { "method": "createSupabaseMigration", "group": null, - "weight": 247, + "weight": 228, "cookies": false, "type": "", "demo": "migrations\/create-supabase-migration.md", @@ -24690,7 +24696,7 @@ "x-appwrite": { "method": "getSupabaseReport", "group": null, - "weight": 255, + "weight": 236, "cookies": false, "type": "", "demo": "migrations\/get-supabase-report.md", @@ -24817,7 +24823,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 252, + "weight": 233, "cookies": false, "type": "", "demo": "migrations\/get.md", @@ -24876,7 +24882,7 @@ "x-appwrite": { "method": "retry", "group": null, - "weight": 257, + "weight": 238, "cookies": false, "type": "", "demo": "migrations\/retry.md", @@ -24930,7 +24936,7 @@ "x-appwrite": { "method": "delete", "group": null, - "weight": 258, + "weight": 239, "cookies": false, "type": "", "demo": "migrations\/delete.md", @@ -24989,7 +24995,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 139, + "weight": 138, "cookies": false, "type": "", "demo": "project\/get-usage.md", @@ -25072,7 +25078,7 @@ "x-appwrite": { "method": "listVariables", "group": null, - "weight": 141, + "weight": 140, "cookies": false, "type": "", "demo": "project\/list-variables.md", @@ -25121,7 +25127,7 @@ "x-appwrite": { "method": "createVariable", "group": null, - "weight": 140, + "weight": 139, "cookies": false, "type": "", "demo": "project\/create-variable.md", @@ -25203,7 +25209,7 @@ "x-appwrite": { "method": "getVariable", "group": null, - "weight": 142, + "weight": 141, "cookies": false, "type": "", "demo": "project\/get-variable.md", @@ -25262,7 +25268,7 @@ "x-appwrite": { "method": "updateVariable", "group": null, - "weight": 143, + "weight": 142, "cookies": false, "type": "", "demo": "project\/update-variable.md", @@ -25348,7 +25354,7 @@ "x-appwrite": { "method": "deleteVariable", "group": null, - "weight": 144, + "weight": 143, "cookies": false, "type": "", "demo": "project\/delete-variable.md", @@ -25407,7 +25413,7 @@ "x-appwrite": { "method": "list", "group": "projects", - "weight": 453, + "weight": 434, "cookies": false, "type": "", "demo": "projects\/list.md", @@ -25487,7 +25493,7 @@ "x-appwrite": { "method": "create", "group": "projects", - "weight": 93, + "weight": 92, "cookies": false, "type": "", "demo": "projects\/create.md", @@ -25635,7 +25641,7 @@ "x-appwrite": { "method": "get", "group": "projects", - "weight": 94, + "weight": 93, "cookies": false, "type": "", "demo": "projects\/get.md", @@ -25694,7 +25700,7 @@ "x-appwrite": { "method": "update", "group": "projects", - "weight": 95, + "weight": 94, "cookies": false, "type": "", "demo": "projects\/update.md", @@ -25820,7 +25826,7 @@ "x-appwrite": { "method": "delete", "group": "projects", - "weight": 112, + "weight": 111, "cookies": false, "type": "", "demo": "projects\/delete.md", @@ -25881,7 +25887,7 @@ "x-appwrite": { "method": "updateApiStatus", "group": "projects", - "weight": 99, + "weight": 98, "cookies": false, "type": "", "demo": "projects\/update-api-status.md", @@ -26038,7 +26044,7 @@ "x-appwrite": { "method": "updateApiStatusAll", "group": "projects", - "weight": 100, + "weight": 99, "cookies": false, "type": "", "demo": "projects\/update-api-status-all.md", @@ -26177,7 +26183,7 @@ "x-appwrite": { "method": "updateAuthDuration", "group": "auth", - "weight": 105, + "weight": 104, "cookies": false, "type": "", "demo": "projects\/update-auth-duration.md", @@ -26256,7 +26262,7 @@ "x-appwrite": { "method": "updateAuthLimit", "group": "auth", - "weight": 104, + "weight": 103, "cookies": false, "type": "", "demo": "projects\/update-auth-limit.md", @@ -26335,7 +26341,7 @@ "x-appwrite": { "method": "updateAuthSessionsLimit", "group": "auth", - "weight": 110, + "weight": 109, "cookies": false, "type": "", "demo": "projects\/update-auth-sessions-limit.md", @@ -26414,7 +26420,7 @@ "x-appwrite": { "method": "updateMembershipsPrivacy", "group": "auth", - "weight": 103, + "weight": 102, "cookies": false, "type": "", "demo": "projects\/update-memberships-privacy.md", @@ -26507,7 +26513,7 @@ "x-appwrite": { "method": "updateMockNumbers", "group": "auth", - "weight": 111, + "weight": 110, "cookies": false, "type": "", "demo": "projects\/update-mock-numbers.md", @@ -26589,7 +26595,7 @@ "x-appwrite": { "method": "updateAuthPasswordDictionary", "group": "auth", - "weight": 108, + "weight": 107, "cookies": false, "type": "", "demo": "projects\/update-auth-password-dictionary.md", @@ -26668,7 +26674,7 @@ "x-appwrite": { "method": "updateAuthPasswordHistory", "group": "auth", - "weight": 107, + "weight": 106, "cookies": false, "type": "", "demo": "projects\/update-auth-password-history.md", @@ -26747,7 +26753,7 @@ "x-appwrite": { "method": "updatePersonalDataCheck", "group": "auth", - "weight": 109, + "weight": 108, "cookies": false, "type": "", "demo": "projects\/update-personal-data-check.md", @@ -26826,7 +26832,7 @@ "x-appwrite": { "method": "updateSessionAlerts", "group": "auth", - "weight": 102, + "weight": 101, "cookies": false, "type": "", "demo": "projects\/update-session-alerts.md", @@ -26905,7 +26911,7 @@ "x-appwrite": { "method": "updateSessionInvalidation", "group": "auth", - "weight": 138, + "weight": 137, "cookies": false, "type": "", "demo": "projects\/update-session-invalidation.md", @@ -26984,7 +26990,7 @@ "x-appwrite": { "method": "updateAuthStatus", "group": "auth", - "weight": 106, + "weight": 105, "cookies": false, "type": "", "demo": "projects\/update-auth-status.md", @@ -27080,7 +27086,7 @@ "x-appwrite": { "method": "listDevKeys", "group": "devKeys", - "weight": 451, + "weight": 432, "cookies": false, "type": "", "demo": "projects\/list-dev-keys.md", @@ -27150,7 +27156,7 @@ "x-appwrite": { "method": "createDevKey", "group": "devKeys", - "weight": 448, + "weight": 429, "cookies": false, "type": "", "demo": "projects\/create-dev-key.md", @@ -27233,7 +27239,7 @@ "x-appwrite": { "method": "getDevKey", "group": "devKeys", - "weight": 450, + "weight": 431, "cookies": false, "type": "", "demo": "projects\/get-dev-key.md", @@ -27299,7 +27305,7 @@ "x-appwrite": { "method": "updateDevKey", "group": "devKeys", - "weight": 449, + "weight": 430, "cookies": false, "type": "", "demo": "projects\/update-dev-key.md", @@ -27385,7 +27391,7 @@ "x-appwrite": { "method": "deleteDevKey", "group": "devKeys", - "weight": 452, + "weight": 433, "cookies": false, "type": "", "demo": "projects\/delete-dev-key.md", @@ -27453,7 +27459,7 @@ "x-appwrite": { "method": "createJWT", "group": "auth", - "weight": 124, + "weight": 123, "cookies": false, "type": "", "demo": "projects\/create-jwt.md", @@ -27598,7 +27604,7 @@ "x-appwrite": { "method": "listKeys", "group": "keys", - "weight": 120, + "weight": 119, "cookies": false, "type": "", "demo": "projects\/list-keys.md", @@ -27666,7 +27672,7 @@ "x-appwrite": { "method": "createKey", "group": "keys", - "weight": 119, + "weight": 118, "cookies": false, "type": "", "demo": "projects\/create-key.md", @@ -27820,7 +27826,7 @@ "x-appwrite": { "method": "getKey", "group": "keys", - "weight": 121, + "weight": 120, "cookies": false, "type": "", "demo": "projects\/get-key.md", @@ -27887,7 +27893,7 @@ "x-appwrite": { "method": "updateKey", "group": "keys", - "weight": 122, + "weight": 121, "cookies": false, "type": "", "demo": "projects\/update-key.md", @@ -28044,7 +28050,7 @@ "x-appwrite": { "method": "deleteKey", "group": "keys", - "weight": 123, + "weight": 122, "cookies": false, "type": "", "demo": "projects\/delete-key.md", @@ -28113,7 +28119,7 @@ "x-appwrite": { "method": "updateOAuth2", "group": "auth", - "weight": 101, + "weight": 100, "cookies": false, "type": "", "demo": "projects\/update-o-auth-2.md", @@ -28256,7 +28262,7 @@ "x-appwrite": { "method": "listPlatforms", "group": "platforms", - "weight": 126, + "weight": 125, "cookies": false, "type": "", "demo": "projects\/list-platforms.md", @@ -28324,7 +28330,7 @@ "x-appwrite": { "method": "createPlatform", "group": "platforms", - "weight": 125, + "weight": 124, "cookies": false, "type": "", "demo": "projects\/create-platform.md", @@ -28445,7 +28451,7 @@ "x-appwrite": { "method": "getPlatform", "group": "platforms", - "weight": 127, + "weight": 126, "cookies": false, "type": "", "demo": "projects\/get-platform.md", @@ -28512,7 +28518,7 @@ "x-appwrite": { "method": "updatePlatform", "group": "platforms", - "weight": 128, + "weight": 127, "cookies": false, "type": "", "demo": "projects\/update-platform.md", @@ -28610,7 +28616,7 @@ "x-appwrite": { "method": "deletePlatform", "group": "platforms", - "weight": 129, + "weight": 128, "cookies": false, "type": "", "demo": "projects\/delete-platform.md", @@ -28679,7 +28685,7 @@ "x-appwrite": { "method": "updateServiceStatus", "group": "projects", - "weight": 97, + "weight": 96, "cookies": false, "type": "", "demo": "projects\/update-service-status.md", @@ -28782,7 +28788,7 @@ "x-appwrite": { "method": "updateServiceStatusAll", "group": "projects", - "weight": 98, + "weight": 97, "cookies": false, "type": "", "demo": "projects\/update-service-status-all.md", @@ -28861,7 +28867,7 @@ "x-appwrite": { "method": "updateSmtp", "group": "templates", - "weight": 130, + "weight": 129, "cookies": false, "type": "", "demo": "projects\/update-smtp.md", @@ -29067,7 +29073,7 @@ "x-appwrite": { "method": "createSmtpTest", "group": "templates", - "weight": 131, + "weight": 130, "cookies": false, "type": "", "demo": "projects\/create-smtp-test.md", @@ -29286,7 +29292,7 @@ "x-appwrite": { "method": "updateTeam", "group": "projects", - "weight": 96, + "weight": 95, "cookies": false, "type": "", "demo": "projects\/update-team.md", @@ -29363,7 +29369,7 @@ "x-appwrite": { "method": "getEmailTemplate", "group": "templates", - "weight": 133, + "weight": 132, "cookies": false, "type": "", "demo": "projects\/get-email-template.md", @@ -29584,7 +29590,7 @@ "x-appwrite": { "method": "updateEmailTemplate", "group": "templates", - "weight": 135, + "weight": 134, "cookies": false, "type": "", "demo": "projects\/update-email-template.md", @@ -29848,7 +29854,7 @@ "x-appwrite": { "method": "deleteEmailTemplate", "group": "templates", - "weight": 137, + "weight": 136, "cookies": false, "type": "", "demo": "projects\/delete-email-template.md", @@ -30069,7 +30075,7 @@ "x-appwrite": { "method": "getSmsTemplate", "group": "templates", - "weight": 132, + "weight": 131, "cookies": false, "type": "", "demo": "projects\/get-sms-template.md", @@ -30351,7 +30357,7 @@ "x-appwrite": { "method": "updateSmsTemplate", "group": "templates", - "weight": 134, + "weight": 133, "cookies": false, "type": "", "demo": "projects\/update-sms-template.md", @@ -30655,7 +30661,7 @@ "x-appwrite": { "method": "deleteSmsTemplate", "group": "templates", - "weight": 136, + "weight": 135, "cookies": false, "type": "", "demo": "projects\/delete-sms-template.md", @@ -30937,7 +30943,7 @@ "x-appwrite": { "method": "listWebhooks", "group": "webhooks", - "weight": 114, + "weight": 113, "cookies": false, "type": "", "demo": "projects\/list-webhooks.md", @@ -31005,7 +31011,7 @@ "x-appwrite": { "method": "createWebhook", "group": "webhooks", - "weight": 113, + "weight": 112, "cookies": false, "type": "", "demo": "projects\/create-webhook.md", @@ -31124,7 +31130,7 @@ "x-appwrite": { "method": "getWebhook", "group": "webhooks", - "weight": 115, + "weight": 114, "cookies": false, "type": "", "demo": "projects\/get-webhook.md", @@ -31191,7 +31197,7 @@ "x-appwrite": { "method": "updateWebhook", "group": "webhooks", - "weight": 116, + "weight": 115, "cookies": false, "type": "", "demo": "projects\/update-webhook.md", @@ -31313,7 +31319,7 @@ "x-appwrite": { "method": "deleteWebhook", "group": "webhooks", - "weight": 118, + "weight": 117, "cookies": false, "type": "", "demo": "projects\/delete-webhook.md", @@ -31382,7 +31388,7 @@ "x-appwrite": { "method": "updateWebhookSignature", "group": "webhooks", - "weight": 117, + "weight": 116, "cookies": false, "type": "", "demo": "projects\/update-webhook-signature.md", @@ -31449,7 +31455,7 @@ "x-appwrite": { "method": "listRules", "group": null, - "weight": 519, + "weight": 510, "cookies": false, "type": "", "demo": "proxy\/list-rules.md", @@ -31531,7 +31537,7 @@ "x-appwrite": { "method": "createAPIRule", "group": null, - "weight": 514, + "weight": 505, "cookies": false, "type": "", "demo": "proxy\/create-api-rule.md", @@ -31601,7 +31607,7 @@ "x-appwrite": { "method": "createFunctionRule", "group": null, - "weight": 516, + "weight": 507, "cookies": false, "type": "", "demo": "proxy\/create-function-rule.md", @@ -31684,7 +31690,7 @@ "x-appwrite": { "method": "createRedirectRule", "group": null, - "weight": 517, + "weight": 508, "cookies": false, "type": "", "demo": "proxy\/create-redirect-rule.md", @@ -31804,7 +31810,7 @@ "x-appwrite": { "method": "createSiteRule", "group": null, - "weight": 515, + "weight": 506, "cookies": false, "type": "", "demo": "proxy\/create-site-rule.md", @@ -31885,7 +31891,7 @@ "x-appwrite": { "method": "getRule", "group": null, - "weight": 518, + "weight": 509, "cookies": false, "type": "", "demo": "proxy\/get-rule.md", @@ -31938,7 +31944,7 @@ "x-appwrite": { "method": "deleteRule", "group": null, - "weight": 520, + "weight": 511, "cookies": false, "type": "", "demo": "proxy\/delete-rule.md", @@ -31998,7 +32004,7 @@ "x-appwrite": { "method": "updateRuleVerification", "group": null, - "weight": 521, + "weight": 512, "cookies": false, "type": "", "demo": "proxy\/update-rule-verification.md", @@ -32056,7 +32062,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 486, + "weight": 467, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -32138,7 +32144,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 484, + "weight": 465, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -32409,7 +32415,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 489, + "weight": 470, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -32459,7 +32465,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 512, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -32509,7 +32515,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 508, + "weight": 489, "cookies": false, "type": "", "demo": "sites\/list-templates.md", @@ -32632,7 +32638,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 509, + "weight": 490, "cookies": false, "type": "", "demo": "sites\/get-template.md", @@ -32690,7 +32696,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 510, + "weight": 491, "cookies": false, "type": "", "demo": "sites\/list-usage.md", @@ -32760,7 +32766,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 485, + "weight": 466, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -32820,7 +32826,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 487, + "weight": 468, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -33086,7 +33092,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 488, + "weight": 469, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -33148,7 +33154,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 495, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -33226,7 +33232,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 494, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -33316,7 +33322,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 490, + "weight": 471, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -33417,7 +33423,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 498, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -33497,7 +33503,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 491, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -33618,7 +33624,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 492, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -33716,7 +33722,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 493, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -33779,7 +33785,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 496, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -33847,7 +33853,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 497, + "weight": 478, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -33933,7 +33939,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 499, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -34001,7 +34007,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 501, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -34082,7 +34088,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 500, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -34147,7 +34153,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 502, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -34215,7 +34221,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 511, + "weight": 492, "cookies": false, "type": "", "demo": "sites\/get-usage.md", @@ -34293,7 +34299,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 505, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -34353,7 +34359,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 503, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -34444,7 +34450,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 504, + "weight": 485, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -34512,7 +34518,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 506, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -34607,7 +34613,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 507, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -34675,7 +34681,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 146, + "weight": 520, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -34758,7 +34764,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 145, + "weight": 518, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -34904,7 +34910,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 147, + "weight": 519, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -34965,7 +34971,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 148, + "weight": 521, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -35107,7 +35113,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 149, + "weight": 522, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -35168,7 +35174,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 151, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -35261,7 +35267,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 150, + "weight": 523, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -35352,7 +35358,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 152, + "weight": 524, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -35423,13 +35429,13 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 157, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/update-file.md", - "rate-limit": 60, - "rate-time": 60, - "rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}", + "rate-limit": 0, + "rate-time": 3600, + "rate-key": "url:{url},ip:{ip}", "scope": "files.write", "platforms": [ "console", @@ -35453,7 +35459,7 @@ "parameters": [ { "name": "bucketId", - "description": "Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https:\/\/appwrite.io\/docs\/server\/storage#createBucket).", + "description": "Bucket unique ID.", "required": true, "type": "string", "x-example": "", @@ -35461,7 +35467,7 @@ }, { "name": "fileId", - "description": "File unique ID.", + "description": "File ID.", "required": true, "type": "string", "x-example": "", @@ -35475,14 +35481,13 @@ "properties": { "name": { "type": "string", - "description": "Name of the file", + "description": "File name.", "default": null, - "x-example": "", - "x-nullable": true + "x-example": "" }, "permissions": { "type": "array", - "description": "An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", + "description": "An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", "default": null, "x-example": "[\"read(\"any\")\"]", "x-nullable": true, @@ -35515,7 +35520,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 158, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -35586,7 +35591,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 154, + "weight": 529, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -35666,7 +35671,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 153, + "weight": 528, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -35874,7 +35879,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 155, + "weight": 530, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -35954,7 +35959,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 159, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/get-usage.md", @@ -36025,7 +36030,7 @@ "x-appwrite": { "method": "getBucketUsage", "group": null, - "weight": 160, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/get-bucket-usage.md", @@ -36104,7 +36109,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 387, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -36187,7 +36192,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 383, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -36271,7 +36276,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 446, + "weight": 427, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -36341,7 +36346,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 442, + "weight": 423, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -36414,7 +36419,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 443, + "weight": 424, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -36480,7 +36485,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 444, + "weight": 425, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -36562,7 +36567,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 445, + "weight": 426, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -36630,7 +36635,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 447, + "weight": 428, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -36714,7 +36719,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 389, + "weight": 370, "cookies": false, "type": "", "demo": "tablesdb\/list-usage.md", @@ -36811,7 +36816,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 384, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -36872,7 +36877,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 385, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -36952,7 +36957,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 386, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -37013,7 +37018,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 394, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -37107,7 +37112,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 390, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -37236,7 +37241,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 391, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -37308,7 +37313,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 392, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -37415,7 +37420,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 393, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -37487,7 +37492,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 399, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -37582,7 +37587,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 400, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -37694,7 +37699,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 401, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -37808,7 +37813,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 402, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -37920,7 +37925,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 403, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -38034,7 +38039,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 404, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -38146,7 +38151,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 405, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -38260,7 +38265,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 406, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -38382,7 +38387,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 407, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -38506,7 +38511,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 408, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -38632,7 +38637,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 409, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -38760,7 +38765,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 410, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -38886,7 +38891,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 411, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -39014,7 +39019,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 412, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -39126,7 +39131,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 413, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -39240,7 +39245,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 414, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -39346,7 +39351,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 415, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -39459,7 +39464,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 416, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -39565,7 +39570,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 417, + "weight": 398, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -39678,7 +39683,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 418, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -39784,7 +39789,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 419, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -39897,7 +39902,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 420, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -40037,7 +40042,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 422, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -40162,7 +40167,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 423, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -40283,7 +40288,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 424, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -40395,7 +40400,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 425, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -40538,7 +40543,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 397, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -40612,7 +40617,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 398, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -40693,7 +40698,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 421, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -40802,7 +40807,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 429, + "weight": 410, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -40895,7 +40900,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 426, + "weight": 407, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -41034,7 +41039,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 427, + "weight": 408, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -41108,7 +41113,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 428, + "weight": 409, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -41187,7 +41192,7 @@ "x-appwrite": { "method": "listTableLogs", "group": "tables", - "weight": 395, + "weight": 376, "cookies": false, "type": "", "demo": "tablesdb\/list-table-logs.md", @@ -41269,7 +41274,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 438, + "weight": 419, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -41372,7 +41377,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 430, + "weight": 411, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -41554,7 +41559,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 435, + "weight": 416, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -41684,7 +41689,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 433, + "weight": 414, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -41787,7 +41792,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 437, + "weight": 418, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -41884,7 +41889,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 431, + "weight": 412, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -41986,7 +41991,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 434, + "weight": 415, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -42132,7 +42137,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 432, + "weight": 413, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -42241,7 +42246,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 436, + "weight": 417, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -42339,7 +42344,7 @@ "x-appwrite": { "method": "listRowLogs", "group": "logs", - "weight": 439, + "weight": 420, "cookies": false, "type": "", "demo": "tablesdb\/list-row-logs.md", @@ -42431,7 +42436,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 441, + "weight": 422, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -42551,7 +42556,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 440, + "weight": 421, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -42669,7 +42674,7 @@ "x-appwrite": { "method": "getTableUsage", "group": null, - "weight": 396, + "weight": 377, "cookies": false, "type": "", "demo": "tablesdb\/get-table-usage.md", @@ -42759,7 +42764,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 388, + "weight": 369, "cookies": false, "type": "", "demo": "tablesdb\/get-usage.md", @@ -42867,7 +42872,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 162, + "weight": 145, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -42952,7 +42957,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 161, + "weight": 144, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -43043,7 +43048,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 163, + "weight": 146, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -43106,7 +43111,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 165, + "weight": 148, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -43182,7 +43187,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 167, + "weight": 150, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -43245,7 +43250,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 174, + "weight": 157, "cookies": false, "type": "", "demo": "teams\/list-logs.md", @@ -43325,7 +43330,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 169, + "weight": 152, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -43418,7 +43423,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 168, + "weight": 151, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -43539,7 +43544,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 170, + "weight": 153, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -43610,7 +43615,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 171, + "weight": 154, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -43704,7 +43709,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 173, + "weight": 156, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -43777,7 +43782,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 172, + "weight": 155, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -43872,7 +43877,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 164, + "weight": 147, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -43934,7 +43939,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 166, + "weight": 149, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -44014,7 +44019,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 524, + "weight": 515, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -44103,7 +44108,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 522, + "weight": 513, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -44187,7 +44192,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 523, + "weight": 514, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -44247,7 +44252,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 525, + "weight": 516, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -44318,7 +44323,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 526, + "weight": 517, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -44378,7 +44383,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 184, + "weight": 167, "cookies": false, "type": "", "demo": "users\/list.md", @@ -44461,7 +44466,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 175, + "weight": 158, "cookies": false, "type": "", "demo": "users\/create.md", @@ -44560,7 +44565,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 178, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -44653,7 +44658,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 176, + "weight": 159, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -44744,7 +44749,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 192, + "weight": 175, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -44824,7 +44829,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 215, + "weight": 198, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -44887,7 +44892,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 177, + "weight": 160, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -44980,7 +44985,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 180, + "weight": 163, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -45073,7 +45078,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 181, + "weight": 164, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -45201,7 +45206,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 182, + "weight": 165, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -45315,7 +45320,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 179, + "weight": 162, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -45427,7 +45432,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 217, + "weight": 200, "cookies": false, "type": "", "demo": "users\/get-usage.md", @@ -45498,7 +45503,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 185, + "weight": 168, "cookies": false, "type": "", "demo": "users\/get.md", @@ -45554,7 +45559,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 213, + "weight": 196, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -45617,7 +45622,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 198, + "weight": 181, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -45698,7 +45703,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 216, + "weight": 199, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -45782,7 +45787,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 194, + "weight": 177, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -45864,7 +45869,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 190, + "weight": 173, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -45946,7 +45951,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 189, + "weight": 172, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -46039,7 +46044,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 203, + "weight": 186, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -46175,7 +46180,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 208, + "weight": 191, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -46307,7 +46312,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 204, + "weight": 187, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -46424,7 +46429,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 205, + "weight": 188, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -46541,7 +46546,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 207, + "weight": 190, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -46658,7 +46663,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 206, + "weight": 189, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -46777,7 +46782,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 196, + "weight": 179, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -46858,7 +46863,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 197, + "weight": 180, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -46939,7 +46944,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 199, + "weight": 182, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -47018,7 +47023,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 186, + "weight": 169, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -47079,7 +47084,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 201, + "weight": 184, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -47158,7 +47163,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 188, + "weight": 171, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -47228,7 +47233,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 209, + "weight": 192, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -47284,7 +47289,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 212, + "weight": 195, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -47342,7 +47347,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 211, + "weight": 194, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -47413,7 +47418,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 193, + "weight": 176, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -47492,7 +47497,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 191, + "weight": 174, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -47574,7 +47579,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 183, + "weight": 166, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -47686,7 +47691,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 187, + "weight": 170, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -47755,7 +47760,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 202, + "weight": 185, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -47846,7 +47851,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 214, + "weight": 197, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -47917,7 +47922,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 210, + "weight": 193, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -48001,7 +48006,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 200, + "weight": 183, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -48082,7 +48087,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 195, + "weight": 178, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -48163,7 +48168,7 @@ "x-appwrite": { "method": "createRepositoryDetection", "group": "repositories", - "weight": 221, + "weight": 204, "cookies": false, "type": "", "demo": "vcs\/create-repository-detection.md", @@ -48259,7 +48264,7 @@ "x-appwrite": { "method": "listRepositories", "group": "repositories", - "weight": 222, + "weight": 205, "cookies": false, "type": "", "demo": "vcs\/list-repositories.md", @@ -48353,7 +48358,7 @@ "x-appwrite": { "method": "createRepository", "group": "repositories", - "weight": 223, + "weight": 206, "cookies": false, "type": "", "demo": "vcs\/create-repository.md", @@ -48437,7 +48442,7 @@ "x-appwrite": { "method": "getRepository", "group": "repositories", - "weight": 224, + "weight": 207, "cookies": false, "type": "", "demo": "vcs\/get-repository.md", @@ -48504,7 +48509,7 @@ "x-appwrite": { "method": "listRepositoryBranches", "group": "repositories", - "weight": 225, + "weight": 208, "cookies": false, "type": "", "demo": "vcs\/list-repository-branches.md", @@ -48571,7 +48576,7 @@ "x-appwrite": { "method": "getRepositoryContents", "group": "repositories", - "weight": 220, + "weight": 203, "cookies": false, "type": "", "demo": "vcs\/get-repository-contents.md", @@ -48655,7 +48660,7 @@ "x-appwrite": { "method": "updateExternalDeployments", "group": "repositories", - "weight": 230, + "weight": 213, "cookies": false, "type": "", "demo": "vcs\/update-external-deployments.md", @@ -48740,7 +48745,7 @@ "x-appwrite": { "method": "listInstallations", "group": "installations", - "weight": 227, + "weight": 210, "cookies": false, "type": "", "demo": "vcs\/list-installations.md", @@ -48821,7 +48826,7 @@ "x-appwrite": { "method": "getInstallation", "group": "installations", - "weight": 228, + "weight": 211, "cookies": false, "type": "", "demo": "vcs\/get-installation.md", @@ -48875,7 +48880,7 @@ "x-appwrite": { "method": "deleteInstallation", "group": "installations", - "weight": 229, + "weight": 212, "cookies": false, "type": "", "demo": "vcs\/delete-installation.md", @@ -48974,7 +48979,7 @@ }, { "name": "console", - "description": "The Console service allows you to interact with console relevant informations." + "description": "The Console service allows you to interact with console relevant information." }, { "name": "migrations", diff --git a/app/config/specs/swagger2-1.8.x-server.json b/app/config/specs/swagger2-1.8.x-server.json index ebc571a19a..a3d51a703d 100644 --- a/app/config/specs/swagger2-1.8.x-server.json +++ b/app/config/specs/swagger2-1.8.x-server.json @@ -103,7 +103,7 @@ "x-appwrite": { "method": "get", "group": "account", - "weight": 10, + "weight": 9, "cookies": false, "type": "", "demo": "account\/get.md", @@ -157,7 +157,7 @@ "x-appwrite": { "method": "create", "group": "account", - "weight": 9, + "weight": 8, "cookies": false, "type": "", "demo": "account\/create.md", @@ -253,7 +253,7 @@ "x-appwrite": { "method": "updateEmail", "group": "account", - "weight": 35, + "weight": 34, "cookies": false, "type": "", "demo": "account\/update-email.md", @@ -334,7 +334,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 48, + "weight": 47, "cookies": false, "type": "", "demo": "account\/list-identities.md", @@ -408,7 +408,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 49, + "weight": 48, "cookies": false, "type": "", "demo": "account\/delete-identity.md", @@ -474,7 +474,7 @@ "x-appwrite": { "method": "createJWT", "group": "tokens", - "weight": 30, + "weight": 29, "cookies": false, "type": "", "demo": "account\/create-jwt.md", @@ -545,7 +545,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 32, + "weight": 31, "cookies": false, "type": "", "demo": "account\/list-logs.md", @@ -624,7 +624,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 307, + "weight": 288, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -700,7 +700,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 309, + "weight": 290, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -827,7 +827,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 310, + "weight": 291, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -971,7 +971,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 311, + "weight": 292, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1098,7 +1098,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 315, + "weight": 296, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1238,7 +1238,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 316, + "weight": 297, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1381,7 +1381,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 308, + "weight": 289, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1485,7 +1485,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 314, + "weight": 295, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1589,7 +1589,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 312, + "weight": 293, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1693,7 +1693,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 313, + "weight": 294, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -1799,7 +1799,7 @@ "x-appwrite": { "method": "updateName", "group": "account", - "weight": 33, + "weight": 32, "cookies": false, "type": "", "demo": "account\/update-name.md", @@ -1875,7 +1875,7 @@ "x-appwrite": { "method": "updatePassword", "group": "account", - "weight": 34, + "weight": 33, "cookies": false, "type": "", "demo": "account\/update-password.md", @@ -1957,7 +1957,7 @@ "x-appwrite": { "method": "updatePhone", "group": "account", - "weight": 36, + "weight": 35, "cookies": false, "type": "", "demo": "account\/update-phone.md", @@ -2038,7 +2038,7 @@ "x-appwrite": { "method": "getPrefs", "group": "account", - "weight": 31, + "weight": 30, "cookies": false, "type": "", "demo": "account\/get-prefs.md", @@ -2092,7 +2092,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "account", - "weight": 37, + "weight": 36, "cookies": false, "type": "", "demo": "account\/update-prefs.md", @@ -2168,7 +2168,7 @@ "x-appwrite": { "method": "createRecovery", "group": "recovery", - "weight": 39, + "weight": 38, "cookies": false, "type": "", "demo": "account\/create-recovery.md", @@ -2252,7 +2252,7 @@ "x-appwrite": { "method": "updateRecovery", "group": "recovery", - "weight": 40, + "weight": 39, "cookies": false, "type": "", "demo": "account\/update-recovery.md", @@ -2340,7 +2340,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 12, + "weight": 11, "cookies": false, "type": "", "demo": "account\/list-sessions.md", @@ -2389,7 +2389,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 13, + "weight": 12, "cookies": false, "type": "", "demo": "account\/delete-sessions.md", @@ -2445,7 +2445,7 @@ "x-appwrite": { "method": "createAnonymousSession", "group": "sessions", - "weight": 18, + "weight": 17, "cookies": false, "type": "", "demo": "account\/create-anonymous-session.md", @@ -2501,7 +2501,7 @@ "x-appwrite": { "method": "createEmailPasswordSession", "group": "sessions", - "weight": 17, + "weight": 16, "cookies": false, "type": "", "demo": "account\/create-email-password-session.md", @@ -2584,7 +2584,7 @@ "x-appwrite": { "method": "updateMagicURLSession", "group": "sessions", - "weight": 27, + "weight": 26, "cookies": false, "type": "", "demo": "account\/update-magic-url-session.md", @@ -2671,7 +2671,7 @@ "x-appwrite": { "method": "updatePhoneSession", "group": "sessions", - "weight": 28, + "weight": 27, "cookies": false, "type": "", "demo": "account\/update-phone-session.md", @@ -2758,7 +2758,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 19, + "weight": 18, "cookies": false, "type": "", "demo": "account\/create-session.md", @@ -2839,7 +2839,7 @@ "x-appwrite": { "method": "getSession", "group": "sessions", - "weight": 14, + "weight": 13, "cookies": false, "type": "", "demo": "account\/get-session.md", @@ -2903,7 +2903,7 @@ "x-appwrite": { "method": "updateSession", "group": "sessions", - "weight": 16, + "weight": 15, "cookies": false, "type": "", "demo": "account\/update-session.md", @@ -2962,7 +2962,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 15, + "weight": 14, "cookies": false, "type": "", "demo": "account\/delete-session.md", @@ -3028,7 +3028,7 @@ "x-appwrite": { "method": "updateStatus", "group": "account", - "weight": 38, + "weight": 37, "cookies": false, "type": "", "demo": "account\/update-status.md", @@ -3084,7 +3084,7 @@ "x-appwrite": { "method": "createEmailToken", "group": "tokens", - "weight": 26, + "weight": 25, "cookies": false, "type": "", "demo": "account\/create-email-token.md", @@ -3176,7 +3176,7 @@ "x-appwrite": { "method": "createMagicURLToken", "group": "tokens", - "weight": 25, + "weight": 24, "cookies": false, "type": "", "demo": "account\/create-magic-url-token.md", @@ -3269,7 +3269,7 @@ "x-appwrite": { "method": "createOAuth2Token", "group": "tokens", - "weight": 24, + "weight": 23, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-token.md", @@ -3412,7 +3412,7 @@ "x-appwrite": { "method": "createPhoneToken", "group": "tokens", - "weight": 29, + "weight": 28, "cookies": false, "type": "", "demo": "account\/create-phone-token.md", @@ -3498,7 +3498,7 @@ "x-appwrite": { "method": "createEmailVerification", "group": "verification", - "weight": 41, + "weight": 40, "cookies": false, "type": "", "demo": "account\/create-email-verification.md", @@ -3626,7 +3626,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "verification", - "weight": 42, + "weight": 41, "cookies": false, "type": "", "demo": "account\/update-email-verification.md", @@ -3767,7 +3767,7 @@ "x-appwrite": { "method": "createPhoneVerification", "group": "verification", - "weight": 43, + "weight": 42, "cookies": false, "type": "", "demo": "account\/create-phone-verification.md", @@ -3824,7 +3824,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "verification", - "weight": 44, + "weight": 43, "cookies": false, "type": "", "demo": "account\/update-phone-verification.md", @@ -3905,7 +3905,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 51, + "weight": 50, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4033,7 +4033,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 50, + "weight": 49, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4167,7 +4167,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 54, + "weight": 53, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4233,7 +4233,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 52, + "weight": 51, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4723,7 +4723,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 53, + "weight": 52, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4809,7 +4809,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 56, + "weight": 55, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -4903,7 +4903,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 55, + "weight": 54, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -4997,7 +4997,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 57, + "weight": 56, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5712,7 +5712,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 321, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -5830,7 +5830,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 317, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -5952,7 +5952,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 381, + "weight": 362, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6021,7 +6021,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 377, + "weight": 358, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6093,7 +6093,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 378, + "weight": 359, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6158,7 +6158,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 379, + "weight": 360, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6239,7 +6239,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 380, + "weight": 361, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6306,7 +6306,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 382, + "weight": 363, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6389,7 +6389,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 318, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -6485,7 +6485,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 319, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -6603,7 +6603,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 320, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -6698,7 +6698,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 329, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -6794,7 +6794,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 325, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -6925,7 +6925,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 326, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -6999,7 +6999,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 327, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7108,7 +7108,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 328, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7182,7 +7182,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 346, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7279,7 +7279,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 347, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7393,7 +7393,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 348, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -7509,7 +7509,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 349, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -7623,7 +7623,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 350, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -7739,7 +7739,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 351, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -7853,7 +7853,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 352, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -7969,7 +7969,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 353, + "weight": 334, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8093,7 +8093,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 354, + "weight": 335, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8219,7 +8219,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 355, + "weight": 336, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8347,7 +8347,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 356, + "weight": 337, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -8477,7 +8477,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 357, + "weight": 338, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -8605,7 +8605,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 358, + "weight": 339, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -8735,7 +8735,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 359, + "weight": 340, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -8849,7 +8849,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 360, + "weight": 341, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -8965,7 +8965,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 361, + "weight": 342, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9073,7 +9073,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 362, + "weight": 343, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9188,7 +9188,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 363, + "weight": 344, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -9296,7 +9296,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 364, + "weight": 345, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -9411,7 +9411,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 365, + "weight": 346, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -9519,7 +9519,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 366, + "weight": 347, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -9634,7 +9634,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 367, + "weight": 348, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -9776,7 +9776,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 369, + "weight": 350, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -9903,7 +9903,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 370, + "weight": 351, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -10026,7 +10026,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 371, + "weight": 352, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -10140,7 +10140,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 372, + "weight": 353, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -10285,7 +10285,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 344, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -10361,7 +10361,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 345, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -10444,7 +10444,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 368, + "weight": 349, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -10555,7 +10555,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 340, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -10661,7 +10661,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 332, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -10856,7 +10856,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 337, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -10993,7 +10993,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 335, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -11098,7 +11098,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 339, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -11197,7 +11197,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 333, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -11302,7 +11302,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 336, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -11456,7 +11456,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 334, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -11568,7 +11568,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 338, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -11671,7 +11671,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 343, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -11794,7 +11794,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 342, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -11915,7 +11915,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 376, + "weight": 357, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -12010,7 +12010,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 373, + "weight": 354, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -12151,7 +12151,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 374, + "weight": 355, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -12227,7 +12227,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 375, + "weight": 356, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -12308,7 +12308,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 457, + "weight": 438, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -12391,7 +12391,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 454, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -12705,7 +12705,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 459, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -12756,7 +12756,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 460, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -12807,7 +12807,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 455, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -12868,7 +12868,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 456, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -13178,7 +13178,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 458, + "weight": 439, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -13241,7 +13241,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 463, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -13320,7 +13320,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 464, + "weight": 445, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -13411,7 +13411,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 461, + "weight": 442, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -13505,7 +13505,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 469, + "weight": 450, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -13592,7 +13592,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 466, + "weight": 447, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -13714,7 +13714,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 467, + "weight": 448, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -13812,7 +13812,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 462, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -13876,7 +13876,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 465, + "weight": 446, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -13945,7 +13945,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 468, + "weight": 449, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -14032,7 +14032,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 470, + "weight": 451, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -14101,7 +14101,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 473, + "weight": 454, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -14186,7 +14186,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 471, + "weight": 452, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -14307,7 +14307,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 472, + "weight": 453, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -14374,7 +14374,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 474, + "weight": 455, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -14443,7 +14443,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 479, + "weight": 460, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -14504,7 +14504,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 477, + "weight": 458, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -14596,7 +14596,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 478, + "weight": 459, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -14665,7 +14665,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 480, + "weight": 461, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -14761,7 +14761,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 481, + "weight": 462, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -14832,7 +14832,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 242, + "weight": 225, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -14909,7 +14909,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 241, + "weight": 224, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -14984,7 +14984,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 69, + "weight": 68, "cookies": false, "type": "", "demo": "health\/get.md", @@ -15036,7 +15036,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 90, + "weight": 89, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -15088,7 +15088,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 72, + "weight": 71, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -15140,7 +15140,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 77, + "weight": 76, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -15201,7 +15201,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 71, + "weight": 70, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -15253,7 +15253,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 73, + "weight": 72, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -15305,7 +15305,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 79, + "weight": 78, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -15368,7 +15368,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 78, + "weight": 77, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -15431,7 +15431,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 80, + "weight": 79, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -15503,7 +15503,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 81, + "weight": 80, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -15566,7 +15566,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 91, + "weight": 90, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -15653,7 +15653,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 85, + "weight": 84, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -15716,7 +15716,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 76, + "weight": 75, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -15779,7 +15779,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 82, + "weight": 81, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -15842,7 +15842,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 83, + "weight": 82, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -15905,7 +15905,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 84, + "weight": 83, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -15968,7 +15968,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 86, + "weight": 85, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -16031,7 +16031,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 87, + "weight": 86, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -16094,7 +16094,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 75, + "weight": 74, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -16157,7 +16157,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 89, + "weight": 88, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -16209,7 +16209,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 88, + "weight": 87, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -16261,7 +16261,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 74, + "weight": 73, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -16313,7 +16313,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 61, + "weight": 60, "cookies": false, "type": "", "demo": "locale\/get.md", @@ -16368,7 +16368,7 @@ "x-appwrite": { "method": "listCodes", "group": null, - "weight": 62, + "weight": 61, "cookies": false, "type": "", "demo": "locale\/list-codes.md", @@ -16423,7 +16423,7 @@ "x-appwrite": { "method": "listContinents", "group": null, - "weight": 66, + "weight": 65, "cookies": false, "type": "", "demo": "locale\/list-continents.md", @@ -16478,7 +16478,7 @@ "x-appwrite": { "method": "listCountries", "group": null, - "weight": 63, + "weight": 62, "cookies": false, "type": "", "demo": "locale\/list-countries.md", @@ -16533,7 +16533,7 @@ "x-appwrite": { "method": "listCountriesEU", "group": null, - "weight": 64, + "weight": 63, "cookies": false, "type": "", "demo": "locale\/list-countries-eu.md", @@ -16588,7 +16588,7 @@ "x-appwrite": { "method": "listCountriesPhones", "group": null, - "weight": 65, + "weight": 64, "cookies": false, "type": "", "demo": "locale\/list-countries-phones.md", @@ -16643,7 +16643,7 @@ "x-appwrite": { "method": "listCurrencies", "group": null, - "weight": 67, + "weight": 66, "cookies": false, "type": "", "demo": "locale\/list-currencies.md", @@ -16698,7 +16698,7 @@ "x-appwrite": { "method": "listLanguages", "group": null, - "weight": 68, + "weight": 67, "cookies": false, "type": "", "demo": "locale\/list-languages.md", @@ -16753,7 +16753,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 299, + "weight": 280, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -16839,7 +16839,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 296, + "weight": 277, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -17000,7 +17000,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 303, + "weight": 284, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -17168,7 +17168,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 298, + "weight": 279, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -17367,7 +17367,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 305, + "weight": 286, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -17581,7 +17581,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 297, + "weight": 278, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -17774,7 +17774,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 304, + "weight": 285, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -17966,7 +17966,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 302, + "weight": 283, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -18023,7 +18023,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 306, + "weight": 287, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -18085,7 +18085,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 300, + "weight": 281, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -18168,7 +18168,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 301, + "weight": 282, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -18251,7 +18251,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 270, + "weight": 251, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -18337,7 +18337,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 269, + "weight": 250, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -18529,7 +18529,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 283, + "weight": 264, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -18718,7 +18718,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 268, + "weight": 249, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -18879,7 +18879,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 282, + "weight": 263, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -19036,7 +19036,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 259, + "weight": 240, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -19167,7 +19167,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 273, + "weight": 254, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -19296,7 +19296,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 263, + "weight": 244, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -19402,7 +19402,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 277, + "weight": 258, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -19506,7 +19506,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 261, + "weight": 242, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -19624,7 +19624,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 275, + "weight": 256, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -19740,7 +19740,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 260, + "weight": 241, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -19858,7 +19858,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 274, + "weight": 255, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -19974,7 +19974,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 262, + "weight": 243, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -20224,7 +20224,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 276, + "weight": 257, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -20469,7 +20469,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 264, + "weight": 245, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -20575,7 +20575,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 278, + "weight": 259, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -20679,7 +20679,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 265, + "weight": 246, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -20785,7 +20785,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 279, + "weight": 260, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -20889,7 +20889,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 266, + "weight": 247, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -20995,7 +20995,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 280, + "weight": 261, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -21099,7 +21099,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 267, + "weight": 248, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -21205,7 +21205,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 281, + "weight": 262, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -21307,7 +21307,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 272, + "weight": 253, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -21364,7 +21364,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 284, + "weight": 265, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -21426,7 +21426,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 271, + "weight": 252, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -21509,7 +21509,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 293, + "weight": 274, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -21592,7 +21592,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 286, + "weight": 267, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -21676,7 +21676,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 285, + "weight": 266, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -21766,7 +21766,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 288, + "weight": 269, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -21828,7 +21828,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 289, + "weight": 270, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -21911,7 +21911,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 290, + "weight": 271, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -21973,7 +21973,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 287, + "weight": 268, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -22056,7 +22056,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 292, + "weight": 273, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -22148,7 +22148,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 291, + "weight": 272, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -22238,7 +22238,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 294, + "weight": 275, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -22303,7 +22303,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 295, + "weight": 276, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -22376,7 +22376,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 486, + "weight": 467, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -22459,7 +22459,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 484, + "weight": 465, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -22731,7 +22731,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 489, + "weight": 470, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -22782,7 +22782,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 512, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -22833,7 +22833,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 485, + "weight": 466, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -22894,7 +22894,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 487, + "weight": 468, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -23161,7 +23161,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 488, + "weight": 469, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -23224,7 +23224,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 495, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -23303,7 +23303,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 494, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -23394,7 +23394,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 490, + "weight": 471, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -23496,7 +23496,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 498, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -23577,7 +23577,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 491, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -23699,7 +23699,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 492, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -23798,7 +23798,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 493, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -23862,7 +23862,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 496, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -23931,7 +23931,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 497, + "weight": 478, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -24018,7 +24018,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 499, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -24087,7 +24087,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 501, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -24169,7 +24169,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 500, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -24235,7 +24235,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 502, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -24304,7 +24304,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 505, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -24365,7 +24365,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 503, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -24457,7 +24457,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 504, + "weight": 485, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -24526,7 +24526,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 506, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -24622,7 +24622,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 507, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -24691,7 +24691,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 146, + "weight": 520, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -24775,7 +24775,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 145, + "weight": 518, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -24922,7 +24922,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 147, + "weight": 519, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -24984,7 +24984,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 148, + "weight": 521, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -25127,7 +25127,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 149, + "weight": 522, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -25189,7 +25189,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 151, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -25284,7 +25284,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 150, + "weight": 523, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -25377,7 +25377,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 152, + "weight": 524, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -25450,13 +25450,13 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 157, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/update-file.md", - "rate-limit": 60, - "rate-time": 60, - "rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}", + "rate-limit": 0, + "rate-time": 3600, + "rate-key": "url:{url},ip:{ip}", "scope": "files.write", "platforms": [ "console", @@ -25482,7 +25482,7 @@ "parameters": [ { "name": "bucketId", - "description": "Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https:\/\/appwrite.io\/docs\/server\/storage#createBucket).", + "description": "Bucket unique ID.", "required": true, "type": "string", "x-example": "", @@ -25490,7 +25490,7 @@ }, { "name": "fileId", - "description": "File unique ID.", + "description": "File ID.", "required": true, "type": "string", "x-example": "", @@ -25504,14 +25504,13 @@ "properties": { "name": { "type": "string", - "description": "Name of the file", + "description": "File name.", "default": null, - "x-example": "", - "x-nullable": true + "x-example": "" }, "permissions": { "type": "array", - "description": "An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", + "description": "An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", "default": null, "x-example": "[\"read(\"any\")\"]", "x-nullable": true, @@ -25544,7 +25543,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 158, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -25617,7 +25616,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 154, + "weight": 529, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -25699,7 +25698,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 153, + "weight": 528, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -25909,7 +25908,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 155, + "weight": 530, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -25991,7 +25990,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 387, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -26075,7 +26074,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 383, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -26160,7 +26159,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 446, + "weight": 427, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -26232,7 +26231,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 442, + "weight": 423, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -26307,7 +26306,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 443, + "weight": 424, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -26375,7 +26374,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 444, + "weight": 425, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -26459,7 +26458,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 445, + "weight": 426, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -26529,7 +26528,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 447, + "weight": 428, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -26615,7 +26614,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 384, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -26677,7 +26676,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 385, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -26758,7 +26757,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 386, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -26820,7 +26819,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 394, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -26915,7 +26914,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 390, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -27045,7 +27044,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 391, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -27118,7 +27117,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 392, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -27226,7 +27225,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 393, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -27299,7 +27298,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 399, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -27395,7 +27394,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 400, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -27508,7 +27507,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 401, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -27623,7 +27622,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 402, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -27736,7 +27735,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 403, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -27851,7 +27850,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 404, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -27964,7 +27963,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 405, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -28079,7 +28078,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 406, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -28202,7 +28201,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 407, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -28327,7 +28326,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 408, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -28454,7 +28453,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 409, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -28583,7 +28582,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 410, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -28710,7 +28709,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 411, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -28839,7 +28838,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 412, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -28952,7 +28951,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 413, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -29067,7 +29066,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 414, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -29174,7 +29173,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 415, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -29288,7 +29287,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 416, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -29395,7 +29394,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 417, + "weight": 398, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -29509,7 +29508,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 418, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -29616,7 +29615,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 419, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -29730,7 +29729,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 420, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -29871,7 +29870,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 422, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -29997,7 +29996,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 423, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -30119,7 +30118,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 424, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -30232,7 +30231,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 425, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -30376,7 +30375,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 397, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -30451,7 +30450,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 398, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -30533,7 +30532,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 421, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -30643,7 +30642,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 429, + "weight": 410, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -30737,7 +30736,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 426, + "weight": 407, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -30877,7 +30876,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 427, + "weight": 408, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -30952,7 +30951,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 428, + "weight": 409, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -31032,7 +31031,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 438, + "weight": 419, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -31137,7 +31136,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 430, + "weight": 411, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -31323,7 +31322,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 435, + "weight": 416, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -31455,7 +31454,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 433, + "weight": 414, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -31559,7 +31558,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 437, + "weight": 418, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -31657,7 +31656,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 431, + "weight": 412, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -31761,7 +31760,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 434, + "weight": 415, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -31910,7 +31909,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 432, + "weight": 413, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -32021,7 +32020,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 436, + "weight": 417, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -32123,7 +32122,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 441, + "weight": 422, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -32245,7 +32244,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 440, + "weight": 421, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -32365,7 +32364,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 162, + "weight": 145, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -32452,7 +32451,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 161, + "weight": 144, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -32545,7 +32544,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 163, + "weight": 146, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -32610,7 +32609,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 165, + "weight": 148, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -32688,7 +32687,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 167, + "weight": 150, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -32753,7 +32752,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 169, + "weight": 152, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -32848,7 +32847,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 168, + "weight": 151, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -32971,7 +32970,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 170, + "weight": 153, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -33044,7 +33043,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 171, + "weight": 154, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -33140,7 +33139,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 173, + "weight": 156, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -33215,7 +33214,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 172, + "weight": 155, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -33312,7 +33311,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 164, + "weight": 147, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -33376,7 +33375,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 166, + "weight": 149, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -33458,7 +33457,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 524, + "weight": 515, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -33548,7 +33547,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 522, + "weight": 513, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -33633,7 +33632,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 523, + "weight": 514, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -33694,7 +33693,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 525, + "weight": 516, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -33766,7 +33765,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 526, + "weight": 517, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -33827,7 +33826,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 184, + "weight": 167, "cookies": false, "type": "", "demo": "users\/list.md", @@ -33911,7 +33910,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 175, + "weight": 158, "cookies": false, "type": "", "demo": "users\/create.md", @@ -34011,7 +34010,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 178, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -34105,7 +34104,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 176, + "weight": 159, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -34197,7 +34196,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 192, + "weight": 175, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -34278,7 +34277,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 215, + "weight": 198, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -34342,7 +34341,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 177, + "weight": 160, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -34436,7 +34435,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 180, + "weight": 163, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -34530,7 +34529,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 181, + "weight": 164, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -34659,7 +34658,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 182, + "weight": 165, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -34774,7 +34773,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 179, + "weight": 162, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -34887,7 +34886,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 185, + "weight": 168, "cookies": false, "type": "", "demo": "users\/get.md", @@ -34944,7 +34943,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 213, + "weight": 196, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -35008,7 +35007,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 198, + "weight": 181, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -35090,7 +35089,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 216, + "weight": 199, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -35175,7 +35174,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 194, + "weight": 177, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -35258,7 +35257,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 190, + "weight": 173, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -35341,7 +35340,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 189, + "weight": 172, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -35435,7 +35434,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 203, + "weight": 186, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -35574,7 +35573,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 208, + "weight": 191, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -35709,7 +35708,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 204, + "weight": 187, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -35829,7 +35828,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 205, + "weight": 188, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -35949,7 +35948,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 207, + "weight": 190, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -36069,7 +36068,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 206, + "weight": 189, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -36191,7 +36190,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 196, + "weight": 179, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -36273,7 +36272,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 197, + "weight": 180, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -36355,7 +36354,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 199, + "weight": 182, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -36435,7 +36434,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 186, + "weight": 169, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -36497,7 +36496,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 201, + "weight": 184, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -36577,7 +36576,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 188, + "weight": 171, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -36648,7 +36647,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 209, + "weight": 192, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -36705,7 +36704,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 212, + "weight": 195, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -36764,7 +36763,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 211, + "weight": 194, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -36836,7 +36835,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 193, + "weight": 176, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -36916,7 +36915,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 191, + "weight": 174, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -36999,7 +36998,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 183, + "weight": 166, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -37112,7 +37111,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 187, + "weight": 170, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -37182,7 +37181,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 202, + "weight": 185, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -37274,7 +37273,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 214, + "weight": 197, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -37346,7 +37345,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 210, + "weight": 193, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -37431,7 +37430,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 200, + "weight": 183, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -37513,7 +37512,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 195, + "weight": 178, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -37633,7 +37632,7 @@ }, { "name": "console", - "description": "The Console service allows you to interact with console relevant informations." + "description": "The Console service allows you to interact with console relevant information." }, { "name": "migrations", diff --git a/app/config/specs/swagger2-latest-client.json b/app/config/specs/swagger2-latest-client.json index 671dfe85d8..e11d5053a4 100644 --- a/app/config/specs/swagger2-latest-client.json +++ b/app/config/specs/swagger2-latest-client.json @@ -94,7 +94,7 @@ "x-appwrite": { "method": "get", "group": "account", - "weight": 10, + "weight": 9, "cookies": false, "type": "", "demo": "account\/get.md", @@ -147,7 +147,7 @@ "x-appwrite": { "method": "create", "group": "account", - "weight": 9, + "weight": 8, "cookies": false, "type": "", "demo": "account\/create.md", @@ -242,7 +242,7 @@ "x-appwrite": { "method": "updateEmail", "group": "account", - "weight": 35, + "weight": 34, "cookies": false, "type": "", "demo": "account\/update-email.md", @@ -322,7 +322,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 48, + "weight": 47, "cookies": false, "type": "", "demo": "account\/list-identities.md", @@ -395,7 +395,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 49, + "weight": 48, "cookies": false, "type": "", "demo": "account\/delete-identity.md", @@ -460,7 +460,7 @@ "x-appwrite": { "method": "createJWT", "group": "tokens", - "weight": 30, + "weight": 29, "cookies": false, "type": "", "demo": "account\/create-jwt.md", @@ -530,7 +530,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 32, + "weight": 31, "cookies": false, "type": "", "demo": "account\/list-logs.md", @@ -608,7 +608,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 307, + "weight": 288, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -683,7 +683,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 309, + "weight": 290, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -807,7 +807,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 310, + "weight": 291, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -948,7 +948,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 311, + "weight": 292, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1072,7 +1072,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 315, + "weight": 296, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1209,7 +1209,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 316, + "weight": 297, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1349,7 +1349,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 308, + "weight": 289, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1450,7 +1450,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 314, + "weight": 295, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1551,7 +1551,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 312, + "weight": 293, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1652,7 +1652,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 313, + "weight": 294, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -1755,7 +1755,7 @@ "x-appwrite": { "method": "updateName", "group": "account", - "weight": 33, + "weight": 32, "cookies": false, "type": "", "demo": "account\/update-name.md", @@ -1830,7 +1830,7 @@ "x-appwrite": { "method": "updatePassword", "group": "account", - "weight": 34, + "weight": 33, "cookies": false, "type": "", "demo": "account\/update-password.md", @@ -1911,7 +1911,7 @@ "x-appwrite": { "method": "updatePhone", "group": "account", - "weight": 36, + "weight": 35, "cookies": false, "type": "", "demo": "account\/update-phone.md", @@ -1991,7 +1991,7 @@ "x-appwrite": { "method": "getPrefs", "group": "account", - "weight": 31, + "weight": 30, "cookies": false, "type": "", "demo": "account\/get-prefs.md", @@ -2044,7 +2044,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "account", - "weight": 37, + "weight": 36, "cookies": false, "type": "", "demo": "account\/update-prefs.md", @@ -2119,7 +2119,7 @@ "x-appwrite": { "method": "createRecovery", "group": "recovery", - "weight": 39, + "weight": 38, "cookies": false, "type": "", "demo": "account\/create-recovery.md", @@ -2202,7 +2202,7 @@ "x-appwrite": { "method": "updateRecovery", "group": "recovery", - "weight": 40, + "weight": 39, "cookies": false, "type": "", "demo": "account\/update-recovery.md", @@ -2289,7 +2289,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 12, + "weight": 11, "cookies": false, "type": "", "demo": "account\/list-sessions.md", @@ -2337,7 +2337,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 13, + "weight": 12, "cookies": false, "type": "", "demo": "account\/delete-sessions.md", @@ -2392,7 +2392,7 @@ "x-appwrite": { "method": "createAnonymousSession", "group": "sessions", - "weight": 18, + "weight": 17, "cookies": false, "type": "", "demo": "account\/create-anonymous-session.md", @@ -2447,7 +2447,7 @@ "x-appwrite": { "method": "createEmailPasswordSession", "group": "sessions", - "weight": 17, + "weight": 16, "cookies": false, "type": "", "demo": "account\/create-email-password-session.md", @@ -2529,7 +2529,7 @@ "x-appwrite": { "method": "updateMagicURLSession", "group": "sessions", - "weight": 27, + "weight": 26, "cookies": false, "type": "", "demo": "account\/update-magic-url-session.md", @@ -2610,7 +2610,7 @@ "x-appwrite": { "method": "createOAuth2Session", "group": "sessions", - "weight": 20, + "weight": 19, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-session.md", @@ -2752,7 +2752,7 @@ "x-appwrite": { "method": "updatePhoneSession", "group": "sessions", - "weight": 28, + "weight": 27, "cookies": false, "type": "", "demo": "account\/update-phone-session.md", @@ -2838,7 +2838,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 19, + "weight": 18, "cookies": false, "type": "", "demo": "account\/create-session.md", @@ -2918,7 +2918,7 @@ "x-appwrite": { "method": "getSession", "group": "sessions", - "weight": 14, + "weight": 13, "cookies": false, "type": "", "demo": "account\/get-session.md", @@ -2981,7 +2981,7 @@ "x-appwrite": { "method": "updateSession", "group": "sessions", - "weight": 16, + "weight": 15, "cookies": false, "type": "", "demo": "account\/update-session.md", @@ -3039,7 +3039,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 15, + "weight": 14, "cookies": false, "type": "", "demo": "account\/delete-session.md", @@ -3104,7 +3104,7 @@ "x-appwrite": { "method": "updateStatus", "group": "account", - "weight": 38, + "weight": 37, "cookies": false, "type": "", "demo": "account\/update-status.md", @@ -3159,7 +3159,7 @@ "x-appwrite": { "method": "createPushTarget", "group": "pushTargets", - "weight": 45, + "weight": 44, "cookies": false, "type": "", "demo": "account\/create-push-target.md", @@ -3245,7 +3245,7 @@ "x-appwrite": { "method": "updatePushTarget", "group": "pushTargets", - "weight": 46, + "weight": 45, "cookies": false, "type": "", "demo": "account\/update-push-target.md", @@ -3319,7 +3319,7 @@ "x-appwrite": { "method": "deletePushTarget", "group": "pushTargets", - "weight": 47, + "weight": 46, "cookies": false, "type": "", "demo": "account\/delete-push-target.md", @@ -3382,7 +3382,7 @@ "x-appwrite": { "method": "createEmailToken", "group": "tokens", - "weight": 26, + "weight": 25, "cookies": false, "type": "", "demo": "account\/create-email-token.md", @@ -3473,7 +3473,7 @@ "x-appwrite": { "method": "createMagicURLToken", "group": "tokens", - "weight": 25, + "weight": 24, "cookies": false, "type": "", "demo": "account\/create-magic-url-token.md", @@ -3565,7 +3565,7 @@ "x-appwrite": { "method": "createOAuth2Token", "group": "tokens", - "weight": 24, + "weight": 23, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-token.md", @@ -3707,7 +3707,7 @@ "x-appwrite": { "method": "createPhoneToken", "group": "tokens", - "weight": 29, + "weight": 28, "cookies": false, "type": "", "demo": "account\/create-phone-token.md", @@ -3792,7 +3792,7 @@ "x-appwrite": { "method": "createEmailVerification", "group": "verification", - "weight": 41, + "weight": 40, "cookies": false, "type": "", "demo": "account\/create-email-verification.md", @@ -3917,7 +3917,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "verification", - "weight": 42, + "weight": 41, "cookies": false, "type": "", "demo": "account\/update-email-verification.md", @@ -4055,7 +4055,7 @@ "x-appwrite": { "method": "createPhoneVerification", "group": "verification", - "weight": 43, + "weight": 42, "cookies": false, "type": "", "demo": "account\/create-phone-verification.md", @@ -4111,7 +4111,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "verification", - "weight": 44, + "weight": 43, "cookies": false, "type": "", "demo": "account\/update-phone-verification.md", @@ -4191,7 +4191,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 51, + "weight": 50, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4317,7 +4317,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 50, + "weight": 49, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4449,7 +4449,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 54, + "weight": 53, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4513,7 +4513,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 52, + "weight": 51, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -5001,7 +5001,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 53, + "weight": 52, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -5085,7 +5085,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 56, + "weight": 55, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5177,7 +5177,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 55, + "weight": 54, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5269,7 +5269,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 57, + "weight": 56, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5982,7 +5982,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 381, + "weight": 362, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6049,7 +6049,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 377, + "weight": 358, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6119,7 +6119,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 378, + "weight": 359, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6182,7 +6182,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 379, + "weight": 360, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6261,7 +6261,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 380, + "weight": 361, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6326,7 +6326,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 382, + "weight": 363, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6407,7 +6407,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 340, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -6511,7 +6511,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 332, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -6670,7 +6670,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 333, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -6773,7 +6773,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 336, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -6924,7 +6924,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 334, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -7034,7 +7034,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 338, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -7135,7 +7135,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 343, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -7256,7 +7256,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 342, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -7375,7 +7375,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 473, + "weight": 454, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -7458,7 +7458,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 471, + "weight": 452, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -7577,7 +7577,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 472, + "weight": 453, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -7649,7 +7649,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 242, + "weight": 225, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -7724,7 +7724,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 241, + "weight": 224, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -7797,7 +7797,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 61, + "weight": 60, "cookies": false, "type": "", "demo": "locale\/get.md", @@ -7850,7 +7850,7 @@ "x-appwrite": { "method": "listCodes", "group": null, - "weight": 62, + "weight": 61, "cookies": false, "type": "", "demo": "locale\/list-codes.md", @@ -7903,7 +7903,7 @@ "x-appwrite": { "method": "listContinents", "group": null, - "weight": 66, + "weight": 65, "cookies": false, "type": "", "demo": "locale\/list-continents.md", @@ -7956,7 +7956,7 @@ "x-appwrite": { "method": "listCountries", "group": null, - "weight": 63, + "weight": 62, "cookies": false, "type": "", "demo": "locale\/list-countries.md", @@ -8009,7 +8009,7 @@ "x-appwrite": { "method": "listCountriesEU", "group": null, - "weight": 64, + "weight": 63, "cookies": false, "type": "", "demo": "locale\/list-countries-eu.md", @@ -8062,7 +8062,7 @@ "x-appwrite": { "method": "listCountriesPhones", "group": null, - "weight": 65, + "weight": 64, "cookies": false, "type": "", "demo": "locale\/list-countries-phones.md", @@ -8115,7 +8115,7 @@ "x-appwrite": { "method": "listCurrencies", "group": null, - "weight": 67, + "weight": 66, "cookies": false, "type": "", "demo": "locale\/list-currencies.md", @@ -8168,7 +8168,7 @@ "x-appwrite": { "method": "listLanguages", "group": null, - "weight": 68, + "weight": 67, "cookies": false, "type": "", "demo": "locale\/list-languages.md", @@ -8223,7 +8223,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 291, + "weight": 272, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -8308,7 +8308,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 295, + "weight": 276, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -8379,7 +8379,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 151, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -8472,7 +8472,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 150, + "weight": 523, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -8563,7 +8563,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 152, + "weight": 524, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -8634,13 +8634,13 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 157, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/update-file.md", - "rate-limit": 60, - "rate-time": 60, - "rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}", + "rate-limit": 0, + "rate-time": 3600, + "rate-key": "url:{url},ip:{ip}", "scope": "files.write", "platforms": [ "console", @@ -8664,7 +8664,7 @@ "parameters": [ { "name": "bucketId", - "description": "Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https:\/\/appwrite.io\/docs\/server\/storage#createBucket).", + "description": "Bucket unique ID.", "required": true, "type": "string", "x-example": "", @@ -8672,7 +8672,7 @@ }, { "name": "fileId", - "description": "File unique ID.", + "description": "File ID.", "required": true, "type": "string", "x-example": "", @@ -8686,14 +8686,13 @@ "properties": { "name": { "type": "string", - "description": "Name of the file", + "description": "File name.", "default": null, - "x-example": "", - "x-nullable": true + "x-example": "" }, "permissions": { "type": "array", - "description": "An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", + "description": "An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", "default": null, "x-example": "[\"read(\"any\")\"]", "x-nullable": true, @@ -8726,7 +8725,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 158, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -8797,7 +8796,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 154, + "weight": 529, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -8877,7 +8876,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 153, + "weight": 528, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -9085,7 +9084,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 155, + "weight": 530, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -9165,7 +9164,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 446, + "weight": 427, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -9235,7 +9234,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 442, + "weight": 423, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -9308,7 +9307,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 443, + "weight": 424, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -9374,7 +9373,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 444, + "weight": 425, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -9456,7 +9455,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 445, + "weight": 426, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -9524,7 +9523,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 447, + "weight": 428, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -9608,7 +9607,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 438, + "weight": 419, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -9711,7 +9710,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 430, + "weight": 411, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -9865,7 +9864,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 431, + "weight": 412, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -9967,7 +9966,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 434, + "weight": 415, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -10113,7 +10112,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 432, + "weight": 413, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -10222,7 +10221,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 436, + "weight": 417, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -10322,7 +10321,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 441, + "weight": 422, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -10442,7 +10441,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 440, + "weight": 421, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -10560,7 +10559,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 162, + "weight": 145, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -10645,7 +10644,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 161, + "weight": 144, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -10736,7 +10735,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 163, + "weight": 146, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -10799,7 +10798,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 165, + "weight": 148, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -10875,7 +10874,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 167, + "weight": 150, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -10938,7 +10937,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 169, + "weight": 152, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -11031,7 +11030,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 168, + "weight": 151, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -11152,7 +11151,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 170, + "weight": 153, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -11223,7 +11222,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 171, + "weight": 154, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -11317,7 +11316,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 173, + "weight": 156, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -11390,7 +11389,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 172, + "weight": 155, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -11486,7 +11485,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 164, + "weight": 147, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -11549,7 +11548,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 166, + "weight": 149, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -11670,7 +11669,7 @@ }, { "name": "console", - "description": "The Console service allows you to interact with console relevant informations." + "description": "The Console service allows you to interact with console relevant information." }, { "name": "migrations", diff --git a/app/config/specs/swagger2-latest-console.json b/app/config/specs/swagger2-latest-console.json index ee057d33ff..21f8513e16 100644 --- a/app/config/specs/swagger2-latest-console.json +++ b/app/config/specs/swagger2-latest-console.json @@ -73,6 +73,12 @@ "x-appwrite": { "demo": "" } + }, + "Cookie": { + "type": "apiKey", + "name": "Cookie", + "description": "The user cookie to authenticate with", + "in": "header" } }, "paths": { @@ -100,7 +106,7 @@ "x-appwrite": { "method": "get", "group": "account", - "weight": 10, + "weight": 9, "cookies": false, "type": "", "demo": "account\/get.md", @@ -152,7 +158,7 @@ "x-appwrite": { "method": "create", "group": "account", - "weight": 9, + "weight": 8, "cookies": false, "type": "", "demo": "account\/create.md", @@ -239,7 +245,7 @@ "x-appwrite": { "method": "delete", "group": "account", - "weight": 11, + "weight": 10, "cookies": false, "type": "", "demo": "account\/delete.md", @@ -290,7 +296,7 @@ "x-appwrite": { "method": "updateEmail", "group": "account", - "weight": 35, + "weight": 34, "cookies": false, "type": "", "demo": "account\/update-email.md", @@ -369,7 +375,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 48, + "weight": 47, "cookies": false, "type": "", "demo": "account\/list-identities.md", @@ -441,7 +447,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 49, + "weight": 48, "cookies": false, "type": "", "demo": "account\/delete-identity.md", @@ -505,7 +511,7 @@ "x-appwrite": { "method": "createJWT", "group": "tokens", - "weight": 30, + "weight": 29, "cookies": false, "type": "", "demo": "account\/create-jwt.md", @@ -574,7 +580,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 32, + "weight": 31, "cookies": false, "type": "", "demo": "account\/list-logs.md", @@ -651,7 +657,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 307, + "weight": 288, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -725,7 +731,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 309, + "weight": 290, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -848,7 +854,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 310, + "weight": 291, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -988,7 +994,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 311, + "weight": 292, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1111,7 +1117,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 315, + "weight": 296, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1247,7 +1253,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 316, + "weight": 297, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1386,7 +1392,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 308, + "weight": 289, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1486,7 +1492,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 314, + "weight": 295, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1586,7 +1592,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 312, + "weight": 293, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1686,7 +1692,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 313, + "weight": 294, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -1788,7 +1794,7 @@ "x-appwrite": { "method": "updateName", "group": "account", - "weight": 33, + "weight": 32, "cookies": false, "type": "", "demo": "account\/update-name.md", @@ -1862,7 +1868,7 @@ "x-appwrite": { "method": "updatePassword", "group": "account", - "weight": 34, + "weight": 33, "cookies": false, "type": "", "demo": "account\/update-password.md", @@ -1942,7 +1948,7 @@ "x-appwrite": { "method": "updatePhone", "group": "account", - "weight": 36, + "weight": 35, "cookies": false, "type": "", "demo": "account\/update-phone.md", @@ -2021,7 +2027,7 @@ "x-appwrite": { "method": "getPrefs", "group": "account", - "weight": 31, + "weight": 30, "cookies": false, "type": "", "demo": "account\/get-prefs.md", @@ -2073,7 +2079,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "account", - "weight": 37, + "weight": 36, "cookies": false, "type": "", "demo": "account\/update-prefs.md", @@ -2147,7 +2153,7 @@ "x-appwrite": { "method": "createRecovery", "group": "recovery", - "weight": 39, + "weight": 38, "cookies": false, "type": "", "demo": "account\/create-recovery.md", @@ -2229,7 +2235,7 @@ "x-appwrite": { "method": "updateRecovery", "group": "recovery", - "weight": 40, + "weight": 39, "cookies": false, "type": "", "demo": "account\/update-recovery.md", @@ -2315,7 +2321,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 12, + "weight": 11, "cookies": false, "type": "", "demo": "account\/list-sessions.md", @@ -2362,7 +2368,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 13, + "weight": 12, "cookies": false, "type": "", "demo": "account\/delete-sessions.md", @@ -2416,7 +2422,7 @@ "x-appwrite": { "method": "createAnonymousSession", "group": "sessions", - "weight": 18, + "weight": 17, "cookies": false, "type": "", "demo": "account\/create-anonymous-session.md", @@ -2470,7 +2476,7 @@ "x-appwrite": { "method": "createEmailPasswordSession", "group": "sessions", - "weight": 17, + "weight": 16, "cookies": false, "type": "", "demo": "account\/create-email-password-session.md", @@ -2551,7 +2557,7 @@ "x-appwrite": { "method": "updateMagicURLSession", "group": "sessions", - "weight": 27, + "weight": 26, "cookies": false, "type": "", "demo": "account\/update-magic-url-session.md", @@ -2631,7 +2637,7 @@ "x-appwrite": { "method": "createOAuth2Session", "group": "sessions", - "weight": 20, + "weight": 19, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-session.md", @@ -2772,7 +2778,7 @@ "x-appwrite": { "method": "updatePhoneSession", "group": "sessions", - "weight": 28, + "weight": 27, "cookies": false, "type": "", "demo": "account\/update-phone-session.md", @@ -2857,7 +2863,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 19, + "weight": 18, "cookies": false, "type": "", "demo": "account\/create-session.md", @@ -2936,7 +2942,7 @@ "x-appwrite": { "method": "getSession", "group": "sessions", - "weight": 14, + "weight": 13, "cookies": false, "type": "", "demo": "account\/get-session.md", @@ -2998,7 +3004,7 @@ "x-appwrite": { "method": "updateSession", "group": "sessions", - "weight": 16, + "weight": 15, "cookies": false, "type": "", "demo": "account\/update-session.md", @@ -3055,7 +3061,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 15, + "weight": 14, "cookies": false, "type": "", "demo": "account\/delete-session.md", @@ -3119,7 +3125,7 @@ "x-appwrite": { "method": "updateStatus", "group": "account", - "weight": 38, + "weight": 37, "cookies": false, "type": "", "demo": "account\/update-status.md", @@ -3173,7 +3179,7 @@ "x-appwrite": { "method": "createPushTarget", "group": "pushTargets", - "weight": 45, + "weight": 44, "cookies": false, "type": "", "demo": "account\/create-push-target.md", @@ -3258,7 +3264,7 @@ "x-appwrite": { "method": "updatePushTarget", "group": "pushTargets", - "weight": 46, + "weight": 45, "cookies": false, "type": "", "demo": "account\/update-push-target.md", @@ -3331,7 +3337,7 @@ "x-appwrite": { "method": "deletePushTarget", "group": "pushTargets", - "weight": 47, + "weight": 46, "cookies": false, "type": "", "demo": "account\/delete-push-target.md", @@ -3393,7 +3399,7 @@ "x-appwrite": { "method": "createEmailToken", "group": "tokens", - "weight": 26, + "weight": 25, "cookies": false, "type": "", "demo": "account\/create-email-token.md", @@ -3483,7 +3489,7 @@ "x-appwrite": { "method": "createMagicURLToken", "group": "tokens", - "weight": 25, + "weight": 24, "cookies": false, "type": "", "demo": "account\/create-magic-url-token.md", @@ -3574,7 +3580,7 @@ "x-appwrite": { "method": "createOAuth2Token", "group": "tokens", - "weight": 24, + "weight": 23, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-token.md", @@ -3715,7 +3721,7 @@ "x-appwrite": { "method": "createPhoneToken", "group": "tokens", - "weight": 29, + "weight": 28, "cookies": false, "type": "", "demo": "account\/create-phone-token.md", @@ -3799,7 +3805,7 @@ "x-appwrite": { "method": "createEmailVerification", "group": "verification", - "weight": 41, + "weight": 40, "cookies": false, "type": "", "demo": "account\/create-email-verification.md", @@ -3923,7 +3929,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "verification", - "weight": 42, + "weight": 41, "cookies": false, "type": "", "demo": "account\/update-email-verification.md", @@ -4060,7 +4066,7 @@ "x-appwrite": { "method": "createPhoneVerification", "group": "verification", - "weight": 43, + "weight": 42, "cookies": false, "type": "", "demo": "account\/create-phone-verification.md", @@ -4115,7 +4121,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "verification", - "weight": 44, + "weight": 43, "cookies": false, "type": "", "demo": "account\/update-phone-verification.md", @@ -4194,7 +4200,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 51, + "weight": 50, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4320,7 +4326,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 50, + "weight": 49, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4452,7 +4458,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 54, + "weight": 53, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4516,7 +4522,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 52, + "weight": 51, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -5004,7 +5010,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 53, + "weight": 52, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -5088,7 +5094,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 56, + "weight": 55, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5180,7 +5186,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 55, + "weight": 54, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5272,7 +5278,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 57, + "weight": 56, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5987,7 +5993,7 @@ "x-appwrite": { "method": "chat", "group": "console", - "weight": 244, + "weight": 495, "cookies": false, "type": "", "demo": "assistant\/chat.md", @@ -6051,7 +6057,7 @@ "x-appwrite": { "method": "getResource", "group": null, - "weight": 513, + "weight": 496, "cookies": false, "type": "", "demo": "console\/get-resource.md", @@ -6122,7 +6128,7 @@ "x-appwrite": { "method": "variables", "group": "console", - "weight": 243, + "weight": 494, "cookies": false, "type": "", "demo": "console\/variables.md", @@ -6171,7 +6177,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 321, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -6287,7 +6293,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 317, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -6407,7 +6413,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 381, + "weight": 362, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6474,7 +6480,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 377, + "weight": 358, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6544,7 +6550,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 378, + "weight": 359, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6607,7 +6613,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 379, + "weight": 360, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6686,7 +6692,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 380, + "weight": 361, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6751,7 +6757,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 382, + "weight": 363, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6832,7 +6838,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 324, + "weight": 305, "cookies": false, "type": "", "demo": "databases\/list-usage.md", @@ -6934,7 +6940,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 318, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -7028,7 +7034,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 319, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -7144,7 +7150,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 320, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -7237,7 +7243,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 329, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -7332,7 +7338,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 325, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -7462,7 +7468,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 326, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -7535,7 +7541,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 327, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7643,7 +7649,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 328, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7716,7 +7722,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 346, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7812,7 +7818,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 347, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7925,7 +7931,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 348, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -8040,7 +8046,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 349, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -8153,7 +8159,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 350, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -8268,7 +8274,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 351, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -8381,7 +8387,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 352, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -8496,7 +8502,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 353, + "weight": 334, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8619,7 +8625,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 354, + "weight": 335, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8744,7 +8750,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 355, + "weight": 336, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8871,7 +8877,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 356, + "weight": 337, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -9000,7 +9006,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 357, + "weight": 338, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -9127,7 +9133,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 358, + "weight": 339, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -9256,7 +9262,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 359, + "weight": 340, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -9369,7 +9375,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 360, + "weight": 341, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -9484,7 +9490,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 361, + "weight": 342, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9591,7 +9597,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 362, + "weight": 343, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9705,7 +9711,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 363, + "weight": 344, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -9812,7 +9818,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 364, + "weight": 345, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -9926,7 +9932,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 365, + "weight": 346, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -10033,7 +10039,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 366, + "weight": 347, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -10147,7 +10153,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 367, + "weight": 348, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -10288,7 +10294,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 369, + "weight": 350, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -10414,7 +10420,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 370, + "weight": 351, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -10536,7 +10542,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 371, + "weight": 352, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -10649,7 +10655,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 372, + "weight": 353, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -10793,7 +10799,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 344, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -10868,7 +10874,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 345, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -10950,7 +10956,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 368, + "weight": 349, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -11060,7 +11066,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 340, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -11164,7 +11170,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 332, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -11355,7 +11361,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 337, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -11490,7 +11496,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 335, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -11594,7 +11600,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 339, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -11692,7 +11698,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 333, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -11795,7 +11801,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 336, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -11946,7 +11952,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 334, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -12056,7 +12062,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 338, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -12155,7 +12161,7 @@ "x-appwrite": { "method": "listDocumentLogs", "group": "logs", - "weight": 341, + "weight": 322, "cookies": false, "type": "", "demo": "databases\/list-document-logs.md", @@ -12248,7 +12254,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 343, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -12369,7 +12375,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 342, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -12488,7 +12494,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 376, + "weight": 357, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -12582,7 +12588,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 373, + "weight": 354, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -12722,7 +12728,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 374, + "weight": 355, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -12797,7 +12803,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 375, + "weight": 356, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -12877,7 +12883,7 @@ "x-appwrite": { "method": "listCollectionLogs", "group": "collections", - "weight": 330, + "weight": 311, "cookies": false, "type": "", "demo": "databases\/list-collection-logs.md", @@ -12960,7 +12966,7 @@ "x-appwrite": { "method": "getCollectionUsage", "group": null, - "weight": 331, + "weight": 312, "cookies": false, "type": "", "demo": "databases\/get-collection-usage.md", @@ -13051,7 +13057,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 322, + "weight": 303, "cookies": false, "type": "", "demo": "databases\/list-logs.md", @@ -13156,7 +13162,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 323, + "weight": 304, "cookies": false, "type": "", "demo": "databases\/get-usage.md", @@ -13269,7 +13275,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 457, + "weight": 438, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -13351,7 +13357,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 454, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -13664,7 +13670,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 459, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -13714,7 +13720,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 460, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -13764,7 +13770,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 483, + "weight": 464, "cookies": false, "type": "", "demo": "functions\/list-templates.md", @@ -13948,7 +13954,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 482, + "weight": 463, "cookies": false, "type": "", "demo": "functions\/get-template.md", @@ -14006,7 +14012,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 476, + "weight": 457, "cookies": false, "type": "", "demo": "functions\/list-usage.md", @@ -14076,7 +14082,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 455, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -14136,7 +14142,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 456, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -14445,7 +14451,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 458, + "weight": 439, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -14507,7 +14513,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 463, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -14585,7 +14591,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 464, + "weight": 445, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -14675,7 +14681,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 461, + "weight": 442, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -14768,7 +14774,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 469, + "weight": 450, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -14854,7 +14860,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 466, + "weight": 447, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -14975,7 +14981,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 467, + "weight": 448, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -15072,7 +15078,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 462, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -15135,7 +15141,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 465, + "weight": 446, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -15203,7 +15209,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 468, + "weight": 449, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -15289,7 +15295,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 470, + "weight": 451, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -15357,7 +15363,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 473, + "weight": 454, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -15440,7 +15446,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 471, + "weight": 452, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -15559,7 +15565,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 472, + "weight": 453, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -15624,7 +15630,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 474, + "weight": 455, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -15692,7 +15698,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 475, + "weight": 456, "cookies": false, "type": "", "demo": "functions\/get-usage.md", @@ -15770,7 +15776,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 479, + "weight": 460, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -15830,7 +15836,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 477, + "weight": 458, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -15921,7 +15927,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 478, + "weight": 459, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -15989,7 +15995,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 480, + "weight": 461, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -16084,7 +16090,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 481, + "weight": 462, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -16154,7 +16160,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 242, + "weight": 225, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -16229,7 +16235,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 241, + "weight": 224, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -16302,7 +16308,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 69, + "weight": 68, "cookies": false, "type": "", "demo": "health\/get.md", @@ -16353,7 +16359,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 90, + "weight": 89, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -16404,7 +16410,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 72, + "weight": 71, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -16455,7 +16461,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 77, + "weight": 76, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -16515,7 +16521,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 71, + "weight": 70, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -16566,7 +16572,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 73, + "weight": 72, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -16617,7 +16623,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 79, + "weight": 78, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -16679,7 +16685,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 78, + "weight": 77, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -16741,7 +16747,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 80, + "weight": 79, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -16812,7 +16818,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 81, + "weight": 80, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -16874,7 +16880,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 91, + "weight": 90, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -16960,7 +16966,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 85, + "weight": 84, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -17022,7 +17028,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 76, + "weight": 75, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -17084,7 +17090,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 82, + "weight": 81, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -17146,7 +17152,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 83, + "weight": 82, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -17208,7 +17214,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 84, + "weight": 83, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -17270,7 +17276,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 86, + "weight": 85, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -17332,7 +17338,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 87, + "weight": 86, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -17394,7 +17400,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 75, + "weight": 74, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -17456,7 +17462,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 89, + "weight": 88, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -17507,7 +17513,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 88, + "weight": 87, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -17558,7 +17564,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 74, + "weight": 73, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -17609,7 +17615,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 61, + "weight": 60, "cookies": false, "type": "", "demo": "locale\/get.md", @@ -17662,7 +17668,7 @@ "x-appwrite": { "method": "listCodes", "group": null, - "weight": 62, + "weight": 61, "cookies": false, "type": "", "demo": "locale\/list-codes.md", @@ -17715,7 +17721,7 @@ "x-appwrite": { "method": "listContinents", "group": null, - "weight": 66, + "weight": 65, "cookies": false, "type": "", "demo": "locale\/list-continents.md", @@ -17768,7 +17774,7 @@ "x-appwrite": { "method": "listCountries", "group": null, - "weight": 63, + "weight": 62, "cookies": false, "type": "", "demo": "locale\/list-countries.md", @@ -17821,7 +17827,7 @@ "x-appwrite": { "method": "listCountriesEU", "group": null, - "weight": 64, + "weight": 63, "cookies": false, "type": "", "demo": "locale\/list-countries-eu.md", @@ -17874,7 +17880,7 @@ "x-appwrite": { "method": "listCountriesPhones", "group": null, - "weight": 65, + "weight": 64, "cookies": false, "type": "", "demo": "locale\/list-countries-phones.md", @@ -17927,7 +17933,7 @@ "x-appwrite": { "method": "listCurrencies", "group": null, - "weight": 67, + "weight": 66, "cookies": false, "type": "", "demo": "locale\/list-currencies.md", @@ -17980,7 +17986,7 @@ "x-appwrite": { "method": "listLanguages", "group": null, - "weight": 68, + "weight": 67, "cookies": false, "type": "", "demo": "locale\/list-languages.md", @@ -18033,7 +18039,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 299, + "weight": 280, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -18118,7 +18124,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 296, + "weight": 277, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -18278,7 +18284,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 303, + "weight": 284, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -18445,7 +18451,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 298, + "weight": 279, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -18643,7 +18649,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 305, + "weight": 286, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -18856,7 +18862,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 297, + "weight": 278, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -19046,7 +19052,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 304, + "weight": 285, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -19235,7 +19241,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 302, + "weight": 283, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -19291,7 +19297,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 306, + "weight": 287, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -19352,7 +19358,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 300, + "weight": 281, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -19434,7 +19440,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 301, + "weight": 282, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -19516,7 +19522,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 270, + "weight": 251, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -19601,7 +19607,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 269, + "weight": 250, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -19790,7 +19796,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 283, + "weight": 264, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -19976,7 +19982,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 268, + "weight": 249, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -20134,7 +20140,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 282, + "weight": 263, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -20288,7 +20294,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 259, + "weight": 240, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -20418,7 +20424,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 273, + "weight": 254, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -20546,7 +20552,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 263, + "weight": 244, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -20651,7 +20657,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 277, + "weight": 258, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -20754,7 +20760,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 261, + "weight": 242, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -20871,7 +20877,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 275, + "weight": 256, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -20986,7 +20992,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 260, + "weight": 241, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -21103,7 +21109,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 274, + "weight": 255, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -21218,7 +21224,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 262, + "weight": 243, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -21465,7 +21471,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 276, + "weight": 257, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -21707,7 +21713,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 264, + "weight": 245, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -21812,7 +21818,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 278, + "weight": 259, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -21915,7 +21921,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 265, + "weight": 246, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -22020,7 +22026,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 279, + "weight": 260, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -22123,7 +22129,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 266, + "weight": 247, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -22228,7 +22234,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 280, + "weight": 261, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -22331,7 +22337,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 267, + "weight": 248, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -22436,7 +22442,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 281, + "weight": 262, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -22537,7 +22543,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 272, + "weight": 253, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -22593,7 +22599,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 284, + "weight": 265, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -22654,7 +22660,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 271, + "weight": 252, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -22736,7 +22742,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 293, + "weight": 274, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -22818,7 +22824,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 286, + "weight": 267, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -22901,7 +22907,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 285, + "weight": 266, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -22990,7 +22996,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 288, + "weight": 269, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -23051,7 +23057,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 289, + "weight": 270, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -23133,7 +23139,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 290, + "weight": 271, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -23194,7 +23200,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 287, + "weight": 268, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -23276,7 +23282,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 292, + "weight": 273, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -23367,7 +23373,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 291, + "weight": 272, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -23455,7 +23461,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 294, + "weight": 275, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -23519,7 +23525,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 295, + "weight": 276, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -23590,7 +23596,7 @@ "x-appwrite": { "method": "list", "group": null, - "weight": 251, + "weight": 232, "cookies": false, "type": "", "demo": "migrations\/list.md", @@ -23673,7 +23679,7 @@ "x-appwrite": { "method": "createAppwriteMigration", "group": null, - "weight": 245, + "weight": 226, "cookies": false, "type": "", "demo": "migrations\/create-appwrite-migration.md", @@ -23786,7 +23792,7 @@ "x-appwrite": { "method": "getAppwriteReport", "group": null, - "weight": 253, + "weight": 234, "cookies": false, "type": "", "demo": "migrations\/get-appwrite-report.md", @@ -23895,7 +23901,7 @@ "x-appwrite": { "method": "createCSVExport", "group": null, - "weight": 250, + "weight": 231, "cookies": false, "type": "", "demo": "migrations\/create-csv-export.md", @@ -24021,7 +24027,7 @@ "x-appwrite": { "method": "createCSVImport", "group": null, - "weight": 249, + "weight": 230, "cookies": false, "type": "", "demo": "migrations\/create-csv-import.md", @@ -24112,7 +24118,7 @@ "x-appwrite": { "method": "createFirebaseMigration", "group": null, - "weight": 246, + "weight": 227, "cookies": false, "type": "", "demo": "migrations\/create-firebase-migration.md", @@ -24205,7 +24211,7 @@ "x-appwrite": { "method": "getFirebaseReport", "group": null, - "weight": 254, + "weight": 235, "cookies": false, "type": "", "demo": "migrations\/get-firebase-report.md", @@ -24291,7 +24297,7 @@ "x-appwrite": { "method": "createNHostMigration", "group": null, - "weight": 248, + "weight": 229, "cookies": false, "type": "", "demo": "migrations\/create-n-host-migration.md", @@ -24426,7 +24432,7 @@ "x-appwrite": { "method": "getNHostReport", "group": null, - "weight": 256, + "weight": 237, "cookies": false, "type": "", "demo": "migrations\/get-n-host-report.md", @@ -24562,7 +24568,7 @@ "x-appwrite": { "method": "createSupabaseMigration", "group": null, - "weight": 247, + "weight": 228, "cookies": false, "type": "", "demo": "migrations\/create-supabase-migration.md", @@ -24690,7 +24696,7 @@ "x-appwrite": { "method": "getSupabaseReport", "group": null, - "weight": 255, + "weight": 236, "cookies": false, "type": "", "demo": "migrations\/get-supabase-report.md", @@ -24817,7 +24823,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 252, + "weight": 233, "cookies": false, "type": "", "demo": "migrations\/get.md", @@ -24876,7 +24882,7 @@ "x-appwrite": { "method": "retry", "group": null, - "weight": 257, + "weight": 238, "cookies": false, "type": "", "demo": "migrations\/retry.md", @@ -24930,7 +24936,7 @@ "x-appwrite": { "method": "delete", "group": null, - "weight": 258, + "weight": 239, "cookies": false, "type": "", "demo": "migrations\/delete.md", @@ -24989,7 +24995,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 139, + "weight": 138, "cookies": false, "type": "", "demo": "project\/get-usage.md", @@ -25072,7 +25078,7 @@ "x-appwrite": { "method": "listVariables", "group": null, - "weight": 141, + "weight": 140, "cookies": false, "type": "", "demo": "project\/list-variables.md", @@ -25121,7 +25127,7 @@ "x-appwrite": { "method": "createVariable", "group": null, - "weight": 140, + "weight": 139, "cookies": false, "type": "", "demo": "project\/create-variable.md", @@ -25203,7 +25209,7 @@ "x-appwrite": { "method": "getVariable", "group": null, - "weight": 142, + "weight": 141, "cookies": false, "type": "", "demo": "project\/get-variable.md", @@ -25262,7 +25268,7 @@ "x-appwrite": { "method": "updateVariable", "group": null, - "weight": 143, + "weight": 142, "cookies": false, "type": "", "demo": "project\/update-variable.md", @@ -25348,7 +25354,7 @@ "x-appwrite": { "method": "deleteVariable", "group": null, - "weight": 144, + "weight": 143, "cookies": false, "type": "", "demo": "project\/delete-variable.md", @@ -25407,7 +25413,7 @@ "x-appwrite": { "method": "list", "group": "projects", - "weight": 453, + "weight": 434, "cookies": false, "type": "", "demo": "projects\/list.md", @@ -25487,7 +25493,7 @@ "x-appwrite": { "method": "create", "group": "projects", - "weight": 93, + "weight": 92, "cookies": false, "type": "", "demo": "projects\/create.md", @@ -25635,7 +25641,7 @@ "x-appwrite": { "method": "get", "group": "projects", - "weight": 94, + "weight": 93, "cookies": false, "type": "", "demo": "projects\/get.md", @@ -25694,7 +25700,7 @@ "x-appwrite": { "method": "update", "group": "projects", - "weight": 95, + "weight": 94, "cookies": false, "type": "", "demo": "projects\/update.md", @@ -25820,7 +25826,7 @@ "x-appwrite": { "method": "delete", "group": "projects", - "weight": 112, + "weight": 111, "cookies": false, "type": "", "demo": "projects\/delete.md", @@ -25881,7 +25887,7 @@ "x-appwrite": { "method": "updateApiStatus", "group": "projects", - "weight": 99, + "weight": 98, "cookies": false, "type": "", "demo": "projects\/update-api-status.md", @@ -26038,7 +26044,7 @@ "x-appwrite": { "method": "updateApiStatusAll", "group": "projects", - "weight": 100, + "weight": 99, "cookies": false, "type": "", "demo": "projects\/update-api-status-all.md", @@ -26177,7 +26183,7 @@ "x-appwrite": { "method": "updateAuthDuration", "group": "auth", - "weight": 105, + "weight": 104, "cookies": false, "type": "", "demo": "projects\/update-auth-duration.md", @@ -26256,7 +26262,7 @@ "x-appwrite": { "method": "updateAuthLimit", "group": "auth", - "weight": 104, + "weight": 103, "cookies": false, "type": "", "demo": "projects\/update-auth-limit.md", @@ -26335,7 +26341,7 @@ "x-appwrite": { "method": "updateAuthSessionsLimit", "group": "auth", - "weight": 110, + "weight": 109, "cookies": false, "type": "", "demo": "projects\/update-auth-sessions-limit.md", @@ -26414,7 +26420,7 @@ "x-appwrite": { "method": "updateMembershipsPrivacy", "group": "auth", - "weight": 103, + "weight": 102, "cookies": false, "type": "", "demo": "projects\/update-memberships-privacy.md", @@ -26507,7 +26513,7 @@ "x-appwrite": { "method": "updateMockNumbers", "group": "auth", - "weight": 111, + "weight": 110, "cookies": false, "type": "", "demo": "projects\/update-mock-numbers.md", @@ -26589,7 +26595,7 @@ "x-appwrite": { "method": "updateAuthPasswordDictionary", "group": "auth", - "weight": 108, + "weight": 107, "cookies": false, "type": "", "demo": "projects\/update-auth-password-dictionary.md", @@ -26668,7 +26674,7 @@ "x-appwrite": { "method": "updateAuthPasswordHistory", "group": "auth", - "weight": 107, + "weight": 106, "cookies": false, "type": "", "demo": "projects\/update-auth-password-history.md", @@ -26747,7 +26753,7 @@ "x-appwrite": { "method": "updatePersonalDataCheck", "group": "auth", - "weight": 109, + "weight": 108, "cookies": false, "type": "", "demo": "projects\/update-personal-data-check.md", @@ -26826,7 +26832,7 @@ "x-appwrite": { "method": "updateSessionAlerts", "group": "auth", - "weight": 102, + "weight": 101, "cookies": false, "type": "", "demo": "projects\/update-session-alerts.md", @@ -26905,7 +26911,7 @@ "x-appwrite": { "method": "updateSessionInvalidation", "group": "auth", - "weight": 138, + "weight": 137, "cookies": false, "type": "", "demo": "projects\/update-session-invalidation.md", @@ -26984,7 +26990,7 @@ "x-appwrite": { "method": "updateAuthStatus", "group": "auth", - "weight": 106, + "weight": 105, "cookies": false, "type": "", "demo": "projects\/update-auth-status.md", @@ -27080,7 +27086,7 @@ "x-appwrite": { "method": "listDevKeys", "group": "devKeys", - "weight": 451, + "weight": 432, "cookies": false, "type": "", "demo": "projects\/list-dev-keys.md", @@ -27150,7 +27156,7 @@ "x-appwrite": { "method": "createDevKey", "group": "devKeys", - "weight": 448, + "weight": 429, "cookies": false, "type": "", "demo": "projects\/create-dev-key.md", @@ -27233,7 +27239,7 @@ "x-appwrite": { "method": "getDevKey", "group": "devKeys", - "weight": 450, + "weight": 431, "cookies": false, "type": "", "demo": "projects\/get-dev-key.md", @@ -27299,7 +27305,7 @@ "x-appwrite": { "method": "updateDevKey", "group": "devKeys", - "weight": 449, + "weight": 430, "cookies": false, "type": "", "demo": "projects\/update-dev-key.md", @@ -27385,7 +27391,7 @@ "x-appwrite": { "method": "deleteDevKey", "group": "devKeys", - "weight": 452, + "weight": 433, "cookies": false, "type": "", "demo": "projects\/delete-dev-key.md", @@ -27453,7 +27459,7 @@ "x-appwrite": { "method": "createJWT", "group": "auth", - "weight": 124, + "weight": 123, "cookies": false, "type": "", "demo": "projects\/create-jwt.md", @@ -27598,7 +27604,7 @@ "x-appwrite": { "method": "listKeys", "group": "keys", - "weight": 120, + "weight": 119, "cookies": false, "type": "", "demo": "projects\/list-keys.md", @@ -27666,7 +27672,7 @@ "x-appwrite": { "method": "createKey", "group": "keys", - "weight": 119, + "weight": 118, "cookies": false, "type": "", "demo": "projects\/create-key.md", @@ -27820,7 +27826,7 @@ "x-appwrite": { "method": "getKey", "group": "keys", - "weight": 121, + "weight": 120, "cookies": false, "type": "", "demo": "projects\/get-key.md", @@ -27887,7 +27893,7 @@ "x-appwrite": { "method": "updateKey", "group": "keys", - "weight": 122, + "weight": 121, "cookies": false, "type": "", "demo": "projects\/update-key.md", @@ -28044,7 +28050,7 @@ "x-appwrite": { "method": "deleteKey", "group": "keys", - "weight": 123, + "weight": 122, "cookies": false, "type": "", "demo": "projects\/delete-key.md", @@ -28113,7 +28119,7 @@ "x-appwrite": { "method": "updateOAuth2", "group": "auth", - "weight": 101, + "weight": 100, "cookies": false, "type": "", "demo": "projects\/update-o-auth-2.md", @@ -28256,7 +28262,7 @@ "x-appwrite": { "method": "listPlatforms", "group": "platforms", - "weight": 126, + "weight": 125, "cookies": false, "type": "", "demo": "projects\/list-platforms.md", @@ -28324,7 +28330,7 @@ "x-appwrite": { "method": "createPlatform", "group": "platforms", - "weight": 125, + "weight": 124, "cookies": false, "type": "", "demo": "projects\/create-platform.md", @@ -28445,7 +28451,7 @@ "x-appwrite": { "method": "getPlatform", "group": "platforms", - "weight": 127, + "weight": 126, "cookies": false, "type": "", "demo": "projects\/get-platform.md", @@ -28512,7 +28518,7 @@ "x-appwrite": { "method": "updatePlatform", "group": "platforms", - "weight": 128, + "weight": 127, "cookies": false, "type": "", "demo": "projects\/update-platform.md", @@ -28610,7 +28616,7 @@ "x-appwrite": { "method": "deletePlatform", "group": "platforms", - "weight": 129, + "weight": 128, "cookies": false, "type": "", "demo": "projects\/delete-platform.md", @@ -28679,7 +28685,7 @@ "x-appwrite": { "method": "updateServiceStatus", "group": "projects", - "weight": 97, + "weight": 96, "cookies": false, "type": "", "demo": "projects\/update-service-status.md", @@ -28782,7 +28788,7 @@ "x-appwrite": { "method": "updateServiceStatusAll", "group": "projects", - "weight": 98, + "weight": 97, "cookies": false, "type": "", "demo": "projects\/update-service-status-all.md", @@ -28861,7 +28867,7 @@ "x-appwrite": { "method": "updateSmtp", "group": "templates", - "weight": 130, + "weight": 129, "cookies": false, "type": "", "demo": "projects\/update-smtp.md", @@ -29067,7 +29073,7 @@ "x-appwrite": { "method": "createSmtpTest", "group": "templates", - "weight": 131, + "weight": 130, "cookies": false, "type": "", "demo": "projects\/create-smtp-test.md", @@ -29286,7 +29292,7 @@ "x-appwrite": { "method": "updateTeam", "group": "projects", - "weight": 96, + "weight": 95, "cookies": false, "type": "", "demo": "projects\/update-team.md", @@ -29363,7 +29369,7 @@ "x-appwrite": { "method": "getEmailTemplate", "group": "templates", - "weight": 133, + "weight": 132, "cookies": false, "type": "", "demo": "projects\/get-email-template.md", @@ -29584,7 +29590,7 @@ "x-appwrite": { "method": "updateEmailTemplate", "group": "templates", - "weight": 135, + "weight": 134, "cookies": false, "type": "", "demo": "projects\/update-email-template.md", @@ -29848,7 +29854,7 @@ "x-appwrite": { "method": "deleteEmailTemplate", "group": "templates", - "weight": 137, + "weight": 136, "cookies": false, "type": "", "demo": "projects\/delete-email-template.md", @@ -30069,7 +30075,7 @@ "x-appwrite": { "method": "getSmsTemplate", "group": "templates", - "weight": 132, + "weight": 131, "cookies": false, "type": "", "demo": "projects\/get-sms-template.md", @@ -30351,7 +30357,7 @@ "x-appwrite": { "method": "updateSmsTemplate", "group": "templates", - "weight": 134, + "weight": 133, "cookies": false, "type": "", "demo": "projects\/update-sms-template.md", @@ -30655,7 +30661,7 @@ "x-appwrite": { "method": "deleteSmsTemplate", "group": "templates", - "weight": 136, + "weight": 135, "cookies": false, "type": "", "demo": "projects\/delete-sms-template.md", @@ -30937,7 +30943,7 @@ "x-appwrite": { "method": "listWebhooks", "group": "webhooks", - "weight": 114, + "weight": 113, "cookies": false, "type": "", "demo": "projects\/list-webhooks.md", @@ -31005,7 +31011,7 @@ "x-appwrite": { "method": "createWebhook", "group": "webhooks", - "weight": 113, + "weight": 112, "cookies": false, "type": "", "demo": "projects\/create-webhook.md", @@ -31124,7 +31130,7 @@ "x-appwrite": { "method": "getWebhook", "group": "webhooks", - "weight": 115, + "weight": 114, "cookies": false, "type": "", "demo": "projects\/get-webhook.md", @@ -31191,7 +31197,7 @@ "x-appwrite": { "method": "updateWebhook", "group": "webhooks", - "weight": 116, + "weight": 115, "cookies": false, "type": "", "demo": "projects\/update-webhook.md", @@ -31313,7 +31319,7 @@ "x-appwrite": { "method": "deleteWebhook", "group": "webhooks", - "weight": 118, + "weight": 117, "cookies": false, "type": "", "demo": "projects\/delete-webhook.md", @@ -31382,7 +31388,7 @@ "x-appwrite": { "method": "updateWebhookSignature", "group": "webhooks", - "weight": 117, + "weight": 116, "cookies": false, "type": "", "demo": "projects\/update-webhook-signature.md", @@ -31449,7 +31455,7 @@ "x-appwrite": { "method": "listRules", "group": null, - "weight": 519, + "weight": 510, "cookies": false, "type": "", "demo": "proxy\/list-rules.md", @@ -31531,7 +31537,7 @@ "x-appwrite": { "method": "createAPIRule", "group": null, - "weight": 514, + "weight": 505, "cookies": false, "type": "", "demo": "proxy\/create-api-rule.md", @@ -31601,7 +31607,7 @@ "x-appwrite": { "method": "createFunctionRule", "group": null, - "weight": 516, + "weight": 507, "cookies": false, "type": "", "demo": "proxy\/create-function-rule.md", @@ -31684,7 +31690,7 @@ "x-appwrite": { "method": "createRedirectRule", "group": null, - "weight": 517, + "weight": 508, "cookies": false, "type": "", "demo": "proxy\/create-redirect-rule.md", @@ -31804,7 +31810,7 @@ "x-appwrite": { "method": "createSiteRule", "group": null, - "weight": 515, + "weight": 506, "cookies": false, "type": "", "demo": "proxy\/create-site-rule.md", @@ -31885,7 +31891,7 @@ "x-appwrite": { "method": "getRule", "group": null, - "weight": 518, + "weight": 509, "cookies": false, "type": "", "demo": "proxy\/get-rule.md", @@ -31938,7 +31944,7 @@ "x-appwrite": { "method": "deleteRule", "group": null, - "weight": 520, + "weight": 511, "cookies": false, "type": "", "demo": "proxy\/delete-rule.md", @@ -31998,7 +32004,7 @@ "x-appwrite": { "method": "updateRuleVerification", "group": null, - "weight": 521, + "weight": 512, "cookies": false, "type": "", "demo": "proxy\/update-rule-verification.md", @@ -32056,7 +32062,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 486, + "weight": 467, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -32138,7 +32144,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 484, + "weight": 465, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -32409,7 +32415,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 489, + "weight": 470, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -32459,7 +32465,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 512, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -32509,7 +32515,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 508, + "weight": 489, "cookies": false, "type": "", "demo": "sites\/list-templates.md", @@ -32632,7 +32638,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 509, + "weight": 490, "cookies": false, "type": "", "demo": "sites\/get-template.md", @@ -32690,7 +32696,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 510, + "weight": 491, "cookies": false, "type": "", "demo": "sites\/list-usage.md", @@ -32760,7 +32766,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 485, + "weight": 466, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -32820,7 +32826,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 487, + "weight": 468, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -33086,7 +33092,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 488, + "weight": 469, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -33148,7 +33154,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 495, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -33226,7 +33232,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 494, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -33316,7 +33322,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 490, + "weight": 471, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -33417,7 +33423,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 498, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -33497,7 +33503,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 491, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -33618,7 +33624,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 492, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -33716,7 +33722,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 493, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -33779,7 +33785,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 496, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -33847,7 +33853,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 497, + "weight": 478, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -33933,7 +33939,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 499, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -34001,7 +34007,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 501, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -34082,7 +34088,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 500, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -34147,7 +34153,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 502, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -34215,7 +34221,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 511, + "weight": 492, "cookies": false, "type": "", "demo": "sites\/get-usage.md", @@ -34293,7 +34299,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 505, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -34353,7 +34359,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 503, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -34444,7 +34450,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 504, + "weight": 485, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -34512,7 +34518,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 506, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -34607,7 +34613,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 507, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -34675,7 +34681,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 146, + "weight": 520, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -34758,7 +34764,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 145, + "weight": 518, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -34904,7 +34910,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 147, + "weight": 519, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -34965,7 +34971,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 148, + "weight": 521, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -35107,7 +35113,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 149, + "weight": 522, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -35168,7 +35174,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 151, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -35261,7 +35267,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 150, + "weight": 523, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -35352,7 +35358,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 152, + "weight": 524, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -35423,13 +35429,13 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 157, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/update-file.md", - "rate-limit": 60, - "rate-time": 60, - "rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}", + "rate-limit": 0, + "rate-time": 3600, + "rate-key": "url:{url},ip:{ip}", "scope": "files.write", "platforms": [ "console", @@ -35453,7 +35459,7 @@ "parameters": [ { "name": "bucketId", - "description": "Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https:\/\/appwrite.io\/docs\/server\/storage#createBucket).", + "description": "Bucket unique ID.", "required": true, "type": "string", "x-example": "", @@ -35461,7 +35467,7 @@ }, { "name": "fileId", - "description": "File unique ID.", + "description": "File ID.", "required": true, "type": "string", "x-example": "", @@ -35475,14 +35481,13 @@ "properties": { "name": { "type": "string", - "description": "Name of the file", + "description": "File name.", "default": null, - "x-example": "", - "x-nullable": true + "x-example": "" }, "permissions": { "type": "array", - "description": "An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", + "description": "An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", "default": null, "x-example": "[\"read(\"any\")\"]", "x-nullable": true, @@ -35515,7 +35520,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 158, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -35586,7 +35591,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 154, + "weight": 529, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -35666,7 +35671,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 153, + "weight": 528, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -35874,7 +35879,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 155, + "weight": 530, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -35954,7 +35959,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 159, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/get-usage.md", @@ -36025,7 +36030,7 @@ "x-appwrite": { "method": "getBucketUsage", "group": null, - "weight": 160, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/get-bucket-usage.md", @@ -36104,7 +36109,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 387, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -36187,7 +36192,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 383, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -36271,7 +36276,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 446, + "weight": 427, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -36341,7 +36346,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 442, + "weight": 423, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -36414,7 +36419,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 443, + "weight": 424, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -36480,7 +36485,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 444, + "weight": 425, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -36562,7 +36567,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 445, + "weight": 426, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -36630,7 +36635,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 447, + "weight": 428, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -36714,7 +36719,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 389, + "weight": 370, "cookies": false, "type": "", "demo": "tablesdb\/list-usage.md", @@ -36811,7 +36816,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 384, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -36872,7 +36877,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 385, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -36952,7 +36957,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 386, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -37013,7 +37018,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 394, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -37107,7 +37112,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 390, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -37236,7 +37241,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 391, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -37308,7 +37313,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 392, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -37415,7 +37420,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 393, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -37487,7 +37492,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 399, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -37582,7 +37587,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 400, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -37694,7 +37699,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 401, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -37808,7 +37813,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 402, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -37920,7 +37925,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 403, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -38034,7 +38039,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 404, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -38146,7 +38151,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 405, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -38260,7 +38265,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 406, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -38382,7 +38387,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 407, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -38506,7 +38511,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 408, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -38632,7 +38637,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 409, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -38760,7 +38765,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 410, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -38886,7 +38891,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 411, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -39014,7 +39019,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 412, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -39126,7 +39131,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 413, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -39240,7 +39245,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 414, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -39346,7 +39351,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 415, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -39459,7 +39464,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 416, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -39565,7 +39570,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 417, + "weight": 398, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -39678,7 +39683,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 418, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -39784,7 +39789,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 419, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -39897,7 +39902,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 420, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -40037,7 +40042,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 422, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -40162,7 +40167,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 423, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -40283,7 +40288,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 424, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -40395,7 +40400,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 425, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -40538,7 +40543,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 397, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -40612,7 +40617,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 398, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -40693,7 +40698,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 421, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -40802,7 +40807,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 429, + "weight": 410, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -40895,7 +40900,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 426, + "weight": 407, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -41034,7 +41039,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 427, + "weight": 408, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -41108,7 +41113,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 428, + "weight": 409, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -41187,7 +41192,7 @@ "x-appwrite": { "method": "listTableLogs", "group": "tables", - "weight": 395, + "weight": 376, "cookies": false, "type": "", "demo": "tablesdb\/list-table-logs.md", @@ -41269,7 +41274,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 438, + "weight": 419, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -41372,7 +41377,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 430, + "weight": 411, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -41554,7 +41559,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 435, + "weight": 416, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -41684,7 +41689,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 433, + "weight": 414, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -41787,7 +41792,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 437, + "weight": 418, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -41884,7 +41889,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 431, + "weight": 412, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -41986,7 +41991,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 434, + "weight": 415, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -42132,7 +42137,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 432, + "weight": 413, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -42241,7 +42246,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 436, + "weight": 417, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -42339,7 +42344,7 @@ "x-appwrite": { "method": "listRowLogs", "group": "logs", - "weight": 439, + "weight": 420, "cookies": false, "type": "", "demo": "tablesdb\/list-row-logs.md", @@ -42431,7 +42436,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 441, + "weight": 422, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -42551,7 +42556,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 440, + "weight": 421, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -42669,7 +42674,7 @@ "x-appwrite": { "method": "getTableUsage", "group": null, - "weight": 396, + "weight": 377, "cookies": false, "type": "", "demo": "tablesdb\/get-table-usage.md", @@ -42759,7 +42764,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 388, + "weight": 369, "cookies": false, "type": "", "demo": "tablesdb\/get-usage.md", @@ -42867,7 +42872,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 162, + "weight": 145, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -42952,7 +42957,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 161, + "weight": 144, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -43043,7 +43048,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 163, + "weight": 146, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -43106,7 +43111,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 165, + "weight": 148, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -43182,7 +43187,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 167, + "weight": 150, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -43245,7 +43250,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 174, + "weight": 157, "cookies": false, "type": "", "demo": "teams\/list-logs.md", @@ -43325,7 +43330,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 169, + "weight": 152, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -43418,7 +43423,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 168, + "weight": 151, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -43539,7 +43544,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 170, + "weight": 153, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -43610,7 +43615,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 171, + "weight": 154, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -43704,7 +43709,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 173, + "weight": 156, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -43777,7 +43782,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 172, + "weight": 155, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -43872,7 +43877,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 164, + "weight": 147, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -43934,7 +43939,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 166, + "weight": 149, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -44014,7 +44019,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 524, + "weight": 515, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -44103,7 +44108,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 522, + "weight": 513, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -44187,7 +44192,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 523, + "weight": 514, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -44247,7 +44252,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 525, + "weight": 516, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -44318,7 +44323,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 526, + "weight": 517, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -44378,7 +44383,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 184, + "weight": 167, "cookies": false, "type": "", "demo": "users\/list.md", @@ -44461,7 +44466,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 175, + "weight": 158, "cookies": false, "type": "", "demo": "users\/create.md", @@ -44560,7 +44565,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 178, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -44653,7 +44658,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 176, + "weight": 159, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -44744,7 +44749,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 192, + "weight": 175, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -44824,7 +44829,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 215, + "weight": 198, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -44887,7 +44892,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 177, + "weight": 160, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -44980,7 +44985,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 180, + "weight": 163, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -45073,7 +45078,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 181, + "weight": 164, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -45201,7 +45206,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 182, + "weight": 165, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -45315,7 +45320,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 179, + "weight": 162, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -45427,7 +45432,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 217, + "weight": 200, "cookies": false, "type": "", "demo": "users\/get-usage.md", @@ -45498,7 +45503,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 185, + "weight": 168, "cookies": false, "type": "", "demo": "users\/get.md", @@ -45554,7 +45559,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 213, + "weight": 196, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -45617,7 +45622,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 198, + "weight": 181, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -45698,7 +45703,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 216, + "weight": 199, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -45782,7 +45787,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 194, + "weight": 177, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -45864,7 +45869,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 190, + "weight": 173, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -45946,7 +45951,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 189, + "weight": 172, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -46039,7 +46044,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 203, + "weight": 186, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -46175,7 +46180,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 208, + "weight": 191, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -46307,7 +46312,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 204, + "weight": 187, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -46424,7 +46429,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 205, + "weight": 188, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -46541,7 +46546,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 207, + "weight": 190, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -46658,7 +46663,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 206, + "weight": 189, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -46777,7 +46782,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 196, + "weight": 179, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -46858,7 +46863,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 197, + "weight": 180, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -46939,7 +46944,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 199, + "weight": 182, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -47018,7 +47023,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 186, + "weight": 169, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -47079,7 +47084,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 201, + "weight": 184, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -47158,7 +47163,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 188, + "weight": 171, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -47228,7 +47233,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 209, + "weight": 192, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -47284,7 +47289,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 212, + "weight": 195, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -47342,7 +47347,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 211, + "weight": 194, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -47413,7 +47418,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 193, + "weight": 176, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -47492,7 +47497,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 191, + "weight": 174, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -47574,7 +47579,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 183, + "weight": 166, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -47686,7 +47691,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 187, + "weight": 170, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -47755,7 +47760,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 202, + "weight": 185, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -47846,7 +47851,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 214, + "weight": 197, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -47917,7 +47922,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 210, + "weight": 193, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -48001,7 +48006,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 200, + "weight": 183, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -48082,7 +48087,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 195, + "weight": 178, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -48163,7 +48168,7 @@ "x-appwrite": { "method": "createRepositoryDetection", "group": "repositories", - "weight": 221, + "weight": 204, "cookies": false, "type": "", "demo": "vcs\/create-repository-detection.md", @@ -48259,7 +48264,7 @@ "x-appwrite": { "method": "listRepositories", "group": "repositories", - "weight": 222, + "weight": 205, "cookies": false, "type": "", "demo": "vcs\/list-repositories.md", @@ -48353,7 +48358,7 @@ "x-appwrite": { "method": "createRepository", "group": "repositories", - "weight": 223, + "weight": 206, "cookies": false, "type": "", "demo": "vcs\/create-repository.md", @@ -48437,7 +48442,7 @@ "x-appwrite": { "method": "getRepository", "group": "repositories", - "weight": 224, + "weight": 207, "cookies": false, "type": "", "demo": "vcs\/get-repository.md", @@ -48504,7 +48509,7 @@ "x-appwrite": { "method": "listRepositoryBranches", "group": "repositories", - "weight": 225, + "weight": 208, "cookies": false, "type": "", "demo": "vcs\/list-repository-branches.md", @@ -48571,7 +48576,7 @@ "x-appwrite": { "method": "getRepositoryContents", "group": "repositories", - "weight": 220, + "weight": 203, "cookies": false, "type": "", "demo": "vcs\/get-repository-contents.md", @@ -48655,7 +48660,7 @@ "x-appwrite": { "method": "updateExternalDeployments", "group": "repositories", - "weight": 230, + "weight": 213, "cookies": false, "type": "", "demo": "vcs\/update-external-deployments.md", @@ -48740,7 +48745,7 @@ "x-appwrite": { "method": "listInstallations", "group": "installations", - "weight": 227, + "weight": 210, "cookies": false, "type": "", "demo": "vcs\/list-installations.md", @@ -48821,7 +48826,7 @@ "x-appwrite": { "method": "getInstallation", "group": "installations", - "weight": 228, + "weight": 211, "cookies": false, "type": "", "demo": "vcs\/get-installation.md", @@ -48875,7 +48880,7 @@ "x-appwrite": { "method": "deleteInstallation", "group": "installations", - "weight": 229, + "weight": 212, "cookies": false, "type": "", "demo": "vcs\/delete-installation.md", @@ -48974,7 +48979,7 @@ }, { "name": "console", - "description": "The Console service allows you to interact with console relevant informations." + "description": "The Console service allows you to interact with console relevant information." }, { "name": "migrations", diff --git a/app/config/specs/swagger2-latest-server.json b/app/config/specs/swagger2-latest-server.json index ebc571a19a..a3d51a703d 100644 --- a/app/config/specs/swagger2-latest-server.json +++ b/app/config/specs/swagger2-latest-server.json @@ -103,7 +103,7 @@ "x-appwrite": { "method": "get", "group": "account", - "weight": 10, + "weight": 9, "cookies": false, "type": "", "demo": "account\/get.md", @@ -157,7 +157,7 @@ "x-appwrite": { "method": "create", "group": "account", - "weight": 9, + "weight": 8, "cookies": false, "type": "", "demo": "account\/create.md", @@ -253,7 +253,7 @@ "x-appwrite": { "method": "updateEmail", "group": "account", - "weight": 35, + "weight": 34, "cookies": false, "type": "", "demo": "account\/update-email.md", @@ -334,7 +334,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 48, + "weight": 47, "cookies": false, "type": "", "demo": "account\/list-identities.md", @@ -408,7 +408,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 49, + "weight": 48, "cookies": false, "type": "", "demo": "account\/delete-identity.md", @@ -474,7 +474,7 @@ "x-appwrite": { "method": "createJWT", "group": "tokens", - "weight": 30, + "weight": 29, "cookies": false, "type": "", "demo": "account\/create-jwt.md", @@ -545,7 +545,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 32, + "weight": 31, "cookies": false, "type": "", "demo": "account\/list-logs.md", @@ -624,7 +624,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 307, + "weight": 288, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -700,7 +700,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 309, + "weight": 290, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -827,7 +827,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 310, + "weight": 291, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -971,7 +971,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 311, + "weight": 292, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1098,7 +1098,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 315, + "weight": 296, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1238,7 +1238,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 316, + "weight": 297, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1381,7 +1381,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 308, + "weight": 289, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1485,7 +1485,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 314, + "weight": 295, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1589,7 +1589,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 312, + "weight": 293, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1693,7 +1693,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 313, + "weight": 294, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -1799,7 +1799,7 @@ "x-appwrite": { "method": "updateName", "group": "account", - "weight": 33, + "weight": 32, "cookies": false, "type": "", "demo": "account\/update-name.md", @@ -1875,7 +1875,7 @@ "x-appwrite": { "method": "updatePassword", "group": "account", - "weight": 34, + "weight": 33, "cookies": false, "type": "", "demo": "account\/update-password.md", @@ -1957,7 +1957,7 @@ "x-appwrite": { "method": "updatePhone", "group": "account", - "weight": 36, + "weight": 35, "cookies": false, "type": "", "demo": "account\/update-phone.md", @@ -2038,7 +2038,7 @@ "x-appwrite": { "method": "getPrefs", "group": "account", - "weight": 31, + "weight": 30, "cookies": false, "type": "", "demo": "account\/get-prefs.md", @@ -2092,7 +2092,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "account", - "weight": 37, + "weight": 36, "cookies": false, "type": "", "demo": "account\/update-prefs.md", @@ -2168,7 +2168,7 @@ "x-appwrite": { "method": "createRecovery", "group": "recovery", - "weight": 39, + "weight": 38, "cookies": false, "type": "", "demo": "account\/create-recovery.md", @@ -2252,7 +2252,7 @@ "x-appwrite": { "method": "updateRecovery", "group": "recovery", - "weight": 40, + "weight": 39, "cookies": false, "type": "", "demo": "account\/update-recovery.md", @@ -2340,7 +2340,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 12, + "weight": 11, "cookies": false, "type": "", "demo": "account\/list-sessions.md", @@ -2389,7 +2389,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 13, + "weight": 12, "cookies": false, "type": "", "demo": "account\/delete-sessions.md", @@ -2445,7 +2445,7 @@ "x-appwrite": { "method": "createAnonymousSession", "group": "sessions", - "weight": 18, + "weight": 17, "cookies": false, "type": "", "demo": "account\/create-anonymous-session.md", @@ -2501,7 +2501,7 @@ "x-appwrite": { "method": "createEmailPasswordSession", "group": "sessions", - "weight": 17, + "weight": 16, "cookies": false, "type": "", "demo": "account\/create-email-password-session.md", @@ -2584,7 +2584,7 @@ "x-appwrite": { "method": "updateMagicURLSession", "group": "sessions", - "weight": 27, + "weight": 26, "cookies": false, "type": "", "demo": "account\/update-magic-url-session.md", @@ -2671,7 +2671,7 @@ "x-appwrite": { "method": "updatePhoneSession", "group": "sessions", - "weight": 28, + "weight": 27, "cookies": false, "type": "", "demo": "account\/update-phone-session.md", @@ -2758,7 +2758,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 19, + "weight": 18, "cookies": false, "type": "", "demo": "account\/create-session.md", @@ -2839,7 +2839,7 @@ "x-appwrite": { "method": "getSession", "group": "sessions", - "weight": 14, + "weight": 13, "cookies": false, "type": "", "demo": "account\/get-session.md", @@ -2903,7 +2903,7 @@ "x-appwrite": { "method": "updateSession", "group": "sessions", - "weight": 16, + "weight": 15, "cookies": false, "type": "", "demo": "account\/update-session.md", @@ -2962,7 +2962,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 15, + "weight": 14, "cookies": false, "type": "", "demo": "account\/delete-session.md", @@ -3028,7 +3028,7 @@ "x-appwrite": { "method": "updateStatus", "group": "account", - "weight": 38, + "weight": 37, "cookies": false, "type": "", "demo": "account\/update-status.md", @@ -3084,7 +3084,7 @@ "x-appwrite": { "method": "createEmailToken", "group": "tokens", - "weight": 26, + "weight": 25, "cookies": false, "type": "", "demo": "account\/create-email-token.md", @@ -3176,7 +3176,7 @@ "x-appwrite": { "method": "createMagicURLToken", "group": "tokens", - "weight": 25, + "weight": 24, "cookies": false, "type": "", "demo": "account\/create-magic-url-token.md", @@ -3269,7 +3269,7 @@ "x-appwrite": { "method": "createOAuth2Token", "group": "tokens", - "weight": 24, + "weight": 23, "cookies": false, "type": "webAuth", "demo": "account\/create-o-auth-2-token.md", @@ -3412,7 +3412,7 @@ "x-appwrite": { "method": "createPhoneToken", "group": "tokens", - "weight": 29, + "weight": 28, "cookies": false, "type": "", "demo": "account\/create-phone-token.md", @@ -3498,7 +3498,7 @@ "x-appwrite": { "method": "createEmailVerification", "group": "verification", - "weight": 41, + "weight": 40, "cookies": false, "type": "", "demo": "account\/create-email-verification.md", @@ -3626,7 +3626,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "verification", - "weight": 42, + "weight": 41, "cookies": false, "type": "", "demo": "account\/update-email-verification.md", @@ -3767,7 +3767,7 @@ "x-appwrite": { "method": "createPhoneVerification", "group": "verification", - "weight": 43, + "weight": 42, "cookies": false, "type": "", "demo": "account\/create-phone-verification.md", @@ -3824,7 +3824,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "verification", - "weight": 44, + "weight": 43, "cookies": false, "type": "", "demo": "account\/update-phone-verification.md", @@ -3905,7 +3905,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 51, + "weight": 50, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4033,7 +4033,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 50, + "weight": 49, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4167,7 +4167,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 54, + "weight": 53, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4233,7 +4233,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 52, + "weight": 51, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4723,7 +4723,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 53, + "weight": 52, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4809,7 +4809,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 56, + "weight": 55, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -4903,7 +4903,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 55, + "weight": 54, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -4997,7 +4997,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 57, + "weight": 56, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5712,7 +5712,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 321, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -5830,7 +5830,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 317, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -5952,7 +5952,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 381, + "weight": 362, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6021,7 +6021,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 377, + "weight": 358, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6093,7 +6093,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 378, + "weight": 359, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6158,7 +6158,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 379, + "weight": 360, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6239,7 +6239,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 380, + "weight": 361, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6306,7 +6306,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 382, + "weight": 363, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6389,7 +6389,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 318, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -6485,7 +6485,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 319, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -6603,7 +6603,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 320, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -6698,7 +6698,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 329, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -6794,7 +6794,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 325, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -6925,7 +6925,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 326, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -6999,7 +6999,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 327, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7108,7 +7108,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 328, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7182,7 +7182,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 346, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7279,7 +7279,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 347, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7393,7 +7393,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 348, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -7509,7 +7509,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 349, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -7623,7 +7623,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 350, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -7739,7 +7739,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 351, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -7853,7 +7853,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 352, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -7969,7 +7969,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 353, + "weight": 334, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8093,7 +8093,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 354, + "weight": 335, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8219,7 +8219,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 355, + "weight": 336, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8347,7 +8347,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 356, + "weight": 337, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -8477,7 +8477,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 357, + "weight": 338, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -8605,7 +8605,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 358, + "weight": 339, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -8735,7 +8735,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 359, + "weight": 340, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -8849,7 +8849,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 360, + "weight": 341, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -8965,7 +8965,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 361, + "weight": 342, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9073,7 +9073,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 362, + "weight": 343, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9188,7 +9188,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 363, + "weight": 344, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -9296,7 +9296,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 364, + "weight": 345, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -9411,7 +9411,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 365, + "weight": 346, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -9519,7 +9519,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 366, + "weight": 347, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -9634,7 +9634,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 367, + "weight": 348, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -9776,7 +9776,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 369, + "weight": 350, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -9903,7 +9903,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 370, + "weight": 351, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -10026,7 +10026,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 371, + "weight": 352, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -10140,7 +10140,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 372, + "weight": 353, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -10285,7 +10285,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 344, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -10361,7 +10361,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 345, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -10444,7 +10444,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 368, + "weight": 349, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -10555,7 +10555,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 340, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -10661,7 +10661,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 332, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -10856,7 +10856,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 337, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -10993,7 +10993,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 335, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -11098,7 +11098,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 339, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -11197,7 +11197,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 333, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -11302,7 +11302,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 336, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -11456,7 +11456,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 334, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -11568,7 +11568,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 338, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -11671,7 +11671,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 343, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -11794,7 +11794,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 342, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -11915,7 +11915,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 376, + "weight": 357, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -12010,7 +12010,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 373, + "weight": 354, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -12151,7 +12151,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 374, + "weight": 355, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -12227,7 +12227,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 375, + "weight": 356, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -12308,7 +12308,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 457, + "weight": 438, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -12391,7 +12391,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 454, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -12705,7 +12705,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 459, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -12756,7 +12756,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 460, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -12807,7 +12807,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 455, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -12868,7 +12868,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 456, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -13178,7 +13178,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 458, + "weight": 439, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -13241,7 +13241,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 463, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -13320,7 +13320,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 464, + "weight": 445, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -13411,7 +13411,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 461, + "weight": 442, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -13505,7 +13505,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 469, + "weight": 450, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -13592,7 +13592,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 466, + "weight": 447, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -13714,7 +13714,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 467, + "weight": 448, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -13812,7 +13812,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 462, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -13876,7 +13876,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 465, + "weight": 446, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -13945,7 +13945,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 468, + "weight": 449, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -14032,7 +14032,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 470, + "weight": 451, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -14101,7 +14101,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 473, + "weight": 454, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -14186,7 +14186,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 471, + "weight": 452, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -14307,7 +14307,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 472, + "weight": 453, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -14374,7 +14374,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 474, + "weight": 455, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -14443,7 +14443,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 479, + "weight": 460, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -14504,7 +14504,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 477, + "weight": 458, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -14596,7 +14596,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 478, + "weight": 459, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -14665,7 +14665,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 480, + "weight": 461, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -14761,7 +14761,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 481, + "weight": 462, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -14832,7 +14832,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 242, + "weight": 225, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -14909,7 +14909,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 241, + "weight": 224, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -14984,7 +14984,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 69, + "weight": 68, "cookies": false, "type": "", "demo": "health\/get.md", @@ -15036,7 +15036,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 90, + "weight": 89, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -15088,7 +15088,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 72, + "weight": 71, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -15140,7 +15140,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 77, + "weight": 76, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -15201,7 +15201,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 71, + "weight": 70, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -15253,7 +15253,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 73, + "weight": 72, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -15305,7 +15305,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 79, + "weight": 78, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -15368,7 +15368,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 78, + "weight": 77, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -15431,7 +15431,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 80, + "weight": 79, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -15503,7 +15503,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 81, + "weight": 80, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -15566,7 +15566,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 91, + "weight": 90, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -15653,7 +15653,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 85, + "weight": 84, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -15716,7 +15716,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 76, + "weight": 75, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -15779,7 +15779,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 82, + "weight": 81, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -15842,7 +15842,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 83, + "weight": 82, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -15905,7 +15905,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 84, + "weight": 83, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -15968,7 +15968,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 86, + "weight": 85, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -16031,7 +16031,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 87, + "weight": 86, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -16094,7 +16094,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 75, + "weight": 74, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -16157,7 +16157,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 89, + "weight": 88, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -16209,7 +16209,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 88, + "weight": 87, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -16261,7 +16261,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 74, + "weight": 73, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -16313,7 +16313,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 61, + "weight": 60, "cookies": false, "type": "", "demo": "locale\/get.md", @@ -16368,7 +16368,7 @@ "x-appwrite": { "method": "listCodes", "group": null, - "weight": 62, + "weight": 61, "cookies": false, "type": "", "demo": "locale\/list-codes.md", @@ -16423,7 +16423,7 @@ "x-appwrite": { "method": "listContinents", "group": null, - "weight": 66, + "weight": 65, "cookies": false, "type": "", "demo": "locale\/list-continents.md", @@ -16478,7 +16478,7 @@ "x-appwrite": { "method": "listCountries", "group": null, - "weight": 63, + "weight": 62, "cookies": false, "type": "", "demo": "locale\/list-countries.md", @@ -16533,7 +16533,7 @@ "x-appwrite": { "method": "listCountriesEU", "group": null, - "weight": 64, + "weight": 63, "cookies": false, "type": "", "demo": "locale\/list-countries-eu.md", @@ -16588,7 +16588,7 @@ "x-appwrite": { "method": "listCountriesPhones", "group": null, - "weight": 65, + "weight": 64, "cookies": false, "type": "", "demo": "locale\/list-countries-phones.md", @@ -16643,7 +16643,7 @@ "x-appwrite": { "method": "listCurrencies", "group": null, - "weight": 67, + "weight": 66, "cookies": false, "type": "", "demo": "locale\/list-currencies.md", @@ -16698,7 +16698,7 @@ "x-appwrite": { "method": "listLanguages", "group": null, - "weight": 68, + "weight": 67, "cookies": false, "type": "", "demo": "locale\/list-languages.md", @@ -16753,7 +16753,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 299, + "weight": 280, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -16839,7 +16839,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 296, + "weight": 277, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -17000,7 +17000,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 303, + "weight": 284, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -17168,7 +17168,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 298, + "weight": 279, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -17367,7 +17367,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 305, + "weight": 286, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -17581,7 +17581,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 297, + "weight": 278, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -17774,7 +17774,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 304, + "weight": 285, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -17966,7 +17966,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 302, + "weight": 283, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -18023,7 +18023,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 306, + "weight": 287, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -18085,7 +18085,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 300, + "weight": 281, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -18168,7 +18168,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 301, + "weight": 282, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -18251,7 +18251,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 270, + "weight": 251, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -18337,7 +18337,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 269, + "weight": 250, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -18529,7 +18529,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 283, + "weight": 264, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -18718,7 +18718,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 268, + "weight": 249, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -18879,7 +18879,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 282, + "weight": 263, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -19036,7 +19036,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 259, + "weight": 240, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -19167,7 +19167,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 273, + "weight": 254, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -19296,7 +19296,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 263, + "weight": 244, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -19402,7 +19402,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 277, + "weight": 258, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -19506,7 +19506,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 261, + "weight": 242, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -19624,7 +19624,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 275, + "weight": 256, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -19740,7 +19740,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 260, + "weight": 241, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -19858,7 +19858,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 274, + "weight": 255, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -19974,7 +19974,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 262, + "weight": 243, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -20224,7 +20224,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 276, + "weight": 257, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -20469,7 +20469,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 264, + "weight": 245, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -20575,7 +20575,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 278, + "weight": 259, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -20679,7 +20679,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 265, + "weight": 246, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -20785,7 +20785,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 279, + "weight": 260, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -20889,7 +20889,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 266, + "weight": 247, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -20995,7 +20995,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 280, + "weight": 261, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -21099,7 +21099,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 267, + "weight": 248, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -21205,7 +21205,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 281, + "weight": 262, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -21307,7 +21307,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 272, + "weight": 253, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -21364,7 +21364,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 284, + "weight": 265, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -21426,7 +21426,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 271, + "weight": 252, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -21509,7 +21509,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 293, + "weight": 274, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -21592,7 +21592,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 286, + "weight": 267, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -21676,7 +21676,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 285, + "weight": 266, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -21766,7 +21766,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 288, + "weight": 269, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -21828,7 +21828,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 289, + "weight": 270, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -21911,7 +21911,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 290, + "weight": 271, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -21973,7 +21973,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 287, + "weight": 268, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -22056,7 +22056,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 292, + "weight": 273, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -22148,7 +22148,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 291, + "weight": 272, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -22238,7 +22238,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 294, + "weight": 275, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -22303,7 +22303,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 295, + "weight": 276, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -22376,7 +22376,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 486, + "weight": 467, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -22459,7 +22459,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 484, + "weight": 465, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -22731,7 +22731,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 489, + "weight": 470, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -22782,7 +22782,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 512, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -22833,7 +22833,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 485, + "weight": 466, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -22894,7 +22894,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 487, + "weight": 468, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -23161,7 +23161,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 488, + "weight": 469, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -23224,7 +23224,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 495, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -23303,7 +23303,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 494, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -23394,7 +23394,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 490, + "weight": 471, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -23496,7 +23496,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 498, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -23577,7 +23577,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 491, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -23699,7 +23699,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 492, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -23798,7 +23798,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 493, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -23862,7 +23862,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 496, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -23931,7 +23931,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 497, + "weight": 478, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -24018,7 +24018,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 499, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -24087,7 +24087,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 501, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -24169,7 +24169,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 500, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -24235,7 +24235,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 502, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -24304,7 +24304,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 505, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -24365,7 +24365,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 503, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -24457,7 +24457,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 504, + "weight": 485, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -24526,7 +24526,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 506, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -24622,7 +24622,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 507, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -24691,7 +24691,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 146, + "weight": 520, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -24775,7 +24775,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 145, + "weight": 518, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -24922,7 +24922,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 147, + "weight": 519, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -24984,7 +24984,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 148, + "weight": 521, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -25127,7 +25127,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 149, + "weight": 522, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -25189,7 +25189,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 151, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -25284,7 +25284,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 150, + "weight": 523, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -25377,7 +25377,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 152, + "weight": 524, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -25450,13 +25450,13 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 157, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/update-file.md", - "rate-limit": 60, - "rate-time": 60, - "rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}", + "rate-limit": 0, + "rate-time": 3600, + "rate-key": "url:{url},ip:{ip}", "scope": "files.write", "platforms": [ "console", @@ -25482,7 +25482,7 @@ "parameters": [ { "name": "bucketId", - "description": "Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https:\/\/appwrite.io\/docs\/server\/storage#createBucket).", + "description": "Bucket unique ID.", "required": true, "type": "string", "x-example": "", @@ -25490,7 +25490,7 @@ }, { "name": "fileId", - "description": "File unique ID.", + "description": "File ID.", "required": true, "type": "string", "x-example": "", @@ -25504,14 +25504,13 @@ "properties": { "name": { "type": "string", - "description": "Name of the file", + "description": "File name.", "default": null, - "x-example": "", - "x-nullable": true + "x-example": "" }, "permissions": { "type": "array", - "description": "An array of permission string. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", + "description": "An array of permission strings. By default, the current permissions are inherited. [Learn more about permissions](https:\/\/appwrite.io\/docs\/permissions).", "default": null, "x-example": "[\"read(\"any\")\"]", "x-nullable": true, @@ -25544,7 +25543,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 158, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -25617,7 +25616,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 154, + "weight": 529, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -25699,7 +25698,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 153, + "weight": 528, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -25909,7 +25908,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 155, + "weight": 530, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -25991,7 +25990,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 387, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -26075,7 +26074,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 383, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -26160,7 +26159,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 446, + "weight": 427, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -26232,7 +26231,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 442, + "weight": 423, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -26307,7 +26306,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 443, + "weight": 424, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -26375,7 +26374,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 444, + "weight": 425, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -26459,7 +26458,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 445, + "weight": 426, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -26529,7 +26528,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 447, + "weight": 428, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -26615,7 +26614,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 384, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -26677,7 +26676,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 385, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -26758,7 +26757,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 386, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -26820,7 +26819,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 394, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -26915,7 +26914,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 390, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -27045,7 +27044,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 391, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -27118,7 +27117,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 392, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -27226,7 +27225,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 393, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -27299,7 +27298,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 399, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -27395,7 +27394,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 400, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -27508,7 +27507,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 401, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -27623,7 +27622,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 402, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -27736,7 +27735,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 403, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -27851,7 +27850,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 404, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -27964,7 +27963,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 405, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -28079,7 +28078,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 406, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -28202,7 +28201,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 407, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -28327,7 +28326,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 408, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -28454,7 +28453,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 409, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -28583,7 +28582,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 410, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -28710,7 +28709,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 411, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -28839,7 +28838,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 412, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -28952,7 +28951,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 413, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -29067,7 +29066,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 414, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -29174,7 +29173,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 415, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -29288,7 +29287,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 416, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -29395,7 +29394,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 417, + "weight": 398, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -29509,7 +29508,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 418, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -29616,7 +29615,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 419, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -29730,7 +29729,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 420, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -29871,7 +29870,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 422, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -29997,7 +29996,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 423, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -30119,7 +30118,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 424, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -30232,7 +30231,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 425, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -30376,7 +30375,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 397, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -30451,7 +30450,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 398, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -30533,7 +30532,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 421, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -30643,7 +30642,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 429, + "weight": 410, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -30737,7 +30736,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 426, + "weight": 407, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -30877,7 +30876,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 427, + "weight": 408, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -30952,7 +30951,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 428, + "weight": 409, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -31032,7 +31031,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 438, + "weight": 419, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -31137,7 +31136,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 430, + "weight": 411, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -31323,7 +31322,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 435, + "weight": 416, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -31455,7 +31454,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 433, + "weight": 414, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -31559,7 +31558,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 437, + "weight": 418, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -31657,7 +31656,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 431, + "weight": 412, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -31761,7 +31760,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 434, + "weight": 415, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -31910,7 +31909,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 432, + "weight": 413, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -32021,7 +32020,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 436, + "weight": 417, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -32123,7 +32122,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 441, + "weight": 422, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -32245,7 +32244,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 440, + "weight": 421, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -32365,7 +32364,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 162, + "weight": 145, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -32452,7 +32451,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 161, + "weight": 144, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -32545,7 +32544,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 163, + "weight": 146, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -32610,7 +32609,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 165, + "weight": 148, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -32688,7 +32687,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 167, + "weight": 150, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -32753,7 +32752,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 169, + "weight": 152, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -32848,7 +32847,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 168, + "weight": 151, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -32971,7 +32970,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 170, + "weight": 153, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -33044,7 +33043,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 171, + "weight": 154, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -33140,7 +33139,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 173, + "weight": 156, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -33215,7 +33214,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 172, + "weight": 155, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -33312,7 +33311,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 164, + "weight": 147, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -33376,7 +33375,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 166, + "weight": 149, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -33458,7 +33457,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 524, + "weight": 515, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -33548,7 +33547,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 522, + "weight": 513, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -33633,7 +33632,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 523, + "weight": 514, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -33694,7 +33693,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 525, + "weight": 516, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -33766,7 +33765,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 526, + "weight": 517, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -33827,7 +33826,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 184, + "weight": 167, "cookies": false, "type": "", "demo": "users\/list.md", @@ -33911,7 +33910,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 175, + "weight": 158, "cookies": false, "type": "", "demo": "users\/create.md", @@ -34011,7 +34010,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 178, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -34105,7 +34104,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 176, + "weight": 159, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -34197,7 +34196,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 192, + "weight": 175, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -34278,7 +34277,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 215, + "weight": 198, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -34342,7 +34341,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 177, + "weight": 160, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -34436,7 +34435,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 180, + "weight": 163, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -34530,7 +34529,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 181, + "weight": 164, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -34659,7 +34658,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 182, + "weight": 165, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -34774,7 +34773,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 179, + "weight": 162, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -34887,7 +34886,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 185, + "weight": 168, "cookies": false, "type": "", "demo": "users\/get.md", @@ -34944,7 +34943,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 213, + "weight": 196, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -35008,7 +35007,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 198, + "weight": 181, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -35090,7 +35089,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 216, + "weight": 199, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -35175,7 +35174,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 194, + "weight": 177, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -35258,7 +35257,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 190, + "weight": 173, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -35341,7 +35340,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 189, + "weight": 172, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -35435,7 +35434,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 203, + "weight": 186, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -35574,7 +35573,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 208, + "weight": 191, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -35709,7 +35708,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 204, + "weight": 187, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -35829,7 +35828,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 205, + "weight": 188, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -35949,7 +35948,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 207, + "weight": 190, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -36069,7 +36068,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 206, + "weight": 189, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -36191,7 +36190,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 196, + "weight": 179, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -36273,7 +36272,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 197, + "weight": 180, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -36355,7 +36354,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 199, + "weight": 182, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -36435,7 +36434,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 186, + "weight": 169, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -36497,7 +36496,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 201, + "weight": 184, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -36577,7 +36576,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 188, + "weight": 171, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -36648,7 +36647,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 209, + "weight": 192, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -36705,7 +36704,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 212, + "weight": 195, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -36764,7 +36763,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 211, + "weight": 194, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -36836,7 +36835,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 193, + "weight": 176, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -36916,7 +36915,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 191, + "weight": 174, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -36999,7 +36998,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 183, + "weight": 166, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -37112,7 +37111,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 187, + "weight": 170, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -37182,7 +37181,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 202, + "weight": 185, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -37274,7 +37273,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 214, + "weight": 197, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -37346,7 +37345,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 210, + "weight": 193, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -37431,7 +37430,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 200, + "weight": 183, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -37513,7 +37512,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 195, + "weight": 178, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -37633,7 +37632,7 @@ }, { "name": "console", - "description": "The Console service allows you to interact with console relevant informations." + "description": "The Console service allows you to interact with console relevant information." }, { "name": "migrations", diff --git a/src/Appwrite/Platform/Tasks/Specs.php b/src/Appwrite/Platform/Tasks/Specs.php index 19526060a8..c64e1b49d4 100644 --- a/src/Appwrite/Platform/Tasks/Specs.php +++ b/src/Appwrite/Platform/Tasks/Specs.php @@ -199,6 +199,12 @@ class Specs extends Action 'description' => '', 'in' => 'header', ], + 'Cookie' => [ + 'type' => 'apiKey', + 'name' => 'Cookie', + 'description' => 'The user cookie to authenticate with', + 'in' => 'header', + ], ], ]; } From ee3b2d75ae7de57fd0c7521715c5ecbdee44b11e Mon Sep 17 00:00:00 2001 From: Darshan Date: Fri, 2 Jan 2026 17:01:03 +0530 Subject: [PATCH 92/95] add: missing test at console level. --- .../Account/AccountConsoleClientTest.php | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/tests/e2e/Services/Account/AccountConsoleClientTest.php b/tests/e2e/Services/Account/AccountConsoleClientTest.php index 3e43d443e3..f0b27a3f7e 100644 --- a/tests/e2e/Services/Account/AccountConsoleClientTest.php +++ b/tests/e2e/Services/Account/AccountConsoleClientTest.php @@ -196,4 +196,55 @@ class AccountConsoleClientTest extends Scope $lastEmail = $this->getLastEmail(); $this->assertEquals($lastEmailId, $lastEmail['id']); } + + public function testGetAccountLogs(): void + { + $email = uniqid() . 'user@localhost.test'; + $password = 'password'; + $name = 'User Name'; + + /** + * Test for SUCCESS - Create account and session for console project + */ + $response = $this->client->call(Client::METHOD_POST, '/account', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ]), [ + 'userId' => ID::unique(), + 'email' => $email, + 'password' => $password, + 'name' => $name, + ]); + + $this->assertEquals($response['headers']['status-code'], 201); + + $response = $this->client->call(Client::METHOD_POST, '/account/sessions/email', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ]), [ + 'email' => $email, + 'password' => $password, + ]); + + $this->assertEquals($response['headers']['status-code'], 201); + + $session = $response['cookies']['a_session_' . $this->getProject()['$id']]; + + /** + * Test for SUCCESS - Get account logs + */ + $response = $this->client->call(Client::METHOD_GET, '/account/logs', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + 'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session, + ])); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertIsArray($response['body']['logs']); + $this->assertNotEmpty($response['body']['logs']); + $this->assertIsNumeric($response['body']['total']); + } } From 445ada0226bbc93978ebf5731224ee01131cc6e8 Mon Sep 17 00:00:00 2001 From: loks0n <22452787+loks0n@users.noreply.github.com> Date: Fri, 2 Jan 2026 17:32:54 +0000 Subject: [PATCH 93/95] fix: memory leak --- app/init.php | 1 + app/init/models.php | 344 ++++++++++++++++ src/Appwrite/Platform/Action.php | 48 --- .../Functions/Http/Deployments/XList.php | 8 +- .../Modules/Projects/Http/Projects/XList.php | 4 +- .../Modules/Sites/Http/Deployments/XList.php | 8 +- src/Appwrite/Utopia/Response.php | 381 ++---------------- .../Utopia/Response/Filters/ListSelection.php | 41 ++ src/Appwrite/Utopia/Response/Model.php | 16 - .../Utopia/Response/Model/Account.php | 127 +++++- .../Utopia/Response/Model/UsageSites.php | 155 ++++++- 11 files changed, 698 insertions(+), 435 deletions(-) create mode 100644 app/init/models.php create mode 100644 src/Appwrite/Utopia/Response/Filters/ListSelection.php diff --git a/app/init.php b/app/init.php index c32f1eb9a8..91a64a72ce 100644 --- a/app/init.php +++ b/app/init.php @@ -26,6 +26,7 @@ require_once __DIR__ . '/init/database/filters.php'; require_once __DIR__ . '/init/database/formats.php'; require_once __DIR__ . '/init/locales.php'; require_once __DIR__ . '/init/registers.php'; +require_once __DIR__ . '/init/models.php'; require_once __DIR__ . '/init/resources.php'; \stream_context_set_default([ // Set global user agent and http settings diff --git a/app/init/models.php b/app/init/models.php new file mode 100644 index 0000000000..fdfa0271b4 --- /dev/null +++ b/app/init/models.php @@ -0,0 +1,344 @@ +getSequence() . ' ' . $project->getId() . ' ' . $collectionId . ' ' . $log); } } - - - /** - * Helper to apply (request) select queries to response model. - * - * This prevents default values of rules to be presnet for not-selected attributes - * - * @param Request $request - * @param Document $document - * @return void - */ - public function applySelectQueries(Request $request, Response $response, string $model): void - { - $queries = $request->getParam('queries', []); - - $queries = Query::parseQueries($queries); - $selectQueries = Query::groupByType($queries)['selections'] ?? []; - - // No select queries means no filtering out - if (empty($selectQueries)) { - return; - } - - $attributes = []; - foreach ($selectQueries as $query) { - foreach ($query->getValues() as $attribute) { - $attributes[] = $attribute; - } - } - - // found a wildcard, return! - if (\in_array('*', $attributes)) { - return; - } - - $responseModel = $response->getModel($model); - foreach ($responseModel->getRules() as $ruleName => $rule) { - if (\str_starts_with($ruleName, '$')) { - continue; - } - - if (!\in_array($ruleName, $attributes)) { - $responseModel->removeRule($ruleName); - } - } - } } diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/XList.php b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/XList.php index 2717e99ee0..55711495e9 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/XList.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/XList.php @@ -10,6 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\Queries\Deployments; use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; +use Appwrite\Utopia\Response\Filters\ListSelection; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception\Order as OrderException; @@ -119,7 +120,9 @@ class XList extends Base $cursor->setValue($cursorDocument); } - $filterQueries = Query::groupByType($queries)['filters']; + $grouped = Query::groupByType($queries); + $filterQueries = $grouped['filters']; + $selectQueries = $grouped['selections'] ?? []; try { $results = $dbForProject->find('deployments', $queries); @@ -128,7 +131,8 @@ class XList extends Base throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."); } - $this->applySelectQueries($request, $response, Response::MODEL_DEPLOYMENT); + $response->addFilter(new ListSelection($selectQueries, 'deployments')); + $response->dynamic(new Document([ 'deployments' => $results, 'total' => $total, diff --git a/src/Appwrite/Platform/Modules/Projects/Http/Projects/XList.php b/src/Appwrite/Platform/Modules/Projects/Http/Projects/XList.php index 32318dd189..7269582a15 100644 --- a/src/Appwrite/Platform/Modules/Projects/Http/Projects/XList.php +++ b/src/Appwrite/Platform/Modules/Projects/Http/Projects/XList.php @@ -11,6 +11,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\Queries\Projects; use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; +use Appwrite\Utopia\Response\Filters\ListSelection; use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Document; @@ -120,7 +121,8 @@ class XList extends Action throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."); } - $this->applySelectQueries($request, $response, Response::MODEL_PROJECT); + $response->addFilter(new ListSelection($selectQueries, 'projects')); + $response->dynamic(new Document([ 'projects' => $projects, 'total' => $total, diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/XList.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/XList.php index b7f9386f06..73e5ea4d77 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/XList.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/XList.php @@ -10,6 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\Queries\Deployments; use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; +use Appwrite\Utopia\Response\Filters\ListSelection; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception\Order as OrderException; @@ -119,7 +120,9 @@ class XList extends Base $cursor->setValue($cursorDocument); } - $filterQueries = Query::groupByType($queries)['filters']; + $grouped = Query::groupByType($queries); + $filterQueries = $grouped['filters']; + $selectQueries = $grouped['selections'] ?? []; try { $results = $dbForProject->find('deployments', $queries); @@ -128,7 +131,8 @@ class XList extends Base throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."); } - $this->applySelectQueries($request, $response, Response::MODEL_DEPLOYMENT); + $response->addFilter(new ListSelection($selectQueries, 'deployments')); + $response->dynamic(new Document([ 'deployments' => $results, 'total' => $total, diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 33351bea14..1dfaa1a41f 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -6,147 +6,8 @@ use Appwrite\Utopia\Database\Documents\User as DBUser; use Appwrite\Utopia\Fetch\BodyMultipart; use Appwrite\Utopia\Response\Filter; use Appwrite\Utopia\Response\Model; -use Appwrite\Utopia\Response\Model\Account; -use Appwrite\Utopia\Response\Model\AlgoArgon2; -use Appwrite\Utopia\Response\Model\AlgoBcrypt; -use Appwrite\Utopia\Response\Model\AlgoMd5; -use Appwrite\Utopia\Response\Model\AlgoPhpass; -use Appwrite\Utopia\Response\Model\AlgoScrypt; -use Appwrite\Utopia\Response\Model\AlgoScryptModified; -use Appwrite\Utopia\Response\Model\AlgoSha; -use Appwrite\Utopia\Response\Model\Any; -use Appwrite\Utopia\Response\Model\Attribute; -use Appwrite\Utopia\Response\Model\AttributeBoolean; -use Appwrite\Utopia\Response\Model\AttributeDatetime; -use Appwrite\Utopia\Response\Model\AttributeEmail; -use Appwrite\Utopia\Response\Model\AttributeEnum; -use Appwrite\Utopia\Response\Model\AttributeFloat; -use Appwrite\Utopia\Response\Model\AttributeInteger; -use Appwrite\Utopia\Response\Model\AttributeIP; -use Appwrite\Utopia\Response\Model\AttributeLine; -use Appwrite\Utopia\Response\Model\AttributeList; -use Appwrite\Utopia\Response\Model\AttributePoint; -use Appwrite\Utopia\Response\Model\AttributePolygon; -use Appwrite\Utopia\Response\Model\AttributeRelationship; -use Appwrite\Utopia\Response\Model\AttributeString; -use Appwrite\Utopia\Response\Model\AttributeURL; -use Appwrite\Utopia\Response\Model\AuthProvider; -use Appwrite\Utopia\Response\Model\BaseList; -use Appwrite\Utopia\Response\Model\Branch; -use Appwrite\Utopia\Response\Model\Bucket; -use Appwrite\Utopia\Response\Model\Collection; -use Appwrite\Utopia\Response\Model\Column; -use Appwrite\Utopia\Response\Model\ColumnBoolean; -use Appwrite\Utopia\Response\Model\ColumnDatetime; -use Appwrite\Utopia\Response\Model\ColumnEmail; -use Appwrite\Utopia\Response\Model\ColumnEnum; -use Appwrite\Utopia\Response\Model\ColumnFloat; -use Appwrite\Utopia\Response\Model\ColumnIndex; -use Appwrite\Utopia\Response\Model\ColumnInteger; -use Appwrite\Utopia\Response\Model\ColumnIP; -use Appwrite\Utopia\Response\Model\ColumnLine; -use Appwrite\Utopia\Response\Model\ColumnList; -use Appwrite\Utopia\Response\Model\ColumnPoint; -use Appwrite\Utopia\Response\Model\ColumnPolygon; -use Appwrite\Utopia\Response\Model\ColumnRelationship; -use Appwrite\Utopia\Response\Model\ColumnString; -use Appwrite\Utopia\Response\Model\ColumnURL; -use Appwrite\Utopia\Response\Model\ConsoleVariables; -use Appwrite\Utopia\Response\Model\Continent; -use Appwrite\Utopia\Response\Model\Country; -use Appwrite\Utopia\Response\Model\Currency; -use Appwrite\Utopia\Response\Model\Database; -use Appwrite\Utopia\Response\Model\Deployment; -use Appwrite\Utopia\Response\Model\DetectionFramework; -use Appwrite\Utopia\Response\Model\DetectionRuntime; -use Appwrite\Utopia\Response\Model\DetectionVariable; -use Appwrite\Utopia\Response\Model\DevKey; -use Appwrite\Utopia\Response\Model\Document as ModelDocument; -use Appwrite\Utopia\Response\Model\Error; -use Appwrite\Utopia\Response\Model\ErrorDev; -use Appwrite\Utopia\Response\Model\Execution; -use Appwrite\Utopia\Response\Model\File; -use Appwrite\Utopia\Response\Model\Framework; -use Appwrite\Utopia\Response\Model\FrameworkAdapter; -use Appwrite\Utopia\Response\Model\Func; -use Appwrite\Utopia\Response\Model\Headers; -use Appwrite\Utopia\Response\Model\HealthAntivirus; -use Appwrite\Utopia\Response\Model\HealthCertificate; -use Appwrite\Utopia\Response\Model\HealthQueue; -use Appwrite\Utopia\Response\Model\HealthStatus; -use Appwrite\Utopia\Response\Model\HealthTime; -use Appwrite\Utopia\Response\Model\HealthVersion; -use Appwrite\Utopia\Response\Model\Identity; -use Appwrite\Utopia\Response\Model\Index; -use Appwrite\Utopia\Response\Model\Installation; -use Appwrite\Utopia\Response\Model\JWT; -use Appwrite\Utopia\Response\Model\Key; -use Appwrite\Utopia\Response\Model\Language; -use Appwrite\Utopia\Response\Model\Locale; -use Appwrite\Utopia\Response\Model\LocaleCode; -use Appwrite\Utopia\Response\Model\Log; -use Appwrite\Utopia\Response\Model\Membership; -use Appwrite\Utopia\Response\Model\Message; -use Appwrite\Utopia\Response\Model\Metric; -use Appwrite\Utopia\Response\Model\MetricBreakdown; -use Appwrite\Utopia\Response\Model\MFAChallenge; -use Appwrite\Utopia\Response\Model\MFAFactors; -use Appwrite\Utopia\Response\Model\MFARecoveryCodes; -use Appwrite\Utopia\Response\Model\MFAType; -use Appwrite\Utopia\Response\Model\Migration; -use Appwrite\Utopia\Response\Model\MigrationFirebaseProject; -use Appwrite\Utopia\Response\Model\MigrationReport; -use Appwrite\Utopia\Response\Model\Mock; -use Appwrite\Utopia\Response\Model\MockNumber; -use Appwrite\Utopia\Response\Model\None; -use Appwrite\Utopia\Response\Model\Phone; -use Appwrite\Utopia\Response\Model\Platform; -use Appwrite\Utopia\Response\Model\Preferences; -use Appwrite\Utopia\Response\Model\Project; -use Appwrite\Utopia\Response\Model\Provider; -use Appwrite\Utopia\Response\Model\ProviderRepository; -use Appwrite\Utopia\Response\Model\ProviderRepositoryFramework; -use Appwrite\Utopia\Response\Model\ProviderRepositoryRuntime; -use Appwrite\Utopia\Response\Model\ResourceToken; -use Appwrite\Utopia\Response\Model\Row; -use Appwrite\Utopia\Response\Model\Rule; -use Appwrite\Utopia\Response\Model\Runtime; -use Appwrite\Utopia\Response\Model\Session; -use Appwrite\Utopia\Response\Model\Site; -use Appwrite\Utopia\Response\Model\Specification; -use Appwrite\Utopia\Response\Model\Subscriber; -use Appwrite\Utopia\Response\Model\Table; -use Appwrite\Utopia\Response\Model\Target; -use Appwrite\Utopia\Response\Model\Team; -use Appwrite\Utopia\Response\Model\TemplateEmail; -use Appwrite\Utopia\Response\Model\TemplateFramework; -use Appwrite\Utopia\Response\Model\TemplateFunction; -use Appwrite\Utopia\Response\Model\TemplateRuntime; -use Appwrite\Utopia\Response\Model\TemplateSite; -use Appwrite\Utopia\Response\Model\TemplateSMS; -use Appwrite\Utopia\Response\Model\TemplateVariable; -use Appwrite\Utopia\Response\Model\Token; -use Appwrite\Utopia\Response\Model\Topic; -use Appwrite\Utopia\Response\Model\Transaction; -use Appwrite\Utopia\Response\Model\UsageBuckets; -use Appwrite\Utopia\Response\Model\UsageCollection; -use Appwrite\Utopia\Response\Model\UsageDatabase; -use Appwrite\Utopia\Response\Model\UsageDatabases; -use Appwrite\Utopia\Response\Model\UsageFunction; -use Appwrite\Utopia\Response\Model\UsageFunctions; -use Appwrite\Utopia\Response\Model\UsageProject; -use Appwrite\Utopia\Response\Model\UsageSite; -use Appwrite\Utopia\Response\Model\UsageSites; -use Appwrite\Utopia\Response\Model\UsageStorage; -use Appwrite\Utopia\Response\Model\UsageTable; -use Appwrite\Utopia\Response\Model\UsageUsers; -use Appwrite\Utopia\Response\Model\User; -use Appwrite\Utopia\Response\Model\Variable; -use Appwrite\Utopia\Response\Model\VcsContent; -use Appwrite\Utopia\Response\Model\Webhook; use Exception; use JsonException; -// Keep last use Swoole\Http\Response as SwooleHTTPResponse; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; @@ -418,6 +279,11 @@ class Response extends SwooleResponse */ protected static bool $showSensitive = false; + /** + * @var array + */ + protected static array $models = []; + protected SwooleHTTPResponse $swoole; /** @@ -428,206 +294,6 @@ class Response extends SwooleResponse public function __construct(SwooleHTTPResponse $response) { $this->swoole = $response; - - $this - // General - ->setModel(new None()) - ->setModel(new Any()) - ->setModel(new Error()) - ->setModel(new ErrorDev()) - // Lists - ->setModel(new BaseList('Rows List', self::MODEL_ROW_LIST, 'rows', self::MODEL_ROW)) - ->setModel(new BaseList('Documents List', self::MODEL_DOCUMENT_LIST, 'documents', self::MODEL_DOCUMENT)) - ->setModel(new BaseList('Tables List', self::MODEL_TABLE_LIST, 'tables', self::MODEL_TABLE)) - ->setModel(new BaseList('Collections List', self::MODEL_COLLECTION_LIST, 'collections', self::MODEL_COLLECTION)) - ->setModel(new BaseList('Databases List', self::MODEL_DATABASE_LIST, 'databases', self::MODEL_DATABASE)) - ->setModel(new BaseList('Indexes List', self::MODEL_INDEX_LIST, 'indexes', self::MODEL_INDEX)) - ->setModel(new BaseList('Column Indexes List', self::MODEL_COLUMN_INDEX_LIST, 'indexes', self::MODEL_COLUMN_INDEX)) - ->setModel(new BaseList('Users List', self::MODEL_USER_LIST, 'users', self::MODEL_USER)) - ->setModel(new BaseList('Sessions List', self::MODEL_SESSION_LIST, 'sessions', self::MODEL_SESSION)) - ->setModel(new BaseList('Identities List', self::MODEL_IDENTITY_LIST, 'identities', self::MODEL_IDENTITY)) - ->setModel(new BaseList('Logs List', self::MODEL_LOG_LIST, 'logs', self::MODEL_LOG)) - ->setModel(new BaseList('Files List', self::MODEL_FILE_LIST, 'files', self::MODEL_FILE)) - ->setModel(new BaseList('Buckets List', self::MODEL_BUCKET_LIST, 'buckets', self::MODEL_BUCKET)) - ->setModel(new BaseList('Resource Tokens List', self::MODEL_RESOURCE_TOKEN_LIST, 'tokens', self::MODEL_RESOURCE_TOKEN)) - ->setModel(new BaseList('Teams List', self::MODEL_TEAM_LIST, 'teams', self::MODEL_TEAM)) - ->setModel(new BaseList('Memberships List', self::MODEL_MEMBERSHIP_LIST, 'memberships', self::MODEL_MEMBERSHIP)) - ->setModel(new BaseList('Sites List', self::MODEL_SITE_LIST, 'sites', self::MODEL_SITE)) - ->setModel(new BaseList('Site Templates List', self::MODEL_TEMPLATE_SITE_LIST, 'templates', self::MODEL_TEMPLATE_SITE)) - ->setModel(new BaseList('Functions List', self::MODEL_FUNCTION_LIST, 'functions', self::MODEL_FUNCTION)) - ->setModel(new BaseList('Function Templates List', self::MODEL_TEMPLATE_FUNCTION_LIST, 'templates', self::MODEL_TEMPLATE_FUNCTION)) - ->setModel(new BaseList('Installations List', self::MODEL_INSTALLATION_LIST, 'installations', self::MODEL_INSTALLATION)) - ->setModel(new BaseList('Framework Provider Repositories List', self::MODEL_PROVIDER_REPOSITORY_FRAMEWORK_LIST, 'frameworkProviderRepositories', self::MODEL_PROVIDER_REPOSITORY_FRAMEWORK)) - ->setModel(new BaseList('Runtime Provider Repositories List', self::MODEL_PROVIDER_REPOSITORY_RUNTIME_LIST, 'runtimeProviderRepositories', self::MODEL_PROVIDER_REPOSITORY_RUNTIME)) - ->setModel(new BaseList('Branches List', self::MODEL_BRANCH_LIST, 'branches', self::MODEL_BRANCH)) - ->setModel(new BaseList('Frameworks List', self::MODEL_FRAMEWORK_LIST, 'frameworks', self::MODEL_FRAMEWORK)) - ->setModel(new BaseList('Runtimes List', self::MODEL_RUNTIME_LIST, 'runtimes', self::MODEL_RUNTIME)) - ->setModel(new BaseList('Deployments List', self::MODEL_DEPLOYMENT_LIST, 'deployments', self::MODEL_DEPLOYMENT)) - ->setModel(new BaseList('Executions List', self::MODEL_EXECUTION_LIST, 'executions', self::MODEL_EXECUTION)) - ->setModel(new BaseList('Projects List', self::MODEL_PROJECT_LIST, 'projects', self::MODEL_PROJECT, true, false)) - ->setModel(new BaseList('Webhooks List', self::MODEL_WEBHOOK_LIST, 'webhooks', self::MODEL_WEBHOOK, true, false)) - ->setModel(new BaseList('API Keys List', self::MODEL_KEY_LIST, 'keys', self::MODEL_KEY, true, false)) - ->setModel(new BaseList('Dev Keys List', self::MODEL_DEV_KEY_LIST, 'devKeys', self::MODEL_DEV_KEY, true, false)) - ->setModel(new BaseList('Auth Providers List', self::MODEL_AUTH_PROVIDER_LIST, 'platforms', self::MODEL_AUTH_PROVIDER, true, false)) - ->setModel(new BaseList('Platforms List', self::MODEL_PLATFORM_LIST, 'platforms', self::MODEL_PLATFORM, true, false)) - ->setModel(new BaseList('Countries List', self::MODEL_COUNTRY_LIST, 'countries', self::MODEL_COUNTRY)) - ->setModel(new BaseList('Continents List', self::MODEL_CONTINENT_LIST, 'continents', self::MODEL_CONTINENT)) - ->setModel(new BaseList('Languages List', self::MODEL_LANGUAGE_LIST, 'languages', self::MODEL_LANGUAGE)) - ->setModel(new BaseList('Currencies List', self::MODEL_CURRENCY_LIST, 'currencies', self::MODEL_CURRENCY)) - ->setModel(new BaseList('Phones List', self::MODEL_PHONE_LIST, 'phones', self::MODEL_PHONE)) - ->setModel(new BaseList('Metric List', self::MODEL_METRIC_LIST, 'metrics', self::MODEL_METRIC, true, false)) - ->setModel(new BaseList('Variables List', self::MODEL_VARIABLE_LIST, 'variables', self::MODEL_VARIABLE)) - ->setModel(new BaseList('Status List', self::MODEL_HEALTH_STATUS_LIST, 'statuses', self::MODEL_HEALTH_STATUS)) - ->setModel(new BaseList('Rule List', self::MODEL_PROXY_RULE_LIST, 'rules', self::MODEL_PROXY_RULE)) - ->setModel(new BaseList('Locale codes list', self::MODEL_LOCALE_CODE_LIST, 'localeCodes', self::MODEL_LOCALE_CODE)) - ->setModel(new BaseList('Provider list', self::MODEL_PROVIDER_LIST, 'providers', self::MODEL_PROVIDER)) - ->setModel(new BaseList('Message list', self::MODEL_MESSAGE_LIST, 'messages', self::MODEL_MESSAGE)) - ->setModel(new BaseList('Topic list', self::MODEL_TOPIC_LIST, 'topics', self::MODEL_TOPIC)) - ->setModel(new BaseList('Subscriber list', self::MODEL_SUBSCRIBER_LIST, 'subscribers', self::MODEL_SUBSCRIBER)) - ->setModel(new BaseList('Target list', self::MODEL_TARGET_LIST, 'targets', self::MODEL_TARGET)) - ->setModel(new BaseList('Transaction List', self::MODEL_TRANSACTION_LIST, 'transactions', self::MODEL_TRANSACTION)) - ->setModel(new BaseList('Migrations List', self::MODEL_MIGRATION_LIST, 'migrations', self::MODEL_MIGRATION)) - ->setModel(new BaseList('Migrations Firebase Projects List', self::MODEL_MIGRATION_FIREBASE_PROJECT_LIST, 'projects', self::MODEL_MIGRATION_FIREBASE_PROJECT)) - ->setModel(new BaseList('Specifications List', self::MODEL_SPECIFICATION_LIST, 'specifications', self::MODEL_SPECIFICATION)) - ->setModel(new BaseList('VCS Content List', self::MODEL_VCS_CONTENT_LIST, 'contents', self::MODEL_VCS_CONTENT)) - // Entities - ->setModel(new Database()) - // Collection API Models - ->setModel(new Collection()) - ->setModel(new Attribute()) - ->setModel(new AttributeList()) - ->setModel(new AttributeString()) - ->setModel(new AttributeInteger()) - ->setModel(new AttributeFloat()) - ->setModel(new AttributeBoolean()) - ->setModel(new AttributeEmail()) - ->setModel(new AttributeEnum()) - ->setModel(new AttributeIP()) - ->setModel(new AttributeURL()) - ->setModel(new AttributeDatetime()) - ->setModel(new AttributeRelationship()) - ->setModel(new AttributePoint()) - ->setModel(new AttributeLine()) - ->setModel(new AttributePolygon()) - // Table API Models - ->setModel(new Table()) - ->setModel(new Column()) - ->setModel(new ColumnList()) - ->setModel(new ColumnString()) - ->setModel(new ColumnInteger()) - ->setModel(new ColumnFloat()) - ->setModel(new ColumnBoolean()) - ->setModel(new ColumnEmail()) - ->setModel(new ColumnEnum()) - ->setModel(new ColumnIP()) - ->setModel(new ColumnURL()) - ->setModel(new ColumnDatetime()) - ->setModel(new ColumnRelationship()) - ->setModel(new ColumnPoint()) - ->setModel(new ColumnLine()) - ->setModel(new ColumnPolygon()) - ->setModel(new Index()) - ->setModel(new ColumnIndex()) - ->setModel(new Row()) - ->setModel(new ModelDocument()) - ->setModel(new Log()) - ->setModel(new User()) - ->setModel(new AlgoMd5()) - ->setModel(new AlgoSha()) - ->setModel(new AlgoPhpass()) - ->setModel(new AlgoBcrypt()) - ->setModel(new AlgoScrypt()) - ->setModel(new AlgoScryptModified()) - ->setModel(new AlgoArgon2()) - ->setModel(new Account()) - ->setModel(new Preferences()) - ->setModel(new Session()) - ->setModel(new Identity()) - ->setModel(new Token()) - ->setModel(new JWT()) - ->setModel(new Locale()) - ->setModel(new LocaleCode()) - ->setModel(new File()) - ->setModel(new Bucket()) - ->setModel(new ResourceToken()) - ->setModel(new Team()) - ->setModel(new Membership()) - ->setModel(new Site()) - ->setModel(new TemplateSite()) - ->setModel(new TemplateFramework()) - ->setModel(new Func()) - ->setModel(new TemplateFunction()) - ->setModel(new TemplateRuntime()) - ->setModel(new TemplateVariable()) - ->setModel(new Installation()) - ->setModel(new ProviderRepository()) - ->setModel(new ProviderRepositoryFramework()) - ->setModel(new ProviderRepositoryRuntime()) - ->setModel(new DetectionFramework()) - ->setModel(new DetectionRuntime()) - ->setModel(new DetectionVariable()) - ->setModel(new VcsContent()) - ->setModel(new Branch()) - ->setModel(new Runtime()) - ->setModel(new Framework()) - ->setModel(new FrameworkAdapter()) - ->setModel(new Deployment()) - ->setModel(new Execution()) - ->setModel(new Project()) - ->setModel(new Webhook()) - ->setModel(new Key()) - ->setModel(new DevKey()) - ->setModel(new MockNumber()) - ->setModel(new AuthProvider()) - ->setModel(new Platform()) - ->setModel(new Variable()) - ->setModel(new Country()) - ->setModel(new Continent()) - ->setModel(new Language()) - ->setModel(new Currency()) - ->setModel(new Phone()) - ->setModel(new HealthAntivirus()) - ->setModel(new HealthQueue()) - ->setModel(new HealthStatus()) - ->setModel(new HealthCertificate()) - ->setModel(new HealthTime()) - ->setModel(new HealthVersion()) - ->setModel(new Metric()) - ->setModel(new MetricBreakdown()) - ->setModel(new UsageDatabases()) - ->setModel(new UsageDatabase()) - ->setModel(new UsageTable()) - ->setModel(new UsageCollection()) - ->setModel(new UsageUsers()) - ->setModel(new UsageStorage()) - ->setModel(new UsageBuckets()) - ->setModel(new UsageFunctions()) - ->setModel(new UsageFunction()) - ->setModel(new UsageSites()) - ->setModel(new UsageSite()) - ->setModel(new UsageProject()) - ->setModel(new Headers()) - ->setModel(new Specification()) - ->setModel(new Rule()) - ->setModel(new TemplateSMS()) - ->setModel(new TemplateEmail()) - ->setModel(new ConsoleVariables()) - ->setModel(new MFAChallenge()) - ->setModel(new MFARecoveryCodes()) - ->setModel(new MFAType()) - ->setModel(new MFAFactors()) - ->setModel(new Provider()) - ->setModel(new Message()) - ->setModel(new Topic()) - ->setModel(new Transaction()) - ->setModel(new Subscriber()) - ->setModel(new Target()) - ->setModel(new Migration()) - ->setModel(new MigrationReport()) - ->setModel(new MigrationFirebaseProject()) - // Tests (keep last) - ->setModel(new Mock()); - parent::__construct($response); } @@ -639,20 +305,14 @@ class Response extends SwooleResponse public const CONTENT_TYPE_MULTIPART = 'multipart/form-data'; /** - * List of defined output objects - */ - protected $models = []; - - /** - * Set Model Object + * Register a model * - * @return self + * @param Model $model + * @return void */ - public function setModel(Model $instance): Response + public static function setModel(Model $model): void { - $this->models[$instance->getType()] = $instance; - - return $this; + self::$models[$model->getType()] = $model; } /** @@ -664,11 +324,11 @@ class Response extends SwooleResponse */ public function getModel(string $key): Model { - if (!isset($this->models[$key])) { + if (!isset(self::$models[$key])) { throw new Exception('Undefined model: ' . $key); } - return $this->models[$key]; + return self::$models[$key]; } /** @@ -678,7 +338,18 @@ class Response extends SwooleResponse */ public function getModels(): array { - return $this->models; + return self::$models; + } + + /** + * Check if a model exists + * + * @param string $key + * @return bool + */ + public static function hasModel(string $key): bool + { + return isset(self::$models[$key]); } public function applyFilters(array $data, string $model): array @@ -774,7 +445,7 @@ class Response extends SwooleResponse } if ($rule['array']) { - if (!is_array($data[$key])) { + if (!\is_array($data[$key])) { throw new Exception($key . ' must be an array of type ' . $rule['type']); } @@ -798,7 +469,7 @@ class Response extends SwooleResponse $ruleType = $rule['type']; } - if (!array_key_exists($ruleType, $this->models)) { + if (!self::hasModel($ruleType)) { throw new Exception('Missing model for rule: ' . $ruleType); } diff --git a/src/Appwrite/Utopia/Response/Filters/ListSelection.php b/src/Appwrite/Utopia/Response/Filters/ListSelection.php new file mode 100644 index 0000000000..53c5ae75cf --- /dev/null +++ b/src/Appwrite/Utopia/Response/Filters/ListSelection.php @@ -0,0 +1,41 @@ +selectQueries)) { + return $content; + } + + $selections = []; + foreach ($this->selectQueries as $query) { + foreach ($query->getValues() as $value) { + if ($value === '*') { + return $content; + } + $selections[$value] = true; + } + } + + return $this->handleList($content, $this->itemsKey, function (array $item) use ($selections) { + $filtered = []; + foreach ($item as $key => $value) { + if (isset($selections[$key]) || \str_starts_with($key, '$')) { + $filtered[$key] = $value; + } + } + return $filtered; + }); + } +} diff --git a/src/Appwrite/Utopia/Response/Model.php b/src/Appwrite/Utopia/Response/Model.php index 59c786ee1f..687b8b3eba 100644 --- a/src/Appwrite/Utopia/Response/Model.php +++ b/src/Appwrite/Utopia/Response/Model.php @@ -101,22 +101,6 @@ abstract class Model return $this; } - /** - * Delete an existing Rule - * If rule exists, it will be removed - * - * @param string $key - * @return Model - */ - public function removeRule(string $key): self - { - if (isset($this->rules[$key])) { - unset($this->rules[$key]); - } - - return $this; - } - /** * @return array */ diff --git a/src/Appwrite/Utopia/Response/Model/Account.php b/src/Appwrite/Utopia/Response/Model/Account.php index 07fd4e92ab..2ccbd2e480 100644 --- a/src/Appwrite/Utopia/Response/Model/Account.php +++ b/src/Appwrite/Utopia/Response/Model/Account.php @@ -3,18 +3,131 @@ namespace Appwrite\Utopia\Response\Model; use Appwrite\Utopia\Response; +use Appwrite\Utopia\Response\Model; +use Utopia\Database\Document; -class Account extends User +class Account extends Model { public function __construct() { - parent::__construct(); - $this - ->removeRule('password') - ->removeRule('hash') - ->removeRule('mfaRecoveryCodes') - ->removeRule('hashOptions'); + ->addRule('$id', [ + 'type' => self::TYPE_STRING, + 'description' => 'User ID.', + 'default' => '', + 'example' => '5e5ea5c16897e', + ]) + ->addRule('$createdAt', [ + 'type' => self::TYPE_DATETIME, + 'description' => 'User creation date in ISO 8601 format.', + 'default' => '', + 'example' => self::TYPE_DATETIME_EXAMPLE, + ]) + ->addRule('$updatedAt', [ + 'type' => self::TYPE_DATETIME, + 'description' => 'User update date in ISO 8601 format.', + 'default' => '', + 'example' => self::TYPE_DATETIME_EXAMPLE, + ]) + ->addRule('name', [ + 'type' => self::TYPE_STRING, + 'description' => 'User name.', + 'default' => '', + 'example' => 'John Doe', + ]) + ->addRule('registration', [ + 'type' => self::TYPE_DATETIME, + 'description' => 'User registration date in ISO 8601 format.', + 'default' => '', + 'example' => self::TYPE_DATETIME_EXAMPLE, + ]) + ->addRule('status', [ + 'type' => self::TYPE_BOOLEAN, + 'description' => 'User status. Pass `true` for enabled and `false` for disabled.', + 'default' => true, + 'example' => true, + ]) + ->addRule('labels', [ + 'type' => self::TYPE_STRING, + 'description' => 'Labels for the user.', + 'default' => [], + 'example' => ['vip'], + 'array' => true, + ]) + ->addRule('passwordUpdate', [ + 'type' => self::TYPE_DATETIME, + 'description' => 'Password update time in ISO 8601 format.', + 'default' => '', + 'example' => self::TYPE_DATETIME_EXAMPLE, + ]) + ->addRule('email', [ + 'type' => self::TYPE_STRING, + 'description' => 'User email address.', + 'default' => '', + 'example' => 'john@appwrite.io', + ]) + ->addRule('phone', [ + 'type' => self::TYPE_STRING, + 'description' => 'User phone number in E.164 format.', + 'default' => '', + 'example' => '+4930901820', + ]) + ->addRule('emailVerification', [ + 'type' => self::TYPE_BOOLEAN, + 'description' => 'Email verification status.', + 'default' => false, + 'example' => true, + ]) + ->addRule('phoneVerification', [ + 'type' => self::TYPE_BOOLEAN, + 'description' => 'Phone verification status.', + 'default' => false, + 'example' => true, + ]) + ->addRule('mfa', [ + 'type' => self::TYPE_BOOLEAN, + 'description' => 'Multi factor authentication status.', + 'default' => false, + 'example' => true, + ]) + ->addRule('prefs', [ + 'type' => Response::MODEL_PREFERENCES, + 'description' => 'User preferences as a key-value object', + 'default' => new \stdClass(), + 'example' => ['theme' => 'pink', 'timezone' => 'UTC'], + ]) + ->addRule('targets', [ + 'type' => Response::MODEL_TARGET, + 'description' => 'A user-owned message receiver. A single user may have multiple e.g. emails, phones, and a browser. Each target is registered with a single provider.', + 'default' => [], + 'array' => true, + 'example' => [], + ]) + ->addRule('accessedAt', [ + 'type' => self::TYPE_DATETIME, + 'description' => 'Most recent access date in ISO 8601 format. This attribute is only updated again after ' . APP_USER_ACCESS / 60 / 60 . ' hours.', + 'default' => '', + 'example' => self::TYPE_DATETIME_EXAMPLE, + ]) + ; + } + + /** + * Get Collection + * + * @return Document + */ + public function filter(Document $document): Document + { + $prefs = $document->getAttribute('prefs'); + if ($prefs instanceof Document) { + $prefs = $prefs->getArrayCopy(); + } + + if (is_array($prefs) && empty($prefs)) { + $document->setAttribute('prefs', new \stdClass()); + } + return $document; } /** diff --git a/src/Appwrite/Utopia/Response/Model/UsageSites.php b/src/Appwrite/Utopia/Response/Model/UsageSites.php index 74435b332c..fea87c7718 100644 --- a/src/Appwrite/Utopia/Response/Model/UsageSites.php +++ b/src/Appwrite/Utopia/Response/Model/UsageSites.php @@ -3,15 +3,19 @@ namespace Appwrite\Utopia\Response\Model; use Appwrite\Utopia\Response; +use Appwrite\Utopia\Response\Model; -class UsageSites extends UsageFunctions +class UsageSites extends Model { public function __construct() { - parent::__construct(); $this - ->removeRule('functionsTotal') - ->removeRule('functions') + ->addRule('range', [ + 'type' => self::TYPE_STRING, + 'description' => 'Time range of the usage stats.', + 'default' => '', + 'example' => '30d', + ]) ->addRule('sitesTotal', [ 'type' => self::TYPE_INTEGER, 'description' => 'Total aggregated number of sites.', @@ -25,6 +29,60 @@ class UsageSites extends UsageFunctions 'example' => [], 'array' => true ]) + ->addRule('deploymentsTotal', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Total aggregated number of sites deployments.', + 'default' => 0, + 'example' => 0, + ]) + ->addRule('deploymentsStorageTotal', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Total aggregated sum of sites deployment storage.', + 'default' => 0, + 'example' => 0, + ]) + ->addRule('buildsTotal', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Total aggregated number of sites build.', + 'default' => 0, + 'example' => 0, + ]) + ->addRule('buildsStorageTotal', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'total aggregated sum of sites build storage.', + 'default' => 0, + 'example' => 0, + ]) + ->addRule('buildsTimeTotal', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Total aggregated sum of sites build compute time.', + 'default' => 0, + 'example' => 0, + ]) + ->addRule('buildsMbSecondsTotal', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Total aggregated sum of sites build mbSeconds.', + 'default' => 0, + 'example' => 0, + ]) + ->addRule('executionsTotal', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Total aggregated number of sites execution.', + 'default' => 0, + 'example' => 0, + ]) + ->addRule('executionsTimeTotal', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Total aggregated sum of sites execution compute time.', + 'default' => 0, + 'example' => 0, + ]) + ->addRule('executionsMbSecondsTotal', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Total aggregated sum of sites execution mbSeconds.', + 'default' => 0, + 'example' => 0, + ]) ->addRule('requestsTotal', [ 'type' => self::TYPE_INTEGER, 'description' => 'Total aggregated number of requests.', @@ -64,6 +122,95 @@ class UsageSites extends UsageFunctions 'example' => [], 'array' => true ]) + ->addRule('deployments', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated number of sites deployment per period.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('deploymentsStorage', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated number of sites deployment storage per period.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('buildsSuccessTotal', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Total aggregated number of successful site builds.', + 'default' => 0, + 'example' => 0, + ]) + ->addRule('buildsFailedTotal', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Total aggregated number of failed site builds.', + 'default' => 0, + 'example' => 0, + ]) + ->addRule('builds', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated number of sites build per period.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('buildsStorage', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated sum of sites build storage per period.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('buildsTime', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated sum of sites build compute time per period.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('buildsMbSeconds', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated sum of sites build mbSeconds per period.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('executions', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated number of sites execution per period.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('executionsTime', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated number of sites execution compute time per period.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('executionsMbSeconds', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated number of sites mbSeconds per period.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('buildsSuccess', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated number of successful site builds per period.', + 'default' => [], + 'example' => [], + 'array' => true + ]) + ->addRule('buildsFailed', [ + 'type' => Response::MODEL_METRIC, + 'description' => 'Aggregated number of failed site builds per period.', + 'default' => [], + 'example' => [], + 'array' => true + ]) ; } From 49511ebdd90a032709dd416be3ab0eb93c194b75 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 4 Jan 2026 12:05:55 +0530 Subject: [PATCH 94/95] fix: missing database id in response. --- .../Http/Databases/Collections/Documents/Attribute/Decrement.php | 1 + .../Http/Databases/Collections/Documents/Attribute/Increment.php | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Decrement.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Decrement.php index a3a1ea6ce8..53831f0fc5 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Decrement.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Decrement.php @@ -177,6 +177,7 @@ class Decrement extends Action value: $value, min: $min ); + $document->setAttribute('$databaseId', $database->getId()); $document->setAttribute('$' . $this->getCollectionsEventsContext() . 'Id', $collectionId); } catch (ConflictException) { throw new Exception($this->getConflictException()); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Increment.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Increment.php index 157c5ef2af..ea680db3b1 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Increment.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Increment.php @@ -177,6 +177,7 @@ class Increment extends Action value: $value, max: $max ); + $document->setAttribute('$databaseId', $database->getId()); $document->setAttribute('$' . $this->getCollectionsEventsContext() . 'Id', $collectionId); } catch (ConflictException) { throw new Exception($this->getConflictException()); From 16f9c358503ba15564f4544e9d2414e24a848986 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 4 Jan 2026 12:09:11 +0530 Subject: [PATCH 95/95] update: tests. --- tests/e2e/Services/Databases/Legacy/DatabasesBase.php | 2 ++ .../Services/Databases/Legacy/Transactions/TransactionsBase.php | 2 ++ tests/e2e/Services/Databases/TablesDB/DatabasesBase.php | 2 ++ .../Databases/TablesDB/Transactions/TransactionsBase.php | 2 ++ 4 files changed, 8 insertions(+) diff --git a/tests/e2e/Services/Databases/Legacy/DatabasesBase.php b/tests/e2e/Services/Databases/Legacy/DatabasesBase.php index d1d2c9687d..6cde01e240 100644 --- a/tests/e2e/Services/Databases/Legacy/DatabasesBase.php +++ b/tests/e2e/Services/Databases/Legacy/DatabasesBase.php @@ -6119,6 +6119,7 @@ trait DatabasesBase $this->assertEquals(200, $inc['headers']['status-code']); $this->assertEquals(6, $inc['body']['count']); $this->assertEquals($collectionId, $inc['body']['$collectionId']); + $this->assertEquals($databaseId, $inc['body']['$databaseId']); // Verify count = 6 $get = $this->client->call(Client::METHOD_GET, "/databases/$databaseId/collections/$collectionId/documents/$docId", array_merge([ @@ -6231,6 +6232,7 @@ trait DatabasesBase $this->assertEquals(200, $dec['headers']['status-code']); $this->assertEquals(9, $dec['body']['count']); $this->assertEquals($collectionId, $dec['body']['$collectionId']); + $this->assertEquals($databaseId, $dec['body']['$databaseId']); $get = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents/' . $documentId, array_merge([ 'content-type' => 'application/json', diff --git a/tests/e2e/Services/Databases/Legacy/Transactions/TransactionsBase.php b/tests/e2e/Services/Databases/Legacy/Transactions/TransactionsBase.php index 0f85de0ff5..d4acfc338c 100644 --- a/tests/e2e/Services/Databases/Legacy/Transactions/TransactionsBase.php +++ b/tests/e2e/Services/Databases/Legacy/Transactions/TransactionsBase.php @@ -3827,6 +3827,7 @@ trait TransactionsBase $this->assertArrayHasKey('$collectionId', $decrementResponse['body'], 'Response should contain $collectionId for Collections API'); $this->assertArrayNotHasKey('$tableId', $decrementResponse['body'], 'Response should not contain $tableId for Collections API'); $this->assertEquals($collectionId, $decrementResponse['body']['$collectionId']); + $this->assertEquals($databaseId, $decrementResponse['body']['$databaseId']); // Test increment endpoint $incrementResponse = $this->client->call( @@ -3846,6 +3847,7 @@ trait TransactionsBase $this->assertArrayHasKey('$collectionId', $incrementResponse['body'], 'Response should contain $collectionId for Collections API'); $this->assertArrayNotHasKey('$tableId', $incrementResponse['body'], 'Response should not contain $tableId for Collections API'); $this->assertEquals($collectionId, $incrementResponse['body']['$collectionId']); + $this->assertEquals($databaseId, $incrementResponse['body']['$databaseId']); // Commit transaction - this will fail if transaction log has 'column' instead of 'attribute' $commitResponse = $this->client->call(Client::METHOD_PATCH, "/databases/transactions/{$transactionId}", array_merge([ diff --git a/tests/e2e/Services/Databases/TablesDB/DatabasesBase.php b/tests/e2e/Services/Databases/TablesDB/DatabasesBase.php index ba111e5923..bcb87e92d5 100644 --- a/tests/e2e/Services/Databases/TablesDB/DatabasesBase.php +++ b/tests/e2e/Services/Databases/TablesDB/DatabasesBase.php @@ -7761,6 +7761,7 @@ trait DatabasesBase ])); $this->assertEquals(200, $inc['headers']['status-code']); $this->assertEquals($tableId, $inc['body']['$tableId']); + $this->assertEquals($databaseId, $inc['body']['$databaseId']); $this->assertEquals(6, $inc['body']['count']); // Verify count = 6 @@ -7874,6 +7875,7 @@ trait DatabasesBase $this->assertEquals(200, $dec['headers']['status-code']); $this->assertEquals(9, $dec['body']['count']); $this->assertEquals($tableId, $dec['body']['$tableId']); + $this->assertEquals($databaseId, $dec['body']['$databaseId']); $get = $this->client->call(Client::METHOD_GET, '/tablesdb/' . $databaseId . '/tables/' . $tableId . '/rows/' . $rowId, array_merge([ 'content-type' => 'application/json', diff --git a/tests/e2e/Services/Databases/TablesDB/Transactions/TransactionsBase.php b/tests/e2e/Services/Databases/TablesDB/Transactions/TransactionsBase.php index 488dc60239..a5af7053f0 100644 --- a/tests/e2e/Services/Databases/TablesDB/Transactions/TransactionsBase.php +++ b/tests/e2e/Services/Databases/TablesDB/Transactions/TransactionsBase.php @@ -3963,6 +3963,7 @@ trait TransactionsBase $this->assertArrayHasKey('$tableId', $decrementResponse['body'], 'Response should contain $tableId for TablesDB API'); $this->assertArrayNotHasKey('$collectionId', $decrementResponse['body'], 'Response should not contain $collectionId for TablesDB API'); $this->assertEquals($tableId, $decrementResponse['body']['$tableId']); + $this->assertEquals($databaseId, $decrementResponse['body']['$databaseId']); // Test increment endpoint $incrementResponse = $this->client->call( @@ -3982,6 +3983,7 @@ trait TransactionsBase $this->assertArrayHasKey('$tableId', $incrementResponse['body'], 'Response should contain $tableId for TablesDB API'); $this->assertArrayNotHasKey('$collectionId', $incrementResponse['body'], 'Response should not contain $collectionId for TablesDB API'); $this->assertEquals($tableId, $incrementResponse['body']['$tableId']); + $this->assertEquals($databaseId, $incrementResponse['body']['$databaseId']); // Commit transaction - this will fail if transaction log has 'attribute' instead of 'column' $commitResponse = $this->client->call(Client::METHOD_PATCH, "/tablesdb/transactions/{$transactionId}", array_merge([