Merge remote-tracking branch 'origin/1.8.x' into documents-db-api

This commit is contained in:
ArnabChatterjee20k
2026-02-16 12:20:53 +05:30
108 changed files with 4355 additions and 4148 deletions
+1
View File
@@ -143,3 +143,4 @@ _APP_FUNCTIONS_CREATION_ABUSE_LIMIT=5000
_APP_STATS_USAGE_DUAL_WRITING_DBS=database_db_main
_APP_TRUSTED_HEADERS=x-forwarded-for
_APP_POOL_ADAPTER=stack
_APP_WORKER_SCREENSHOTS_ROUTER=http://appwrite
+5 -3
View File
@@ -3,6 +3,7 @@ concurrency:
group: '${{ github.workflow }}-${{ github.ref }}'
cancel-in-progress: true
env:
COMPOSE_FILE: docker-compose.yml
IMAGE: appwrite-dev
CACHE_KEY: 'appwrite-dev-${{ github.event.pull_request.head.sha }}'
'on':
@@ -13,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
- name: Set up Docker Buildx
@@ -28,6 +29,7 @@ jobs:
cache-from: type=gha
cache-to: 'type=gha,mode=max'
outputs: 'type=docker,dest=/tmp/${{ env.IMAGE }}.tar'
target: development
build-args: |
DEBUG=false
TESTING=true
@@ -45,7 +47,7 @@ jobs:
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Load Cache
uses: actions/cache@v4
with:
@@ -97,7 +99,7 @@ jobs:
echo "| 200 | $(jq -r '.statusCodeDistribution."200"|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark.json) | $(jq -r '.statusCodeDistribution."200"|tostring|[while(length>0;.[:-3])|.[-3:]]|reverse|join(",")' benchmark-latest.json) | " >> benchmark.txt
echo "| P99 | $(jq -r '.latencyPercentiles.p99' benchmark.json ) | $(jq -r '.latencyPercentiles.p99' benchmark-latest.json ) | " >> benchmark.txt
- name: Save results
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
if: '${{ !cancelled() }}'
with:
name: benchmark.json
+1 -1
View File
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Cleanup
run: |
+1 -1
View File
@@ -34,7 +34,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
+3 -3
View File
@@ -12,7 +12,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
fetch-depth: 2
@@ -20,9 +20,9 @@ jobs:
- name: Validate composer.json and composer.lock
run: |
docker run --rm -v $PWD:/app composer sh -c \
docker run --rm -v $PWD:/app composer:2.8 sh -c \
"composer validate"
- name: Run Linter
run: |
docker run --rm -v $PWD:/app composer sh -c \
docker run --rm -v $PWD:/app composer:2.8 sh -c \
"composer install --profile --ignore-platform-reqs && composer lint"
+3 -3
View File
@@ -10,11 +10,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
- name: Build the Docker image
run: docker build . -t appwrite_image:latest
run: DOCKER_BUILDKIT=1 docker build . --target production -t appwrite_image:latest
- name: Run Trivy vulnerability scanner on image
uses: aquasecurity/trivy-action@0.20.0
with:
@@ -33,7 +33,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Run Trivy vulnerability scanner on filesystem
uses: aquasecurity/trivy-action@0.20.0
with:
+5 -4
View File
@@ -11,19 +11,20 @@ jobs:
pull-requests: write
steps:
- name: Check out code
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
submodules: 'recursive'
- name: Build the Docker image
uses: docker/build-push-action@v5
with:
uses: docker/build-push-action@v6
with:
context: .
push: false
load: true
tags: pr_image:${{ github.sha }}
target: production
- name: Run Trivy vulnerability scanner on image
uses: aquasecurity/trivy-action@0.20.0
@@ -44,7 +45,7 @@ jobs:
- name: Process Trivy scan results
id: process-results
uses: actions/github-script@v7
uses: actions/github-script@v8
with:
script: |
const fs = require('fs');
+3 -3
View File
@@ -12,7 +12,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
fetch-depth: 2
submodules: recursive
@@ -24,7 +24,7 @@ jobs:
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
@@ -38,7 +38,7 @@ jobs:
type=ref,event=tag
- name: Build & Publish to DockerHub
uses: docker/build-push-action@v4
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64,linux/arm64
+3 -3
View File
@@ -11,7 +11,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
@@ -26,7 +26,7 @@ jobs:
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
@@ -42,7 +42,7 @@ jobs:
type=semver,pattern={{major}}
- name: Build and push
uses: docker/build-push-action@v4
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64,linux/arm64
+4 -1
View File
@@ -1,5 +1,8 @@
name: "SDK Preview"
env:
COMPOSE_FILE: docker-compose.yml
on:
pull_request:
paths:
@@ -19,7 +22,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Set SDK type
id: set-sdk
+2 -2
View File
@@ -8,11 +8,11 @@ jobs:
steps:
- name: Check out the repo
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Run CodeQL
run: |
docker run --rm -v $PWD:/app composer:2.6 sh -c \
docker run --rm -v $PWD:/app composer:2.8 sh -c \
"composer install --profile --ignore-platform-reqs && composer check"
- name: Run Locale check
+12 -10
View File
@@ -5,6 +5,7 @@ concurrency:
cancel-in-progress: true
env:
COMPOSE_FILE: docker-compose.yml
IMAGE: appwrite-dev
CACHE_KEY: appwrite-dev-${{ github.event.pull_request.head.sha }}
@@ -26,7 +27,7 @@ jobs:
database_changed: ${{ steps.check.outputs.database_changed }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Fetch base branch
run: git fetch origin ${{ github.event.pull_request.base.ref }}
@@ -48,7 +49,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
submodules: recursive
@@ -65,6 +66,7 @@ jobs:
cache-from: type=gha
cache-to: type=gha,mode=max
outputs: type=docker,dest=/tmp/${{ env.IMAGE }}.tar
target: development
build-args: |
DEBUG=false
TESTING=true
@@ -86,7 +88,7 @@ jobs:
steps:
- name: checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Load Cache
uses: actions/cache@v4
@@ -132,7 +134,7 @@ jobs:
pull-requests: write
steps:
- name: checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Load Cache
uses: actions/cache@v4
@@ -221,7 +223,7 @@ jobs:
]
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Load Cache
uses: actions/cache@v4
@@ -348,7 +350,7 @@ jobs:
steps:
- name: checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Load Cache
uses: actions/cache@v4
@@ -413,7 +415,7 @@ jobs:
pull-requests: write
steps:
- name: checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Load Cache
uses: actions/cache@v4
@@ -473,7 +475,7 @@ jobs:
]
steps:
- name: checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Load Cache
uses: actions/cache@v4
@@ -531,7 +533,7 @@ jobs:
pull-requests: write
steps:
- name: checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Load Cache
uses: actions/cache@v4
@@ -592,7 +594,7 @@ jobs:
]
steps:
- name: checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
- name: Load Cache
uses: actions/cache@v4
+1 -1
View File
@@ -12,7 +12,7 @@ RUN composer install --ignore-platform-reqs --optimize-autoloader \
--no-plugins --no-scripts --prefer-dist \
`if [ "$TESTING" != "true" ]; then echo "--no-dev"; fi`
FROM appwrite/base:0.11.5 AS base
FROM appwrite/base:1.0.0 AS base
LABEL maintainer="team@appwrite.io"
+1 -5
View File
@@ -30,9 +30,6 @@ use Utopia\Pools\Group;
use Utopia\Queue\Broker\Pool as BrokerPool;
use Utopia\Queue\Publisher;
use Utopia\Registry\Registry;
use Utopia\Span\Exporter;
use Utopia\Span\Span;
use Utopia\Span\Storage;
use Utopia\System\System;
use Utopia\Telemetry\Adapter\None as NoTelemetry;
@@ -340,6 +337,5 @@ $cli
$cli->shutdown()->action(fn () => Timer::clearAll());
Runtime::enableCoroutine(SWOOLE_HOOK_ALL);
Span::setStorage(new Storage\Coroutine());
Span::addExporter(new Exporter\Stdout());
require_once __DIR__ . '/init/span.php';
run($cli->run(...));
+11
View File
@@ -364,6 +364,17 @@ $platformCollections = [
'array' => true,
'filters' => [],
],
[
'$id' => 'status',
'type' => Database::VAR_STRING,
'format' => '',
'size' => 100,
'signed' => false,
'required' => false,
'default' => null,
'array' => false,
'filters' => [],
],
],
'indexes' => [
[
+35 -16
View File
@@ -11,7 +11,7 @@ return [
[
'key' => 'web',
'name' => 'Web',
'version' => '22.0.0',
'version' => '22.1.0',
'url' => 'https://github.com/appwrite/sdk-for-web',
'package' => 'https://www.npmjs.com/package/appwrite',
'enabled' => true,
@@ -60,7 +60,7 @@ return [
[
'key' => 'flutter',
'name' => 'Flutter',
'version' => '21.0.0',
'version' => '21.1.0',
'url' => 'https://github.com/appwrite/sdk-for-flutter',
'package' => 'https://pub.dev/packages/appwrite',
'enabled' => true,
@@ -79,7 +79,7 @@ return [
[
'key' => 'apple',
'name' => 'Apple',
'version' => '14.0.0',
'version' => '14.1.0',
'url' => 'https://github.com/appwrite/sdk-for-apple',
'package' => 'https://github.com/appwrite/sdk-for-apple',
'enabled' => true,
@@ -117,7 +117,7 @@ return [
'key' => 'android',
'name' => 'Android',
'namespace' => 'io.appwrite',
'version' => '12.0.0',
'version' => '12.1.0',
'url' => 'https://github.com/appwrite/sdk-for-android',
'package' => 'https://search.maven.org/artifact/io.appwrite/sdk-for-android',
'enabled' => true,
@@ -140,7 +140,7 @@ return [
[
'key' => 'react-native',
'name' => 'React Native',
'version' => '0.20.0',
'version' => '0.21.0',
'url' => 'https://github.com/appwrite/sdk-for-react-native',
'package' => 'https://npmjs.com/package/react-native-appwrite',
'enabled' => true,
@@ -227,7 +227,7 @@ return [
[
'key' => 'cli',
'name' => 'Command Line',
'version' => '13.3.2',
'version' => '13.4.0',
'url' => 'https://github.com/appwrite/sdk-for-cli',
'package' => 'https://www.npmjs.com/package/appwrite-cli',
'enabled' => true,
@@ -253,7 +253,7 @@ return [
[
'key' => 'markdown',
'name' => 'Markdown',
'version' => '0.2.0',
'version' => '0.3.0',
'url' => 'https://github.com/appwrite/sdk-for-md.git',
'package' => 'https://www.npmjs.com/package/@appwrite.io/docs',
'enabled' => true,
@@ -270,6 +270,25 @@ return [
'repoBranch' => 'main',
'changelog' => \realpath(__DIR__ . '/../../docs/sdks/md/CHANGELOG.md'),
],
[
'key' => 'agent-skills',
'name' => 'AgentSkills',
'version' => '0.1.0',
'url' => 'https://github.com/appwrite/agent-skills.git',
'enabled' => true,
'beta' => false,
'dev' => false,
'hidden' => false,
'family' => APP_SDK_PLATFORM_CONSOLE,
'prism' => 'agent-skills',
'source' => \realpath(__DIR__ . '/../sdks/console-agent-skills'),
'gitUrl' => 'git@github.com:appwrite/agent-skills.git',
'gitRepoName' => 'agent-skills',
'gitUserName' => 'appwrite',
'gitBranch' => 'dev',
'repoBranch' => 'main',
'changelog' => \realpath(__DIR__ . '/../../docs/sdks/agent-skills/CHANGELOG.md'),
],
],
],
@@ -283,7 +302,7 @@ return [
[
'key' => 'nodejs',
'name' => 'Node.js',
'version' => '22.0.0',
'version' => '22.0.1',
'url' => 'https://github.com/appwrite/sdk-for-node',
'package' => 'https://www.npmjs.com/package/node-appwrite',
'enabled' => true,
@@ -302,7 +321,7 @@ return [
[
'key' => 'php',
'name' => 'PHP',
'version' => '20.0.0',
'version' => '20.0.1',
'url' => 'https://github.com/appwrite/sdk-for-php',
'package' => 'https://packagist.org/packages/appwrite/appwrite',
'enabled' => true,
@@ -321,7 +340,7 @@ return [
[
'key' => 'python',
'name' => 'Python',
'version' => '15.0.0',
'version' => '15.1.0',
'url' => 'https://github.com/appwrite/sdk-for-python',
'package' => 'https://pypi.org/project/appwrite/',
'enabled' => true,
@@ -340,7 +359,7 @@ return [
[
'key' => 'ruby',
'name' => 'Ruby',
'version' => '21.0.0',
'version' => '21.0.1',
'url' => 'https://github.com/appwrite/sdk-for-ruby',
'package' => 'https://rubygems.org/gems/appwrite',
'enabled' => true,
@@ -359,7 +378,7 @@ return [
[
'key' => 'go',
'name' => 'Go',
'version' => 'v0.16.0',
'version' => 'v0.16.1',
'url' => 'https://github.com/appwrite/sdk-for-go',
'package' => 'https://github.com/appwrite/sdk-for-go',
'enabled' => true,
@@ -378,7 +397,7 @@ return [
[
'key' => 'dotnet',
'name' => '.NET',
'version' => '0.25.0',
'version' => '0.26.0',
'url' => 'https://github.com/appwrite/sdk-for-dotnet',
'package' => 'https://www.nuget.org/packages/Appwrite',
'enabled' => true,
@@ -397,7 +416,7 @@ return [
[
'key' => 'dart',
'name' => 'Dart',
'version' => '21.0.0',
'version' => '21.0.1',
'url' => 'https://github.com/appwrite/sdk-for-dart',
'package' => 'https://pub.dev/packages/dart_appwrite',
'enabled' => true,
@@ -417,7 +436,7 @@ return [
'key' => 'kotlin',
'name' => 'Kotlin',
'namespace' => 'io.appwrite',
'version' => '14.0.0',
'version' => '14.0.1',
'url' => 'https://github.com/appwrite/sdk-for-kotlin',
'package' => 'https://search.maven.org/artifact/io.appwrite/sdk-for-kotlin',
'enabled' => true,
@@ -440,7 +459,7 @@ return [
[
'key' => 'swift',
'name' => 'Swift',
'version' => '15.0.0',
'version' => '15.1.0',
'url' => 'https://github.com/appwrite/sdk-for-swift',
'package' => 'https://github.com/appwrite/sdk-for-swift',
'enabled' => true,
+76 -90
View File
@@ -555,7 +555,7 @@
"x-appwrite": {
"method": "updateMFA",
"group": "mfa",
"weight": 250,
"weight": 239,
"cookies": false,
"type": "",
"demo": "account\/update-mfa.md",
@@ -627,7 +627,7 @@
"x-appwrite": {
"method": "createMfaAuthenticator",
"group": "mfa",
"weight": 252,
"weight": 241,
"cookies": false,
"type": "",
"demo": "account\/create-mfa-authenticator.md",
@@ -751,7 +751,7 @@
"x-appwrite": {
"method": "updateMfaAuthenticator",
"group": "mfa",
"weight": 253,
"weight": 242,
"cookies": false,
"type": "",
"demo": "account\/update-mfa-authenticator.md",
@@ -891,7 +891,7 @@
"x-appwrite": {
"method": "deleteMfaAuthenticator",
"group": "mfa",
"weight": 254,
"weight": 243,
"cookies": false,
"type": "",
"demo": "account\/delete-mfa-authenticator.md",
@@ -1015,7 +1015,7 @@
"x-appwrite": {
"method": "createMfaChallenge",
"group": "mfa",
"weight": 258,
"weight": 247,
"cookies": false,
"type": "",
"demo": "account\/create-mfa-challenge.md",
@@ -1149,7 +1149,7 @@
"x-appwrite": {
"method": "updateMfaChallenge",
"group": "mfa",
"weight": 259,
"weight": 248,
"cookies": false,
"type": "",
"demo": "account\/update-mfa-challenge.md",
@@ -1287,7 +1287,7 @@
"x-appwrite": {
"method": "listMfaFactors",
"group": "mfa",
"weight": 251,
"weight": 240,
"cookies": false,
"type": "",
"demo": "account\/list-mfa-factors.md",
@@ -1388,7 +1388,7 @@
"x-appwrite": {
"method": "getMfaRecoveryCodes",
"group": "mfa",
"weight": 257,
"weight": 246,
"cookies": false,
"type": "",
"demo": "account\/get-mfa-recovery-codes.md",
@@ -1487,7 +1487,7 @@
"x-appwrite": {
"method": "createMfaRecoveryCodes",
"group": "mfa",
"weight": 255,
"weight": 244,
"cookies": false,
"type": "",
"demo": "account\/create-mfa-recovery-codes.md",
@@ -1586,7 +1586,7 @@
"x-appwrite": {
"method": "updateMfaRecoveryCodes",
"group": "mfa",
"weight": 256,
"weight": 245,
"cookies": false,
"type": "",
"demo": "account\/update-mfa-recovery-codes.md",
@@ -4051,7 +4051,7 @@
"x-appwrite": {
"method": "getBrowser",
"group": null,
"weight": 261,
"weight": 250,
"cookies": false,
"type": "location",
"demo": "avatars\/get-browser.md",
@@ -4179,7 +4179,7 @@
"x-appwrite": {
"method": "getCreditCard",
"group": null,
"weight": 260,
"weight": 249,
"cookies": false,
"type": "location",
"demo": "avatars\/get-credit-card.md",
@@ -4313,7 +4313,7 @@
"x-appwrite": {
"method": "getFavicon",
"group": null,
"weight": 264,
"weight": 253,
"cookies": false,
"type": "location",
"demo": "avatars\/get-favicon.md",
@@ -4373,7 +4373,7 @@
"x-appwrite": {
"method": "getFlag",
"group": null,
"weight": 262,
"weight": 251,
"cookies": false,
"type": "location",
"demo": "avatars\/get-flag.md",
@@ -4863,7 +4863,7 @@
"x-appwrite": {
"method": "getImage",
"group": null,
"weight": 263,
"weight": 252,
"cookies": false,
"type": "location",
"demo": "avatars\/get-image.md",
@@ -4947,7 +4947,7 @@
"x-appwrite": {
"method": "getInitials",
"group": null,
"weight": 266,
"weight": 255,
"cookies": false,
"type": "location",
"demo": "avatars\/get-initials.md",
@@ -5041,7 +5041,7 @@
"x-appwrite": {
"method": "getQR",
"group": null,
"weight": 265,
"weight": 254,
"cookies": false,
"type": "location",
"demo": "avatars\/get-qr.md",
@@ -5135,7 +5135,7 @@
"x-appwrite": {
"method": "getScreenshot",
"group": null,
"weight": 267,
"weight": 256,
"cookies": false,
"type": "location",
"demo": "avatars\/get-screenshot.md",
@@ -5888,7 +5888,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 343,
"weight": 332,
"cookies": false,
"type": "",
"demo": "databases\/list-transactions.md",
@@ -5955,7 +5955,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 339,
"weight": 328,
"cookies": false,
"type": "",
"demo": "databases\/create-transaction.md",
@@ -6026,7 +6026,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 340,
"weight": 329,
"cookies": false,
"type": "",
"demo": "databases\/get-transaction.md",
@@ -6090,7 +6090,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 341,
"weight": 330,
"cookies": false,
"type": "",
"demo": "databases\/update-transaction.md",
@@ -6168,7 +6168,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 342,
"weight": 331,
"cookies": false,
"type": "",
"demo": "databases\/delete-transaction.md",
@@ -6234,7 +6234,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 344,
"weight": 333,
"cookies": false,
"type": "",
"demo": "databases\/create-operations.md",
@@ -6319,7 +6319,7 @@
"x-appwrite": {
"method": "listDocuments",
"group": "documents",
"weight": 294,
"weight": 283,
"cookies": false,
"type": "",
"demo": "databases\/list-documents.md",
@@ -6431,7 +6431,7 @@
"x-appwrite": {
"method": "createDocument",
"group": "documents",
"weight": 286,
"weight": 275,
"cookies": false,
"type": "",
"demo": "databases\/create-document.md",
@@ -6592,7 +6592,7 @@
"x-appwrite": {
"method": "getDocument",
"group": "documents",
"weight": 287,
"weight": 276,
"cookies": false,
"type": "",
"demo": "databases\/get-document.md",
@@ -6703,7 +6703,7 @@
"x-appwrite": {
"method": "upsertDocument",
"group": "documents",
"weight": 290,
"weight": 279,
"cookies": false,
"type": "",
"demo": "databases\/upsert-document.md",
@@ -6858,7 +6858,7 @@
"x-appwrite": {
"method": "updateDocument",
"group": "documents",
"weight": 288,
"weight": 277,
"cookies": false,
"type": "",
"demo": "databases\/update-document.md",
@@ -6970,7 +6970,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 292,
"weight": 281,
"cookies": false,
"type": "",
"demo": "databases\/delete-document.md",
@@ -7077,7 +7077,7 @@
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 297,
"weight": 286,
"cookies": false,
"type": "",
"demo": "databases\/decrement-document-attribute.md",
@@ -7206,7 +7206,7 @@
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 296,
"weight": 285,
"cookies": false,
"type": "",
"demo": "databases\/increment-document-attribute.md",
@@ -7335,7 +7335,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 444,
"weight": 436,
"cookies": false,
"type": "",
"demo": "functions\/list-executions.md",
@@ -7422,7 +7422,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 442,
"weight": 434,
"cookies": false,
"type": "",
"demo": "functions\/create-execution.md",
@@ -7540,7 +7540,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 443,
"weight": 435,
"cookies": false,
"type": "",
"demo": "functions\/get-execution.md",
@@ -7615,7 +7615,7 @@
"x-appwrite": {
"method": "query",
"group": "graphql",
"weight": 187,
"weight": 176,
"cookies": false,
"type": "graphql",
"demo": "graphql\/query.md",
@@ -7669,7 +7669,7 @@
"x-appwrite": {
"method": "mutation",
"group": "graphql",
"weight": 186,
"weight": 175,
"cookies": false,
"type": "graphql",
"demo": "graphql\/mutation.md",
@@ -8155,7 +8155,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 234,
"weight": 223,
"cookies": false,
"type": "",
"demo": "messaging\/create-subscriber.md",
@@ -8239,7 +8239,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 238,
"weight": 227,
"cookies": false,
"type": "",
"demo": "messaging\/delete-subscriber.md",
@@ -8315,7 +8315,7 @@
"x-appwrite": {
"method": "listFiles",
"group": "files",
"weight": 540,
"weight": 532,
"cookies": false,
"type": "",
"demo": "storage\/list-files.md",
@@ -8414,7 +8414,7 @@
"x-appwrite": {
"method": "createFile",
"group": "files",
"weight": 538,
"weight": 530,
"cookies": false,
"type": "upload",
"demo": "storage\/create-file.md",
@@ -8516,7 +8516,7 @@
"x-appwrite": {
"method": "getFile",
"group": "files",
"weight": 539,
"weight": 531,
"cookies": false,
"type": "",
"demo": "storage\/get-file.md",
@@ -8590,7 +8590,7 @@
"x-appwrite": {
"method": "updateFile",
"group": "files",
"weight": 541,
"weight": 533,
"cookies": false,
"type": "",
"demo": "storage\/update-file.md",
@@ -8682,7 +8682,7 @@
"x-appwrite": {
"method": "deleteFile",
"group": "files",
"weight": 542,
"weight": 534,
"cookies": false,
"type": "",
"demo": "storage\/delete-file.md",
@@ -8751,7 +8751,7 @@
"x-appwrite": {
"method": "getFileDownload",
"group": "files",
"weight": 544,
"weight": 536,
"cookies": false,
"type": "location",
"demo": "storage\/get-file-download.md",
@@ -8831,7 +8831,7 @@
"x-appwrite": {
"method": "getFilePreview",
"group": "files",
"weight": 543,
"weight": 535,
"cookies": false,
"type": "location",
"demo": "storage\/get-file-preview.md",
@@ -9061,7 +9061,7 @@
"x-appwrite": {
"method": "getFileView",
"group": "files",
"weight": 545,
"weight": 537,
"cookies": false,
"type": "location",
"demo": "storage\/get-file-view.md",
@@ -9148,7 +9148,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 416,
"weight": 405,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-transactions.md",
@@ -9218,7 +9218,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 412,
"weight": 401,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-transaction.md",
@@ -9292,7 +9292,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 413,
"weight": 402,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-transaction.md",
@@ -9359,7 +9359,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 414,
"weight": 403,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-transaction.md",
@@ -9440,7 +9440,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 415,
"weight": 404,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-transaction.md",
@@ -9509,7 +9509,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 417,
"weight": 406,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-operations.md",
@@ -9597,7 +9597,7 @@
"x-appwrite": {
"method": "listRows",
"group": "rows",
"weight": 408,
"weight": 397,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-rows.md",
@@ -9708,7 +9708,7 @@
"x-appwrite": {
"method": "createRow",
"group": "rows",
"weight": 400,
"weight": 389,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-row.md",
@@ -9864,7 +9864,7 @@
"x-appwrite": {
"method": "getRow",
"group": "rows",
"weight": 401,
"weight": 390,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-row.md",
@@ -9974,7 +9974,7 @@
"x-appwrite": {
"method": "upsertRow",
"group": "rows",
"weight": 404,
"weight": 393,
"cookies": false,
"type": "",
"demo": "tablesdb\/upsert-row.md",
@@ -10124,7 +10124,7 @@
"x-appwrite": {
"method": "updateRow",
"group": "rows",
"weight": 402,
"weight": 391,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-row.md",
@@ -10235,7 +10235,7 @@
"x-appwrite": {
"method": "deleteRow",
"group": "rows",
"weight": 406,
"weight": 395,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-row.md",
@@ -10341,7 +10341,7 @@
"x-appwrite": {
"method": "decrementRowColumn",
"group": "rows",
"weight": 411,
"weight": 400,
"cookies": false,
"type": "",
"demo": "tablesdb\/decrement-row-column.md",
@@ -10469,7 +10469,7 @@
"x-appwrite": {
"method": "incrementRowColumn",
"group": "rows",
"weight": 410,
"weight": 399,
"cookies": false,
"type": "",
"demo": "tablesdb\/increment-row-column.md",
@@ -10597,7 +10597,7 @@
"x-appwrite": {
"method": "list",
"group": "teams",
"weight": 110,
"weight": 107,
"cookies": false,
"type": "",
"demo": "teams\/list.md",
@@ -10686,7 +10686,7 @@
"x-appwrite": {
"method": "create",
"group": "teams",
"weight": 109,
"weight": 106,
"cookies": false,
"type": "",
"demo": "teams\/create.md",
@@ -10773,7 +10773,7 @@
"x-appwrite": {
"method": "get",
"group": "teams",
"weight": 111,
"weight": 108,
"cookies": false,
"type": "",
"demo": "teams\/get.md",
@@ -10837,7 +10837,7 @@
"x-appwrite": {
"method": "updateName",
"group": "teams",
"weight": 113,
"weight": 110,
"cookies": false,
"type": "",
"demo": "teams\/update-name.md",
@@ -10913,7 +10913,7 @@
"x-appwrite": {
"method": "delete",
"group": "teams",
"weight": 115,
"weight": 112,
"cookies": false,
"type": "",
"demo": "teams\/delete.md",
@@ -10979,7 +10979,7 @@
"x-appwrite": {
"method": "listMemberships",
"group": "memberships",
"weight": 117,
"weight": 114,
"cookies": false,
"type": "",
"demo": "teams\/list-memberships.md",
@@ -11078,7 +11078,7 @@
"x-appwrite": {
"method": "createMembership",
"group": "memberships",
"weight": 116,
"weight": 113,
"cookies": false,
"type": "",
"demo": "teams\/create-membership.md",
@@ -11146,14 +11146,7 @@
"description": "Array of strings. Use this param to set the user roles in the team. A role can be any string. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions). Maximum of 100 roles are allowed, each 32 characters long.",
"x-example": null,
"items": {
"type": "string",
"enum": [
"admin",
"developer",
"owner"
],
"x-enum-name": null,
"x-enum-keys": []
"type": "string"
}
},
"url": {
@@ -11201,7 +11194,7 @@
"x-appwrite": {
"method": "getMembership",
"group": "memberships",
"weight": 118,
"weight": 115,
"cookies": false,
"type": "",
"demo": "teams\/get-membership.md",
@@ -11275,7 +11268,7 @@
"x-appwrite": {
"method": "updateMembership",
"group": "memberships",
"weight": 119,
"weight": 116,
"cookies": false,
"type": "",
"demo": "teams\/update-membership.md",
@@ -11336,14 +11329,7 @@
"description": "An array of strings. Use this param to set the user's roles in the team. A role can be any string. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions). Maximum of 100 roles are allowed, each 32 characters long.",
"x-example": null,
"items": {
"type": "string",
"enum": [
"admin",
"developer",
"owner"
],
"x-enum-name": null,
"x-enum-keys": []
"type": "string"
}
}
},
@@ -11371,7 +11357,7 @@
"x-appwrite": {
"method": "deleteMembership",
"group": "memberships",
"weight": 121,
"weight": 118,
"cookies": false,
"type": "",
"demo": "teams\/delete-membership.md",
@@ -11447,7 +11433,7 @@
"x-appwrite": {
"method": "updateMembershipStatus",
"group": "memberships",
"weight": 120,
"weight": 117,
"cookies": false,
"type": "",
"demo": "teams\/update-membership-status.md",
@@ -11547,7 +11533,7 @@
"x-appwrite": {
"method": "getPrefs",
"group": "teams",
"weight": 112,
"weight": 109,
"cookies": false,
"type": "",
"demo": "teams\/get-prefs.md",
@@ -11610,7 +11596,7 @@
"x-appwrite": {
"method": "updatePrefs",
"group": "teams",
"weight": 114,
"weight": 111,
"cookies": false,
"type": "",
"demo": "teams\/update-prefs.md",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+76 -90
View File
@@ -555,7 +555,7 @@
"x-appwrite": {
"method": "updateMFA",
"group": "mfa",
"weight": 250,
"weight": 239,
"cookies": false,
"type": "",
"demo": "account\/update-mfa.md",
@@ -627,7 +627,7 @@
"x-appwrite": {
"method": "createMfaAuthenticator",
"group": "mfa",
"weight": 252,
"weight": 241,
"cookies": false,
"type": "",
"demo": "account\/create-mfa-authenticator.md",
@@ -751,7 +751,7 @@
"x-appwrite": {
"method": "updateMfaAuthenticator",
"group": "mfa",
"weight": 253,
"weight": 242,
"cookies": false,
"type": "",
"demo": "account\/update-mfa-authenticator.md",
@@ -891,7 +891,7 @@
"x-appwrite": {
"method": "deleteMfaAuthenticator",
"group": "mfa",
"weight": 254,
"weight": 243,
"cookies": false,
"type": "",
"demo": "account\/delete-mfa-authenticator.md",
@@ -1015,7 +1015,7 @@
"x-appwrite": {
"method": "createMfaChallenge",
"group": "mfa",
"weight": 258,
"weight": 247,
"cookies": false,
"type": "",
"demo": "account\/create-mfa-challenge.md",
@@ -1149,7 +1149,7 @@
"x-appwrite": {
"method": "updateMfaChallenge",
"group": "mfa",
"weight": 259,
"weight": 248,
"cookies": false,
"type": "",
"demo": "account\/update-mfa-challenge.md",
@@ -1287,7 +1287,7 @@
"x-appwrite": {
"method": "listMfaFactors",
"group": "mfa",
"weight": 251,
"weight": 240,
"cookies": false,
"type": "",
"demo": "account\/list-mfa-factors.md",
@@ -1388,7 +1388,7 @@
"x-appwrite": {
"method": "getMfaRecoveryCodes",
"group": "mfa",
"weight": 257,
"weight": 246,
"cookies": false,
"type": "",
"demo": "account\/get-mfa-recovery-codes.md",
@@ -1487,7 +1487,7 @@
"x-appwrite": {
"method": "createMfaRecoveryCodes",
"group": "mfa",
"weight": 255,
"weight": 244,
"cookies": false,
"type": "",
"demo": "account\/create-mfa-recovery-codes.md",
@@ -1586,7 +1586,7 @@
"x-appwrite": {
"method": "updateMfaRecoveryCodes",
"group": "mfa",
"weight": 256,
"weight": 245,
"cookies": false,
"type": "",
"demo": "account\/update-mfa-recovery-codes.md",
@@ -4051,7 +4051,7 @@
"x-appwrite": {
"method": "getBrowser",
"group": null,
"weight": 261,
"weight": 250,
"cookies": false,
"type": "location",
"demo": "avatars\/get-browser.md",
@@ -4179,7 +4179,7 @@
"x-appwrite": {
"method": "getCreditCard",
"group": null,
"weight": 260,
"weight": 249,
"cookies": false,
"type": "location",
"demo": "avatars\/get-credit-card.md",
@@ -4313,7 +4313,7 @@
"x-appwrite": {
"method": "getFavicon",
"group": null,
"weight": 264,
"weight": 253,
"cookies": false,
"type": "location",
"demo": "avatars\/get-favicon.md",
@@ -4373,7 +4373,7 @@
"x-appwrite": {
"method": "getFlag",
"group": null,
"weight": 262,
"weight": 251,
"cookies": false,
"type": "location",
"demo": "avatars\/get-flag.md",
@@ -4863,7 +4863,7 @@
"x-appwrite": {
"method": "getImage",
"group": null,
"weight": 263,
"weight": 252,
"cookies": false,
"type": "location",
"demo": "avatars\/get-image.md",
@@ -4947,7 +4947,7 @@
"x-appwrite": {
"method": "getInitials",
"group": null,
"weight": 266,
"weight": 255,
"cookies": false,
"type": "location",
"demo": "avatars\/get-initials.md",
@@ -5041,7 +5041,7 @@
"x-appwrite": {
"method": "getQR",
"group": null,
"weight": 265,
"weight": 254,
"cookies": false,
"type": "location",
"demo": "avatars\/get-qr.md",
@@ -5135,7 +5135,7 @@
"x-appwrite": {
"method": "getScreenshot",
"group": null,
"weight": 267,
"weight": 256,
"cookies": false,
"type": "location",
"demo": "avatars\/get-screenshot.md",
@@ -5888,7 +5888,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 343,
"weight": 332,
"cookies": false,
"type": "",
"demo": "databases\/list-transactions.md",
@@ -5955,7 +5955,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 339,
"weight": 328,
"cookies": false,
"type": "",
"demo": "databases\/create-transaction.md",
@@ -6026,7 +6026,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 340,
"weight": 329,
"cookies": false,
"type": "",
"demo": "databases\/get-transaction.md",
@@ -6090,7 +6090,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 341,
"weight": 330,
"cookies": false,
"type": "",
"demo": "databases\/update-transaction.md",
@@ -6168,7 +6168,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 342,
"weight": 331,
"cookies": false,
"type": "",
"demo": "databases\/delete-transaction.md",
@@ -6234,7 +6234,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 344,
"weight": 333,
"cookies": false,
"type": "",
"demo": "databases\/create-operations.md",
@@ -6319,7 +6319,7 @@
"x-appwrite": {
"method": "listDocuments",
"group": "documents",
"weight": 294,
"weight": 283,
"cookies": false,
"type": "",
"demo": "databases\/list-documents.md",
@@ -6431,7 +6431,7 @@
"x-appwrite": {
"method": "createDocument",
"group": "documents",
"weight": 286,
"weight": 275,
"cookies": false,
"type": "",
"demo": "databases\/create-document.md",
@@ -6592,7 +6592,7 @@
"x-appwrite": {
"method": "getDocument",
"group": "documents",
"weight": 287,
"weight": 276,
"cookies": false,
"type": "",
"demo": "databases\/get-document.md",
@@ -6703,7 +6703,7 @@
"x-appwrite": {
"method": "upsertDocument",
"group": "documents",
"weight": 290,
"weight": 279,
"cookies": false,
"type": "",
"demo": "databases\/upsert-document.md",
@@ -6858,7 +6858,7 @@
"x-appwrite": {
"method": "updateDocument",
"group": "documents",
"weight": 288,
"weight": 277,
"cookies": false,
"type": "",
"demo": "databases\/update-document.md",
@@ -6970,7 +6970,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 292,
"weight": 281,
"cookies": false,
"type": "",
"demo": "databases\/delete-document.md",
@@ -7077,7 +7077,7 @@
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 297,
"weight": 286,
"cookies": false,
"type": "",
"demo": "databases\/decrement-document-attribute.md",
@@ -7206,7 +7206,7 @@
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 296,
"weight": 285,
"cookies": false,
"type": "",
"demo": "databases\/increment-document-attribute.md",
@@ -7335,7 +7335,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 444,
"weight": 436,
"cookies": false,
"type": "",
"demo": "functions\/list-executions.md",
@@ -7422,7 +7422,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 442,
"weight": 434,
"cookies": false,
"type": "",
"demo": "functions\/create-execution.md",
@@ -7540,7 +7540,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 443,
"weight": 435,
"cookies": false,
"type": "",
"demo": "functions\/get-execution.md",
@@ -7615,7 +7615,7 @@
"x-appwrite": {
"method": "query",
"group": "graphql",
"weight": 187,
"weight": 176,
"cookies": false,
"type": "graphql",
"demo": "graphql\/query.md",
@@ -7669,7 +7669,7 @@
"x-appwrite": {
"method": "mutation",
"group": "graphql",
"weight": 186,
"weight": 175,
"cookies": false,
"type": "graphql",
"demo": "graphql\/mutation.md",
@@ -8155,7 +8155,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 234,
"weight": 223,
"cookies": false,
"type": "",
"demo": "messaging\/create-subscriber.md",
@@ -8239,7 +8239,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 238,
"weight": 227,
"cookies": false,
"type": "",
"demo": "messaging\/delete-subscriber.md",
@@ -8315,7 +8315,7 @@
"x-appwrite": {
"method": "listFiles",
"group": "files",
"weight": 540,
"weight": 532,
"cookies": false,
"type": "",
"demo": "storage\/list-files.md",
@@ -8414,7 +8414,7 @@
"x-appwrite": {
"method": "createFile",
"group": "files",
"weight": 538,
"weight": 530,
"cookies": false,
"type": "upload",
"demo": "storage\/create-file.md",
@@ -8516,7 +8516,7 @@
"x-appwrite": {
"method": "getFile",
"group": "files",
"weight": 539,
"weight": 531,
"cookies": false,
"type": "",
"demo": "storage\/get-file.md",
@@ -8590,7 +8590,7 @@
"x-appwrite": {
"method": "updateFile",
"group": "files",
"weight": 541,
"weight": 533,
"cookies": false,
"type": "",
"demo": "storage\/update-file.md",
@@ -8682,7 +8682,7 @@
"x-appwrite": {
"method": "deleteFile",
"group": "files",
"weight": 542,
"weight": 534,
"cookies": false,
"type": "",
"demo": "storage\/delete-file.md",
@@ -8751,7 +8751,7 @@
"x-appwrite": {
"method": "getFileDownload",
"group": "files",
"weight": 544,
"weight": 536,
"cookies": false,
"type": "location",
"demo": "storage\/get-file-download.md",
@@ -8831,7 +8831,7 @@
"x-appwrite": {
"method": "getFilePreview",
"group": "files",
"weight": 543,
"weight": 535,
"cookies": false,
"type": "location",
"demo": "storage\/get-file-preview.md",
@@ -9061,7 +9061,7 @@
"x-appwrite": {
"method": "getFileView",
"group": "files",
"weight": 545,
"weight": 537,
"cookies": false,
"type": "location",
"demo": "storage\/get-file-view.md",
@@ -9148,7 +9148,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 416,
"weight": 405,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-transactions.md",
@@ -9218,7 +9218,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 412,
"weight": 401,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-transaction.md",
@@ -9292,7 +9292,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 413,
"weight": 402,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-transaction.md",
@@ -9359,7 +9359,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 414,
"weight": 403,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-transaction.md",
@@ -9440,7 +9440,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 415,
"weight": 404,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-transaction.md",
@@ -9509,7 +9509,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 417,
"weight": 406,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-operations.md",
@@ -9597,7 +9597,7 @@
"x-appwrite": {
"method": "listRows",
"group": "rows",
"weight": 408,
"weight": 397,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-rows.md",
@@ -9708,7 +9708,7 @@
"x-appwrite": {
"method": "createRow",
"group": "rows",
"weight": 400,
"weight": 389,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-row.md",
@@ -9864,7 +9864,7 @@
"x-appwrite": {
"method": "getRow",
"group": "rows",
"weight": 401,
"weight": 390,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-row.md",
@@ -9974,7 +9974,7 @@
"x-appwrite": {
"method": "upsertRow",
"group": "rows",
"weight": 404,
"weight": 393,
"cookies": false,
"type": "",
"demo": "tablesdb\/upsert-row.md",
@@ -10124,7 +10124,7 @@
"x-appwrite": {
"method": "updateRow",
"group": "rows",
"weight": 402,
"weight": 391,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-row.md",
@@ -10235,7 +10235,7 @@
"x-appwrite": {
"method": "deleteRow",
"group": "rows",
"weight": 406,
"weight": 395,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-row.md",
@@ -10341,7 +10341,7 @@
"x-appwrite": {
"method": "decrementRowColumn",
"group": "rows",
"weight": 411,
"weight": 400,
"cookies": false,
"type": "",
"demo": "tablesdb\/decrement-row-column.md",
@@ -10469,7 +10469,7 @@
"x-appwrite": {
"method": "incrementRowColumn",
"group": "rows",
"weight": 410,
"weight": 399,
"cookies": false,
"type": "",
"demo": "tablesdb\/increment-row-column.md",
@@ -10597,7 +10597,7 @@
"x-appwrite": {
"method": "list",
"group": "teams",
"weight": 110,
"weight": 107,
"cookies": false,
"type": "",
"demo": "teams\/list.md",
@@ -10686,7 +10686,7 @@
"x-appwrite": {
"method": "create",
"group": "teams",
"weight": 109,
"weight": 106,
"cookies": false,
"type": "",
"demo": "teams\/create.md",
@@ -10773,7 +10773,7 @@
"x-appwrite": {
"method": "get",
"group": "teams",
"weight": 111,
"weight": 108,
"cookies": false,
"type": "",
"demo": "teams\/get.md",
@@ -10837,7 +10837,7 @@
"x-appwrite": {
"method": "updateName",
"group": "teams",
"weight": 113,
"weight": 110,
"cookies": false,
"type": "",
"demo": "teams\/update-name.md",
@@ -10913,7 +10913,7 @@
"x-appwrite": {
"method": "delete",
"group": "teams",
"weight": 115,
"weight": 112,
"cookies": false,
"type": "",
"demo": "teams\/delete.md",
@@ -10979,7 +10979,7 @@
"x-appwrite": {
"method": "listMemberships",
"group": "memberships",
"weight": 117,
"weight": 114,
"cookies": false,
"type": "",
"demo": "teams\/list-memberships.md",
@@ -11078,7 +11078,7 @@
"x-appwrite": {
"method": "createMembership",
"group": "memberships",
"weight": 116,
"weight": 113,
"cookies": false,
"type": "",
"demo": "teams\/create-membership.md",
@@ -11146,14 +11146,7 @@
"description": "Array of strings. Use this param to set the user roles in the team. A role can be any string. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions). Maximum of 100 roles are allowed, each 32 characters long.",
"x-example": null,
"items": {
"type": "string",
"enum": [
"admin",
"developer",
"owner"
],
"x-enum-name": null,
"x-enum-keys": []
"type": "string"
}
},
"url": {
@@ -11201,7 +11194,7 @@
"x-appwrite": {
"method": "getMembership",
"group": "memberships",
"weight": 118,
"weight": 115,
"cookies": false,
"type": "",
"demo": "teams\/get-membership.md",
@@ -11275,7 +11268,7 @@
"x-appwrite": {
"method": "updateMembership",
"group": "memberships",
"weight": 119,
"weight": 116,
"cookies": false,
"type": "",
"demo": "teams\/update-membership.md",
@@ -11336,14 +11329,7 @@
"description": "An array of strings. Use this param to set the user's roles in the team. A role can be any string. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions). Maximum of 100 roles are allowed, each 32 characters long.",
"x-example": null,
"items": {
"type": "string",
"enum": [
"admin",
"developer",
"owner"
],
"x-enum-name": null,
"x-enum-keys": []
"type": "string"
}
}
},
@@ -11371,7 +11357,7 @@
"x-appwrite": {
"method": "deleteMembership",
"group": "memberships",
"weight": 121,
"weight": 118,
"cookies": false,
"type": "",
"demo": "teams\/delete-membership.md",
@@ -11447,7 +11433,7 @@
"x-appwrite": {
"method": "updateMembershipStatus",
"group": "memberships",
"weight": 120,
"weight": 117,
"cookies": false,
"type": "",
"demo": "teams\/update-membership-status.md",
@@ -11547,7 +11533,7 @@
"x-appwrite": {
"method": "getPrefs",
"group": "teams",
"weight": 112,
"weight": 109,
"cookies": false,
"type": "",
"demo": "teams\/get-prefs.md",
@@ -11610,7 +11596,7 @@
"x-appwrite": {
"method": "updatePrefs",
"group": "teams",
"weight": 114,
"weight": 111,
"cookies": false,
"type": "",
"demo": "teams\/update-prefs.md",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+76 -90
View File
@@ -612,7 +612,7 @@
"x-appwrite": {
"method": "updateMFA",
"group": "mfa",
"weight": 250,
"weight": 239,
"cookies": false,
"type": "",
"demo": "account\/update-mfa.md",
@@ -687,7 +687,7 @@
"x-appwrite": {
"method": "createMfaAuthenticator",
"group": "mfa",
"weight": 252,
"weight": 241,
"cookies": false,
"type": "",
"demo": "account\/create-mfa-authenticator.md",
@@ -811,7 +811,7 @@
"x-appwrite": {
"method": "updateMfaAuthenticator",
"group": "mfa",
"weight": 253,
"weight": 242,
"cookies": false,
"type": "",
"demo": "account\/update-mfa-authenticator.md",
@@ -952,7 +952,7 @@
"x-appwrite": {
"method": "deleteMfaAuthenticator",
"group": "mfa",
"weight": 254,
"weight": 243,
"cookies": false,
"type": "",
"demo": "account\/delete-mfa-authenticator.md",
@@ -1076,7 +1076,7 @@
"x-appwrite": {
"method": "createMfaChallenge",
"group": "mfa",
"weight": 258,
"weight": 247,
"cookies": false,
"type": "",
"demo": "account\/create-mfa-challenge.md",
@@ -1213,7 +1213,7 @@
"x-appwrite": {
"method": "updateMfaChallenge",
"group": "mfa",
"weight": 259,
"weight": 248,
"cookies": false,
"type": "",
"demo": "account\/update-mfa-challenge.md",
@@ -1353,7 +1353,7 @@
"x-appwrite": {
"method": "listMfaFactors",
"group": "mfa",
"weight": 251,
"weight": 240,
"cookies": false,
"type": "",
"demo": "account\/list-mfa-factors.md",
@@ -1454,7 +1454,7 @@
"x-appwrite": {
"method": "getMfaRecoveryCodes",
"group": "mfa",
"weight": 257,
"weight": 246,
"cookies": false,
"type": "",
"demo": "account\/get-mfa-recovery-codes.md",
@@ -1555,7 +1555,7 @@
"x-appwrite": {
"method": "createMfaRecoveryCodes",
"group": "mfa",
"weight": 255,
"weight": 244,
"cookies": false,
"type": "",
"demo": "account\/create-mfa-recovery-codes.md",
@@ -1656,7 +1656,7 @@
"x-appwrite": {
"method": "updateMfaRecoveryCodes",
"group": "mfa",
"weight": 256,
"weight": 245,
"cookies": false,
"type": "",
"demo": "account\/update-mfa-recovery-codes.md",
@@ -4203,7 +4203,7 @@
"x-appwrite": {
"method": "getBrowser",
"group": null,
"weight": 261,
"weight": 250,
"cookies": false,
"type": "location",
"demo": "avatars\/get-browser.md",
@@ -4329,7 +4329,7 @@
"x-appwrite": {
"method": "getCreditCard",
"group": null,
"weight": 260,
"weight": 249,
"cookies": false,
"type": "location",
"demo": "avatars\/get-credit-card.md",
@@ -4461,7 +4461,7 @@
"x-appwrite": {
"method": "getFavicon",
"group": null,
"weight": 264,
"weight": 253,
"cookies": false,
"type": "location",
"demo": "avatars\/get-favicon.md",
@@ -4525,7 +4525,7 @@
"x-appwrite": {
"method": "getFlag",
"group": null,
"weight": 262,
"weight": 251,
"cookies": false,
"type": "location",
"demo": "avatars\/get-flag.md",
@@ -5013,7 +5013,7 @@
"x-appwrite": {
"method": "getImage",
"group": null,
"weight": 263,
"weight": 252,
"cookies": false,
"type": "location",
"demo": "avatars\/get-image.md",
@@ -5097,7 +5097,7 @@
"x-appwrite": {
"method": "getInitials",
"group": null,
"weight": 266,
"weight": 255,
"cookies": false,
"type": "location",
"demo": "avatars\/get-initials.md",
@@ -5189,7 +5189,7 @@
"x-appwrite": {
"method": "getQR",
"group": null,
"weight": 265,
"weight": 254,
"cookies": false,
"type": "location",
"demo": "avatars\/get-qr.md",
@@ -5281,7 +5281,7 @@
"x-appwrite": {
"method": "getScreenshot",
"group": null,
"weight": 267,
"weight": 256,
"cookies": false,
"type": "location",
"demo": "avatars\/get-screenshot.md",
@@ -5994,7 +5994,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 343,
"weight": 332,
"cookies": false,
"type": "",
"demo": "databases\/list-transactions.md",
@@ -6061,7 +6061,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 339,
"weight": 328,
"cookies": false,
"type": "",
"demo": "databases\/create-transaction.md",
@@ -6132,7 +6132,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 340,
"weight": 329,
"cookies": false,
"type": "",
"demo": "databases\/get-transaction.md",
@@ -6195,7 +6195,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 341,
"weight": 330,
"cookies": false,
"type": "",
"demo": "databases\/update-transaction.md",
@@ -6274,7 +6274,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 342,
"weight": 331,
"cookies": false,
"type": "",
"demo": "databases\/delete-transaction.md",
@@ -6339,7 +6339,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 344,
"weight": 333,
"cookies": false,
"type": "",
"demo": "databases\/create-operations.md",
@@ -6420,7 +6420,7 @@
"x-appwrite": {
"method": "listDocuments",
"group": "documents",
"weight": 294,
"weight": 283,
"cookies": false,
"type": "",
"demo": "databases\/list-documents.md",
@@ -6524,7 +6524,7 @@
"x-appwrite": {
"method": "createDocument",
"group": "documents",
"weight": 286,
"weight": 275,
"cookies": false,
"type": "",
"demo": "databases\/create-document.md",
@@ -6683,7 +6683,7 @@
"x-appwrite": {
"method": "getDocument",
"group": "documents",
"weight": 287,
"weight": 276,
"cookies": false,
"type": "",
"demo": "databases\/get-document.md",
@@ -6786,7 +6786,7 @@
"x-appwrite": {
"method": "upsertDocument",
"group": "documents",
"weight": 290,
"weight": 279,
"cookies": false,
"type": "",
"demo": "databases\/upsert-document.md",
@@ -6937,7 +6937,7 @@
"x-appwrite": {
"method": "updateDocument",
"group": "documents",
"weight": 288,
"weight": 277,
"cookies": false,
"type": "",
"demo": "databases\/update-document.md",
@@ -7047,7 +7047,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 292,
"weight": 281,
"cookies": false,
"type": "",
"demo": "databases\/delete-document.md",
@@ -7148,7 +7148,7 @@
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 297,
"weight": 286,
"cookies": false,
"type": "",
"demo": "databases\/decrement-document-attribute.md",
@@ -7271,7 +7271,7 @@
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 296,
"weight": 285,
"cookies": false,
"type": "",
"demo": "databases\/increment-document-attribute.md",
@@ -7392,7 +7392,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 444,
"weight": 436,
"cookies": false,
"type": "",
"demo": "functions\/list-executions.md",
@@ -7475,7 +7475,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 442,
"weight": 434,
"cookies": false,
"type": "",
"demo": "functions\/create-execution.md",
@@ -7594,7 +7594,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 443,
"weight": 435,
"cookies": false,
"type": "",
"demo": "functions\/get-execution.md",
@@ -7666,7 +7666,7 @@
"x-appwrite": {
"method": "query",
"group": "graphql",
"weight": 187,
"weight": 176,
"cookies": false,
"type": "graphql",
"demo": "graphql\/query.md",
@@ -7741,7 +7741,7 @@
"x-appwrite": {
"method": "mutation",
"group": "graphql",
"weight": 186,
"weight": 175,
"cookies": false,
"type": "graphql",
"demo": "graphql\/mutation.md",
@@ -8240,7 +8240,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 234,
"weight": 223,
"cookies": false,
"type": "",
"demo": "messaging\/create-subscriber.md",
@@ -8325,7 +8325,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 238,
"weight": 227,
"cookies": false,
"type": "",
"demo": "messaging\/delete-subscriber.md",
@@ -8396,7 +8396,7 @@
"x-appwrite": {
"method": "listFiles",
"group": "files",
"weight": 540,
"weight": 532,
"cookies": false,
"type": "",
"demo": "storage\/list-files.md",
@@ -8489,7 +8489,7 @@
"x-appwrite": {
"method": "createFile",
"group": "files",
"weight": 538,
"weight": 530,
"cookies": false,
"type": "upload",
"demo": "storage\/create-file.md",
@@ -8580,7 +8580,7 @@
"x-appwrite": {
"method": "getFile",
"group": "files",
"weight": 539,
"weight": 531,
"cookies": false,
"type": "",
"demo": "storage\/get-file.md",
@@ -8651,7 +8651,7 @@
"x-appwrite": {
"method": "updateFile",
"group": "files",
"weight": 541,
"weight": 533,
"cookies": false,
"type": "",
"demo": "storage\/update-file.md",
@@ -8742,7 +8742,7 @@
"x-appwrite": {
"method": "deleteFile",
"group": "files",
"weight": 542,
"weight": 534,
"cookies": false,
"type": "",
"demo": "storage\/delete-file.md",
@@ -8813,7 +8813,7 @@
"x-appwrite": {
"method": "getFileDownload",
"group": "files",
"weight": 544,
"weight": 536,
"cookies": false,
"type": "location",
"demo": "storage\/get-file-download.md",
@@ -8893,7 +8893,7 @@
"x-appwrite": {
"method": "getFilePreview",
"group": "files",
"weight": 543,
"weight": 535,
"cookies": false,
"type": "location",
"demo": "storage\/get-file-preview.md",
@@ -9101,7 +9101,7 @@
"x-appwrite": {
"method": "getFileView",
"group": "files",
"weight": 545,
"weight": 537,
"cookies": false,
"type": "location",
"demo": "storage\/get-file-view.md",
@@ -9181,7 +9181,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 416,
"weight": 405,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-transactions.md",
@@ -9251,7 +9251,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 412,
"weight": 401,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-transaction.md",
@@ -9325,7 +9325,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 413,
"weight": 402,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-transaction.md",
@@ -9391,7 +9391,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 414,
"weight": 403,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-transaction.md",
@@ -9473,7 +9473,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 415,
"weight": 404,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-transaction.md",
@@ -9541,7 +9541,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 417,
"weight": 406,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-operations.md",
@@ -9625,7 +9625,7 @@
"x-appwrite": {
"method": "listRows",
"group": "rows",
"weight": 408,
"weight": 397,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-rows.md",
@@ -9728,7 +9728,7 @@
"x-appwrite": {
"method": "createRow",
"group": "rows",
"weight": 400,
"weight": 389,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-row.md",
@@ -9882,7 +9882,7 @@
"x-appwrite": {
"method": "getRow",
"group": "rows",
"weight": 401,
"weight": 390,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-row.md",
@@ -9984,7 +9984,7 @@
"x-appwrite": {
"method": "upsertRow",
"group": "rows",
"weight": 404,
"weight": 393,
"cookies": false,
"type": "",
"demo": "tablesdb\/upsert-row.md",
@@ -10130,7 +10130,7 @@
"x-appwrite": {
"method": "updateRow",
"group": "rows",
"weight": 402,
"weight": 391,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-row.md",
@@ -10239,7 +10239,7 @@
"x-appwrite": {
"method": "deleteRow",
"group": "rows",
"weight": 406,
"weight": 395,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-row.md",
@@ -10339,7 +10339,7 @@
"x-appwrite": {
"method": "decrementRowColumn",
"group": "rows",
"weight": 411,
"weight": 400,
"cookies": false,
"type": "",
"demo": "tablesdb\/decrement-row-column.md",
@@ -10461,7 +10461,7 @@
"x-appwrite": {
"method": "incrementRowColumn",
"group": "rows",
"weight": 410,
"weight": 399,
"cookies": false,
"type": "",
"demo": "tablesdb\/increment-row-column.md",
@@ -10581,7 +10581,7 @@
"x-appwrite": {
"method": "list",
"group": "teams",
"weight": 110,
"weight": 107,
"cookies": false,
"type": "",
"demo": "teams\/list.md",
@@ -10666,7 +10666,7 @@
"x-appwrite": {
"method": "create",
"group": "teams",
"weight": 109,
"weight": 106,
"cookies": false,
"type": "",
"demo": "teams\/create.md",
@@ -10757,7 +10757,7 @@
"x-appwrite": {
"method": "get",
"group": "teams",
"weight": 111,
"weight": 108,
"cookies": false,
"type": "",
"demo": "teams\/get.md",
@@ -10820,7 +10820,7 @@
"x-appwrite": {
"method": "updateName",
"group": "teams",
"weight": 113,
"weight": 110,
"cookies": false,
"type": "",
"demo": "teams\/update-name.md",
@@ -10896,7 +10896,7 @@
"x-appwrite": {
"method": "delete",
"group": "teams",
"weight": 115,
"weight": 112,
"cookies": false,
"type": "",
"demo": "teams\/delete.md",
@@ -10959,7 +10959,7 @@
"x-appwrite": {
"method": "listMemberships",
"group": "memberships",
"weight": 117,
"weight": 114,
"cookies": false,
"type": "",
"demo": "teams\/list-memberships.md",
@@ -11052,7 +11052,7 @@
"x-appwrite": {
"method": "createMembership",
"group": "memberships",
"weight": 116,
"weight": 113,
"cookies": false,
"type": "",
"demo": "teams\/create-membership.md",
@@ -11120,14 +11120,7 @@
"default": null,
"x-example": null,
"items": {
"type": "string",
"enum": [
"admin",
"developer",
"owner"
],
"x-enum-name": null,
"x-enum-keys": []
"type": "string"
}
},
"url": {
@@ -11176,7 +11169,7 @@
"x-appwrite": {
"method": "getMembership",
"group": "memberships",
"weight": 118,
"weight": 115,
"cookies": false,
"type": "",
"demo": "teams\/get-membership.md",
@@ -11247,7 +11240,7 @@
"x-appwrite": {
"method": "updateMembership",
"group": "memberships",
"weight": 119,
"weight": 116,
"cookies": false,
"type": "",
"demo": "teams\/update-membership.md",
@@ -11303,14 +11296,7 @@
"default": null,
"x-example": null,
"items": {
"type": "string",
"enum": [
"admin",
"developer",
"owner"
],
"x-enum-name": null,
"x-enum-keys": []
"type": "string"
}
}
},
@@ -11341,7 +11327,7 @@
"x-appwrite": {
"method": "deleteMembership",
"group": "memberships",
"weight": 121,
"weight": 118,
"cookies": false,
"type": "",
"demo": "teams\/delete-membership.md",
@@ -11414,7 +11400,7 @@
"x-appwrite": {
"method": "updateMembershipStatus",
"group": "memberships",
"weight": 120,
"weight": 117,
"cookies": false,
"type": "",
"demo": "teams\/update-membership-status.md",
@@ -11510,7 +11496,7 @@
"x-appwrite": {
"method": "getPrefs",
"group": "teams",
"weight": 112,
"weight": 109,
"cookies": false,
"type": "",
"demo": "teams\/get-prefs.md",
@@ -11573,7 +11559,7 @@
"x-appwrite": {
"method": "updatePrefs",
"group": "teams",
"weight": 114,
"weight": 111,
"cookies": false,
"type": "",
"demo": "teams\/update-prefs.md",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+76 -90
View File
@@ -612,7 +612,7 @@
"x-appwrite": {
"method": "updateMFA",
"group": "mfa",
"weight": 250,
"weight": 239,
"cookies": false,
"type": "",
"demo": "account\/update-mfa.md",
@@ -687,7 +687,7 @@
"x-appwrite": {
"method": "createMfaAuthenticator",
"group": "mfa",
"weight": 252,
"weight": 241,
"cookies": false,
"type": "",
"demo": "account\/create-mfa-authenticator.md",
@@ -811,7 +811,7 @@
"x-appwrite": {
"method": "updateMfaAuthenticator",
"group": "mfa",
"weight": 253,
"weight": 242,
"cookies": false,
"type": "",
"demo": "account\/update-mfa-authenticator.md",
@@ -952,7 +952,7 @@
"x-appwrite": {
"method": "deleteMfaAuthenticator",
"group": "mfa",
"weight": 254,
"weight": 243,
"cookies": false,
"type": "",
"demo": "account\/delete-mfa-authenticator.md",
@@ -1076,7 +1076,7 @@
"x-appwrite": {
"method": "createMfaChallenge",
"group": "mfa",
"weight": 258,
"weight": 247,
"cookies": false,
"type": "",
"demo": "account\/create-mfa-challenge.md",
@@ -1213,7 +1213,7 @@
"x-appwrite": {
"method": "updateMfaChallenge",
"group": "mfa",
"weight": 259,
"weight": 248,
"cookies": false,
"type": "",
"demo": "account\/update-mfa-challenge.md",
@@ -1353,7 +1353,7 @@
"x-appwrite": {
"method": "listMfaFactors",
"group": "mfa",
"weight": 251,
"weight": 240,
"cookies": false,
"type": "",
"demo": "account\/list-mfa-factors.md",
@@ -1454,7 +1454,7 @@
"x-appwrite": {
"method": "getMfaRecoveryCodes",
"group": "mfa",
"weight": 257,
"weight": 246,
"cookies": false,
"type": "",
"demo": "account\/get-mfa-recovery-codes.md",
@@ -1555,7 +1555,7 @@
"x-appwrite": {
"method": "createMfaRecoveryCodes",
"group": "mfa",
"weight": 255,
"weight": 244,
"cookies": false,
"type": "",
"demo": "account\/create-mfa-recovery-codes.md",
@@ -1656,7 +1656,7 @@
"x-appwrite": {
"method": "updateMfaRecoveryCodes",
"group": "mfa",
"weight": 256,
"weight": 245,
"cookies": false,
"type": "",
"demo": "account\/update-mfa-recovery-codes.md",
@@ -4203,7 +4203,7 @@
"x-appwrite": {
"method": "getBrowser",
"group": null,
"weight": 261,
"weight": 250,
"cookies": false,
"type": "location",
"demo": "avatars\/get-browser.md",
@@ -4329,7 +4329,7 @@
"x-appwrite": {
"method": "getCreditCard",
"group": null,
"weight": 260,
"weight": 249,
"cookies": false,
"type": "location",
"demo": "avatars\/get-credit-card.md",
@@ -4461,7 +4461,7 @@
"x-appwrite": {
"method": "getFavicon",
"group": null,
"weight": 264,
"weight": 253,
"cookies": false,
"type": "location",
"demo": "avatars\/get-favicon.md",
@@ -4525,7 +4525,7 @@
"x-appwrite": {
"method": "getFlag",
"group": null,
"weight": 262,
"weight": 251,
"cookies": false,
"type": "location",
"demo": "avatars\/get-flag.md",
@@ -5013,7 +5013,7 @@
"x-appwrite": {
"method": "getImage",
"group": null,
"weight": 263,
"weight": 252,
"cookies": false,
"type": "location",
"demo": "avatars\/get-image.md",
@@ -5097,7 +5097,7 @@
"x-appwrite": {
"method": "getInitials",
"group": null,
"weight": 266,
"weight": 255,
"cookies": false,
"type": "location",
"demo": "avatars\/get-initials.md",
@@ -5189,7 +5189,7 @@
"x-appwrite": {
"method": "getQR",
"group": null,
"weight": 265,
"weight": 254,
"cookies": false,
"type": "location",
"demo": "avatars\/get-qr.md",
@@ -5281,7 +5281,7 @@
"x-appwrite": {
"method": "getScreenshot",
"group": null,
"weight": 267,
"weight": 256,
"cookies": false,
"type": "location",
"demo": "avatars\/get-screenshot.md",
@@ -5994,7 +5994,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 343,
"weight": 332,
"cookies": false,
"type": "",
"demo": "databases\/list-transactions.md",
@@ -6061,7 +6061,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 339,
"weight": 328,
"cookies": false,
"type": "",
"demo": "databases\/create-transaction.md",
@@ -6132,7 +6132,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 340,
"weight": 329,
"cookies": false,
"type": "",
"demo": "databases\/get-transaction.md",
@@ -6195,7 +6195,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 341,
"weight": 330,
"cookies": false,
"type": "",
"demo": "databases\/update-transaction.md",
@@ -6274,7 +6274,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 342,
"weight": 331,
"cookies": false,
"type": "",
"demo": "databases\/delete-transaction.md",
@@ -6339,7 +6339,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 344,
"weight": 333,
"cookies": false,
"type": "",
"demo": "databases\/create-operations.md",
@@ -6420,7 +6420,7 @@
"x-appwrite": {
"method": "listDocuments",
"group": "documents",
"weight": 294,
"weight": 283,
"cookies": false,
"type": "",
"demo": "databases\/list-documents.md",
@@ -6524,7 +6524,7 @@
"x-appwrite": {
"method": "createDocument",
"group": "documents",
"weight": 286,
"weight": 275,
"cookies": false,
"type": "",
"demo": "databases\/create-document.md",
@@ -6683,7 +6683,7 @@
"x-appwrite": {
"method": "getDocument",
"group": "documents",
"weight": 287,
"weight": 276,
"cookies": false,
"type": "",
"demo": "databases\/get-document.md",
@@ -6786,7 +6786,7 @@
"x-appwrite": {
"method": "upsertDocument",
"group": "documents",
"weight": 290,
"weight": 279,
"cookies": false,
"type": "",
"demo": "databases\/upsert-document.md",
@@ -6937,7 +6937,7 @@
"x-appwrite": {
"method": "updateDocument",
"group": "documents",
"weight": 288,
"weight": 277,
"cookies": false,
"type": "",
"demo": "databases\/update-document.md",
@@ -7047,7 +7047,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 292,
"weight": 281,
"cookies": false,
"type": "",
"demo": "databases\/delete-document.md",
@@ -7148,7 +7148,7 @@
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 297,
"weight": 286,
"cookies": false,
"type": "",
"demo": "databases\/decrement-document-attribute.md",
@@ -7271,7 +7271,7 @@
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 296,
"weight": 285,
"cookies": false,
"type": "",
"demo": "databases\/increment-document-attribute.md",
@@ -7392,7 +7392,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 444,
"weight": 436,
"cookies": false,
"type": "",
"demo": "functions\/list-executions.md",
@@ -7475,7 +7475,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 442,
"weight": 434,
"cookies": false,
"type": "",
"demo": "functions\/create-execution.md",
@@ -7594,7 +7594,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 443,
"weight": 435,
"cookies": false,
"type": "",
"demo": "functions\/get-execution.md",
@@ -7666,7 +7666,7 @@
"x-appwrite": {
"method": "query",
"group": "graphql",
"weight": 187,
"weight": 176,
"cookies": false,
"type": "graphql",
"demo": "graphql\/query.md",
@@ -7741,7 +7741,7 @@
"x-appwrite": {
"method": "mutation",
"group": "graphql",
"weight": 186,
"weight": 175,
"cookies": false,
"type": "graphql",
"demo": "graphql\/mutation.md",
@@ -8240,7 +8240,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 234,
"weight": 223,
"cookies": false,
"type": "",
"demo": "messaging\/create-subscriber.md",
@@ -8325,7 +8325,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 238,
"weight": 227,
"cookies": false,
"type": "",
"demo": "messaging\/delete-subscriber.md",
@@ -8396,7 +8396,7 @@
"x-appwrite": {
"method": "listFiles",
"group": "files",
"weight": 540,
"weight": 532,
"cookies": false,
"type": "",
"demo": "storage\/list-files.md",
@@ -8489,7 +8489,7 @@
"x-appwrite": {
"method": "createFile",
"group": "files",
"weight": 538,
"weight": 530,
"cookies": false,
"type": "upload",
"demo": "storage\/create-file.md",
@@ -8580,7 +8580,7 @@
"x-appwrite": {
"method": "getFile",
"group": "files",
"weight": 539,
"weight": 531,
"cookies": false,
"type": "",
"demo": "storage\/get-file.md",
@@ -8651,7 +8651,7 @@
"x-appwrite": {
"method": "updateFile",
"group": "files",
"weight": 541,
"weight": 533,
"cookies": false,
"type": "",
"demo": "storage\/update-file.md",
@@ -8742,7 +8742,7 @@
"x-appwrite": {
"method": "deleteFile",
"group": "files",
"weight": 542,
"weight": 534,
"cookies": false,
"type": "",
"demo": "storage\/delete-file.md",
@@ -8813,7 +8813,7 @@
"x-appwrite": {
"method": "getFileDownload",
"group": "files",
"weight": 544,
"weight": 536,
"cookies": false,
"type": "location",
"demo": "storage\/get-file-download.md",
@@ -8893,7 +8893,7 @@
"x-appwrite": {
"method": "getFilePreview",
"group": "files",
"weight": 543,
"weight": 535,
"cookies": false,
"type": "location",
"demo": "storage\/get-file-preview.md",
@@ -9101,7 +9101,7 @@
"x-appwrite": {
"method": "getFileView",
"group": "files",
"weight": 545,
"weight": 537,
"cookies": false,
"type": "location",
"demo": "storage\/get-file-view.md",
@@ -9181,7 +9181,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 416,
"weight": 405,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-transactions.md",
@@ -9251,7 +9251,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 412,
"weight": 401,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-transaction.md",
@@ -9325,7 +9325,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 413,
"weight": 402,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-transaction.md",
@@ -9391,7 +9391,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 414,
"weight": 403,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-transaction.md",
@@ -9473,7 +9473,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 415,
"weight": 404,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-transaction.md",
@@ -9541,7 +9541,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 417,
"weight": 406,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-operations.md",
@@ -9625,7 +9625,7 @@
"x-appwrite": {
"method": "listRows",
"group": "rows",
"weight": 408,
"weight": 397,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-rows.md",
@@ -9728,7 +9728,7 @@
"x-appwrite": {
"method": "createRow",
"group": "rows",
"weight": 400,
"weight": 389,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-row.md",
@@ -9882,7 +9882,7 @@
"x-appwrite": {
"method": "getRow",
"group": "rows",
"weight": 401,
"weight": 390,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-row.md",
@@ -9984,7 +9984,7 @@
"x-appwrite": {
"method": "upsertRow",
"group": "rows",
"weight": 404,
"weight": 393,
"cookies": false,
"type": "",
"demo": "tablesdb\/upsert-row.md",
@@ -10130,7 +10130,7 @@
"x-appwrite": {
"method": "updateRow",
"group": "rows",
"weight": 402,
"weight": 391,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-row.md",
@@ -10239,7 +10239,7 @@
"x-appwrite": {
"method": "deleteRow",
"group": "rows",
"weight": 406,
"weight": 395,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-row.md",
@@ -10339,7 +10339,7 @@
"x-appwrite": {
"method": "decrementRowColumn",
"group": "rows",
"weight": 411,
"weight": 400,
"cookies": false,
"type": "",
"demo": "tablesdb\/decrement-row-column.md",
@@ -10461,7 +10461,7 @@
"x-appwrite": {
"method": "incrementRowColumn",
"group": "rows",
"weight": 410,
"weight": 399,
"cookies": false,
"type": "",
"demo": "tablesdb\/increment-row-column.md",
@@ -10581,7 +10581,7 @@
"x-appwrite": {
"method": "list",
"group": "teams",
"weight": 110,
"weight": 107,
"cookies": false,
"type": "",
"demo": "teams\/list.md",
@@ -10666,7 +10666,7 @@
"x-appwrite": {
"method": "create",
"group": "teams",
"weight": 109,
"weight": 106,
"cookies": false,
"type": "",
"demo": "teams\/create.md",
@@ -10757,7 +10757,7 @@
"x-appwrite": {
"method": "get",
"group": "teams",
"weight": 111,
"weight": 108,
"cookies": false,
"type": "",
"demo": "teams\/get.md",
@@ -10820,7 +10820,7 @@
"x-appwrite": {
"method": "updateName",
"group": "teams",
"weight": 113,
"weight": 110,
"cookies": false,
"type": "",
"demo": "teams\/update-name.md",
@@ -10896,7 +10896,7 @@
"x-appwrite": {
"method": "delete",
"group": "teams",
"weight": 115,
"weight": 112,
"cookies": false,
"type": "",
"demo": "teams\/delete.md",
@@ -10959,7 +10959,7 @@
"x-appwrite": {
"method": "listMemberships",
"group": "memberships",
"weight": 117,
"weight": 114,
"cookies": false,
"type": "",
"demo": "teams\/list-memberships.md",
@@ -11052,7 +11052,7 @@
"x-appwrite": {
"method": "createMembership",
"group": "memberships",
"weight": 116,
"weight": 113,
"cookies": false,
"type": "",
"demo": "teams\/create-membership.md",
@@ -11120,14 +11120,7 @@
"default": null,
"x-example": null,
"items": {
"type": "string",
"enum": [
"admin",
"developer",
"owner"
],
"x-enum-name": null,
"x-enum-keys": []
"type": "string"
}
},
"url": {
@@ -11176,7 +11169,7 @@
"x-appwrite": {
"method": "getMembership",
"group": "memberships",
"weight": 118,
"weight": 115,
"cookies": false,
"type": "",
"demo": "teams\/get-membership.md",
@@ -11247,7 +11240,7 @@
"x-appwrite": {
"method": "updateMembership",
"group": "memberships",
"weight": 119,
"weight": 116,
"cookies": false,
"type": "",
"demo": "teams\/update-membership.md",
@@ -11303,14 +11296,7 @@
"default": null,
"x-example": null,
"items": {
"type": "string",
"enum": [
"admin",
"developer",
"owner"
],
"x-enum-name": null,
"x-enum-keys": []
"type": "string"
}
}
},
@@ -11341,7 +11327,7 @@
"x-appwrite": {
"method": "deleteMembership",
"group": "memberships",
"weight": 121,
"weight": 118,
"cookies": false,
"type": "",
"demo": "teams\/delete-membership.md",
@@ -11414,7 +11400,7 @@
"x-appwrite": {
"method": "updateMembershipStatus",
"group": "memberships",
"weight": 120,
"weight": 117,
"cookies": false,
"type": "",
"demo": "teams\/update-membership-status.md",
@@ -11510,7 +11496,7 @@
"x-appwrite": {
"method": "getPrefs",
"group": "teams",
"weight": 112,
"weight": 109,
"cookies": false,
"type": "",
"demo": "teams\/get-prefs.md",
@@ -11573,7 +11559,7 @@
"x-appwrite": {
"method": "updatePrefs",
"group": "teams",
"weight": 114,
"weight": 111,
"cookies": false,
"type": "",
"demo": "teams\/update-prefs.md",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+10 -12
View File
@@ -52,6 +52,7 @@ use Utopia\Logger\Log;
use Utopia\Logger\Log\User;
use Utopia\Logger\Logger;
use Utopia\Platform\Service;
use Utopia\Span\Span;
use Utopia\System\System;
use Utopia\Validator;
use Utopia\Validator\Text;
@@ -630,8 +631,15 @@ function router(Http $utopia, Database $dbForPlatform, callable $getProjectDB, S
$headerOverrides['x-appwrite-log-id'] = $execution->getId();
}
// Headers that must have single values (RFC 7230)
$singleValueHeaders = ['content-length', 'content-type'];
foreach ($headerOverrides as $key => $value) {
if (\array_key_exists($key, $executionResponse['headers'])) {
$keyLower = \strtolower($key);
if (\in_array($keyLower, $singleValueHeaders)) {
// Single-value headers must replace, not append
$executionResponse['headers'][$key] = $value;
} elseif (\array_key_exists($key, $executionResponse['headers'])) {
if (\is_array($executionResponse['headers'][$key])) {
$executionResponse['headers'][$key][] = $value;
} else {
@@ -1238,17 +1246,7 @@ Http::error()
$trace = $error->getTrace();
if (php_sapi_name() === 'cli') {
Console::error('[Error] Timestamp: ' . date('c', time()));
if ($route) {
Console::error('[Error] Method: ' . $route->getMethod());
Console::error('[Error] URL: ' . $route->getPath());
}
Console::error('[Error] Type: ' . get_class($error));
Console::error('[Error] Message: ' . $message);
Console::error('[Error] File: ' . $file);
Console::error('[Error] Line: ' . $line);
Span::error($error);
}
switch ($class) {
+51 -33
View File
@@ -1,6 +1,7 @@
<?php
require_once __DIR__ . '/../vendor/autoload.php';
require_once __DIR__ . '/init/span.php';
use Appwrite\Utopia\Request;
use Appwrite\Utopia\Response;
@@ -31,13 +32,13 @@ use Utopia\Http\Http;
use Utopia\Logger\Log;
use Utopia\Logger\Log\User;
use Utopia\Pools\Group;
use Utopia\Span\Span;
use Utopia\System\System;
$files = new Files();
$files->load(__DIR__.'/../public');
const DOMAIN_SYNC_TIMER = 30; // 30 seconds
$files = null;
$domains = new Table(1_000_000); // 1 million rows
$domains->column('value', Table::TYPE_INT, 1);
$domains->create();
@@ -163,8 +164,11 @@ $http
Constant::OPTION_TASK_WORKER_NUM => 1, // required for the task to fetch domains background
]);
$http->on(Constant::EVENT_WORKER_START, function ($server, $workerId) {
Console::success('Worker ' . ++$workerId . ' started successfully');
$http->on(Constant::EVENT_WORKER_START, function ($server, $workerId) use (&$files) {
if (!$server->taskworker) {
$files = new Files();
$files->load(__DIR__ . '/../public');
}
});
$http->on(Constant::EVENT_WORKER_STOP, function ($server, $workerId) {
@@ -204,18 +208,19 @@ function createDatabase(Http $app, string $resourceKey, string $dbName, array $c
}
}
Console::success("[Setup] - $dbName database init started...");
Span::init("database.setup");
Span::add('database.name', $dbName);
$attempts = 0;
while (true) {
try {
$attempts++;
Console::info(" └── Creating database: $dbName...");
$database->create();
$database->create();
break; // exit loop on success
} catch (\Exception $e) {
if ($e instanceof DuplicateException) {
Console::info(" └── Skip: metadata table already exists");
Span::add('database.exists', true);
break;
}
@@ -229,6 +234,7 @@ function createDatabase(Http $app, string $resourceKey, string $dbName, array $c
}
// Process collections
$collectionsCreated = 0;
foreach ($collections as $key => $collection) {
if (($collection['$collection'] ?? '') !== Database::METADATA) {
continue;
@@ -238,8 +244,6 @@ function createDatabase(Http $app, string $resourceKey, string $dbName, array $c
continue;
}
Console::info(" └── Creating collection: {$collection['$id']}...");
$attributes = array_map(fn ($attr) => new Document([
'$id' => ID::custom($attr['$id']),
'type' => $attr['type'],
@@ -261,14 +265,19 @@ function createDatabase(Http $app, string $resourceKey, string $dbName, array $c
]), $collection['indexes']);
$database->createCollection($key, $attributes, $indexes);
$collectionsCreated++;
}
Span::add('database.collections_created', $collectionsCreated);
if ($extraSetup) {
$extraSetup($database);
}
Span::current()?->finish();
}
$http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $register) {
$http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $totalWorkers, $register) {
$app = new Http('UTC');
go(function () use ($register, $app) {
@@ -293,7 +302,6 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg
}
if ($dbForPlatform->getDocument('buckets', 'default')->isEmpty()) {
Console::info(" └── Creating default bucket...");
$dbForPlatform->createDocument('buckets', new Document([
'$id' => ID::custom('default'),
'$collection' => ID::custom('buckets'),
@@ -316,7 +324,6 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg
$bucket = $dbForPlatform->getDocument('buckets', 'default');
Console::info(" └── Creating files collection for default bucket...");
$files = $collections['buckets']['files'] ?? [];
if (empty($files)) {
throw new Exception('Files collection is not configured.');
@@ -346,7 +353,6 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg
}
if ($authorization->skip(fn () => $dbForPlatform->getDocument('buckets', 'screenshots')->isEmpty())) {
Console::info(" └── Creating screenshots bucket...");
$authorization->skip(fn () => $dbForPlatform->createDocument('buckets', new Document([
'$id' => ID::custom('screenshots'),
'$collection' => ID::custom('buckets'),
@@ -364,7 +370,6 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg
$bucket = $authorization->skip(fn () => $dbForPlatform->getDocument('buckets', 'screenshots'));
Console::info(" └── Creating files collection for screenshots bucket...");
$files = $collections['buckets']['files'] ?? [];
if (empty($files)) {
throw new Exception('Files collection is not configured.');
@@ -418,6 +423,9 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg
])));
foreach ($sharedTablesV2All as $hostname) {
Span::init('database.setup');
Span::add('database.hostname', $hostname);
$adapter = new DatabasePool($pools->get($hostname));
$dbForProject = (new Database($adapter, $cache))
->setDatabase('appwrite')
@@ -431,11 +439,10 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg
while (true) {
try {
$attempts++;
Console::success('[Setup] - Creating project database: ' . $hostname . '...');
$dbForProject->create();
$dbForProject->create();
break; // exit loop on success
} catch (DuplicateException) {
Console::success('[Setup] - Skip: metadata table already exists');
Span::add('database.exists', true);
break;
} catch (\Throwable $e) {
Console::warning(" └── Project database create failed. Retrying ({$attempts})...");
@@ -452,6 +459,7 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg
$audit->setup();
}
$collectionsCreated = 0;
foreach ($projectCollections as $key => $collection) {
if (($collection['$collection'] ?? '') !== Database::METADATA) {
continue;
@@ -463,17 +471,21 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg
$attributes = \array_map(fn ($attribute) => new Document($attribute), $collection['attributes']);
$indexes = \array_map(fn (array $index) => new Document($index), $collection['indexes']);
Console::success('[Setup] - Creating project collection: ' . $collection['$id'] . '...');
$dbForProject->createCollection($key, $attributes, $indexes);
$collectionsCreated++;
}
}
Console::success('[Setup] - Server database init completed...');
Span::add('database.collections_created', $collectionsCreated);
Span::current()?->finish();
}
});
Console::success('Server started successfully (max payload is ' . number_format($payloadSize) . ' bytes)');
Console::info("Master pid {$http->master_pid}, manager pid {$http->manager_pid}");
Span::init('http.server.start');
Span::add('server.workers', $totalWorkers);
Span::add('server.payload_size', $payloadSize);
Span::add('server.master_pid', $http->master_pid);
Span::add('server.manager_pid', $http->manager_pid);
Span::current()?->finish();
// Start the task that starts fetching custom domains
$http->task([], 0);
@@ -485,15 +497,19 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg
});
});
$http->on(Constant::EVENT_REQUEST, function (SwooleRequest $swooleRequest, SwooleResponse $swooleResponse) use ($register, $files) {
$http->on(Constant::EVENT_REQUEST, function (SwooleRequest $swooleRequest, SwooleResponse $swooleResponse) use ($register, &$files) {
Span::init('http.request');
Http::setResource('swooleRequest', fn () => $swooleRequest);
Http::setResource('swooleResponse', fn () => $swooleResponse);
$request = new Request($swooleRequest);
$response = new Response($swooleResponse);
if ($files->isFileLoaded($request->getURI())) {
$time = (60 * 60 * 24 * 365 * 2); // 45 days cache
Span::add('http.method', $request->getMethod());
if ($files instanceof Files && $files->isFileLoaded($request->getURI())) {
$time = (60 * 60 * 24 * 45); // 45 days cache
$response
->setContentType($files->getFileMimeType($request->getURI()))
@@ -520,7 +536,12 @@ $http->on(Constant::EVENT_REQUEST, function (SwooleRequest $swooleRequest, Swool
$authorization->addRole(Role::any()->toString());
$app->run($request, $response);
$route = $app->getRoute();
Span::add('http.path', $route?->getPath() ?? 'unknown');
} catch (\Throwable $th) {
Span::error($th);
$version = System::getEnv('_APP_VERSION', 'UNKNOWN');
$logger = $app->getResource("logger");
@@ -583,12 +604,6 @@ $http->on(Constant::EVENT_REQUEST, function (SwooleRequest $swooleRequest, Swool
}
}
Console::error('[Error] Type: ' . get_class($th));
Console::error('[Error] Message: ' . $th->getMessage());
Console::error('[Error] File: ' . $th->getFile());
Console::error('[Error] Line: ' . $th->getLine());
Console::error('[Error] Trace: ' . $th->getTraceAsString());
$swooleResponse->setStatusCode(500);
$output = ((Http::isDevelopment())) ? [
@@ -605,6 +620,9 @@ $http->on(Constant::EVENT_REQUEST, function (SwooleRequest $swooleRequest, Swool
];
$swooleResponse->end(\json_encode($output));
} finally {
Span::add('http.response.code', $response->getStatusCode());
Span::current()?->finish();
}
});
+3
View File
@@ -431,6 +431,9 @@ const COOKIE_NAME_PREVIEW = 'a_jwt_console';
const CACHE_RECONNECT_MAX_RETRIES = 2;
const CACHE_RECONNECT_RETRY_DELAY = 1000;
// Project status
const PROJECT_STATUS_ACTIVE = 'active';
// Database types
const DATABASE_TYPE_LEGACY = 'legacy';
const DATABASE_TYPE_TABLESDB = 'tablesdb';
+8
View File
@@ -0,0 +1,8 @@
<?php
use Utopia\Span\Exporter;
use Utopia\Span\Span;
use Utopia\Span\Storage;
Span::setStorage(new Storage\Coroutine());
Span::addExporter(new Exporter\Pretty());
+1 -5
View File
@@ -45,17 +45,13 @@ use Utopia\Queue\Message;
use Utopia\Queue\Publisher;
use Utopia\Queue\Server;
use Utopia\Registry\Registry;
use Utopia\Span\Exporter;
use Utopia\Span\Span;
use Utopia\Span\Storage;
use Utopia\Storage\Device\Telemetry as TelemetryDevice;
use Utopia\System\System;
use Utopia\Telemetry\Adapter as Telemetry;
use Utopia\Telemetry\Adapter\None as NoTelemetry;
Runtime::enableCoroutine();
Span::setStorage(new Storage\Coroutine());
Span::addExporter(new Exporter\Stdout());
require_once __DIR__ . '/init/span.php';
global $register;
Server::setResource('register', fn () => $register);
+5 -4
View File
@@ -54,12 +54,13 @@
"utopia-php/cache": "1.0.*",
"utopia-php/cli": "0.22.*",
"utopia-php/config": "1.*",
"utopia-php/console": "0.1.*",
"utopia-php/database": "5.*",
"utopia-php/agents": "dev-chore-bump-fetch as 0.4.7",
"utopia-php/detector": "0.2.*",
"utopia-php/domains": "1.*",
"utopia-php/emails": "0.6.*",
"utopia-php/dns": "1.5.*",
"utopia-php/dns": "1.6.*",
"utopia-php/dsn": "0.2.1",
"utopia-php/framework": "0.33.*",
"utopia-php/fetch": "0.5.*",
@@ -71,6 +72,7 @@
"utopia-php/orchestration": "0.9.*",
"utopia-php/platform": "0.7.*",
"utopia-php/pools": "1.*",
"utopia-php/span": "1.1.*",
"utopia-php/preloader": "0.2.*",
"utopia-php/queue": "0.15.*",
"utopia-php/registry": "0.5.*",
@@ -78,8 +80,7 @@
"utopia-php/system": "0.10.*",
"utopia-php/telemetry": "0.2.*",
"utopia-php/vcs": "1.*",
"utopia-php/websocket": "0.3.*",
"utopia-php/console": "0.1.*",
"utopia-php/websocket": "1.0.*",
"matomo/device-detector": "6.4.*",
"dragonmantank/cron-expression": "3.4.*",
"phpmailer/phpmailer": "6.9.*",
@@ -95,7 +96,7 @@
"appwrite/sdk-generator": "*",
"phpunit/phpunit": "9.*",
"swoole/ide-helper": "6.*",
"phpstan/phpstan": "1.8.*",
"phpstan/phpstan": "1.12.*",
"textalk/websocket": "1.5.*",
"laravel/pint": "1.*",
"phpbench/phpbench": "1.*"
Generated
+51 -56
View File
@@ -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": "367aaf665ff75a13d5d7c8b3bedb89a9",
"content-hash": "9397ae16877660a3ea485cfdcaab906c",
"packages": [
{
"name": "adhocore/jwt",
@@ -3846,16 +3846,16 @@
},
{
"name": "utopia-php/database",
"version": "5.0.2",
"version": "5.1.1",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/database.git",
"reference": "aa80f86f5bf3f0d8c13abd3213bf1649f542d366"
"reference": "94815bfa605282096272625827d0314f9ed99066"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/database/zipball/aa80f86f5bf3f0d8c13abd3213bf1649f542d366",
"reference": "aa80f86f5bf3f0d8c13abd3213bf1649f542d366",
"url": "https://api.github.com/repos/utopia-php/database/zipball/94815bfa605282096272625827d0314f9ed99066",
"reference": "94815bfa605282096272625827d0314f9ed99066",
"shasum": ""
},
"require": {
@@ -3863,10 +3863,10 @@
"ext-mongodb": "*",
"ext-pdo": "*",
"php": ">=8.4",
"utopia-php/cache": "1.0.*",
"utopia-php/cache": "1.*",
"utopia-php/framework": "0.33.*",
"utopia-php/mongo": "0.11.*",
"utopia-php/pools": "1.0.*"
"utopia-php/mongo": "1.*",
"utopia-php/pools": "1.*"
},
"require-dev": {
"fakerphp/faker": "1.23.*",
@@ -3898,9 +3898,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/database/issues",
"source": "https://github.com/utopia-php/database/tree/5.0.2"
"source": "https://github.com/utopia-php/database/tree/5.1.1"
},
"time": "2026-02-08T05:23:42+00:00"
"time": "2026-02-12T11:44:58+00:00"
},
{
"name": "utopia-php/detector",
@@ -3997,22 +3997,22 @@
},
{
"name": "utopia-php/dns",
"version": "1.5.4",
"version": "1.6.2",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/dns.git",
"reference": "ee831a6f2ceb28babb042ea65539c26ea4530bf6"
"reference": "98c70520213a41e2fe1867e5b110273c06bf1cab"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/dns/zipball/ee831a6f2ceb28babb042ea65539c26ea4530bf6",
"reference": "ee831a6f2ceb28babb042ea65539c26ea4530bf6",
"url": "https://api.github.com/repos/utopia-php/dns/zipball/98c70520213a41e2fe1867e5b110273c06bf1cab",
"reference": "98c70520213a41e2fe1867e5b110273c06bf1cab",
"shasum": ""
},
"require": {
"php": ">=8.3",
"utopia-php/domains": "1.0.*",
"utopia-php/span": "1.0.*",
"utopia-php/span": "1.1.*",
"utopia-php/telemetry": "*",
"utopia-php/validators": "0.*"
},
@@ -4048,9 +4048,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/dns/issues",
"source": "https://github.com/utopia-php/dns/tree/1.5.4"
"source": "https://github.com/utopia-php/dns/tree/1.6.2"
},
"time": "2026-02-02T10:40:38+00:00"
"time": "2026-02-13T12:29:08+00:00"
},
{
"name": "utopia-php/domains",
@@ -4568,16 +4568,16 @@
},
{
"name": "utopia-php/mongo",
"version": "0.11.0",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/mongo.git",
"reference": "34bc0cda8ea368cde68702a6fffe2c3ac625398e"
"reference": "45bedf36c2c946ec7a0a3e59b9f12f772de0b01d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/mongo/zipball/34bc0cda8ea368cde68702a6fffe2c3ac625398e",
"reference": "34bc0cda8ea368cde68702a6fffe2c3ac625398e",
"url": "https://api.github.com/repos/utopia-php/mongo/zipball/45bedf36c2c946ec7a0a3e59b9f12f772de0b01d",
"reference": "45bedf36c2c946ec7a0a3e59b9f12f772de0b01d",
"shasum": ""
},
"require": {
@@ -4623,9 +4623,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/mongo/issues",
"source": "https://github.com/utopia-php/mongo/tree/0.11.0"
"source": "https://github.com/utopia-php/mongo/tree/1.0.0"
},
"time": "2025-10-20T11:11:23+00:00"
"time": "2026-02-12T05:54:06+00:00"
},
{
"name": "utopia-php/platform",
@@ -4958,25 +4958,26 @@
},
{
"name": "utopia-php/span",
"version": "1.0.0",
"version": "1.1.4",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/span.git",
"reference": "f2f6c499ded3a776e8019902e83d140ff0f89693"
"reference": "49d04aa588a2cdbbc9381ee7a1c129469e0f905c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/span/zipball/f2f6c499ded3a776e8019902e83d140ff0f89693",
"reference": "f2f6c499ded3a776e8019902e83d140ff0f89693",
"url": "https://api.github.com/repos/utopia-php/span/zipball/49d04aa588a2cdbbc9381ee7a1c129469e0f905c",
"reference": "49d04aa588a2cdbbc9381ee7a1c129469e0f905c",
"shasum": ""
},
"require": {
"php": ">=8.1"
"php": ">=8.2"
},
"require-dev": {
"laravel/pint": "^1.0",
"phpstan/phpstan": "^2.0",
"phpunit/phpunit": "^10.0",
"rector/rector": "^2.3",
"swoole/ide-helper": "^5.0"
},
"suggest": {
@@ -4995,9 +4996,9 @@
"description": "Simple span tracing library for PHP with coroutine support",
"support": {
"issues": "https://github.com/utopia-php/span/issues",
"source": "https://github.com/utopia-php/span/tree/1.0.0"
"source": "https://github.com/utopia-php/span/tree/1.1.4"
},
"time": "2026-01-12T20:05:10+00:00"
"time": "2026-02-13T10:58:12+00:00"
},
{
"name": "utopia-php/storage",
@@ -5264,16 +5265,16 @@
},
{
"name": "utopia-php/websocket",
"version": "0.3.1",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/websocket.git",
"reference": "77004ba9f66a0ab6eb840a85b2af332fca8f6bd9"
"reference": "d230de8d4d2450184297327238ed1fbde676b8d2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/websocket/zipball/77004ba9f66a0ab6eb840a85b2af332fca8f6bd9",
"reference": "77004ba9f66a0ab6eb840a85b2af332fca8f6bd9",
"url": "https://api.github.com/repos/utopia-php/websocket/zipball/d230de8d4d2450184297327238ed1fbde676b8d2",
"reference": "d230de8d4d2450184297327238ed1fbde676b8d2",
"shasum": ""
},
"require": {
@@ -5307,9 +5308,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/websocket/issues",
"source": "https://github.com/utopia-php/websocket/tree/0.3.1"
"source": "https://github.com/utopia-php/websocket/tree/1.0.0"
},
"time": "2025-05-09T12:57:42+00:00"
"time": "2026-02-05T13:40:16+00:00"
},
{
"name": "webmozart/assert",
@@ -5438,16 +5439,16 @@
"packages-dev": [
{
"name": "appwrite/sdk-generator",
"version": "1.8.28",
"version": "1.9.0",
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-generator.git",
"reference": "4762aa017b28a3a7e4e53da6e193d0c196ec3fd4"
"reference": "94a2d7ef55ea63c6e8afb166d39a82c07d01c8c0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/4762aa017b28a3a7e4e53da6e193d0c196ec3fd4",
"reference": "4762aa017b28a3a7e4e53da6e193d0c196ec3fd4",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/94a2d7ef55ea63c6e8afb166d39a82c07d01c8c0",
"reference": "94a2d7ef55ea63c6e8afb166d39a82c07d01c8c0",
"shasum": ""
},
"require": {
@@ -5483,9 +5484,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.8.28"
"source": "https://github.com/appwrite/sdk-generator/tree/1.9.0"
},
"time": "2026-02-11T10:35:18+00:00"
"time": "2026-02-12T12:08:13+00:00"
},
{
"name": "doctrine/annotations",
@@ -6287,16 +6288,11 @@
},
{
"name": "phpstan/phpstan",
"version": "1.8.11",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "46e223dd68a620da18855c23046ddb00940b4014"
},
"version": "1.12.32",
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/46e223dd68a620da18855c23046ddb00940b4014",
"reference": "46e223dd68a620da18855c23046ddb00940b4014",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/2770dcdf5078d0b0d53f94317e06affe88419aa8",
"reference": "2770dcdf5078d0b0d53f94317e06affe88419aa8",
"shasum": ""
},
"require": {
@@ -6325,8 +6321,11 @@
"static analysis"
],
"support": {
"docs": "https://phpstan.org/user-guide/getting-started",
"forum": "https://github.com/phpstan/phpstan/discussions",
"issues": "https://github.com/phpstan/phpstan/issues",
"source": "https://github.com/phpstan/phpstan/tree/1.8.11"
"security": "https://github.com/phpstan/phpstan/security/policy",
"source": "https://github.com/phpstan/phpstan-src"
},
"funding": [
{
@@ -6336,13 +6335,9 @@
{
"url": "https://github.com/phpstan",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
"type": "tidelift"
}
],
"time": "2022-10-24T15:45:13+00:00"
"time": "2025-09-30T10:16:31+00:00"
},
{
"name": "phpunit/php-code-coverage",
+1
View File
@@ -602,6 +602,7 @@ services:
environment:
# Specific
- _APP_BROWSER_HOST
- _APP_WORKER_SCREENSHOTS_ROUTER
# Basic
- _APP_ENV
- _APP_WORKER_PER_CORE
@@ -2,7 +2,6 @@
import io.appwrite.Client;
import io.appwrite.coroutines.CoroutineCallback;
import io.appwrite.services.Teams;
import io.appwrite.enums.Roles;
Client client = new Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -12,7 +11,7 @@ Teams teams = new Teams(client);
teams.createMembership(
"<TEAM_ID>", // teamId
Roles.ADMIN, // roles
List.of(), // roles
"email@example.com", // email (optional)
"<USER_ID>", // userId (optional)
"+12065550100", // phone (optional)
@@ -2,7 +2,6 @@
import io.appwrite.Client;
import io.appwrite.coroutines.CoroutineCallback;
import io.appwrite.services.Teams;
import io.appwrite.enums.Roles;
Client client = new Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,7 +12,7 @@ Teams teams = new Teams(client);
teams.updateMembership(
"<TEAM_ID>", // teamId
"<MEMBERSHIP_ID>", // membershipId
Roles.ADMIN, // roles
List.of(), // roles
new CoroutineCallback<>((result, error) -> {
if (error != null) {
error.printStackTrace();
@@ -2,7 +2,6 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.Teams
import io.appwrite.enums.Roles
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -12,7 +11,7 @@ val teams = Teams(client)
val result = teams.createMembership(
teamId = "<TEAM_ID>",
roles = roles.ADMIN,
roles = listOf(),
email = "email@example.com", // (optional)
userId = "<USER_ID>", // (optional)
phone = "+12065550100", // (optional)
@@ -2,7 +2,6 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.Teams
import io.appwrite.enums.Roles
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,5 +12,5 @@ val teams = Teams(client)
val result = teams.updateMembership(
teamId = "<TEAM_ID>",
membershipId = "<MEMBERSHIP_ID>",
roles = roles.ADMIN,
roles = listOf(),
)```
@@ -1,6 +1,5 @@
```swift
import Appwrite
import AppwriteEnums
let client = Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -10,7 +9,7 @@ let teams = Teams(client)
let membership = try await teams.createMembership(
teamId: "<TEAM_ID>",
roles: [.admin],
roles: [],
email: "email@example.com", // optional
userId: "<USER_ID>", // optional
phone: "+12065550100", // optional
@@ -1,6 +1,5 @@
```swift
import Appwrite
import AppwriteEnums
let client = Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -11,7 +10,7 @@ let teams = Teams(client)
let membership = try await teams.updateMembership(
teamId: "<TEAM_ID>",
membershipId: "<MEMBERSHIP_ID>",
roles: [.admin]
roles: []
)
```
@@ -1,6 +1,5 @@
```dart
import 'package:appwrite/appwrite.dart';
import 'package:appwrite/enums.dart' as enums;
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,7 +9,7 @@ Teams teams = Teams(client);
Membership result = await teams.createMembership(
teamId: '<TEAM_ID>',
roles: [enums.Roles.admin],
roles: [],
email: 'email@example.com', // optional
userId: '<USER_ID>', // optional
phone: '+12065550100', // optional
@@ -1,6 +1,5 @@
```dart
import 'package:appwrite/appwrite.dart';
import 'package:appwrite/enums.dart' as enums;
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,6 +10,6 @@ Teams teams = Teams(client);
Membership result = await teams.updateMembership(
teamId: '<TEAM_ID>',
membershipId: '<MEMBERSHIP_ID>',
roles: [enums.Roles.admin],
roles: [],
);
```
@@ -1,5 +1,5 @@
```javascript
import { Client, Teams, Roles } from "react-native-appwrite";
import { Client, Teams } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -9,7 +9,7 @@ const teams = new Teams(client);
const result = await teams.createMembership({
teamId: '<TEAM_ID>',
roles: [Roles.Admin],
roles: [],
email: 'email@example.com', // optional
userId: '<USER_ID>', // optional
phone: '+12065550100', // optional
@@ -1,5 +1,5 @@
```javascript
import { Client, Teams, Roles } from "react-native-appwrite";
import { Client, Teams } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,7 +10,7 @@ const teams = new Teams(client);
const result = await teams.updateMembership({
teamId: '<TEAM_ID>',
membershipId: '<MEMBERSHIP_ID>',
roles: [Roles.Admin]
roles: []
});
console.log(result);
@@ -1,5 +1,5 @@
```javascript
import { Client, Teams, Roles } from "appwrite";
import { Client, Teams } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -9,7 +9,7 @@ const teams = new Teams(client);
const result = await teams.createMembership({
teamId: '<TEAM_ID>',
roles: [Roles.Admin],
roles: [],
email: 'email@example.com', // optional
userId: '<USER_ID>', // optional
phone: '+12065550100', // optional
@@ -1,5 +1,5 @@
```javascript
import { Client, Teams, Roles } from "appwrite";
import { Client, Teams } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,7 +10,7 @@ const teams = new Teams(client);
const result = await teams.updateMembership({
teamId: '<TEAM_ID>',
membershipId: '<MEMBERSHIP_ID>',
roles: [Roles.Admin]
roles: []
});
console.log(result);
@@ -11,6 +11,7 @@ const result = await projects.createKey({
projectId: '<PROJECT_ID>',
name: '<NAME>',
scopes: [Scopes.SessionsWrite],
keyId: '<KEY_ID>', // optional
expire: '' // optional
});
@@ -9,6 +9,7 @@ const projects = new Projects(client);
const result = await projects.listKeys({
projectId: '<PROJECT_ID>',
queries: [], // optional
total: false // optional
});
@@ -1,5 +1,5 @@
```javascript
import { Client, Teams, Roles } from "@appwrite.io/console";
import { Client, Teams } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -9,7 +9,7 @@ const teams = new Teams(client);
const result = await teams.createMembership({
teamId: '<TEAM_ID>',
roles: [Roles.Admin],
roles: [],
email: 'email@example.com', // optional
userId: '<USER_ID>', // optional
phone: '+12065550100', // optional
@@ -1,5 +1,5 @@
```javascript
import { Client, Teams, Roles } from "@appwrite.io/console";
import { Client, Teams } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,7 +10,7 @@ const teams = new Teams(client);
const result = await teams.updateMembership({
teamId: '<TEAM_ID>',
membershipId: '<MEMBERSHIP_ID>',
roles: [Roles.Admin]
roles: []
});
console.log(result);
@@ -1,6 +1,5 @@
```dart
import 'package:dart_appwrite/dart_appwrite.dart';
import 'package:dart_appwrite/enums.dart' as enums;
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,7 +10,7 @@ Teams teams = Teams(client);
Membership result = await teams.createMembership(
teamId: '<TEAM_ID>',
roles: [enums.Roles.admin],
roles: [],
email: 'email@example.com', // (optional)
userId: '<USER_ID>', // (optional)
phone: '+12065550100', // (optional)
@@ -1,6 +1,5 @@
```dart
import 'package:dart_appwrite/dart_appwrite.dart';
import 'package:dart_appwrite/enums.dart' as enums;
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -12,6 +11,6 @@ Teams teams = Teams(client);
Membership result = await teams.updateMembership(
teamId: '<TEAM_ID>',
membershipId: '<MEMBERSHIP_ID>',
roles: [enums.Roles.admin],
roles: [],
);
```
@@ -1,6 +1,5 @@
```csharp
using Appwrite;
using Appwrite.Enums;
using Appwrite.Models;
using Appwrite.Services;
@@ -13,7 +12,7 @@ Teams teams = new Teams(client);
Membership result = await teams.CreateMembership(
teamId: "<TEAM_ID>",
roles: new List&lt;Roles&gt; { Roles.Admin },
roles: new List<string>(),
email: "email@example.com", // optional
userId: "<USER_ID>", // optional
phone: "+12065550100", // optional
@@ -1,6 +1,5 @@
```csharp
using Appwrite;
using Appwrite.Enums;
using Appwrite.Models;
using Appwrite.Services;
@@ -14,5 +13,5 @@ Teams teams = new Teams(client);
Membership result = await teams.UpdateMembership(
teamId: "<TEAM_ID>",
membershipId: "<MEMBERSHIP_ID>",
roles: new List&lt;Roles&gt; { Roles.Admin }
roles: new List<string>()
);```
@@ -31,6 +31,8 @@ mutation {
lengths
orders
}
bytesMax
bytesUsed
}
}
```
@@ -29,6 +29,8 @@ mutation {
lengths
orders
}
bytesMax
bytesUsed
}
}
```
@@ -31,6 +31,8 @@ mutation {
lengths
orders
}
bytesMax
bytesUsed
}
}
```
@@ -29,6 +29,8 @@ mutation {
lengths
orders
}
bytesMax
bytesUsed
}
}
```
@@ -2,7 +2,6 @@
import io.appwrite.Client;
import io.appwrite.coroutines.CoroutineCallback;
import io.appwrite.services.Teams;
import io.appwrite.enums.Roles;
Client client = new Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,7 +12,7 @@ Teams teams = new Teams(client);
teams.createMembership(
"<TEAM_ID>", // teamId
List.of(Roles.ADMIN), // roles
List.of(), // roles
"email@example.com", // email (optional)
"<USER_ID>", // userId (optional)
"+12065550100", // phone (optional)
@@ -2,7 +2,6 @@
import io.appwrite.Client;
import io.appwrite.coroutines.CoroutineCallback;
import io.appwrite.services.Teams;
import io.appwrite.enums.Roles;
Client client = new Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -14,7 +13,7 @@ Teams teams = new Teams(client);
teams.updateMembership(
"<TEAM_ID>", // teamId
"<MEMBERSHIP_ID>", // membershipId
List.of(Roles.ADMIN), // roles
List.of(), // roles
new CoroutineCallback<>((result, error) -> {
if (error != null) {
error.printStackTrace();
@@ -2,7 +2,6 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.Teams
import io.appwrite.enums.Roles
val client = Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,7 +12,7 @@ val teams = Teams(client)
val response = teams.createMembership(
teamId = "<TEAM_ID>",
roles = listOf(Roles.ADMIN),
roles = listOf(),
email = "email@example.com", // optional
userId = "<USER_ID>", // optional
phone = "+12065550100", // optional
@@ -2,7 +2,6 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.Teams
import io.appwrite.enums.Roles
val client = Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -14,6 +13,6 @@ val teams = Teams(client)
val response = teams.updateMembership(
teamId = "<TEAM_ID>",
membershipId = "<MEMBERSHIP_ID>",
roles = listOf(Roles.ADMIN)
roles = listOf()
)
```
@@ -10,7 +10,7 @@ const teams = new sdk.Teams(client);
const result = await teams.createMembership({
teamId: '<TEAM_ID>',
roles: [sdk.Roles.Admin],
roles: [],
email: 'email@example.com', // optional
userId: '<USER_ID>', // optional
phone: '+12065550100', // optional
@@ -11,6 +11,6 @@ const teams = new sdk.Teams(client);
const result = await teams.updateMembership({
teamId: '<TEAM_ID>',
membershipId: '<MEMBERSHIP_ID>',
roles: [sdk.Roles.Admin]
roles: []
});
```
@@ -3,7 +3,6 @@
use Appwrite\Client;
use Appwrite\Services\Teams;
use Appwrite\Enums\Roles;
$client = (new Client())
->setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -14,7 +13,7 @@ $teams = new Teams($client);
$result = $teams->createMembership(
teamId: '<TEAM_ID>',
roles: [Roles::ADMIN()],
roles: [],
email: 'email@example.com', // optional
userId: '<USER_ID>', // optional
phone: '+12065550100', // optional
@@ -3,7 +3,6 @@
use Appwrite\Client;
use Appwrite\Services\Teams;
use Appwrite\Enums\Roles;
$client = (new Client())
->setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -15,5 +14,5 @@ $teams = new Teams($client);
$result = $teams->updateMembership(
teamId: '<TEAM_ID>',
membershipId: '<MEMBERSHIP_ID>',
roles: [Roles::ADMIN()]
roles: []
);```
@@ -1,7 +1,6 @@
```python
from appwrite.client import Client
from appwrite.services.teams import Teams
from appwrite.enums import Roles
client = Client()
client.set_endpoint('https://<REGION>.cloud.appwrite.io/v1') # Your API Endpoint
@@ -12,7 +11,7 @@ teams = Teams(client)
result = teams.create_membership(
team_id = '<TEAM_ID>',
roles = [Roles.ADMIN],
roles = [],
email = 'email@example.com', # optional
user_id = '<USER_ID>', # optional
phone = '+12065550100', # optional
@@ -1,7 +1,6 @@
```python
from appwrite.client import Client
from appwrite.services.teams import Teams
from appwrite.enums import Roles
client = Client()
client.set_endpoint('https://<REGION>.cloud.appwrite.io/v1') # Your API Endpoint
@@ -13,6 +12,6 @@ teams = Teams(client)
result = teams.update_membership(
team_id = '<TEAM_ID>',
membership_id = '<MEMBERSHIP_ID>',
roles = [Roles.ADMIN]
roles = []
)
```
@@ -2,7 +2,6 @@
require 'appwrite'
include Appwrite
include Appwrite::Enums
client = Client.new
.set_endpoint('https://<REGION>.cloud.appwrite.io/v1') # Your API Endpoint
@@ -13,7 +12,7 @@ teams = Teams.new(client)
result = teams.create_membership(
team_id: '<TEAM_ID>',
roles: [Roles::ADMIN],
roles: [],
email: 'email@example.com', # optional
user_id: '<USER_ID>', # optional
phone: '+12065550100', # optional
@@ -2,7 +2,6 @@
require 'appwrite'
include Appwrite
include Appwrite::Enums
client = Client.new
.set_endpoint('https://<REGION>.cloud.appwrite.io/v1') # Your API Endpoint
@@ -14,6 +13,6 @@ teams = Teams.new(client)
result = teams.update_membership(
team_id: '<TEAM_ID>',
membership_id: '<MEMBERSHIP_ID>',
roles: [Roles::ADMIN]
roles: []
)
```
@@ -1,6 +1,5 @@
```swift
import Appwrite
import AppwriteEnums
let client = Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -11,7 +10,7 @@ let teams = Teams(client)
let membership = try await teams.createMembership(
teamId: "<TEAM_ID>",
roles: [.admin],
roles: [],
email: "email@example.com", // optional
userId: "<USER_ID>", // optional
phone: "+12065550100", // optional
@@ -1,6 +1,5 @@
```swift
import Appwrite
import AppwriteEnums
let client = Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -12,7 +11,7 @@ let teams = Teams(client)
let membership = try await teams.updateMembership(
teamId: "<TEAM_ID>",
membershipId: "<MEMBERSHIP_ID>",
roles: [.admin]
roles: []
)
```
+12
View File
@@ -0,0 +1,12 @@
# Changelog
## 0.1.0
Initial release compatible with Appwrite server 1.8.x. Follows the [Agent Skills Open Standard](https://agentskills.io/home).
- Added agent skills for 9 languages: TypeScript, Python, PHP, Go, Kotlin, Swift, Ruby, .NET, and Dart
- Coverage for Account, Users, TablesDB, Storage, Teams, Functions, and Realtime services
- Query builder with filtering, sorting, pagination, and field selection
- Permission and Role helpers for access control
- SSR authentication patterns for major frameworks
- Consistent error handling via `AppwriteException` across all languages
+96
View File
@@ -0,0 +1,96 @@
## Getting Started
Agent Skills to help developers using AI coding agents with Appwrite. Agent Skills are folders of instructions, scripts, and resources that agents like Claude Code, Cursor, GitHub Copilot, and others can discover and use to work more accurately and efficiently.
These skills follow the Agent Skills Open Standard: https://agentskills.io/home
### Install the skills
Install directly with the Skills CLI:
```bash
npx skills add chiragagg5k/appwrite-agent-skills
```
This installs the packaged `appwrite-*` skills into your local skills directory.
### Available language skills
- `appwrite-typescript`
- `appwrite-dart`
- `appwrite-kotlin`
- `appwrite-swift`
- `appwrite-php`
- `appwrite-python`
- `appwrite-ruby`
- `appwrite-go`
- `appwrite-dotnet`
### Usage
Skills are automatically available once installed. The agent will use them when relevant tasks are detected.
### Prompt examples
Use these as copy-paste prompt starters.
#### TypeScript (server-side)
```text
Use the appwrite-typescript skill.
Create a Node.js script that uses Users service to create a user, then adds an initial profile row in TablesDB.
Use env vars for endpoint, project ID, and API key.
Include error handling and a small retry for transient failures.
```
#### TypeScript (web client)
```text
Use the appwrite-typescript skill.
Build a browser login flow with Account service:
- email/password signup
- email/password session login
- fetch current user
- logout current session
Return production-ready TypeScript code.
```
#### Python
```text
Use the appwrite-python skill.
Write a script that uploads a local file to Storage, then prints the file ID and a preview URL.
Use InputFile.from_path and catch Appwrite exceptions.
```
#### PHP
```text
Use the appwrite-php skill.
Create a service class that lists rows from TablesDB with Query.equal and Query.limit, and maps them to DTOs.
Prefer dependency injection for the Appwrite client.
```
#### Go
```text
Use the appwrite-go skill.
Implement a CLI command that creates a document-style row, then reads it back and prints JSON output.
Use context timeouts and structured error messages.
```
#### Kotlin
```text
Use the appwrite-kotlin skill.
Generate Android repository code to paginate rows using cursor queries and expose a suspend function API.
Keep UI concerns out of the data layer.
```
#### Migration prompt (Databases -> TablesDB)
```text
Use the appwrite-typescript skill.
Migrate this existing Databases-based code to TablesDB APIs.
Keep behavior identical and list each API mapping you changed.
```
+6
View File
@@ -1,5 +1,11 @@
# Change Log
## 12.1.0
* Add `queries` parameter to Realtime subscriptions for filtering events
* Add `subscriptions` field to `RealtimeCallback` and `RealtimeResponseEvent` types
* Fix `Roles` enum removed from Teams service; `roles` parameter now accepts `List<String>`
## 12.0.0
* Add array-based enum parameters (e.g., `permissions: List<BrowserPermission>`).
+6
View File
@@ -1,5 +1,11 @@
# Change Log
## 14.1.0
* Add `queries` parameter to Realtime subscriptions for filtering events
* Fix `Roles` enum removed from Teams service; `roles` parameter now accepts `[String]`
* Fix doc examples with proper formatting and complete client configuration
## 14.0.0
* Add array-based enum parameters (e.g., `permissions: [BrowserPermission]`).
+5
View File
@@ -1,5 +1,10 @@
# Change Log
## 13.4.0
* Add `--queries` option to `list-keys` command
* Add `--key-id` option to `create-key` command
## 13.3.2
- Fix handle null rows in table parser
+4
View File
@@ -1,5 +1,9 @@
# Change Log
## 21.0.1
* Fix doc examples with proper formatting
## 21.0.0
* Add array-based enum parameters (e.g., `permissions: List<BrowserPermission>`).
+6
View File
@@ -1,5 +1,11 @@
# Change Log
## 0.26.0
* Add `dart-3.10` and `flutter-3.38` to `BuildRuntime` and `Runtime` enums
* Add `bytesMax` and `bytesUsed` properties to `Collection` and `Table` models
* Fix `Roles` enum removed from Teams service; `roles` parameter now accepts `IReadOnlyList<string>`
## 0.25.0
* Add array-based enum parameters (e.g., `permissions: IReadOnlyList<BrowserPermission>`).
+6
View File
@@ -1,5 +1,11 @@
# Change Log
## 21.1.0
* Add `queries` parameter to Realtime subscriptions for filtering events
* Fix `Roles` enum removed from Teams service; `roles` parameter now accepts `List<String>`
* Fix doc examples with proper formatting and syntax highlighting
## 21.0.0
* Add array-based enum parameters (e.g., `permissions: List<BrowserPermission>`).
+4
View File
@@ -1,5 +1,9 @@
# Change Log
## v0.16.1
* Fix doc examples with proper formatting
## v0.16.0
* Added ability to create columns and indexes synchronously while creating a table
+4
View File
@@ -1,5 +1,9 @@
# Change Log
## 14.0.1
* Fix doc examples with proper formatting
## 14.0.0
* Add array-based enum parameters (e.g., `permissions: List<BrowserPermission>`).
+7
View File
@@ -1,5 +1,12 @@
# Change Log
## 0.3.0
* Add `bytesMax` and `bytesUsed` properties to Collection and Table documentation
* Add `queries` parameter to `listKeys` and `keyId` parameter to `createKey` documentation
* Add `dart-3.10` and `flutter-3.38` runtimes
* Fix Teams membership docs to use `string[]` instead of `Roles[]`
## 0.2.0
* Document array-based enum parameters in Markdown examples (e.g., `permissions: BrowserPermission[]`).
+4
View File
@@ -1,5 +1,9 @@
# Change Log
## 22.0.1
* Fix doc examples with proper formatting
## 22.0.0
* Add array-based enum parameters (e.g., `permissions: BrowserPermission[]`).
+4
View File
@@ -1,5 +1,9 @@
# Change Log
## 20.0.1
* Fix doc examples with proper formatting
## 20.0.0
* Add array-based enum parameters (e.g., `permissions: array<BrowserPermission>`).
+5
View File
@@ -1,5 +1,10 @@
# Change Log
## 15.1.0
* Add `dart-3.10` and `flutter-3.38` to `BuildRuntime` and `Runtime` enums
* Fix `Roles` enum removed from Teams service; `roles` parameter now accepts `list[str]`
## 15.0.0
* Add array-based enum parameters (e.g., `permissions: list[BrowserPermission]`).
+6
View File
@@ -1,5 +1,11 @@
# Change log
## 0.21.0
* Add `queries` parameter to `client.subscribe()` for filtering Realtime events
* Fix `Roles` enum removed from Teams service; `roles` parameter now accepts `string[]`
* Fix parameter detection in overloaded methods to check for optional params (Account, Avatars, Graphql)
## 0.20.0
* Add array-based enum parameters (e.g., `permissions: BrowserPermission[]`).
+4
View File
@@ -1,5 +1,9 @@
# Change Log
## 21.0.1
* Fix doc examples with proper formatting
## 21.0.0
* Add array-based enum parameters (e.g., `permissions: Array<BrowserPermission>`).
+6
View File
@@ -1,5 +1,11 @@
# Change Log
## 15.1.0
* Add `dart-3.10` and `flutter-3.38` to `BuildRuntime` and `Runtime` enums
* Add `bytesMax` and `bytesUsed` properties to `Collection` and `Table` models
* Fix `Roles` enum removed from Teams service; `roles` parameter now accepts `[String]`
## 15.0.0
* Add array-based enum parameters (e.g., `permissions: [BrowserPermission]`).
+10
View File
@@ -1,5 +1,15 @@
# Change Log
## 22.1.0
* Add `queries` parameter to `Realtime.subscribe()` and `client.subscribe()` for server-side query filtering
* Add slot-based subscription management with subscription ID mappings from backend
* Add `subscriptions` field to `RealtimeResponseEvent` type
* Fix `Roles` enum removed from Teams service; `roles` parameter now accepts `string[]`
* Fix parameter detection in overloaded methods to check for optional params (Account, Avatars, Graphql)
* Fix WebSocket connection handling with stale connection guards and improved close/reconnect logic
* Fix doc examples wrapped in markdown code fences
## 22.0.0
* Add array-based enum parameters (e.g., `permissions: BrowserPermission[]`).
+4 -4
View File
@@ -51,14 +51,14 @@ class Origin extends Validator
*/
public function isValid($origin): bool
{
$this->origin = $origin;
$this->scheme = null;
$this->host = null;
if (!is_string($origin) || empty($origin)) {
return false;
}
$this->origin = $origin;
$this->scheme = null;
$this->host = null;
$this->scheme = $this->parseScheme($origin);
$this->host = strtolower(parse_url($origin, PHP_URL_HOST) ?? '');
@@ -301,7 +301,7 @@ class Create extends Base
if ($async) {
if (is_null($scheduledAt)) {
if (System::getEnv('_APP_REGION') !== 'nyc') { // TODO: Remove region check
if ($project->getId() != '6862e6a6000cce69f9da') {
$execution = $authorization->skip(fn () => $dbForProject->createDocument('executions', $execution));
}
$queueForFunctions
@@ -344,7 +344,7 @@ class Create extends Base
->setAttribute('scheduleInternalId', $schedule->getSequence())
->setAttribute('scheduledAt', $scheduledAt);
if (System::getEnv('_APP_REGION') !== 'nyc') { // TODO: Remove region check
if ($project->getId() != '6862e6a6000cce69f9da') {
$execution = $authorization->skip(fn () => $dbForProject->createDocument('executions', $execution));
}
}
@@ -505,7 +505,7 @@ class Create extends Base
->addMetric(str_replace(['{resourceType}', '{resourceInternalId}'], [RESOURCE_TYPE_FUNCTIONS, $function->getSequence()], METRIC_RESOURCE_TYPE_ID_EXECUTIONS_MB_SECONDS), (int)(($spec['memory'] ?? APP_COMPUTE_MEMORY_DEFAULT) * $execution->getAttribute('duration', 0) * ($spec['cpus'] ?? APP_COMPUTE_CPUS_DEFAULT)))
;
if (System::getEnv('_APP_REGION') !== 'nyc') { // TODO: Remove region check
if ($project->getId() != '6862e6a6000cce69f9da') {
$execution = $authorization->skip(fn () => $dbForProject->createDocument('executions', $execution));
}
}
@@ -111,15 +111,16 @@ class Screenshots extends Action
throw new \Exception('Bucket not found');
}
$routerHost = System::getEnv('_APP_WORKER_SCREENSHOTS_ROUTER', 'http://appwrite');
$configs = [
'screenshotLight' => [
'headers' => [ 'x-appwrite-hostname' => $rule->getAttribute('domain') ],
'url' => 'http://appwrite/?appwrite-preview=1&appwrite-theme=light',
'url' => $routerHost . '/?appwrite-preview=1&appwrite-theme=light',
'theme' => 'light'
],
'screenshotDark' => [
'headers' => [ 'x-appwrite-hostname' => $rule->getAttribute('domain') ],
'url' => 'http://appwrite/?appwrite-preview=1&appwrite-theme=dark',
'url' => $routerHost . '/?appwrite-preview=1&appwrite-theme=dark',
'theme' => 'dark'
],
];
@@ -263,6 +263,7 @@ class Create extends Action
'search' => implode(' ', [$projectId, $name]),
'database' => $dsn,
'labels' => [],
'status' => PROJECT_STATUS_ACTIVE,
'documentsDatabase' => $this->getDatabaseDSN('documentsDatabase', $region, $dsn),
'vectorDatabase' => $this->getDatabaseDSN('vectorDatabase', $region, $dsn)
]));
@@ -9,7 +9,6 @@ use Appwrite\SDK\ContentType;
use Appwrite\SDK\Method;
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;
@@ -68,13 +67,13 @@ class XList extends Action
->param('queries', [], $this->getQueriesValidator(), '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(', ', Projects::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('request')
->inject('response')
->inject('dbForPlatform')
->inject('team')
->callback($this->action(...));
}
public function action(array $queries, string $search, bool $includeTotal, Request $request, Response $response, Database $dbForPlatform)
public function action(array $queries, string $search, bool $includeTotal, Response $response, Database $dbForPlatform, Document $team)
{
try {
$queries = Query::parseQueries($queries);
@@ -86,6 +85,10 @@ class XList extends Action
$queries[] = Query::search('search', $search);
}
if (!$team->isEmpty()) {
$queries[] = Query::equal('teamInternalId', [$team->getSequence()]);
}
$cursor = Query::getCursorQueries($queries, false);
$cursor = \reset($cursor);
+13 -1
View File
@@ -2,6 +2,7 @@
namespace Appwrite\Platform\Tasks;
use Appwrite\SDK\Language\AgentSkills;
use Appwrite\SDK\Language\Android;
use Appwrite\SDK\Language\Apple;
use Appwrite\SDK\Language\CLI;
@@ -51,6 +52,7 @@ class SDKs extends Action
'graphql',
'rest',
'markdown',
'agent-skills'
];
public static function getName(): string
@@ -284,6 +286,9 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
$config = new Markdown();
$config->setNPMPackage('@appwrite.io/docs');
break;
case 'agent-skills':
$config = new AgentSkills();
break;
default:
throw new \Exception('Language "' . $language['key'] . '" not supported');
}
@@ -576,9 +581,16 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
foreach ($docDirectories as $languageTitle => $path) {
$languagePath = strtolower($languageTitle !== 0 ? '/' . $languageTitle : '');
$examplesSource = $result . '/docs/examples' . $languagePath;
if (!\is_dir($examplesSource)) {
Console::warning("No code examples found for {$language['name']} SDK at: {$examplesSource}. Skipping copy.");
continue;
}
\exec(
'mkdir -p ' . $resultExamples . $languagePath . ' && \
cp -r ' . $result . '/docs/examples' . $languagePath . ' ' . $resultExamples
cp -r ' . $examplesSource . ' ' . $resultExamples
);
Console::success("Copied code examples for {$language['name']} SDK to: {$resultExamples}");
}
+2 -2
View File
@@ -7,7 +7,6 @@ use Utopia\Database\Database;
use Utopia\Database\Document;
use Utopia\Platform\Action;
use Utopia\Queue\Message;
use Utopia\System\System;
class Executions extends Action
{
@@ -45,7 +44,8 @@ class Executions extends Action
throw new Exception('Missing execution');
}
if (System::getEnv('_APP_REGION') !== 'nyc') { // TODO: Remove region check
$project = new Document($payload['project'] ?? []);
if ($project->getId() != '6862e6a6000cce69f9da') {
$dbForProject->upsertDocument('executions', $execution);
}
}
+18 -92
View File
@@ -4,6 +4,8 @@ namespace Appwrite\Platform\Workers;
use Appwrite\Event\StatsUsage;
use Appwrite\Messaging\Status as MessageStatus;
use libphonenumber\NumberParseException;
use libphonenumber\PhoneNumberUtil;
use Swoole\Runtime;
use Utopia\Config\Config;
use Utopia\Database\Database;
@@ -100,9 +102,7 @@ class Messaging extends Action
$type = $payload['type'] ?? '';
Span::init('messaging');
Span::add('project', $project->getId());
Span::add('type', $type);
Span::add('message.type', $type);
try {
switch ($type) {
@@ -140,12 +140,6 @@ class Messaging extends Action
$userIds = $message->getAttribute('users', []);
$providerType = $message->getAttribute('providerType');
Span::add('messageId', $message->getId());
Span::add('providerType', $providerType);
Span::add('topicsCount', \count($topicIds));
Span::add('usersCount', \count($userIds));
Span::add('targetsCount', \count($targetIds));
/**
* @var array<Document> $allTargets
*/
@@ -189,31 +183,13 @@ class Messaging extends Action
\array_push($allTargets, ...$targets);
}
Span::add('recipientsTotal', \count($allTargets));
// Extract country codes for SMS targets
if ($providerType === MESSAGE_TYPE_SMS && !empty($allTargets)) {
$countryCodes = [];
foreach ($allTargets as $target) {
$identifier = $target->getAttribute('identifier', '');
$countryCode = $this->extractCountryCode($identifier);
if ($countryCode !== null) {
$countryCodes[$countryCode] = ($countryCodes[$countryCode] ?? 0) + 1;
}
}
foreach ($countryCodes as $code => $count) {
Span::add('countryCode_' . $code, $count);
}
}
if (empty($allTargets)) {
$dbForProject->updateDocument('messages', $message->getId(), $message->setAttributes([
'status' => MessageStatus::FAILED,
'deliveryErrors' => ['No valid recipients found.']
]));
Span::add('status', 'failed');
Span::add('error', 'No valid recipients found.');
Span::add('message.skipped', 'no_valid_recipients');
return;
}
@@ -228,14 +204,10 @@ class Messaging extends Action
'deliveryErrors' => ['No enabled provider found.']
]));
Span::add('status', 'failed');
Span::add('error', 'No enabled provider found.');
Span::add('message.skipped', 'no_enabled_provider');
return;
}
Span::add('provider', $default->getAttribute('provider'));
Span::add('providerName', $default->getAttribute('name'));
/**
* @var array<string, array<string, null>> $identifiers
*/
@@ -377,14 +349,12 @@ class Messaging extends Action
if (\count($message->getAttribute('deliveryErrors')) > 0) {
$message->setAttribute('status', MessageStatus::FAILED);
Span::add('status', 'failed');
} else {
$message->setAttribute('status', MessageStatus::SENT);
Span::add('status', 'sent');
}
Span::add('deliveredTotal', $deliveredTotal);
Span::add('errorsTotal', \count($deliveryErrors));
Span::add('message.delivered_total', $deliveredTotal);
Span::add('message.errors_total', \count($deliveryErrors));
$message->removeAttribute('to');
@@ -431,22 +401,12 @@ class Messaging extends Action
private function sendInternalSMSMessage(Document $message, Document $project, array $recipients, Log $log): void
{
Span::add('providerType', 'sms');
// Extract country code from the single recipient phone number
$countryCode = $this->extractCountryCode($recipients[0] ?? '');
if ($countryCode !== null) {
Span::add('countryCode', $countryCode);
}
if ($this->adapter === null) {
$this->adapter = $this->createInternalSMSAdapter();
}
if ($this->adapter === null) {
Span::add('status', 'skipped');
Span::add('warning', 'SMS adapter is not set.');
return;
throw new \Exception('SMS adapter is not set.');
}
if ($project->isEmpty()) {
@@ -456,13 +416,19 @@ class Messaging extends Action
$denyList = System::getEnv('_APP_SMS_PROJECTS_DENY_LIST', '');
$denyList = explode(',', $denyList);
if (\in_array($project->getId(), $denyList)) {
Span::add('status', 'denied');
Span::add('error', 'Project is in the deny list.');
Span::add('message.skipped', 'project_denied');
return;
}
$from = System::getEnv('_APP_SMS_FROM', '');
Span::add('from', $from);
Span::add('message.from', $from);
try {
$phoneNumber = PhoneNumberUtil::getInstance()->parse($recipients[0] ?? '');
Span::add('message.country_code', $phoneNumber->getCountryCode());
} catch (NumberParseException $e) {
Span::add('message.country_code', 'unknown');
}
$sms = new SMS(
$recipients,
@@ -470,14 +436,7 @@ class Messaging extends Action
$from
);
try {
$result = $this->adapter->send($sms);
Span::add('status', 'sent');
Span::add('deliveredTo', $result['deliveredTo'] ?? 0);
} catch (\Throwable $th) {
Span::add('status', 'failed');
throw new \Exception('Failed sending to targets with error: ' . $th->getMessage());
}
$this->adapter->send($sms);
}
@@ -749,7 +708,6 @@ class Messaging extends Action
private function createInternalSMSAdapter(): ?SMSAdapter
{
if (empty(System::getEnv('_APP_SMS_PROVIDER')) || empty(System::getEnv('_APP_SMS_FROM'))) {
Span::add('warning', 'Skipped SMS processing. Missing "_APP_SMS_PROVIDER" or "_APP_SMS_FROM" environment variables.');
return null;
}
@@ -795,13 +753,11 @@ class Messaging extends Action
$provider = $this->createProviderFromDSN($localDSN);
$adapter = $this->getSmsAdapter($provider);
} catch (\Exception) {
Span::add('warning', 'Unable to create adapter: ' . $localDSN->getHost());
continue;
}
$callingCode = $localDSN->getParam('local', '');
if (empty($callingCode)) {
Span::add('warning', 'Unable to register adapter: ' . $localDSN->getHost() . '. Missing `local` parameter.');
continue;
}
@@ -872,34 +828,4 @@ class Messaging extends Action
return $provider;
}
/**
* Extract country calling code from a phone number using known country codes.
*/
private function extractCountryCode(string $phoneNumber): ?string
{
if (!\str_starts_with($phoneNumber, '+')) {
return null;
}
$number = \substr($phoneNumber, 1);
if (empty($number)) {
return null;
}
$phoneCodes = Config::getParam('locale-phones', []);
$codes = \array_unique(\array_values($phoneCodes));
// Sort by length descending to match longest codes first (e.g., 1868 before 1)
\usort($codes, fn ($a, $b) => \strlen($b) - \strlen($a));
foreach ($codes as $code) {
if (\str_starts_with($number, $code)) {
return $code;
}
}
return null;
}
}

Some files were not shown because too many files have changed in this diff Show More