diff --git a/.env b/.env index 1ca5d5fc4e..fee68d5a04 100644 --- a/.env +++ b/.env @@ -10,6 +10,7 @@ _APP_CONSOLE_SESSION_ALERTS=enabled _APP_CONSOLE_WHITELIST_IPS= _APP_CONSOLE_COUNTRIES_DENYLIST=AQ _APP_CONSOLE_HOSTNAMES=localhost,appwrite.io,*.appwrite.io +_APP_MIGRATION_HOST=appwrite _APP_SYSTEM_EMAIL_NAME=Appwrite _APP_SYSTEM_EMAIL_ADDRESS=noreply@appwrite.io _APP_SYSTEM_TEAM_EMAIL=team@appwrite.io @@ -25,6 +26,7 @@ _APP_OPENSSL_KEY_V1=your-secret-key _APP_DNS=172.16.238.100 # CoreDNS _APP_DOMAIN=appwrite.test _APP_CONSOLE_DOMAIN=localhost +_APP_CONSOLE_TRUSTED_PROJECTS=trusted-project,another-trusted-project _APP_DOMAIN_FUNCTIONS=functions.localhost _APP_DOMAIN_SITES=sites.localhost,rebranded.localhost _APP_DOMAIN_TARGET_CNAME=cname.localhost @@ -36,6 +38,7 @@ _APP_REDIS_HOST=redis _APP_REDIS_PORT=6379 _APP_REDIS_PASS= _APP_REDIS_USER= +_APP_DB_ADAPTER=mariadb _APP_DB_HOST=mariadb _APP_DB_PORT=3306 _APP_DB_SCHEMA=appwrite @@ -130,4 +133,5 @@ _APP_PROJECT_REGIONS=default _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 \ No newline at end of file +_APP_POOL_ADAPTER=stack +_APP_WORKER_SCREENSHOTS_ROUTER=http://appwrite diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 62b4953e27..b7b4fa0d2f 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -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 diff --git a/.github/workflows/cleanup-cache.yml b/.github/workflows/cleanup-cache.yml index 8f25fe5ef6..8f9f05a38c 100644 --- a/.github/workflows/cleanup-cache.yml +++ b/.github/workflows/cleanup-cache.yml @@ -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: | diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index a40f07ceda..7edfde0aae 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -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. diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 02edd57923..f4ae5df1ce 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -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" diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 80d880244c..cd9b3827e7 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -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: diff --git a/.github/workflows/pr-scan.yml b/.github/workflows/pr-scan.yml index eded58985d..51f3460d03 100644 --- a/.github/workflows/pr-scan.yml +++ b/.github/workflows/pr-scan.yml @@ -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'); diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 180eb5428d..692861d44d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -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 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5426f53583..84fc4c9fba 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -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 diff --git a/.github/workflows/sdk-preview.yml b/.github/workflows/sdk-preview.yml index e317845768..986a77399d 100644 --- a/.github/workflows/sdk-preview.yml +++ b/.github/workflows/sdk-preview.yml @@ -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 diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index 1c5f36ace3..a0dc38b3b4 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -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 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 509e1f5b29..4bb2662ab6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -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 @@ -80,10 +82,13 @@ jobs: name: Unit Test runs-on: ubuntu-latest needs: setup + permissions: + contents: read + pull-requests: write steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Load Cache uses: actions/cache@v4 @@ -108,18 +113,28 @@ jobs: run: docker compose exec -T appwrite vars - name: Run Unit Tests - run: | - docker compose exec \ - -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ + uses: itznotabug/php-retry@v3 + with: + max_attempts: 3 + timeout_minutes: 30 + job_id: ${{ job.check_run_id }} + github_token: ${{ secrets.GITHUB_TOKEN }} + test_dir: tests/unit + command: >- + docker compose exec + -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" appwrite test /usr/src/code/tests/unit e2e_general_test: name: E2E General Test runs-on: ubuntu-latest needs: setup + permissions: + contents: read + pull-requests: write steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Load Cache uses: actions/cache@v4 @@ -143,9 +158,16 @@ jobs: done - name: Run General Tests - run: | - docker compose exec -T \ - -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ + uses: itznotabug/php-retry@v3 + with: + max_attempts: 3 + timeout_minutes: 30 + job_id: ${{ job.check_run_id }} + github_token: ${{ secrets.GITHUB_TOKEN }} + test_dir: tests/e2e/General + command: >- + docker compose exec -T + -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" appwrite test /usr/src/code/tests/e2e/General --debug - name: Failure Logs @@ -160,9 +182,17 @@ jobs: name: E2E Service Test runs-on: ubuntu-latest needs: setup + permissions: + contents: read + pull-requests: write strategy: fail-fast: false matrix: + db_adapter: [ + MARIADB, + POSTGRESQL + ] + service: [ Account, Avatars, @@ -189,7 +219,7 @@ jobs: ] steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Load Cache uses: actions/cache@v4 @@ -214,16 +244,44 @@ jobs: done - name: Run ${{ matrix.service }} tests with Project table mode - run: | - echo "Using project tables" - export _APP_DATABASE_SHARED_TABLES= - export _APP_DATABASE_SHARED_TABLES_V1= + uses: itznotabug/php-retry@v3 + with: + max_attempts: 3 + timeout_minutes: 30 + job_id: ${{ job.check_run_id }} + github_token: ${{ secrets.GITHUB_TOKEN }} + test_dir: tests/e2e/Services/${{ matrix.service }} + command: | + echo "Using project tables" - docker compose exec -T \ - -e _APP_DATABASE_SHARED_TABLES \ - -e _APP_DATABASE_SHARED_TABLES_V1 \ - -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ - appwrite test /usr/src/code/tests/e2e/Services/${{ matrix.service }} --debug --exclude-group abuseEnabled,screenshots + export _APP_DATABASE_SHARED_TABLES= + export _APP_DATABASE_SHARED_TABLES_V1= + + # Set DB Adapter Specific ENV Vars using if-elif + if [ "${{ matrix.db_adapter }}" = "MARIADB" ]; then + export _APP_DB_ADAPTER=mariadb + export _APP_DB_HOST=mariadb + export _APP_DB_PORT=3306 + export _APP_DB_SCHEMA=appwrite + elif [ "${{ matrix.db_adapter }}" = "POSTGRESQL" ]; then + export _APP_DB_ADAPTER=postgresql + export _APP_DB_HOST=postgresql + export _APP_DB_PORT=5432 + export _APP_DB_SCHEMA=appwrite + else + echo "Unknown DB adapter: ${{ matrix.db_adapter }}" + exit 1 + fi + + docker compose exec -T \ + -e _APP_DATABASE_SHARED_TABLES \ + -e _APP_DATABASE_SHARED_TABLES_V1 \ + -e _APP_DB_ADAPTER \ + -e _APP_DB_HOST \ + -e _APP_DB_PORT \ + -e _APP_DB_SCHEMA \ + -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ + appwrite test /usr/src/code/tests/e2e/Services/${{ matrix.service }} --debug --exclude-group abuseEnabled,screenshots - name: Failure Logs if: failure() @@ -238,6 +296,9 @@ jobs: runs-on: ubuntu-latest needs: [ setup, check_database_changes ] if: needs.check_database_changes.outputs.database_changed == 'true' + permissions: + contents: read + pull-requests: write strategy: fail-fast: false matrix: @@ -273,7 +334,7 @@ jobs: steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Load Cache uses: actions/cache@v4 @@ -297,22 +358,29 @@ jobs: done - name: Run ${{ matrix.service }} tests with ${{ matrix.tables-mode }} table mode - run: | - if [ "${{ matrix.tables-mode }}" == "Shared V1" ]; then - echo "Using shared tables V1" - export _APP_DATABASE_SHARED_TABLES=database_db_main - export _APP_DATABASE_SHARED_TABLES_V1=database_db_main - elif [ "${{ matrix.tables-mode }}" == "Shared V2" ]; then - echo "Using shared tables V2" - export _APP_DATABASE_SHARED_TABLES=database_db_main - export _APP_DATABASE_SHARED_TABLES_V1= - fi - - docker compose exec -T \ - -e _APP_DATABASE_SHARED_TABLES \ - -e _APP_DATABASE_SHARED_TABLES_V1 \ - -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ - appwrite test /usr/src/code/tests/e2e/Services/${{ matrix.service }} --debug --exclude-group abuseEnabled,screenshots + uses: itznotabug/php-retry@v3 + with: + max_attempts: 3 + timeout_minutes: 30 + job_id: ${{ job.check_run_id }} + github_token: ${{ secrets.GITHUB_TOKEN }} + test_dir: tests/e2e/Services/${{ matrix.service }} + command: | + if [ "${{ matrix.tables-mode }}" == "Shared V1" ]; then + echo "Using shared tables V1" + export _APP_DATABASE_SHARED_TABLES=database_db_main + export _APP_DATABASE_SHARED_TABLES_V1=database_db_main + elif [ "${{ matrix.tables-mode }}" == "Shared V2" ]; then + echo "Using shared tables V2" + export _APP_DATABASE_SHARED_TABLES=database_db_main + export _APP_DATABASE_SHARED_TABLES_V1= + fi + + docker compose exec -T \ + -e _APP_DATABASE_SHARED_TABLES \ + -e _APP_DATABASE_SHARED_TABLES_V1 \ + -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ + appwrite test /usr/src/code/tests/e2e/Services/${{ matrix.service }} --debug --exclude-group abuseEnabled,screenshots - name: Failure Logs if: failure() @@ -326,9 +394,12 @@ jobs: name: E2E Service Test (Abuse enabled) runs-on: ubuntu-latest needs: setup + permissions: + contents: read + pull-requests: write steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Load Cache uses: actions/cache@v4 @@ -345,16 +416,23 @@ jobs: sleep 30 - name: Run Projects tests in dedicated table mode - run: | - echo "Using project tables" - export _APP_DATABASE_SHARED_TABLES= - export _APP_DATABASE_SHARED_TABLES_V1= + uses: itznotabug/php-retry@v3 + with: + max_attempts: 3 + timeout_minutes: 30 + job_id: ${{ job.check_run_id }} + github_token: ${{ secrets.GITHUB_TOKEN }} + test_dir: tests/e2e/Services/Projects + command: | + echo "Using project tables" + export _APP_DATABASE_SHARED_TABLES= + export _APP_DATABASE_SHARED_TABLES_V1= - docker compose exec -T \ - -e _APP_DATABASE_SHARED_TABLES \ - -e _APP_DATABASE_SHARED_TABLES_V1 \ - -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ - appwrite test /usr/src/code/tests/e2e/Services/Projects --debug --group=abuseEnabled + docker compose exec -T \ + -e _APP_DATABASE_SHARED_TABLES \ + -e _APP_DATABASE_SHARED_TABLES_V1 \ + -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ + appwrite test /usr/src/code/tests/e2e/Services/Projects --debug --group=abuseEnabled - name: Failure Logs if: failure() @@ -369,6 +447,9 @@ jobs: runs-on: ubuntu-latest needs: [ setup, check_database_changes ] if: needs.check_database_changes.outputs.database_changed == 'true' + permissions: + contents: read + pull-requests: write strategy: fail-fast: false matrix: @@ -378,7 +459,7 @@ jobs: ] steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Load Cache uses: actions/cache@v4 @@ -395,22 +476,29 @@ jobs: sleep 30 - name: Run Projects tests in ${{ matrix.tables-mode }} table mode - run: | - if [ "${{ matrix.tables-mode }}" == "Shared V1" ]; then - echo "Using shared tables V1" - export _APP_DATABASE_SHARED_TABLES=database_db_main - export _APP_DATABASE_SHARED_TABLES_V1=database_db_main - elif [ "${{ matrix.tables-mode }}" == "Shared V2" ]; then - echo "Using shared tables V2" - export _APP_DATABASE_SHARED_TABLES=database_db_main - export _APP_DATABASE_SHARED_TABLES_V1= - fi + uses: itznotabug/php-retry@v3 + with: + max_attempts: 3 + timeout_minutes: 30 + job_id: ${{ job.check_run_id }} + github_token: ${{ secrets.GITHUB_TOKEN }} + test_dir: tests/e2e/Services/Projects + command: | + if [ "${{ matrix.tables-mode }}" == "Shared V1" ]; then + echo "Using shared tables V1" + export _APP_DATABASE_SHARED_TABLES=database_db_main + export _APP_DATABASE_SHARED_TABLES_V1=database_db_main + elif [ "${{ matrix.tables-mode }}" == "Shared V2" ]; then + echo "Using shared tables V2" + export _APP_DATABASE_SHARED_TABLES=database_db_main + export _APP_DATABASE_SHARED_TABLES_V1= + fi - docker compose exec -T \ - -e _APP_DATABASE_SHARED_TABLES \ - -e _APP_DATABASE_SHARED_TABLES_V1 \ - -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ - appwrite test /usr/src/code/tests/e2e/Services/Projects --debug --group=abuseEnabled + docker compose exec -T \ + -e _APP_DATABASE_SHARED_TABLES \ + -e _APP_DATABASE_SHARED_TABLES_V1 \ + -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ + appwrite test /usr/src/code/tests/e2e/Services/Projects --debug --group=abuseEnabled - name: Failure Logs if: failure() @@ -424,9 +512,12 @@ jobs: name: E2E Service Test (Site Screenshots) runs-on: ubuntu-latest needs: setup + permissions: + contents: read + pull-requests: write steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Load Cache uses: actions/cache@v4 @@ -443,17 +534,24 @@ jobs: sleep 30 - name: Run Site tests with browser connected in dedicated table mode - run: | - echo "Keeping original value of _APP_BROWSER_HOST" - echo "Using project tables" - export _APP_DATABASE_SHARED_TABLES= - export _APP_DATABASE_SHARED_TABLES_V1= + uses: itznotabug/php-retry@v3 + with: + max_attempts: 3 + timeout_minutes: 30 + job_id: ${{ job.check_run_id }} + github_token: ${{ secrets.GITHUB_TOKEN }} + test_dir: tests/e2e/Services/Sites + command: | + echo "Keeping original value of _APP_BROWSER_HOST" + echo "Using project tables" + export _APP_DATABASE_SHARED_TABLES= + export _APP_DATABASE_SHARED_TABLES_V1= - docker compose exec -T \ - -e _APP_DATABASE_SHARED_TABLES \ - -e _APP_DATABASE_SHARED_TABLES_V1 \ - -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ - appwrite test /usr/src/code/tests/e2e/Services/Sites --debug --group=screenshots + docker compose exec -T \ + -e _APP_DATABASE_SHARED_TABLES \ + -e _APP_DATABASE_SHARED_TABLES_V1 \ + -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ + appwrite test /usr/src/code/tests/e2e/Services/Sites --debug --group=screenshots - name: Failure Logs if: failure() @@ -468,6 +566,9 @@ jobs: runs-on: ubuntu-latest needs: [ setup, check_database_changes ] if: needs.check_database_changes.outputs.database_changed == 'true' + permissions: + contents: read + pull-requests: write strategy: fail-fast: false matrix: @@ -477,7 +578,7 @@ jobs: ] steps: - name: checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Load Cache uses: actions/cache@v4 @@ -494,23 +595,30 @@ jobs: sleep 30 - name: Run Site tests with browser connected in ${{ matrix.tables-mode }} table mode - run: | - echo "Keeping original value of _APP_BROWSER_HOST" - if [ "${{ matrix.tables-mode }}" == "Shared V1" ]; then - echo "Using shared tables V1" - export _APP_DATABASE_SHARED_TABLES=database_db_main - export _APP_DATABASE_SHARED_TABLES_V1=database_db_main - elif [ "${{ matrix.tables-mode }}" == "Shared V2" ]; then - echo "Using shared tables V2" - export _APP_DATABASE_SHARED_TABLES=database_db_main - export _APP_DATABASE_SHARED_TABLES_V1= - fi + uses: itznotabug/php-retry@v3 + with: + max_attempts: 3 + timeout_minutes: 30 + job_id: ${{ job.check_run_id }} + github_token: ${{ secrets.GITHUB_TOKEN }} + test_dir: tests/e2e/Services/Sites + command: | + echo "Keeping original value of _APP_BROWSER_HOST" + if [ "${{ matrix.tables-mode }}" == "Shared V1" ]; then + echo "Using shared tables V1" + export _APP_DATABASE_SHARED_TABLES=database_db_main + export _APP_DATABASE_SHARED_TABLES_V1=database_db_main + elif [ "${{ matrix.tables-mode }}" == "Shared V2" ]; then + echo "Using shared tables V2" + export _APP_DATABASE_SHARED_TABLES=database_db_main + export _APP_DATABASE_SHARED_TABLES_V1= + fi - docker compose exec -T \ - -e _APP_DATABASE_SHARED_TABLES \ - -e _APP_DATABASE_SHARED_TABLES_V1 \ - -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ - appwrite test /usr/src/code/tests/e2e/Services/Sites --debug --group=screenshots + docker compose exec -T \ + -e _APP_DATABASE_SHARED_TABLES \ + -e _APP_DATABASE_SHARED_TABLES_V1 \ + -e _APP_E2E_RESPONSE_FORMAT="${{ github.event.inputs.response_format }}" \ + appwrite test /usr/src/code/tests/e2e/Services/Sites --debug --group=screenshots - name: Failure Logs if: failure() @@ -518,4 +626,4 @@ jobs: echo "=== Appwrite Worker Builds Logs ===" docker compose logs appwrite-worker-builds echo "=== OpenRuntimes Executor Logs ===" - docker compose logs openruntimes-executor \ No newline at end of file + docker compose logs openruntimes-executor diff --git a/Dockerfile b/Dockerfile index e848b6f0b5..9afe164809 100755 --- a/Dockerfile +++ b/Dockerfile @@ -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" @@ -81,6 +81,7 @@ RUN chmod +x /usr/local/bin/doctor && \ chmod +x /usr/local/bin/worker-certificates && \ chmod +x /usr/local/bin/worker-databases && \ chmod +x /usr/local/bin/worker-deletes && \ + chmod +x /usr/local/bin/worker-executions && \ chmod +x /usr/local/bin/worker-functions && \ chmod +x /usr/local/bin/worker-mails && \ chmod +x /usr/local/bin/worker-messaging && \ diff --git a/app/cli.php b/app/cli.php index b683af961d..0f8426afd9 100644 --- a/app/cli.php +++ b/app/cli.php @@ -16,13 +16,13 @@ use Swoole\Timer; use Utopia\Cache\Adapter\Pool as CachePool; use Utopia\Cache\Adapter\Sharding; use Utopia\Cache\Cache; -use Utopia\CLI\CLI; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Adapter\Pool as DatabasePool; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; +use Utopia\DI\Dependency; use Utopia\DSN\DSN; use Utopia\Logger\Log; use Utopia\Platform\Service; @@ -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; @@ -45,9 +42,32 @@ Config::setParam('runtimes', (new Runtimes('v5'))->getAll(supported: false)); require_once __DIR__ . '/controllers/general.php'; global $register; -CLI::setResource('register', fn () => $register); -CLI::setResource('cache', function ($pools) { +$platform = new Appwrite(); +$args = $platform->getEnv('argv'); + +\array_shift($args); +if (!isset($args[0])) { + Console::error('Missing task name'); + Console::exit(1); +} + +$taskName = $args[0]; +$platform->init(Service::TYPE_TASK); +$cli = $platform->getCli(); + +$setResource = function (string $name, callable $callback, array $injections = []) use ($cli) { + $dependency = new Dependency(); + $dependency->setName($name)->setCallback($callback); + foreach ($injections as $injection) { + $dependency->inject($injection); + } + $cli->setResource($dependency); +}; + +$setResource('register', fn () => $register, []); + +$setResource('cache', function ($pools) { $list = Config::getParam('pools-cache', []); $adapters = []; @@ -58,17 +78,17 @@ CLI::setResource('cache', function ($pools) { return new Cache(new Sharding($adapters)); }, ['pools']); -CLI::setResource('pools', function (Registry $register) { +$setResource('pools', function (Registry $register) { return $register->get('pools'); }, ['register']); -CLI::setResource('authorization', function () { +$setResource('authorization', function () { $authorization = new Authorization(); $authorization->disable(); return $authorization; }, []); -CLI::setResource('dbForPlatform', function ($pools, $cache, $authorization) { +$setResource('dbForPlatform', function ($pools, $cache, $authorization) { $sleep = 3; $maxAttempts = 5; $attempts = 0; @@ -111,16 +131,17 @@ CLI::setResource('dbForPlatform', function ($pools, $cache, $authorization) { return $dbForPlatform; }, ['pools', 'cache', 'authorization']); -CLI::setResource('console', function () { +$setResource('console', function () { return new Document(Config::getParam('console')); }, []); -CLI::setResource( +$setResource( 'isResourceBlocked', - fn () => fn (Document $project, string $resourceType, ?string $resourceId) => false + fn () => fn (Document $project, string $resourceType, ?string $resourceId) => false, + [] ); -CLI::setResource('getProjectDB', function (Group $pools, Database $dbForPlatform, $cache, $authorization) { +$setResource('getProjectDB', function (Group $pools, Database $dbForPlatform, $cache, $authorization) { $databases = []; // TODO: @Meldiron This should probably be responsibility of utopia-php/pools return function (Document $project) use ($pools, $dbForPlatform, $cache, $authorization, &$databases) { @@ -182,7 +203,7 @@ CLI::setResource('getProjectDB', function (Group $pools, Database $dbForPlatform }; }, ['pools', 'dbForPlatform', 'cache', 'authorization']); -CLI::setResource('getLogsDB', function (Group $pools, Cache $cache, Authorization $authorization) { +$setResource('getLogsDB', function (Group $pools, Cache $cache, Authorization $authorization) { $database = null; return function (?Document $project = null) use ($pools, $cache, $database, $authorization) { @@ -210,40 +231,40 @@ CLI::setResource('getLogsDB', function (Group $pools, Cache $cache, Authorizatio return $database; }; }, ['pools', 'cache', 'authorization']); -CLI::setResource('publisher', function (Group $pools) { +$setResource('publisher', function (Group $pools) { return new BrokerPool(publisher: $pools->get('publisher')); }, ['pools']); -CLI::setResource('publisherDatabases', function (BrokerPool $publisher) { +$setResource('publisherDatabases', function (BrokerPool $publisher) { return $publisher; }, ['publisher']); -CLI::setResource('publisherFunctions', function (BrokerPool $publisher) { +$setResource('publisherFunctions', function (BrokerPool $publisher) { return $publisher; }, ['publisher']); -CLI::setResource('publisherMigrations', function (BrokerPool $publisher) { +$setResource('publisherMigrations', function (BrokerPool $publisher) { return $publisher; }, ['publisher']); -CLI::setResource('publisherStatsUsage', function (BrokerPool $publisher) { +$setResource('publisherStatsUsage', function (BrokerPool $publisher) { return $publisher; }, ['publisher']); -CLI::setResource('publisherMessaging', function (BrokerPool $publisher) { +$setResource('publisherMessaging', function (BrokerPool $publisher) { return $publisher; }, ['publisher']); -CLI::setResource('queueForStatsUsage', function (Publisher $publisher) { +$setResource('queueForStatsUsage', function (Publisher $publisher) { return new StatsUsage($publisher); }, ['publisher']); -CLI::setResource('queueForStatsResources', function (Publisher $publisher) { +$setResource('queueForStatsResources', function (Publisher $publisher) { return new StatsResources($publisher); }, ['publisher']); -CLI::setResource('queueForFunctions', function (Publisher $publisher) { +$setResource('queueForFunctions', function (Publisher $publisher) { return new Func($publisher); }, ['publisher']); -CLI::setResource('queueForDeletes', function (Publisher $publisher) { +$setResource('queueForDeletes', function (Publisher $publisher) { return new Delete($publisher); }, ['publisher']); -CLI::setResource('queueForCertificates', function (Publisher $publisher) { +$setResource('queueForCertificates', function (Publisher $publisher) { return new Certificate($publisher); }, ['publisher']); -CLI::setResource('logError', function (Registry $register) { +$setResource('logError', function (Registry $register) { return function (Throwable $error, string $namespace, string $action) use ($register) { Console::error('[Error] Timestamp: ' . date('c', time())); Console::error('[Error] Type: ' . get_class($error)); @@ -295,22 +316,9 @@ CLI::setResource('logError', function (Registry $register) { }; }, ['register']); -CLI::setResource('executor', fn () => new Executor()); +$setResource('executor', fn () => new Executor(), []); -CLI::setResource('telemetry', fn () => new NoTelemetry()); - -$platform = new Appwrite(); -$args = $platform->getEnv('argv'); - -if (!isset($args[0])) { - Console::error('Missing task name'); - Console::exit(1); -} - -\array_shift($args); -$taskName = $args[0]; -$platform->init(Service::TYPE_TASK); -$cli = $platform->getCli(); +$setResource('telemetry', fn () => new NoTelemetry(), []); $cli ->error() @@ -329,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(...)); diff --git a/app/config/collections/platform.php b/app/config/collections/platform.php index 2fb3168c5b..84964ac96a 100644 --- a/app/config/collections/platform.php +++ b/app/config/collections/platform.php @@ -342,6 +342,17 @@ $platformCollections = [ 'array' => true, 'filters' => [], ], + [ + '$id' => 'status', + 'type' => Database::VAR_STRING, + 'format' => '', + 'size' => 100, + 'signed' => false, + 'required' => false, + 'default' => null, + 'array' => false, + 'filters' => [], + ], ], 'indexes' => [ [ diff --git a/app/config/errors.php b/app/config/errors.php index 62affd8101..16fad57de1 100644 --- a/app/config/errors.php +++ b/app/config/errors.php @@ -1139,6 +1139,11 @@ return [ 'description' => 'Key with the requested ID could not be found.', 'code' => 404, ], + Exception::KEY_ALREADY_EXISTS => [ + 'name' => Exception::KEY_ALREADY_EXISTS, + 'description' => 'Key with the same ID already exists. Try again with a different ID.', + 'code' => 409, + ], Exception::PLATFORM_NOT_FOUND => [ 'name' => Exception::PLATFORM_NOT_FOUND, 'description' => 'Platform with the requested ID could not be found.', diff --git a/app/config/platform.php b/app/config/platform.php index 4030949ce6..17dfd72217 100644 --- a/app/config/platform.php +++ b/app/config/platform.php @@ -22,6 +22,7 @@ return [ 'hostnames' => array_filter(array_unique([ System::getEnv('_APP_DOMAIN', 'localhost'), System::getEnv('_APP_CONSOLE_DOMAIN', 'localhost'), + System::getEnv('_APP_MIGRATION_HOST'), ])), 'platformName' => APP_EMAIL_PLATFORM_NAME, 'logoUrl' => APP_EMAIL_LOGO_URL, diff --git a/app/config/sdks.php b/app/config/sdks.php index df1db80e5d..a3088b247b 100644 --- a/app/config/sdks.php +++ b/app/config/sdks.php @@ -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.2.1', + '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, diff --git a/app/config/specs/open-api3-1.8.x-client.json b/app/config/specs/open-api3-1.8.x-client.json index 592dc5b052..d9c97de566 100644 --- a/app/config/specs/open-api3-1.8.x-client.json +++ b/app/config/specs/open-api3-1.8.x-client.json @@ -555,7 +555,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 253, + "weight": 239, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -627,7 +627,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 255, + "weight": 241, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -751,7 +751,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 256, + "weight": 242, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -891,7 +891,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 257, + "weight": 243, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1015,7 +1015,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 261, + "weight": 247, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1149,7 +1149,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 262, + "weight": 248, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1287,7 +1287,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 254, + "weight": 240, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1388,7 +1388,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 260, + "weight": 246, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1487,7 +1487,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 258, + "weight": 244, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1586,7 +1586,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 259, + "weight": 245, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -4051,7 +4051,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 264, + "weight": 250, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4179,7 +4179,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 263, + "weight": 249, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4313,7 +4313,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 267, + "weight": 253, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4373,7 +4373,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 265, + "weight": 251, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4863,7 +4863,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 266, + "weight": 252, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4947,7 +4947,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 269, + "weight": 255, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5041,7 +5041,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 268, + "weight": 254, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5135,7 +5135,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 270, + "weight": 256, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5888,7 +5888,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 346, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -5955,7 +5955,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 342, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6026,7 +6026,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 343, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6090,7 +6090,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 344, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6168,7 +6168,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 345, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6234,7 +6234,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 347, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6319,7 +6319,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 297, + "weight": 283, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -6431,7 +6431,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 289, + "weight": 275, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -6592,7 +6592,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 290, + "weight": 276, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -6703,7 +6703,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 293, + "weight": 279, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -6858,7 +6858,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 291, + "weight": 277, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -6970,7 +6970,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 295, + "weight": 281, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -7077,7 +7077,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 300, + "weight": 286, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -7206,7 +7206,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 299, + "weight": 285, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -7335,7 +7335,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 447, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -7422,7 +7422,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 445, + "weight": 434, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -7540,7 +7540,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 446, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -7615,7 +7615,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 190, + "weight": 176, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -7669,7 +7669,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 189, + "weight": 175, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -8155,7 +8155,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 237, + "weight": 223, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -8239,7 +8239,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 241, + "weight": 227, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -8315,7 +8315,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 543, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -8414,7 +8414,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 541, + "weight": 530, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -8516,7 +8516,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 542, + "weight": 531, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -8590,7 +8590,7 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 544, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/update-file.md", @@ -8682,7 +8682,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 545, + "weight": 534, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -8751,7 +8751,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 547, + "weight": 536, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -8831,7 +8831,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 546, + "weight": 535, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -9061,7 +9061,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 548, + "weight": 537, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -9148,7 +9148,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 419, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -9218,7 +9218,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 415, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -9292,7 +9292,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 416, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -9359,7 +9359,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 417, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -9440,7 +9440,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 418, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -9509,7 +9509,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 420, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -9597,7 +9597,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 411, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -9708,7 +9708,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 403, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -9864,7 +9864,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 404, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -9974,7 +9974,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 407, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -10124,7 +10124,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 405, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -10235,7 +10235,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 409, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -10341,7 +10341,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 414, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -10469,7 +10469,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 413, + "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", diff --git a/app/config/specs/open-api3-1.8.x-console.json b/app/config/specs/open-api3-1.8.x-console.json index d82b0f6cb9..91975d2d2e 100644 --- a/app/config/specs/open-api3-1.8.x-console.json +++ b/app/config/specs/open-api3-1.8.x-console.json @@ -588,7 +588,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 253, + "weight": 239, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -659,7 +659,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 255, + "weight": 241, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -782,7 +782,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 256, + "weight": 242, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -921,7 +921,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 257, + "weight": 243, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1044,7 +1044,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 261, + "weight": 247, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1177,7 +1177,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 262, + "weight": 248, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1314,7 +1314,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 254, + "weight": 240, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1414,7 +1414,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 260, + "weight": 246, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1512,7 +1512,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 258, + "weight": 244, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1610,7 +1610,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 259, + "weight": 245, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -4044,7 +4044,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 264, + "weight": 250, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4172,7 +4172,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 263, + "weight": 249, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4306,7 +4306,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 267, + "weight": 253, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4366,7 +4366,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 265, + "weight": 251, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4856,7 +4856,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 266, + "weight": 252, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4940,7 +4940,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 269, + "weight": 255, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5034,7 +5034,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 268, + "weight": 254, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5128,7 +5128,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 270, + "weight": 256, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5874,7 +5874,7 @@ "x-appwrite": { "method": "chat", "group": "console", - "weight": 513, + "weight": 502, "cookies": false, "type": "", "demo": "assistant\/chat.md", @@ -5935,7 +5935,7 @@ "x-appwrite": { "method": "getResource", "group": null, - "weight": 514, + "weight": 503, "cookies": false, "type": "", "demo": "console\/get-resource.md", @@ -6010,7 +6010,7 @@ "x-appwrite": { "method": "variables", "group": "console", - "weight": 512, + "weight": 501, "cookies": false, "type": "", "demo": "console\/variables.md", @@ -6059,7 +6059,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 278, + "weight": 264, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -6178,7 +6178,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 274, + "weight": 260, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -6295,7 +6295,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 346, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6362,7 +6362,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 342, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6433,7 +6433,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 343, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6497,7 +6497,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 344, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6575,7 +6575,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 345, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6641,7 +6641,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 347, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6726,7 +6726,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 281, + "weight": 267, "cookies": false, "type": "", "demo": "databases\/list-usage.md", @@ -6830,7 +6830,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 275, + "weight": 261, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -6924,7 +6924,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 276, + "weight": 262, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -7034,7 +7034,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 277, + "weight": 263, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -7129,7 +7129,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 286, + "weight": 272, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -7229,7 +7229,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 282, + "weight": 268, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -7356,7 +7356,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 283, + "weight": 269, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -7431,7 +7431,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 284, + "weight": 270, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7534,7 +7534,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 285, + "weight": 271, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7611,7 +7611,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 303, + "weight": 289, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7712,7 +7712,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 304, + "weight": 290, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7825,7 +7825,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 305, + "weight": 291, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -7943,7 +7943,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 306, + "weight": 292, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -8056,7 +8056,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 307, + "weight": 293, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -8174,7 +8174,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 308, + "weight": 294, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -8288,7 +8288,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 309, + "weight": 295, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -8407,7 +8407,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 310, + "weight": 296, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8529,7 +8529,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 311, + "weight": 297, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8656,7 +8656,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 312, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8784,7 +8784,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 313, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -8917,7 +8917,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 314, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -9045,7 +9045,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 315, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -9178,7 +9178,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 316, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -9291,7 +9291,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 317, + "weight": 303, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -9409,7 +9409,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 318, + "weight": 304, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9524,7 +9524,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 319, + "weight": 305, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9648,7 +9648,7 @@ "x-appwrite": { "method": "createLongtextAttribute", "group": "attributes", - "weight": 336, + "weight": 322, "cookies": false, "type": "", "demo": "databases\/create-longtext-attribute.md", @@ -9757,7 +9757,7 @@ "x-appwrite": { "method": "updateLongtextAttribute", "group": "attributes", - "weight": 337, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/update-longtext-attribute.md", @@ -9871,7 +9871,7 @@ "x-appwrite": { "method": "createMediumtextAttribute", "group": "attributes", - "weight": 334, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/create-mediumtext-attribute.md", @@ -9980,7 +9980,7 @@ "x-appwrite": { "method": "updateMediumtextAttribute", "group": "attributes", - "weight": 335, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/update-mediumtext-attribute.md", @@ -10094,7 +10094,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 320, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -10209,7 +10209,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 321, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -10333,7 +10333,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 322, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -10448,7 +10448,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 323, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -10572,7 +10572,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 324, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -10711,7 +10711,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 326, + "weight": 312, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -10836,7 +10836,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 327, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -10961,7 +10961,7 @@ "x-appwrite": { "method": "createTextAttribute", "group": "attributes", - "weight": 332, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/create-text-attribute.md", @@ -11070,7 +11070,7 @@ "x-appwrite": { "method": "updateTextAttribute", "group": "attributes", - "weight": 333, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/update-text-attribute.md", @@ -11184,7 +11184,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 328, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -11298,7 +11298,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 329, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -11417,7 +11417,7 @@ "x-appwrite": { "method": "createVarcharAttribute", "group": "attributes", - "weight": 330, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/create-varchar-attribute.md", @@ -11533,7 +11533,7 @@ "x-appwrite": { "method": "updateVarcharAttribute", "group": "attributes", - "weight": 331, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/update-varchar-attribute.md", @@ -11685,7 +11685,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 301, + "weight": 287, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -11762,7 +11762,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 302, + "weight": 288, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -11848,7 +11848,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 325, + "weight": 311, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -11964,7 +11964,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 297, + "weight": 283, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -12076,7 +12076,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 289, + "weight": 275, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -12267,7 +12267,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 294, + "weight": 280, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -12404,7 +12404,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 292, + "weight": 278, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -12509,7 +12509,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 296, + "weight": 282, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -12611,7 +12611,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 290, + "weight": 276, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -12722,7 +12722,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 293, + "weight": 279, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -12877,7 +12877,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 291, + "weight": 277, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -12989,7 +12989,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 295, + "weight": 281, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -13096,7 +13096,7 @@ "x-appwrite": { "method": "listDocumentLogs", "group": "logs", - "weight": 298, + "weight": 284, "cookies": false, "type": "", "demo": "databases\/list-document-logs.md", @@ -13194,7 +13194,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 300, + "weight": 286, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -13323,7 +13323,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 299, + "weight": 285, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -13452,7 +13452,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 341, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -13551,7 +13551,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 338, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -13692,7 +13692,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 339, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -13769,7 +13769,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 340, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -13855,7 +13855,7 @@ "x-appwrite": { "method": "listCollectionLogs", "group": "collections", - "weight": 287, + "weight": 273, "cookies": false, "type": "", "demo": "databases\/list-collection-logs.md", @@ -13943,7 +13943,7 @@ "x-appwrite": { "method": "getCollectionUsage", "group": null, - "weight": 288, + "weight": 274, "cookies": false, "type": "", "demo": "databases\/get-collection-usage.md", @@ -14040,7 +14040,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 279, + "weight": 265, "cookies": false, "type": "", "demo": "databases\/list-logs.md", @@ -14148,7 +14148,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 280, + "weight": 266, "cookies": false, "type": "", "demo": "databases\/get-usage.md", @@ -14265,7 +14265,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 431, + "weight": 420, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -14350,7 +14350,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 428, + "weight": 417, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -14434,6 +14434,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -14461,7 +14462,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -14646,7 +14648,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 433, + "weight": 422, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -14696,7 +14698,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 434, + "weight": 423, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -14746,7 +14748,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 457, + "weight": 446, "cookies": false, "type": "", "demo": "functions\/list-templates.md", @@ -14817,6 +14819,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -14844,7 +14847,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -14939,7 +14943,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 456, + "weight": 445, "cookies": false, "type": "", "demo": "functions\/get-template.md", @@ -14999,7 +15003,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 450, + "weight": 439, "cookies": false, "type": "", "demo": "functions\/list-usage.md", @@ -15071,7 +15075,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 429, + "weight": 418, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -15131,7 +15135,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 430, + "weight": 419, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -15222,6 +15226,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -15249,7 +15254,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -15424,7 +15430,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 432, + "weight": 421, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -15486,7 +15492,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 437, + "weight": 426, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -15567,7 +15573,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 438, + "weight": 427, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -15662,7 +15668,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 435, + "weight": 424, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -15762,7 +15768,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 443, + "weight": 432, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -15848,7 +15854,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 440, + "weight": 429, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -15965,7 +15971,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 441, + "weight": 430, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -16063,7 +16069,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 436, + "weight": 425, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -16126,7 +16132,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 439, + "weight": 428, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -16191,7 +16197,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 442, + "weight": 431, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -16282,7 +16288,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 444, + "weight": 433, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -16354,7 +16360,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 447, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -16441,7 +16447,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 445, + "weight": 434, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -16559,7 +16565,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 446, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -16625,7 +16631,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 448, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -16697,7 +16703,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 449, + "weight": 438, "cookies": false, "type": "", "demo": "functions\/get-usage.md", @@ -16779,7 +16785,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 453, + "weight": 442, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -16839,7 +16845,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 451, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -16931,7 +16937,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 452, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -17001,7 +17007,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 454, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -17095,7 +17101,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 455, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -17167,7 +17173,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 190, + "weight": 176, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -17221,7 +17227,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 189, + "weight": 175, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -17275,7 +17281,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 458, + "weight": 447, "cookies": false, "type": "", "demo": "health\/get.md", @@ -17326,7 +17332,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 467, + "weight": 456, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -17377,7 +17383,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 461, + "weight": 450, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -17428,7 +17434,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 464, + "weight": 453, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -17490,7 +17496,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 460, + "weight": 449, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -17541,7 +17547,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 462, + "weight": 451, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -17592,7 +17598,7 @@ "x-appwrite": { "method": "getQueueAudits", "group": "queue", - "weight": 468, + "weight": 457, "cookies": false, "type": "", "demo": "health\/get-queue-audits.md", @@ -17656,7 +17662,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 472, + "weight": 461, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -17720,7 +17726,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 471, + "weight": 460, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -17784,7 +17790,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 473, + "weight": 462, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -17859,7 +17865,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 474, + "weight": 463, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -17923,7 +17929,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 481, + "weight": 470, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -18014,7 +18020,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 478, + "weight": 467, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -18078,7 +18084,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 470, + "weight": 459, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -18142,7 +18148,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 475, + "weight": 464, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -18206,7 +18212,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 476, + "weight": 465, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -18270,7 +18276,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 477, + "weight": 466, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -18334,7 +18340,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 479, + "weight": 468, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -18398,7 +18404,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 480, + "weight": 469, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -18462,7 +18468,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 469, + "weight": 458, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -18526,7 +18532,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 466, + "weight": 455, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -18577,7 +18583,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 465, + "weight": 454, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -18628,7 +18634,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 463, + "weight": 452, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -19111,7 +19117,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 245, + "weight": 231, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -19199,7 +19205,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 242, + "weight": 228, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -19345,7 +19351,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 249, + "weight": 235, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -19503,7 +19509,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 244, + "weight": 230, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -19681,7 +19687,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 251, + "weight": 237, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -19879,7 +19885,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 243, + "weight": 229, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -20060,7 +20066,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 250, + "weight": 236, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -20247,7 +20253,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 248, + "weight": 234, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -20301,7 +20307,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 252, + "weight": 238, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -20364,7 +20370,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 246, + "weight": 232, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -20451,7 +20457,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 247, + "weight": 233, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -20538,7 +20544,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 216, + "weight": 202, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -20626,7 +20632,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 215, + "weight": 201, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -20805,7 +20811,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 229, + "weight": 215, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -20986,7 +20992,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 214, + "weight": 200, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -21138,7 +21144,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 228, + "weight": 214, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -21291,7 +21297,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 205, + "weight": 191, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -21411,7 +21417,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 219, + "weight": 205, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -21533,7 +21539,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 209, + "weight": 195, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -21630,7 +21636,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 223, + "weight": 209, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -21730,7 +21736,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 207, + "weight": 193, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -21839,7 +21845,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 221, + "weight": 207, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -21950,7 +21956,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 206, + "weight": 192, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -22059,7 +22065,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 220, + "weight": 206, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -22170,7 +22176,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 208, + "weight": 194, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -22404,7 +22410,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 222, + "weight": 208, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -22637,7 +22643,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 210, + "weight": 196, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -22735,7 +22741,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 224, + "weight": 210, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -22835,7 +22841,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 211, + "weight": 197, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -22933,7 +22939,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 225, + "weight": 211, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -23033,7 +23039,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 212, + "weight": 198, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -23131,7 +23137,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 226, + "weight": 212, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -23231,7 +23237,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 213, + "weight": 199, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -23329,7 +23335,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 227, + "weight": 213, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -23429,7 +23435,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 218, + "weight": 204, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -23483,7 +23489,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 230, + "weight": 216, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -23546,7 +23552,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 217, + "weight": 203, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -23633,7 +23639,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 239, + "weight": 225, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -23720,7 +23726,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 232, + "weight": 218, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -23806,7 +23812,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 231, + "weight": 217, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -23890,7 +23896,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 234, + "weight": 220, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -23951,7 +23957,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 235, + "weight": 221, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -24031,7 +24037,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 236, + "weight": 222, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -24094,7 +24100,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 233, + "weight": 219, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -24181,7 +24187,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 238, + "weight": 224, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -24277,7 +24283,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 237, + "weight": 223, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -24368,7 +24374,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 240, + "weight": 226, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -24432,7 +24438,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 241, + "weight": 227, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -24508,7 +24514,7 @@ "x-appwrite": { "method": "list", "group": null, - "weight": 197, + "weight": 183, "cookies": false, "type": "", "demo": "migrations\/list.md", @@ -24594,7 +24600,7 @@ "x-appwrite": { "method": "createAppwriteMigration", "group": null, - "weight": 191, + "weight": 177, "cookies": false, "type": "", "demo": "migrations\/create-appwrite-migration.md", @@ -24704,7 +24710,7 @@ "x-appwrite": { "method": "getAppwriteReport", "group": null, - "weight": 199, + "weight": 185, "cookies": false, "type": "", "demo": "migrations\/get-appwrite-report.md", @@ -24818,7 +24824,7 @@ "x-appwrite": { "method": "createCSVExport", "group": null, - "weight": 196, + "weight": 182, "cookies": false, "type": "", "demo": "migrations\/create-csv-export.md", @@ -24933,7 +24939,7 @@ "x-appwrite": { "method": "createCSVImport", "group": null, - "weight": 195, + "weight": 181, "cookies": false, "type": "", "demo": "migrations\/create-csv-import.md", @@ -25018,7 +25024,7 @@ "x-appwrite": { "method": "createFirebaseMigration", "group": null, - "weight": 192, + "weight": 178, "cookies": false, "type": "", "demo": "migrations\/create-firebase-migration.md", @@ -25109,7 +25115,7 @@ "x-appwrite": { "method": "getFirebaseReport", "group": null, - "weight": 200, + "weight": 186, "cookies": false, "type": "", "demo": "migrations\/get-firebase-report.md", @@ -25196,7 +25202,7 @@ "x-appwrite": { "method": "createNHostMigration", "group": null, - "weight": 194, + "weight": 180, "cookies": false, "type": "", "demo": "migrations\/create-n-host-migration.md", @@ -25324,7 +25330,7 @@ "x-appwrite": { "method": "getNHostReport", "group": null, - "weight": 202, + "weight": 188, "cookies": false, "type": "", "demo": "migrations\/get-n-host-report.md", @@ -25473,7 +25479,7 @@ "x-appwrite": { "method": "createSupabaseMigration", "group": null, - "weight": 193, + "weight": 179, "cookies": false, "type": "", "demo": "migrations\/create-supabase-migration.md", @@ -25596,7 +25602,7 @@ "x-appwrite": { "method": "getSupabaseReport", "group": null, - "weight": 201, + "weight": 187, "cookies": false, "type": "", "demo": "migrations\/get-supabase-report.md", @@ -25736,7 +25742,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 198, + "weight": 184, "cookies": false, "type": "", "demo": "migrations\/get.md", @@ -25795,7 +25801,7 @@ "x-appwrite": { "method": "retry", "group": null, - "weight": 203, + "weight": 189, "cookies": false, "type": "", "demo": "migrations\/retry.md", @@ -25847,7 +25853,7 @@ "x-appwrite": { "method": "delete", "group": null, - "weight": 204, + "weight": 190, "cookies": false, "type": "", "demo": "migrations\/delete.md", @@ -25908,7 +25914,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 103, + "weight": 100, "cookies": false, "type": "", "demo": "project\/get-usage.md", @@ -25997,7 +26003,7 @@ "x-appwrite": { "method": "listVariables", "group": null, - "weight": 105, + "weight": 102, "cookies": false, "type": "", "demo": "project\/list-variables.md", @@ -26044,7 +26050,7 @@ "x-appwrite": { "method": "createVariable", "group": null, - "weight": 104, + "weight": 101, "cookies": false, "type": "", "demo": "project\/create-variable.md", @@ -26123,7 +26129,7 @@ "x-appwrite": { "method": "getVariable", "group": null, - "weight": 106, + "weight": 103, "cookies": false, "type": "", "demo": "project\/get-variable.md", @@ -26182,7 +26188,7 @@ "x-appwrite": { "method": "updateVariable", "group": null, - "weight": 107, + "weight": 104, "cookies": false, "type": "", "demo": "project\/update-variable.md", @@ -26265,7 +26271,7 @@ "x-appwrite": { "method": "deleteVariable", "group": null, - "weight": 108, + "weight": 105, "cookies": false, "type": "", "demo": "project\/delete-variable.md", @@ -26326,7 +26332,7 @@ "x-appwrite": { "method": "list", "group": "projects", - "weight": 426, + "weight": 414, "cookies": false, "type": "", "demo": "projects\/list.md", @@ -26409,7 +26415,7 @@ "x-appwrite": { "method": "create", "group": "projects", - "weight": 57, + "weight": 412, "cookies": false, "type": "", "demo": "projects\/create.md", @@ -26545,7 +26551,7 @@ "x-appwrite": { "method": "get", "group": "projects", - "weight": 58, + "weight": 57, "cookies": false, "type": "", "demo": "projects\/get.md", @@ -26604,7 +26610,7 @@ "x-appwrite": { "method": "update", "group": "projects", - "weight": 59, + "weight": 413, "cookies": false, "type": "", "demo": "projects\/update.md", @@ -26721,7 +26727,7 @@ "x-appwrite": { "method": "delete", "group": "projects", - "weight": 76, + "weight": 73, "cookies": false, "type": "", "demo": "projects\/delete.md", @@ -26782,7 +26788,7 @@ "x-appwrite": { "method": "updateApiStatus", "group": "projects", - "weight": 63, + "weight": 60, "cookies": false, "type": "", "demo": "projects\/update-api-status.md", @@ -26939,7 +26945,7 @@ "x-appwrite": { "method": "updateApiStatusAll", "group": "projects", - "weight": 64, + "weight": 61, "cookies": false, "type": "", "demo": "projects\/update-api-status-all.md", @@ -27079,7 +27085,7 @@ "x-appwrite": { "method": "updateAuthDuration", "group": "auth", - "weight": 69, + "weight": 66, "cookies": false, "type": "", "demo": "projects\/update-auth-duration.md", @@ -27160,7 +27166,7 @@ "x-appwrite": { "method": "updateAuthLimit", "group": "auth", - "weight": 68, + "weight": 65, "cookies": false, "type": "", "demo": "projects\/update-auth-limit.md", @@ -27241,7 +27247,7 @@ "x-appwrite": { "method": "updateAuthSessionsLimit", "group": "auth", - "weight": 74, + "weight": 71, "cookies": false, "type": "", "demo": "projects\/update-auth-sessions-limit.md", @@ -27322,7 +27328,7 @@ "x-appwrite": { "method": "updateMembershipsPrivacy", "group": "auth", - "weight": 67, + "weight": 64, "cookies": false, "type": "", "demo": "projects\/update-memberships-privacy.md", @@ -27414,7 +27420,7 @@ "x-appwrite": { "method": "updateMockNumbers", "group": "auth", - "weight": 75, + "weight": 72, "cookies": false, "type": "", "demo": "projects\/update-mock-numbers.md", @@ -27497,7 +27503,7 @@ "x-appwrite": { "method": "updateAuthPasswordDictionary", "group": "auth", - "weight": 72, + "weight": 69, "cookies": false, "type": "", "demo": "projects\/update-auth-password-dictionary.md", @@ -27577,7 +27583,7 @@ "x-appwrite": { "method": "updateAuthPasswordHistory", "group": "auth", - "weight": 71, + "weight": 68, "cookies": false, "type": "", "demo": "projects\/update-auth-password-history.md", @@ -27658,7 +27664,7 @@ "x-appwrite": { "method": "updatePersonalDataCheck", "group": "auth", - "weight": 73, + "weight": 70, "cookies": false, "type": "", "demo": "projects\/update-personal-data-check.md", @@ -27738,7 +27744,7 @@ "x-appwrite": { "method": "updateSessionAlerts", "group": "auth", - "weight": 66, + "weight": 63, "cookies": false, "type": "", "demo": "projects\/update-session-alerts.md", @@ -27818,7 +27824,7 @@ "x-appwrite": { "method": "updateSessionInvalidation", "group": "auth", - "weight": 102, + "weight": 99, "cookies": false, "type": "", "demo": "projects\/update-session-invalidation.md", @@ -27898,7 +27904,7 @@ "x-appwrite": { "method": "updateAuthStatus", "group": "auth", - "weight": 70, + "weight": 67, "cookies": false, "type": "", "demo": "projects\/update-auth-status.md", @@ -27999,7 +28005,7 @@ "x-appwrite": { "method": "listDevKeys", "group": "devKeys", - "weight": 424, + "weight": 410, "cookies": false, "type": "", "demo": "projects\/list-dev-keys.md", @@ -28070,7 +28076,7 @@ "x-appwrite": { "method": "createDevKey", "group": "devKeys", - "weight": 421, + "weight": 407, "cookies": false, "type": "", "demo": "projects\/create-dev-key.md", @@ -28155,7 +28161,7 @@ "x-appwrite": { "method": "getDevKey", "group": "devKeys", - "weight": 423, + "weight": 409, "cookies": false, "type": "", "demo": "projects\/get-dev-key.md", @@ -28223,7 +28229,7 @@ "x-appwrite": { "method": "updateDevKey", "group": "devKeys", - "weight": 422, + "weight": 408, "cookies": false, "type": "", "demo": "projects\/update-dev-key.md", @@ -28309,7 +28315,7 @@ "x-appwrite": { "method": "deleteDevKey", "group": "devKeys", - "weight": 425, + "weight": 411, "cookies": false, "type": "", "demo": "projects\/delete-dev-key.md", @@ -28379,7 +28385,7 @@ "x-appwrite": { "method": "createJWT", "group": "auth", - "weight": 88, + "weight": 85, "cookies": false, "type": "", "demo": "projects\/create-jwt.md", @@ -28527,7 +28533,7 @@ "x-appwrite": { "method": "listKeys", "group": "keys", - "weight": 84, + "weight": 81, "cookies": false, "type": "", "demo": "projects\/list-keys.md", @@ -28561,6 +28567,19 @@ }, "in": "path" }, + { + "name": "queries", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: expire, accessedAt, name, scopes", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "in": "query" + }, { "name": "total", "description": "When set to false, the total count returned will be 0 and will not be calculated.", @@ -28597,7 +28616,7 @@ "x-appwrite": { "method": "createKey", "group": "keys", - "weight": 83, + "weight": 80, "cookies": false, "type": "", "demo": "projects\/create-key.md", @@ -28638,6 +28657,11 @@ "schema": { "type": "object", "properties": { + "keyId": { + "type": "string", + "description": "Key ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can't start with a special char. Max length is 36 chars.", + "x-example": "" + }, "name": { "type": "string", "description": "Key name. Max length: 128 chars.", @@ -28752,7 +28776,7 @@ "x-appwrite": { "method": "getKey", "group": "keys", - "weight": 85, + "weight": 82, "cookies": false, "type": "", "demo": "projects\/get-key.md", @@ -28821,7 +28845,7 @@ "x-appwrite": { "method": "updateKey", "group": "keys", - "weight": 86, + "weight": 83, "cookies": false, "type": "", "demo": "projects\/update-key.md", @@ -28977,7 +29001,7 @@ "x-appwrite": { "method": "deleteKey", "group": "keys", - "weight": 87, + "weight": 84, "cookies": false, "type": "", "demo": "projects\/delete-key.md", @@ -29048,7 +29072,7 @@ "x-appwrite": { "method": "updateLabels", "group": "projects", - "weight": 427, + "weight": 415, "cookies": false, "type": "", "demo": "projects\/update-labels.md", @@ -29130,7 +29154,7 @@ "x-appwrite": { "method": "updateOAuth2", "group": "auth", - "weight": 65, + "weight": 62, "cookies": false, "type": "", "demo": "projects\/update-o-auth-2.md", @@ -29271,7 +29295,7 @@ "x-appwrite": { "method": "listPlatforms", "group": "platforms", - "weight": 90, + "weight": 87, "cookies": false, "type": "", "demo": "projects\/list-platforms.md", @@ -29341,7 +29365,7 @@ "x-appwrite": { "method": "createPlatform", "group": "platforms", - "weight": 89, + "weight": 86, "cookies": false, "type": "", "demo": "projects\/create-platform.md", @@ -29461,7 +29485,7 @@ "x-appwrite": { "method": "getPlatform", "group": "platforms", - "weight": 91, + "weight": 88, "cookies": false, "type": "", "demo": "projects\/get-platform.md", @@ -29530,7 +29554,7 @@ "x-appwrite": { "method": "updatePlatform", "group": "platforms", - "weight": 92, + "weight": 89, "cookies": false, "type": "", "demo": "projects\/update-platform.md", @@ -29626,7 +29650,7 @@ "x-appwrite": { "method": "deletePlatform", "group": "platforms", - "weight": 93, + "weight": 90, "cookies": false, "type": "", "demo": "projects\/delete-platform.md", @@ -29697,7 +29721,7 @@ "x-appwrite": { "method": "updateServiceStatus", "group": "projects", - "weight": 61, + "weight": 58, "cookies": false, "type": "", "demo": "projects\/update-service-status.md", @@ -29800,7 +29824,7 @@ "x-appwrite": { "method": "updateServiceStatusAll", "group": "projects", - "weight": 62, + "weight": 59, "cookies": false, "type": "", "demo": "projects\/update-service-status-all.md", @@ -29880,7 +29904,7 @@ "x-appwrite": { "method": "updateSmtp", "group": "templates", - "weight": 94, + "weight": 91, "cookies": false, "type": "", "demo": "projects\/update-smtp.md", @@ -30078,7 +30102,7 @@ "x-appwrite": { "method": "createSmtpTest", "group": "templates", - "weight": 95, + "weight": 92, "cookies": false, "type": "", "demo": "projects\/create-smtp-test.md", @@ -30293,7 +30317,7 @@ "x-appwrite": { "method": "updateTeam", "group": "projects", - "weight": 60, + "weight": 416, "cookies": false, "type": "", "demo": "projects\/update-team.md", @@ -30373,7 +30397,7 @@ "x-appwrite": { "method": "getEmailTemplate", "group": "templates", - "weight": 97, + "weight": 94, "cookies": false, "type": "", "demo": "projects\/get-email-template.md", @@ -30598,7 +30622,7 @@ "x-appwrite": { "method": "updateEmailTemplate", "group": "templates", - "weight": 99, + "weight": 96, "cookies": false, "type": "", "demo": "projects\/update-email-template.md", @@ -30865,7 +30889,7 @@ "x-appwrite": { "method": "deleteEmailTemplate", "group": "templates", - "weight": 101, + "weight": 98, "cookies": false, "type": "", "demo": "projects\/delete-email-template.md", @@ -31092,7 +31116,7 @@ "x-appwrite": { "method": "getSmsTemplate", "group": "templates", - "weight": 96, + "weight": 93, "cookies": false, "type": "", "demo": "projects\/get-sms-template.md", @@ -31378,7 +31402,7 @@ "x-appwrite": { "method": "updateSmsTemplate", "group": "templates", - "weight": 98, + "weight": 95, "cookies": false, "type": "", "demo": "projects\/update-sms-template.md", @@ -31687,7 +31711,7 @@ "x-appwrite": { "method": "deleteSmsTemplate", "group": "templates", - "weight": 100, + "weight": 97, "cookies": false, "type": "", "demo": "projects\/delete-sms-template.md", @@ -31975,7 +31999,7 @@ "x-appwrite": { "method": "listWebhooks", "group": "webhooks", - "weight": 78, + "weight": 75, "cookies": false, "type": "", "demo": "projects\/list-webhooks.md", @@ -32045,7 +32069,7 @@ "x-appwrite": { "method": "createWebhook", "group": "webhooks", - "weight": 77, + "weight": 74, "cookies": false, "type": "", "demo": "projects\/create-webhook.md", @@ -32161,7 +32185,7 @@ "x-appwrite": { "method": "getWebhook", "group": "webhooks", - "weight": 79, + "weight": 76, "cookies": false, "type": "", "demo": "projects\/get-webhook.md", @@ -32230,7 +32254,7 @@ "x-appwrite": { "method": "updateWebhook", "group": "webhooks", - "weight": 80, + "weight": 77, "cookies": false, "type": "", "demo": "projects\/update-webhook.md", @@ -32347,7 +32371,7 @@ "x-appwrite": { "method": "deleteWebhook", "group": "webhooks", - "weight": 82, + "weight": 79, "cookies": false, "type": "", "demo": "projects\/delete-webhook.md", @@ -32418,7 +32442,7 @@ "x-appwrite": { "method": "updateWebhookSignature", "group": "webhooks", - "weight": 81, + "weight": 78, "cookies": false, "type": "", "demo": "projects\/update-webhook-signature.md", @@ -32489,7 +32513,7 @@ "x-appwrite": { "method": "listRules", "group": null, - "weight": 528, + "weight": 517, "cookies": false, "type": "", "demo": "proxy\/list-rules.md", @@ -32574,7 +32598,7 @@ "x-appwrite": { "method": "createAPIRule", "group": null, - "weight": 523, + "weight": 512, "cookies": false, "type": "", "demo": "proxy\/create-api-rule.md", @@ -32641,7 +32665,7 @@ "x-appwrite": { "method": "createFunctionRule", "group": null, - "weight": 525, + "weight": 514, "cookies": false, "type": "", "demo": "proxy\/create-function-rule.md", @@ -32719,7 +32743,7 @@ "x-appwrite": { "method": "createRedirectRule", "group": null, - "weight": 526, + "weight": 515, "cookies": false, "type": "", "demo": "proxy\/create-redirect-rule.md", @@ -32833,7 +32857,7 @@ "x-appwrite": { "method": "createSiteRule", "group": null, - "weight": 524, + "weight": 513, "cookies": false, "type": "", "demo": "proxy\/create-site-rule.md", @@ -32911,7 +32935,7 @@ "x-appwrite": { "method": "getRule", "group": null, - "weight": 527, + "weight": 516, "cookies": false, "type": "", "demo": "proxy\/get-rule.md", @@ -32962,7 +32986,7 @@ "x-appwrite": { "method": "deleteRule", "group": null, - "weight": 529, + "weight": 518, "cookies": false, "type": "", "demo": "proxy\/delete-rule.md", @@ -33022,7 +33046,7 @@ "x-appwrite": { "method": "updateRuleVerification", "group": null, - "weight": 530, + "weight": 519, "cookies": false, "type": "", "demo": "proxy\/update-rule-verification.md", @@ -33082,7 +33106,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 485, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -33167,7 +33191,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 483, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -33306,6 +33330,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -33333,7 +33358,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -33421,7 +33447,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 488, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -33471,7 +33497,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 511, + "weight": 500, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -33521,7 +33547,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 507, + "weight": 496, "cookies": false, "type": "", "demo": "sites\/list-templates.md", @@ -33653,7 +33679,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 508, + "weight": 497, "cookies": false, "type": "", "demo": "sites\/get-template.md", @@ -33713,7 +33739,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 509, + "weight": 498, "cookies": false, "type": "", "demo": "sites\/list-usage.md", @@ -33785,7 +33811,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 484, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -33845,7 +33871,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 486, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -33991,6 +34017,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -34018,7 +34045,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -34095,7 +34123,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 487, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -34157,7 +34185,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 494, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -34238,7 +34266,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 493, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -34333,7 +34361,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 489, + "weight": 478, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -34439,7 +34467,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 497, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -34520,7 +34548,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 490, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -34637,7 +34665,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 491, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -34736,7 +34764,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 492, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -34799,7 +34827,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 495, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -34864,7 +34892,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 496, + "weight": 485, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -34955,7 +34983,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 498, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -35027,7 +35055,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 500, + "weight": 489, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -35113,7 +35141,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 499, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -35176,7 +35204,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 501, + "weight": 490, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -35248,7 +35276,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 510, + "weight": 499, "cookies": false, "type": "", "demo": "sites\/get-usage.md", @@ -35330,7 +35358,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 504, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -35390,7 +35418,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 502, + "weight": 491, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -35482,7 +35510,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 503, + "weight": 492, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -35552,7 +35580,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 505, + "weight": 494, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -35646,7 +35674,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 506, + "weight": 495, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -35718,7 +35746,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 538, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -35804,7 +35832,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 536, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -35940,7 +35968,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 537, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -36001,7 +36029,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 539, + "weight": 528, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -36134,7 +36162,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 540, + "weight": 529, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -36197,7 +36225,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 543, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -36296,7 +36324,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 541, + "weight": 530, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -36398,7 +36426,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 542, + "weight": 531, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -36472,7 +36500,7 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 544, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/update-file.md", @@ -36564,7 +36592,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 545, + "weight": 534, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -36633,7 +36661,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 547, + "weight": 536, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -36713,7 +36741,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 546, + "weight": 535, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -36943,7 +36971,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 548, + "weight": 537, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -37030,7 +37058,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 550, + "weight": 539, "cookies": false, "type": "", "demo": "storage\/get-usage.md", @@ -37103,7 +37131,7 @@ "x-appwrite": { "method": "getBucketUsage", "group": null, - "weight": 551, + "weight": 540, "cookies": false, "type": "", "demo": "storage\/get-bucket-usage.md", @@ -37186,7 +37214,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 352, + "weight": 338, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -37272,7 +37300,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 348, + "weight": 334, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -37353,7 +37381,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 419, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -37423,7 +37451,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 415, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -37497,7 +37525,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 416, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -37564,7 +37592,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 417, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -37645,7 +37673,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 418, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -37714,7 +37742,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 420, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -37802,7 +37830,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 354, + "weight": 340, "cookies": false, "type": "", "demo": "tablesdb\/list-usage.md", @@ -37901,7 +37929,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 349, + "weight": 335, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -37962,7 +37990,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 350, + "weight": 336, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -38037,7 +38065,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 351, + "weight": 337, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -38100,7 +38128,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 359, + "weight": 345, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -38199,7 +38227,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 355, + "weight": 341, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -38325,7 +38353,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 356, + "weight": 342, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -38399,7 +38427,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 357, + "weight": 343, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -38501,7 +38529,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 358, + "weight": 344, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -38577,7 +38605,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 364, + "weight": 350, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -38677,7 +38705,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 365, + "weight": 351, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -38789,7 +38817,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 366, + "weight": 352, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -38906,7 +38934,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 367, + "weight": 353, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -39018,7 +39046,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 368, + "weight": 354, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -39135,7 +39163,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 369, + "weight": 355, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -39248,7 +39276,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 370, + "weight": 356, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -39366,7 +39394,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 371, + "weight": 357, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -39487,7 +39515,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 372, + "weight": 358, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -39613,7 +39641,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 373, + "weight": 359, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -39740,7 +39768,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 374, + "weight": 360, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -39872,7 +39900,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 375, + "weight": 361, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -39999,7 +40027,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 376, + "weight": 362, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -40131,7 +40159,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 377, + "weight": 363, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -40243,7 +40271,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 378, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -40360,7 +40388,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 379, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -40474,7 +40502,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 380, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -40597,7 +40625,7 @@ "x-appwrite": { "method": "createLongtextColumn", "group": "columns", - "weight": 397, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-longtext-column.md", @@ -40709,7 +40737,7 @@ "x-appwrite": { "method": "updateLongtextColumn", "group": "columns", - "weight": 398, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-longtext-column.md", @@ -40826,7 +40854,7 @@ "x-appwrite": { "method": "createMediumtextColumn", "group": "columns", - "weight": 395, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-mediumtext-column.md", @@ -40938,7 +40966,7 @@ "x-appwrite": { "method": "updateMediumtextColumn", "group": "columns", - "weight": 396, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-mediumtext-column.md", @@ -41055,7 +41083,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 381, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -41169,7 +41197,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 382, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -41292,7 +41320,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 383, + "weight": 369, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -41406,7 +41434,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 384, + "weight": 370, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -41529,7 +41557,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 385, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -41667,7 +41695,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 387, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -41795,7 +41823,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 388, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -41923,7 +41951,7 @@ "x-appwrite": { "method": "createTextColumn", "group": "columns", - "weight": 393, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/create-text-column.md", @@ -42035,7 +42063,7 @@ "x-appwrite": { "method": "updateTextColumn", "group": "columns", - "weight": 394, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/update-text-column.md", @@ -42152,7 +42180,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 389, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -42265,7 +42293,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 390, + "weight": 376, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -42383,7 +42411,7 @@ "x-appwrite": { "method": "createVarcharColumn", "group": "columns", - "weight": 391, + "weight": 377, "cookies": false, "type": "", "demo": "tablesdb\/create-varchar-column.md", @@ -42502,7 +42530,7 @@ "x-appwrite": { "method": "updateVarcharColumn", "group": "columns", - "weight": 392, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/update-varchar-column.md", @@ -42657,7 +42685,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 362, + "weight": 348, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -42733,7 +42761,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 363, + "weight": 349, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -42818,7 +42846,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 386, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -42933,7 +42961,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 402, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -43031,7 +43059,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 399, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -43171,7 +43199,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 400, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -43247,7 +43275,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 401, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -43332,7 +43360,7 @@ "x-appwrite": { "method": "listTableLogs", "group": "tables", - "weight": 360, + "weight": 346, "cookies": false, "type": "", "demo": "tablesdb\/list-table-logs.md", @@ -43419,7 +43447,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 411, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -43530,7 +43558,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 403, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -43712,7 +43740,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 408, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -43844,7 +43872,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 406, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -43948,7 +43976,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 410, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -44049,7 +44077,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 404, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -44159,7 +44187,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 407, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -44309,7 +44337,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 405, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -44420,7 +44448,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 409, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -44526,7 +44554,7 @@ "x-appwrite": { "method": "listRowLogs", "group": "logs", - "weight": 412, + "weight": 398, "cookies": false, "type": "", "demo": "tablesdb\/list-row-logs.md", @@ -44623,7 +44651,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 414, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -44751,7 +44779,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 413, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -44879,7 +44907,7 @@ "x-appwrite": { "method": "getTableUsage", "group": null, - "weight": 361, + "weight": 347, "cookies": false, "type": "", "demo": "tablesdb\/get-table-usage.md", @@ -44975,7 +45003,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 353, + "weight": 339, "cookies": false, "type": "", "demo": "tablesdb\/get-usage.md", @@ -45087,7 +45115,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 110, + "weight": 107, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -45176,7 +45204,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 109, + "weight": 106, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -45263,7 +45291,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 111, + "weight": 108, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -45327,7 +45355,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 113, + "weight": 110, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -45403,7 +45431,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 115, + "weight": 112, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -45469,7 +45497,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 122, + "weight": 119, "cookies": false, "type": "", "demo": "teams\/list-logs.md", @@ -45554,7 +45582,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 117, + "weight": 114, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -45653,7 +45681,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 116, + "weight": 113, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -45721,14 +45749,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": { @@ -45776,7 +45797,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 118, + "weight": 115, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -45850,7 +45871,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 119, + "weight": 116, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -45911,14 +45932,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" } } }, @@ -45946,7 +45960,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 121, + "weight": 118, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -46022,7 +46036,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 120, + "weight": 117, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -46121,7 +46135,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 112, + "weight": 109, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -46183,7 +46197,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 114, + "weight": 111, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -46266,7 +46280,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 533, + "weight": 522, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -46360,7 +46374,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 531, + "weight": 520, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -46449,7 +46463,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 532, + "weight": 521, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -46509,7 +46523,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 534, + "weight": 523, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -46579,7 +46593,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 535, + "weight": 524, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -46641,7 +46655,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 132, + "weight": 129, "cookies": false, "type": "", "demo": "users\/list.md", @@ -46727,7 +46741,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 123, + "weight": 120, "cookies": false, "type": "", "demo": "users\/create.md", @@ -46821,7 +46835,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 126, + "weight": 123, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -46910,7 +46924,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 124, + "weight": 121, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -46999,7 +47013,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 140, + "weight": 137, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -47080,7 +47094,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 163, + "weight": 160, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -47143,7 +47157,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 125, + "weight": 122, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -47232,7 +47246,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 128, + "weight": 125, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -47321,7 +47335,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 129, + "weight": 126, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -47444,7 +47458,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 130, + "weight": 127, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -47551,7 +47565,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 127, + "weight": 124, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -47660,7 +47674,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 165, + "weight": 162, "cookies": false, "type": "", "demo": "users\/get-usage.md", @@ -47733,7 +47747,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 133, + "weight": 130, "cookies": false, "type": "", "demo": "users\/get.md", @@ -47787,7 +47801,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 161, + "weight": 158, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -47850,7 +47864,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 146, + "weight": 143, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -47933,7 +47947,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 164, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -48018,7 +48032,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 142, + "weight": 139, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -48103,7 +48117,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 138, + "weight": 135, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -48190,7 +48204,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 137, + "weight": 134, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -48288,7 +48302,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 151, + "weight": 148, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -48423,7 +48437,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 156, + "weight": 153, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -48559,7 +48573,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 152, + "weight": 149, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -48678,7 +48692,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 153, + "weight": 150, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -48795,7 +48809,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 155, + "weight": 152, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -48912,7 +48926,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 154, + "weight": 151, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -49031,7 +49045,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 144, + "weight": 141, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -49113,7 +49127,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 145, + "weight": 142, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -49195,7 +49209,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 147, + "weight": 144, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -49278,7 +49292,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 134, + "weight": 131, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -49339,7 +49353,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 149, + "weight": 146, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -49421,7 +49435,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 136, + "weight": 133, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -49493,7 +49507,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 157, + "weight": 154, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -49547,7 +49561,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 160, + "weight": 157, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -49603,7 +49617,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 159, + "weight": 156, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -49676,7 +49690,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 141, + "weight": 138, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -49758,7 +49772,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 139, + "weight": 136, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -49843,7 +49857,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 131, + "weight": 128, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -49954,7 +49968,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 135, + "weight": 132, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -50025,7 +50039,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 150, + "weight": 147, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -50115,7 +50129,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 162, + "weight": 159, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -50188,7 +50202,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 158, + "weight": 155, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -50274,7 +50288,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 148, + "weight": 145, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -50356,7 +50370,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 143, + "weight": 140, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -50438,7 +50452,7 @@ "x-appwrite": { "method": "createRepositoryDetection", "group": "repositories", - "weight": 169, + "weight": 551, "cookies": false, "type": "", "demo": "vcs\/create-repository-detection.md", @@ -50535,7 +50549,7 @@ "x-appwrite": { "method": "listRepositories", "group": "repositories", - "weight": 170, + "weight": 548, "cookies": false, "type": "", "demo": "vcs\/list-repositories.md", @@ -50634,7 +50648,7 @@ "x-appwrite": { "method": "createRepository", "group": "repositories", - "weight": 171, + "weight": 546, "cookies": false, "type": "", "demo": "vcs\/create-repository.md", @@ -50720,7 +50734,7 @@ "x-appwrite": { "method": "getRepository", "group": "repositories", - "weight": 172, + "weight": 547, "cookies": false, "type": "", "demo": "vcs\/get-repository.md", @@ -50791,7 +50805,7 @@ "x-appwrite": { "method": "listRepositoryBranches", "group": "repositories", - "weight": 173, + "weight": 549, "cookies": false, "type": "", "demo": "vcs\/list-repository-branches.md", @@ -50862,7 +50876,7 @@ "x-appwrite": { "method": "getRepositoryContents", "group": "repositories", - "weight": 168, + "weight": 550, "cookies": false, "type": "", "demo": "vcs\/get-repository-contents.md", @@ -50948,7 +50962,7 @@ "x-appwrite": { "method": "updateExternalDeployments", "group": "repositories", - "weight": 178, + "weight": 164, "cookies": false, "type": "", "demo": "vcs\/update-external-deployments.md", @@ -51038,7 +51052,7 @@ "x-appwrite": { "method": "listInstallations", "group": "installations", - "weight": 175, + "weight": 544, "cookies": false, "type": "", "demo": "vcs\/list-installations.md", @@ -51124,7 +51138,7 @@ "x-appwrite": { "method": "getInstallation", "group": "installations", - "weight": 176, + "weight": 543, "cookies": false, "type": "", "demo": "vcs\/get-installation.md", @@ -51176,7 +51190,7 @@ "x-appwrite": { "method": "deleteInstallation", "group": "installations", - "weight": 177, + "weight": 545, "cookies": false, "type": "", "demo": "vcs\/delete-installation.md", @@ -52922,6 +52936,18 @@ "$ref": "#\/components\/schemas\/index" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum document size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used document size in bytes based on defined attributes.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -52934,7 +52960,9 @@ "enabled", "documentSecurity", "attributes", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -52948,7 +52976,9 @@ "enabled": false, "documentSecurity": true, "attributes": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "attributeList": { @@ -54715,6 +54745,18 @@ "$ref": "#\/components\/schemas\/columnIndex" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum row size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used row size in bytes based on defined columns.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -54727,7 +54769,9 @@ "enabled", "rowSecurity", "columns", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -54741,7 +54785,9 @@ "enabled": false, "rowSecurity": true, "columns": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "columnList": { diff --git a/app/config/specs/open-api3-1.8.x-server.json b/app/config/specs/open-api3-1.8.x-server.json index f63942090c..89ad0cb0ff 100644 --- a/app/config/specs/open-api3-1.8.x-server.json +++ b/app/config/specs/open-api3-1.8.x-server.json @@ -562,7 +562,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 253, + "weight": 239, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -635,7 +635,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 255, + "weight": 241, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -762,7 +762,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 256, + "weight": 242, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -905,7 +905,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 257, + "weight": 243, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1032,7 +1032,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 261, + "weight": 247, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1169,7 +1169,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 262, + "weight": 248, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1310,7 +1310,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 254, + "weight": 240, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1414,7 +1414,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 260, + "weight": 246, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1516,7 +1516,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 258, + "weight": 244, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1618,7 +1618,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 259, + "weight": 245, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -3761,7 +3761,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 264, + "weight": 250, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -3891,7 +3891,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 263, + "weight": 249, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4027,7 +4027,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 267, + "weight": 253, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4089,7 +4089,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 265, + "weight": 251, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4581,7 +4581,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 266, + "weight": 252, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4667,7 +4667,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 269, + "weight": 255, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -4763,7 +4763,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 268, + "weight": 254, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -4859,7 +4859,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 270, + "weight": 256, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5614,7 +5614,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 278, + "weight": 264, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -5735,7 +5735,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 274, + "weight": 260, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -5854,7 +5854,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 346, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -5923,7 +5923,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 342, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -5996,7 +5996,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 343, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6062,7 +6062,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 344, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6142,7 +6142,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 345, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6210,7 +6210,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 347, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6297,7 +6297,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 275, + "weight": 261, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -6393,7 +6393,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 276, + "weight": 262, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -6505,7 +6505,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 277, + "weight": 263, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -6602,7 +6602,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 286, + "weight": 272, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -6703,7 +6703,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 282, + "weight": 268, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -6831,7 +6831,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 283, + "weight": 269, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -6907,7 +6907,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 284, + "weight": 270, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7011,7 +7011,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 285, + "weight": 271, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7089,7 +7089,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 303, + "weight": 289, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7191,7 +7191,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 304, + "weight": 290, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7305,7 +7305,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 305, + "weight": 291, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -7424,7 +7424,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 306, + "weight": 292, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -7538,7 +7538,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 307, + "weight": 293, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -7657,7 +7657,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 308, + "weight": 294, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -7772,7 +7772,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 309, + "weight": 295, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -7892,7 +7892,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 310, + "weight": 296, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8015,7 +8015,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 311, + "weight": 297, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8143,7 +8143,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 312, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8272,7 +8272,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 313, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -8406,7 +8406,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 314, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -8535,7 +8535,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 315, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -8669,7 +8669,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 316, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -8783,7 +8783,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 317, + "weight": 303, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -8902,7 +8902,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 318, + "weight": 304, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9018,7 +9018,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 319, + "weight": 305, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9143,7 +9143,7 @@ "x-appwrite": { "method": "createLongtextAttribute", "group": "attributes", - "weight": 336, + "weight": 322, "cookies": false, "type": "", "demo": "databases\/create-longtext-attribute.md", @@ -9253,7 +9253,7 @@ "x-appwrite": { "method": "updateLongtextAttribute", "group": "attributes", - "weight": 337, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/update-longtext-attribute.md", @@ -9368,7 +9368,7 @@ "x-appwrite": { "method": "createMediumtextAttribute", "group": "attributes", - "weight": 334, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/create-mediumtext-attribute.md", @@ -9478,7 +9478,7 @@ "x-appwrite": { "method": "updateMediumtextAttribute", "group": "attributes", - "weight": 335, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/update-mediumtext-attribute.md", @@ -9593,7 +9593,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 320, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -9709,7 +9709,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 321, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -9834,7 +9834,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 322, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -9950,7 +9950,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 323, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -10075,7 +10075,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 324, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -10215,7 +10215,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 326, + "weight": 312, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -10341,7 +10341,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 327, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -10467,7 +10467,7 @@ "x-appwrite": { "method": "createTextAttribute", "group": "attributes", - "weight": 332, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/create-text-attribute.md", @@ -10577,7 +10577,7 @@ "x-appwrite": { "method": "updateTextAttribute", "group": "attributes", - "weight": 333, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/update-text-attribute.md", @@ -10692,7 +10692,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 328, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -10807,7 +10807,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 329, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -10927,7 +10927,7 @@ "x-appwrite": { "method": "createVarcharAttribute", "group": "attributes", - "weight": 330, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/create-varchar-attribute.md", @@ -11044,7 +11044,7 @@ "x-appwrite": { "method": "updateVarcharAttribute", "group": "attributes", - "weight": 331, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/update-varchar-attribute.md", @@ -11197,7 +11197,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 301, + "weight": 287, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -11275,7 +11275,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 302, + "weight": 288, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -11362,7 +11362,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 325, + "weight": 311, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -11479,7 +11479,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 297, + "weight": 283, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -11593,7 +11593,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 289, + "weight": 275, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -11788,7 +11788,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 294, + "weight": 280, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -11927,7 +11927,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 292, + "weight": 278, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -12033,7 +12033,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 296, + "weight": 282, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -12136,7 +12136,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 290, + "weight": 276, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -12249,7 +12249,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 293, + "weight": 279, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -12407,7 +12407,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 291, + "weight": 277, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -12521,7 +12521,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 295, + "weight": 281, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -12630,7 +12630,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 300, + "weight": 286, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -12761,7 +12761,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 299, + "weight": 285, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -12892,7 +12892,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 341, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -12992,7 +12992,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 338, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -13134,7 +13134,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 339, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -13212,7 +13212,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 340, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -13299,7 +13299,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 431, + "weight": 420, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -13385,7 +13385,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 428, + "weight": 417, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -13470,6 +13470,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -13497,7 +13498,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -13682,7 +13684,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 433, + "weight": 422, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -13733,7 +13735,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 434, + "weight": 423, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -13784,7 +13786,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 429, + "weight": 418, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -13845,7 +13847,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 430, + "weight": 419, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -13937,6 +13939,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -13964,7 +13967,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -14139,7 +14143,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 432, + "weight": 421, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -14202,7 +14206,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 437, + "weight": 426, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -14284,7 +14288,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 438, + "weight": 427, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -14380,7 +14384,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 435, + "weight": 424, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -14481,7 +14485,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 443, + "weight": 432, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -14568,7 +14572,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 440, + "weight": 429, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -14686,7 +14690,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 441, + "weight": 430, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -14785,7 +14789,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 436, + "weight": 425, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -14849,7 +14853,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 439, + "weight": 428, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -14915,7 +14919,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 442, + "weight": 431, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -15007,7 +15011,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 444, + "weight": 433, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -15080,7 +15084,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 447, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -15169,7 +15173,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 445, + "weight": 434, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -15289,7 +15293,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 446, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -15357,7 +15361,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 448, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -15430,7 +15434,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 453, + "weight": 442, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -15491,7 +15495,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 451, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -15584,7 +15588,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 452, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -15655,7 +15659,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 454, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -15750,7 +15754,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 455, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -15823,7 +15827,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 190, + "weight": 176, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -15879,7 +15883,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 189, + "weight": 175, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -15935,7 +15939,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 458, + "weight": 447, "cookies": false, "type": "", "demo": "health\/get.md", @@ -15987,7 +15991,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 467, + "weight": 456, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -16039,7 +16043,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 461, + "weight": 450, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -16091,7 +16095,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 464, + "weight": 453, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -16154,7 +16158,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 460, + "weight": 449, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -16206,7 +16210,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 462, + "weight": 451, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -16258,7 +16262,7 @@ "x-appwrite": { "method": "getQueueAudits", "group": "queue", - "weight": 468, + "weight": 457, "cookies": false, "type": "", "demo": "health\/get-queue-audits.md", @@ -16323,7 +16327,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 472, + "weight": 461, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -16388,7 +16392,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 471, + "weight": 460, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -16453,7 +16457,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 473, + "weight": 462, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -16529,7 +16533,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 474, + "weight": 463, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -16594,7 +16598,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 481, + "weight": 470, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -16686,7 +16690,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 478, + "weight": 467, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -16751,7 +16755,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 470, + "weight": 459, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -16816,7 +16820,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 475, + "weight": 464, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -16881,7 +16885,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 476, + "weight": 465, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -16946,7 +16950,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 477, + "weight": 466, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -17011,7 +17015,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 479, + "weight": 468, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -17076,7 +17080,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 480, + "weight": 469, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -17141,7 +17145,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 469, + "weight": 458, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -17206,7 +17210,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 466, + "weight": 455, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -17258,7 +17262,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 465, + "weight": 454, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -17310,7 +17314,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 463, + "weight": 452, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -17810,7 +17814,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 245, + "weight": 231, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -17899,7 +17903,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 242, + "weight": 228, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -18046,7 +18050,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 249, + "weight": 235, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -18205,7 +18209,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 244, + "weight": 230, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -18384,7 +18388,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 251, + "weight": 237, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -18583,7 +18587,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 243, + "weight": 229, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -18767,7 +18771,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 250, + "weight": 236, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -18957,7 +18961,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 248, + "weight": 234, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -19012,7 +19016,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 252, + "weight": 238, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -19076,7 +19080,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 246, + "weight": 232, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -19164,7 +19168,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 247, + "weight": 233, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -19252,7 +19256,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 216, + "weight": 202, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -19341,7 +19345,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 215, + "weight": 201, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -19523,7 +19527,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 229, + "weight": 215, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -19707,7 +19711,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 214, + "weight": 200, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -19862,7 +19866,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 228, + "weight": 214, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -20018,7 +20022,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 205, + "weight": 191, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -20139,7 +20143,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 219, + "weight": 205, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -20262,7 +20266,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 209, + "weight": 195, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -20360,7 +20364,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 223, + "weight": 209, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -20461,7 +20465,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 207, + "weight": 193, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -20571,7 +20575,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 221, + "weight": 207, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -20683,7 +20687,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 206, + "weight": 192, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -20793,7 +20797,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 220, + "weight": 206, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -20905,7 +20909,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 208, + "weight": 194, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -21142,7 +21146,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 222, + "weight": 208, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -21378,7 +21382,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 210, + "weight": 196, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -21477,7 +21481,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 224, + "weight": 210, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -21578,7 +21582,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 211, + "weight": 197, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -21677,7 +21681,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 225, + "weight": 211, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -21778,7 +21782,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 212, + "weight": 198, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -21877,7 +21881,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 226, + "weight": 212, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -21978,7 +21982,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 213, + "weight": 199, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -22077,7 +22081,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 227, + "weight": 213, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -22178,7 +22182,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 218, + "weight": 204, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -22233,7 +22237,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 230, + "weight": 216, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -22297,7 +22301,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 217, + "weight": 203, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -22385,7 +22389,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 239, + "weight": 225, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -22473,7 +22477,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 232, + "weight": 218, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -22560,7 +22564,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 231, + "weight": 217, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -22645,7 +22649,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 234, + "weight": 220, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -22707,7 +22711,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 235, + "weight": 221, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -22788,7 +22792,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 236, + "weight": 222, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -22852,7 +22856,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 233, + "weight": 219, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -22940,7 +22944,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 238, + "weight": 224, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -23037,7 +23041,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 237, + "weight": 223, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -23130,7 +23134,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 240, + "weight": 226, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -23195,7 +23199,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 241, + "weight": 227, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -23273,7 +23277,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 485, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -23359,7 +23363,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 483, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -23499,6 +23503,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -23526,7 +23531,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -23614,7 +23620,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 488, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -23665,7 +23671,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 511, + "weight": 500, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -23716,7 +23722,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 484, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -23777,7 +23783,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 486, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -23924,6 +23930,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -23951,7 +23958,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -24028,7 +24036,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 487, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -24091,7 +24099,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 494, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -24173,7 +24181,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 493, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -24269,7 +24277,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 489, + "weight": 478, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -24376,7 +24384,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 497, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -24458,7 +24466,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 490, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -24576,7 +24584,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 491, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -24676,7 +24684,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 492, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -24740,7 +24748,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 495, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -24806,7 +24814,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 496, + "weight": 485, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -24898,7 +24906,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 498, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -24971,7 +24979,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 500, + "weight": 489, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -25058,7 +25066,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 499, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -25122,7 +25130,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 501, + "weight": 490, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -25195,7 +25203,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 504, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -25256,7 +25264,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 502, + "weight": 491, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -25349,7 +25357,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 503, + "weight": 492, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -25420,7 +25428,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 505, + "weight": 494, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -25515,7 +25523,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 506, + "weight": 495, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -25588,7 +25596,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 538, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -25675,7 +25683,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 536, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -25812,7 +25820,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 537, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -25874,7 +25882,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 539, + "weight": 528, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -26008,7 +26016,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 540, + "weight": 529, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -26072,7 +26080,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 543, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -26173,7 +26181,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 541, + "weight": 530, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -26277,7 +26285,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 542, + "weight": 531, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -26353,7 +26361,7 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 544, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/update-file.md", @@ -26447,7 +26455,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 545, + "weight": 534, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -26518,7 +26526,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 547, + "weight": 536, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -26600,7 +26608,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 546, + "weight": 535, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -26832,7 +26840,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 548, + "weight": 537, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -26921,7 +26929,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 352, + "weight": 338, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -27008,7 +27016,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 348, + "weight": 334, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -27090,7 +27098,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 419, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -27162,7 +27170,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 415, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -27238,7 +27246,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 416, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -27307,7 +27315,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 417, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -27390,7 +27398,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 418, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -27461,7 +27469,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 420, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -27551,7 +27559,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 349, + "weight": 335, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -27613,7 +27621,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 350, + "weight": 336, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -27689,7 +27697,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 351, + "weight": 337, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -27753,7 +27761,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 359, + "weight": 345, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -27853,7 +27861,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 355, + "weight": 341, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -27980,7 +27988,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 356, + "weight": 342, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -28055,7 +28063,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 357, + "weight": 343, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -28158,7 +28166,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 358, + "weight": 344, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -28235,7 +28243,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 364, + "weight": 350, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -28336,7 +28344,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 365, + "weight": 351, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -28449,7 +28457,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 366, + "weight": 352, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -28567,7 +28575,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 367, + "weight": 353, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -28680,7 +28688,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 368, + "weight": 354, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -28798,7 +28806,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 369, + "weight": 355, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -28912,7 +28920,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 370, + "weight": 356, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -29031,7 +29039,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 371, + "weight": 357, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -29153,7 +29161,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 372, + "weight": 358, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -29280,7 +29288,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 373, + "weight": 359, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -29408,7 +29416,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 374, + "weight": 360, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -29541,7 +29549,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 375, + "weight": 361, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -29669,7 +29677,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 376, + "weight": 362, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -29802,7 +29810,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 377, + "weight": 363, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -29915,7 +29923,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 378, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -30033,7 +30041,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 379, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -30148,7 +30156,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 380, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -30272,7 +30280,7 @@ "x-appwrite": { "method": "createLongtextColumn", "group": "columns", - "weight": 397, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-longtext-column.md", @@ -30385,7 +30393,7 @@ "x-appwrite": { "method": "updateLongtextColumn", "group": "columns", - "weight": 398, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-longtext-column.md", @@ -30503,7 +30511,7 @@ "x-appwrite": { "method": "createMediumtextColumn", "group": "columns", - "weight": 395, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-mediumtext-column.md", @@ -30616,7 +30624,7 @@ "x-appwrite": { "method": "updateMediumtextColumn", "group": "columns", - "weight": 396, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-mediumtext-column.md", @@ -30734,7 +30742,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 381, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -30849,7 +30857,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 382, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -30973,7 +30981,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 383, + "weight": 369, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -31088,7 +31096,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 384, + "weight": 370, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -31212,7 +31220,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 385, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -31351,7 +31359,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 387, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -31480,7 +31488,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 388, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -31609,7 +31617,7 @@ "x-appwrite": { "method": "createTextColumn", "group": "columns", - "weight": 393, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/create-text-column.md", @@ -31722,7 +31730,7 @@ "x-appwrite": { "method": "updateTextColumn", "group": "columns", - "weight": 394, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/update-text-column.md", @@ -31840,7 +31848,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 389, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -31954,7 +31962,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 390, + "weight": 376, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -32073,7 +32081,7 @@ "x-appwrite": { "method": "createVarcharColumn", "group": "columns", - "weight": 391, + "weight": 377, "cookies": false, "type": "", "demo": "tablesdb\/create-varchar-column.md", @@ -32193,7 +32201,7 @@ "x-appwrite": { "method": "updateVarcharColumn", "group": "columns", - "weight": 392, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/update-varchar-column.md", @@ -32349,7 +32357,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 362, + "weight": 348, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -32426,7 +32434,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 363, + "weight": 349, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -32512,7 +32520,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 386, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -32628,7 +32636,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 402, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -32727,7 +32735,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 399, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -32868,7 +32876,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 400, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -32945,7 +32953,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 401, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -33031,7 +33039,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 411, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -33144,7 +33152,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 403, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -33330,7 +33338,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 408, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -33464,7 +33472,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 406, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -33569,7 +33577,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 410, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -33671,7 +33679,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 404, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -33783,7 +33791,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 407, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -33936,7 +33944,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 405, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -34049,7 +34057,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 409, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -34157,7 +34165,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 414, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -34287,7 +34295,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 413, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -34417,7 +34425,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 110, + "weight": 107, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -34508,7 +34516,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 109, + "weight": 106, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -34597,7 +34605,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 111, + "weight": 108, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -34663,7 +34671,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 113, + "weight": 110, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -34741,7 +34749,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 115, + "weight": 112, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -34809,7 +34817,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 117, + "weight": 114, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -34910,7 +34918,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 116, + "weight": 113, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -34980,14 +34988,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": { @@ -35035,7 +35036,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 118, + "weight": 115, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -35111,7 +35112,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 119, + "weight": 116, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -35174,14 +35175,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" } } }, @@ -35209,7 +35203,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 121, + "weight": 118, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -35287,7 +35281,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 120, + "weight": 117, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -35388,7 +35382,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 112, + "weight": 109, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -35452,7 +35446,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 114, + "weight": 111, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -35537,7 +35531,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 533, + "weight": 522, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -35632,7 +35626,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 531, + "weight": 520, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -35722,7 +35716,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 532, + "weight": 521, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -35783,7 +35777,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 534, + "weight": 523, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -35854,7 +35848,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 535, + "weight": 524, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -35917,7 +35911,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 132, + "weight": 129, "cookies": false, "type": "", "demo": "users\/list.md", @@ -36004,7 +35998,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 123, + "weight": 120, "cookies": false, "type": "", "demo": "users\/create.md", @@ -36099,7 +36093,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 126, + "weight": 123, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -36189,7 +36183,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 124, + "weight": 121, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -36279,7 +36273,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 140, + "weight": 137, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -36361,7 +36355,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 163, + "weight": 160, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -36425,7 +36419,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 125, + "weight": 122, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -36515,7 +36509,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 128, + "weight": 125, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -36605,7 +36599,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 129, + "weight": 126, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -36729,7 +36723,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 130, + "weight": 127, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -36837,7 +36831,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 127, + "weight": 124, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -36947,7 +36941,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 133, + "weight": 130, "cookies": false, "type": "", "demo": "users\/get.md", @@ -37002,7 +36996,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 161, + "weight": 158, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -37066,7 +37060,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 146, + "weight": 143, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -37150,7 +37144,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 164, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -37236,7 +37230,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 142, + "weight": 139, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -37322,7 +37316,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 138, + "weight": 135, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -37410,7 +37404,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 137, + "weight": 134, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -37509,7 +37503,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 151, + "weight": 148, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -37647,7 +37641,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 156, + "weight": 153, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -37786,7 +37780,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 152, + "weight": 149, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -37908,7 +37902,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 153, + "weight": 150, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -38028,7 +38022,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 155, + "weight": 152, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -38148,7 +38142,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 154, + "weight": 151, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -38270,7 +38264,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 144, + "weight": 141, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -38353,7 +38347,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 145, + "weight": 142, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -38436,7 +38430,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 147, + "weight": 144, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -38520,7 +38514,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 134, + "weight": 131, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -38582,7 +38576,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 149, + "weight": 146, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -38665,7 +38659,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 136, + "weight": 133, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -38738,7 +38732,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 157, + "weight": 154, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -38793,7 +38787,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 160, + "weight": 157, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -38850,7 +38844,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 159, + "weight": 156, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -38924,7 +38918,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 141, + "weight": 138, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -39007,7 +39001,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 139, + "weight": 136, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -39093,7 +39087,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 131, + "weight": 128, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -39205,7 +39199,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 135, + "weight": 132, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -39277,7 +39271,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 150, + "weight": 147, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -39368,7 +39362,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 162, + "weight": 159, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -39442,7 +39436,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 158, + "weight": 155, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -39529,7 +39523,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 148, + "weight": 145, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -39612,7 +39606,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 143, + "weight": 140, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -40988,6 +40982,18 @@ "$ref": "#\/components\/schemas\/index" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum document size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used document size in bytes based on defined attributes.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -41000,7 +41006,9 @@ "enabled", "documentSecurity", "attributes", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -41014,7 +41022,9 @@ "enabled": false, "documentSecurity": true, "attributes": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "attributeList": { @@ -42781,6 +42791,18 @@ "$ref": "#\/components\/schemas\/columnIndex" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum row size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used row size in bytes based on defined columns.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -42793,7 +42815,9 @@ "enabled", "rowSecurity", "columns", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -42807,7 +42831,9 @@ "enabled": false, "rowSecurity": true, "columns": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "columnList": { diff --git a/app/config/specs/open-api3-latest-client.json b/app/config/specs/open-api3-latest-client.json index 592dc5b052..d9c97de566 100644 --- a/app/config/specs/open-api3-latest-client.json +++ b/app/config/specs/open-api3-latest-client.json @@ -555,7 +555,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 253, + "weight": 239, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -627,7 +627,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 255, + "weight": 241, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -751,7 +751,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 256, + "weight": 242, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -891,7 +891,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 257, + "weight": 243, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1015,7 +1015,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 261, + "weight": 247, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1149,7 +1149,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 262, + "weight": 248, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1287,7 +1287,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 254, + "weight": 240, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1388,7 +1388,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 260, + "weight": 246, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1487,7 +1487,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 258, + "weight": 244, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1586,7 +1586,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 259, + "weight": 245, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -4051,7 +4051,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 264, + "weight": 250, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4179,7 +4179,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 263, + "weight": 249, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4313,7 +4313,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 267, + "weight": 253, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4373,7 +4373,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 265, + "weight": 251, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4863,7 +4863,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 266, + "weight": 252, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4947,7 +4947,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 269, + "weight": 255, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5041,7 +5041,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 268, + "weight": 254, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5135,7 +5135,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 270, + "weight": 256, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5888,7 +5888,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 346, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -5955,7 +5955,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 342, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6026,7 +6026,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 343, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6090,7 +6090,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 344, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6168,7 +6168,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 345, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6234,7 +6234,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 347, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6319,7 +6319,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 297, + "weight": 283, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -6431,7 +6431,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 289, + "weight": 275, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -6592,7 +6592,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 290, + "weight": 276, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -6703,7 +6703,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 293, + "weight": 279, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -6858,7 +6858,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 291, + "weight": 277, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -6970,7 +6970,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 295, + "weight": 281, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -7077,7 +7077,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 300, + "weight": 286, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -7206,7 +7206,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 299, + "weight": 285, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -7335,7 +7335,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 447, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -7422,7 +7422,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 445, + "weight": 434, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -7540,7 +7540,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 446, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -7615,7 +7615,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 190, + "weight": 176, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -7669,7 +7669,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 189, + "weight": 175, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -8155,7 +8155,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 237, + "weight": 223, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -8239,7 +8239,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 241, + "weight": 227, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -8315,7 +8315,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 543, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -8414,7 +8414,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 541, + "weight": 530, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -8516,7 +8516,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 542, + "weight": 531, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -8590,7 +8590,7 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 544, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/update-file.md", @@ -8682,7 +8682,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 545, + "weight": 534, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -8751,7 +8751,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 547, + "weight": 536, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -8831,7 +8831,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 546, + "weight": 535, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -9061,7 +9061,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 548, + "weight": 537, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -9148,7 +9148,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 419, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -9218,7 +9218,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 415, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -9292,7 +9292,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 416, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -9359,7 +9359,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 417, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -9440,7 +9440,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 418, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -9509,7 +9509,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 420, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -9597,7 +9597,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 411, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -9708,7 +9708,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 403, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -9864,7 +9864,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 404, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -9974,7 +9974,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 407, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -10124,7 +10124,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 405, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -10235,7 +10235,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 409, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -10341,7 +10341,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 414, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -10469,7 +10469,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 413, + "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", diff --git a/app/config/specs/open-api3-latest-console.json b/app/config/specs/open-api3-latest-console.json index d82b0f6cb9..91975d2d2e 100644 --- a/app/config/specs/open-api3-latest-console.json +++ b/app/config/specs/open-api3-latest-console.json @@ -588,7 +588,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 253, + "weight": 239, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -659,7 +659,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 255, + "weight": 241, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -782,7 +782,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 256, + "weight": 242, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -921,7 +921,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 257, + "weight": 243, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1044,7 +1044,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 261, + "weight": 247, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1177,7 +1177,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 262, + "weight": 248, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1314,7 +1314,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 254, + "weight": 240, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1414,7 +1414,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 260, + "weight": 246, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1512,7 +1512,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 258, + "weight": 244, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1610,7 +1610,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 259, + "weight": 245, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -4044,7 +4044,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 264, + "weight": 250, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4172,7 +4172,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 263, + "weight": 249, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4306,7 +4306,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 267, + "weight": 253, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4366,7 +4366,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 265, + "weight": 251, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4856,7 +4856,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 266, + "weight": 252, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4940,7 +4940,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 269, + "weight": 255, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5034,7 +5034,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 268, + "weight": 254, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5128,7 +5128,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 270, + "weight": 256, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5874,7 +5874,7 @@ "x-appwrite": { "method": "chat", "group": "console", - "weight": 513, + "weight": 502, "cookies": false, "type": "", "demo": "assistant\/chat.md", @@ -5935,7 +5935,7 @@ "x-appwrite": { "method": "getResource", "group": null, - "weight": 514, + "weight": 503, "cookies": false, "type": "", "demo": "console\/get-resource.md", @@ -6010,7 +6010,7 @@ "x-appwrite": { "method": "variables", "group": "console", - "weight": 512, + "weight": 501, "cookies": false, "type": "", "demo": "console\/variables.md", @@ -6059,7 +6059,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 278, + "weight": 264, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -6178,7 +6178,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 274, + "weight": 260, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -6295,7 +6295,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 346, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6362,7 +6362,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 342, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6433,7 +6433,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 343, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6497,7 +6497,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 344, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6575,7 +6575,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 345, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6641,7 +6641,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 347, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6726,7 +6726,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 281, + "weight": 267, "cookies": false, "type": "", "demo": "databases\/list-usage.md", @@ -6830,7 +6830,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 275, + "weight": 261, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -6924,7 +6924,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 276, + "weight": 262, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -7034,7 +7034,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 277, + "weight": 263, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -7129,7 +7129,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 286, + "weight": 272, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -7229,7 +7229,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 282, + "weight": 268, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -7356,7 +7356,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 283, + "weight": 269, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -7431,7 +7431,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 284, + "weight": 270, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7534,7 +7534,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 285, + "weight": 271, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7611,7 +7611,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 303, + "weight": 289, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7712,7 +7712,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 304, + "weight": 290, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7825,7 +7825,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 305, + "weight": 291, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -7943,7 +7943,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 306, + "weight": 292, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -8056,7 +8056,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 307, + "weight": 293, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -8174,7 +8174,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 308, + "weight": 294, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -8288,7 +8288,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 309, + "weight": 295, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -8407,7 +8407,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 310, + "weight": 296, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8529,7 +8529,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 311, + "weight": 297, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8656,7 +8656,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 312, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8784,7 +8784,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 313, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -8917,7 +8917,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 314, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -9045,7 +9045,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 315, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -9178,7 +9178,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 316, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -9291,7 +9291,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 317, + "weight": 303, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -9409,7 +9409,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 318, + "weight": 304, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9524,7 +9524,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 319, + "weight": 305, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9648,7 +9648,7 @@ "x-appwrite": { "method": "createLongtextAttribute", "group": "attributes", - "weight": 336, + "weight": 322, "cookies": false, "type": "", "demo": "databases\/create-longtext-attribute.md", @@ -9757,7 +9757,7 @@ "x-appwrite": { "method": "updateLongtextAttribute", "group": "attributes", - "weight": 337, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/update-longtext-attribute.md", @@ -9871,7 +9871,7 @@ "x-appwrite": { "method": "createMediumtextAttribute", "group": "attributes", - "weight": 334, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/create-mediumtext-attribute.md", @@ -9980,7 +9980,7 @@ "x-appwrite": { "method": "updateMediumtextAttribute", "group": "attributes", - "weight": 335, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/update-mediumtext-attribute.md", @@ -10094,7 +10094,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 320, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -10209,7 +10209,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 321, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -10333,7 +10333,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 322, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -10448,7 +10448,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 323, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -10572,7 +10572,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 324, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -10711,7 +10711,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 326, + "weight": 312, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -10836,7 +10836,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 327, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -10961,7 +10961,7 @@ "x-appwrite": { "method": "createTextAttribute", "group": "attributes", - "weight": 332, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/create-text-attribute.md", @@ -11070,7 +11070,7 @@ "x-appwrite": { "method": "updateTextAttribute", "group": "attributes", - "weight": 333, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/update-text-attribute.md", @@ -11184,7 +11184,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 328, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -11298,7 +11298,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 329, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -11417,7 +11417,7 @@ "x-appwrite": { "method": "createVarcharAttribute", "group": "attributes", - "weight": 330, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/create-varchar-attribute.md", @@ -11533,7 +11533,7 @@ "x-appwrite": { "method": "updateVarcharAttribute", "group": "attributes", - "weight": 331, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/update-varchar-attribute.md", @@ -11685,7 +11685,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 301, + "weight": 287, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -11762,7 +11762,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 302, + "weight": 288, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -11848,7 +11848,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 325, + "weight": 311, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -11964,7 +11964,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 297, + "weight": 283, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -12076,7 +12076,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 289, + "weight": 275, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -12267,7 +12267,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 294, + "weight": 280, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -12404,7 +12404,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 292, + "weight": 278, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -12509,7 +12509,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 296, + "weight": 282, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -12611,7 +12611,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 290, + "weight": 276, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -12722,7 +12722,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 293, + "weight": 279, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -12877,7 +12877,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 291, + "weight": 277, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -12989,7 +12989,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 295, + "weight": 281, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -13096,7 +13096,7 @@ "x-appwrite": { "method": "listDocumentLogs", "group": "logs", - "weight": 298, + "weight": 284, "cookies": false, "type": "", "demo": "databases\/list-document-logs.md", @@ -13194,7 +13194,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 300, + "weight": 286, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -13323,7 +13323,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 299, + "weight": 285, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -13452,7 +13452,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 341, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -13551,7 +13551,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 338, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -13692,7 +13692,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 339, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -13769,7 +13769,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 340, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -13855,7 +13855,7 @@ "x-appwrite": { "method": "listCollectionLogs", "group": "collections", - "weight": 287, + "weight": 273, "cookies": false, "type": "", "demo": "databases\/list-collection-logs.md", @@ -13943,7 +13943,7 @@ "x-appwrite": { "method": "getCollectionUsage", "group": null, - "weight": 288, + "weight": 274, "cookies": false, "type": "", "demo": "databases\/get-collection-usage.md", @@ -14040,7 +14040,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 279, + "weight": 265, "cookies": false, "type": "", "demo": "databases\/list-logs.md", @@ -14148,7 +14148,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 280, + "weight": 266, "cookies": false, "type": "", "demo": "databases\/get-usage.md", @@ -14265,7 +14265,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 431, + "weight": 420, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -14350,7 +14350,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 428, + "weight": 417, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -14434,6 +14434,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -14461,7 +14462,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -14646,7 +14648,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 433, + "weight": 422, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -14696,7 +14698,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 434, + "weight": 423, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -14746,7 +14748,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 457, + "weight": 446, "cookies": false, "type": "", "demo": "functions\/list-templates.md", @@ -14817,6 +14819,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -14844,7 +14847,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -14939,7 +14943,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 456, + "weight": 445, "cookies": false, "type": "", "demo": "functions\/get-template.md", @@ -14999,7 +15003,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 450, + "weight": 439, "cookies": false, "type": "", "demo": "functions\/list-usage.md", @@ -15071,7 +15075,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 429, + "weight": 418, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -15131,7 +15135,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 430, + "weight": 419, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -15222,6 +15226,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -15249,7 +15254,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -15424,7 +15430,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 432, + "weight": 421, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -15486,7 +15492,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 437, + "weight": 426, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -15567,7 +15573,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 438, + "weight": 427, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -15662,7 +15668,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 435, + "weight": 424, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -15762,7 +15768,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 443, + "weight": 432, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -15848,7 +15854,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 440, + "weight": 429, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -15965,7 +15971,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 441, + "weight": 430, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -16063,7 +16069,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 436, + "weight": 425, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -16126,7 +16132,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 439, + "weight": 428, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -16191,7 +16197,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 442, + "weight": 431, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -16282,7 +16288,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 444, + "weight": 433, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -16354,7 +16360,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 447, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -16441,7 +16447,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 445, + "weight": 434, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -16559,7 +16565,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 446, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -16625,7 +16631,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 448, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -16697,7 +16703,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 449, + "weight": 438, "cookies": false, "type": "", "demo": "functions\/get-usage.md", @@ -16779,7 +16785,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 453, + "weight": 442, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -16839,7 +16845,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 451, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -16931,7 +16937,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 452, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -17001,7 +17007,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 454, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -17095,7 +17101,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 455, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -17167,7 +17173,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 190, + "weight": 176, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -17221,7 +17227,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 189, + "weight": 175, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -17275,7 +17281,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 458, + "weight": 447, "cookies": false, "type": "", "demo": "health\/get.md", @@ -17326,7 +17332,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 467, + "weight": 456, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -17377,7 +17383,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 461, + "weight": 450, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -17428,7 +17434,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 464, + "weight": 453, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -17490,7 +17496,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 460, + "weight": 449, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -17541,7 +17547,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 462, + "weight": 451, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -17592,7 +17598,7 @@ "x-appwrite": { "method": "getQueueAudits", "group": "queue", - "weight": 468, + "weight": 457, "cookies": false, "type": "", "demo": "health\/get-queue-audits.md", @@ -17656,7 +17662,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 472, + "weight": 461, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -17720,7 +17726,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 471, + "weight": 460, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -17784,7 +17790,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 473, + "weight": 462, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -17859,7 +17865,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 474, + "weight": 463, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -17923,7 +17929,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 481, + "weight": 470, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -18014,7 +18020,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 478, + "weight": 467, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -18078,7 +18084,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 470, + "weight": 459, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -18142,7 +18148,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 475, + "weight": 464, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -18206,7 +18212,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 476, + "weight": 465, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -18270,7 +18276,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 477, + "weight": 466, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -18334,7 +18340,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 479, + "weight": 468, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -18398,7 +18404,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 480, + "weight": 469, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -18462,7 +18468,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 469, + "weight": 458, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -18526,7 +18532,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 466, + "weight": 455, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -18577,7 +18583,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 465, + "weight": 454, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -18628,7 +18634,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 463, + "weight": 452, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -19111,7 +19117,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 245, + "weight": 231, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -19199,7 +19205,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 242, + "weight": 228, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -19345,7 +19351,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 249, + "weight": 235, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -19503,7 +19509,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 244, + "weight": 230, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -19681,7 +19687,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 251, + "weight": 237, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -19879,7 +19885,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 243, + "weight": 229, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -20060,7 +20066,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 250, + "weight": 236, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -20247,7 +20253,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 248, + "weight": 234, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -20301,7 +20307,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 252, + "weight": 238, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -20364,7 +20370,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 246, + "weight": 232, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -20451,7 +20457,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 247, + "weight": 233, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -20538,7 +20544,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 216, + "weight": 202, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -20626,7 +20632,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 215, + "weight": 201, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -20805,7 +20811,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 229, + "weight": 215, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -20986,7 +20992,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 214, + "weight": 200, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -21138,7 +21144,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 228, + "weight": 214, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -21291,7 +21297,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 205, + "weight": 191, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -21411,7 +21417,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 219, + "weight": 205, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -21533,7 +21539,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 209, + "weight": 195, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -21630,7 +21636,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 223, + "weight": 209, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -21730,7 +21736,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 207, + "weight": 193, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -21839,7 +21845,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 221, + "weight": 207, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -21950,7 +21956,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 206, + "weight": 192, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -22059,7 +22065,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 220, + "weight": 206, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -22170,7 +22176,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 208, + "weight": 194, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -22404,7 +22410,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 222, + "weight": 208, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -22637,7 +22643,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 210, + "weight": 196, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -22735,7 +22741,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 224, + "weight": 210, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -22835,7 +22841,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 211, + "weight": 197, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -22933,7 +22939,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 225, + "weight": 211, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -23033,7 +23039,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 212, + "weight": 198, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -23131,7 +23137,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 226, + "weight": 212, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -23231,7 +23237,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 213, + "weight": 199, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -23329,7 +23335,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 227, + "weight": 213, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -23429,7 +23435,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 218, + "weight": 204, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -23483,7 +23489,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 230, + "weight": 216, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -23546,7 +23552,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 217, + "weight": 203, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -23633,7 +23639,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 239, + "weight": 225, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -23720,7 +23726,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 232, + "weight": 218, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -23806,7 +23812,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 231, + "weight": 217, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -23890,7 +23896,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 234, + "weight": 220, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -23951,7 +23957,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 235, + "weight": 221, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -24031,7 +24037,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 236, + "weight": 222, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -24094,7 +24100,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 233, + "weight": 219, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -24181,7 +24187,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 238, + "weight": 224, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -24277,7 +24283,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 237, + "weight": 223, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -24368,7 +24374,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 240, + "weight": 226, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -24432,7 +24438,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 241, + "weight": 227, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -24508,7 +24514,7 @@ "x-appwrite": { "method": "list", "group": null, - "weight": 197, + "weight": 183, "cookies": false, "type": "", "demo": "migrations\/list.md", @@ -24594,7 +24600,7 @@ "x-appwrite": { "method": "createAppwriteMigration", "group": null, - "weight": 191, + "weight": 177, "cookies": false, "type": "", "demo": "migrations\/create-appwrite-migration.md", @@ -24704,7 +24710,7 @@ "x-appwrite": { "method": "getAppwriteReport", "group": null, - "weight": 199, + "weight": 185, "cookies": false, "type": "", "demo": "migrations\/get-appwrite-report.md", @@ -24818,7 +24824,7 @@ "x-appwrite": { "method": "createCSVExport", "group": null, - "weight": 196, + "weight": 182, "cookies": false, "type": "", "demo": "migrations\/create-csv-export.md", @@ -24933,7 +24939,7 @@ "x-appwrite": { "method": "createCSVImport", "group": null, - "weight": 195, + "weight": 181, "cookies": false, "type": "", "demo": "migrations\/create-csv-import.md", @@ -25018,7 +25024,7 @@ "x-appwrite": { "method": "createFirebaseMigration", "group": null, - "weight": 192, + "weight": 178, "cookies": false, "type": "", "demo": "migrations\/create-firebase-migration.md", @@ -25109,7 +25115,7 @@ "x-appwrite": { "method": "getFirebaseReport", "group": null, - "weight": 200, + "weight": 186, "cookies": false, "type": "", "demo": "migrations\/get-firebase-report.md", @@ -25196,7 +25202,7 @@ "x-appwrite": { "method": "createNHostMigration", "group": null, - "weight": 194, + "weight": 180, "cookies": false, "type": "", "demo": "migrations\/create-n-host-migration.md", @@ -25324,7 +25330,7 @@ "x-appwrite": { "method": "getNHostReport", "group": null, - "weight": 202, + "weight": 188, "cookies": false, "type": "", "demo": "migrations\/get-n-host-report.md", @@ -25473,7 +25479,7 @@ "x-appwrite": { "method": "createSupabaseMigration", "group": null, - "weight": 193, + "weight": 179, "cookies": false, "type": "", "demo": "migrations\/create-supabase-migration.md", @@ -25596,7 +25602,7 @@ "x-appwrite": { "method": "getSupabaseReport", "group": null, - "weight": 201, + "weight": 187, "cookies": false, "type": "", "demo": "migrations\/get-supabase-report.md", @@ -25736,7 +25742,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 198, + "weight": 184, "cookies": false, "type": "", "demo": "migrations\/get.md", @@ -25795,7 +25801,7 @@ "x-appwrite": { "method": "retry", "group": null, - "weight": 203, + "weight": 189, "cookies": false, "type": "", "demo": "migrations\/retry.md", @@ -25847,7 +25853,7 @@ "x-appwrite": { "method": "delete", "group": null, - "weight": 204, + "weight": 190, "cookies": false, "type": "", "demo": "migrations\/delete.md", @@ -25908,7 +25914,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 103, + "weight": 100, "cookies": false, "type": "", "demo": "project\/get-usage.md", @@ -25997,7 +26003,7 @@ "x-appwrite": { "method": "listVariables", "group": null, - "weight": 105, + "weight": 102, "cookies": false, "type": "", "demo": "project\/list-variables.md", @@ -26044,7 +26050,7 @@ "x-appwrite": { "method": "createVariable", "group": null, - "weight": 104, + "weight": 101, "cookies": false, "type": "", "demo": "project\/create-variable.md", @@ -26123,7 +26129,7 @@ "x-appwrite": { "method": "getVariable", "group": null, - "weight": 106, + "weight": 103, "cookies": false, "type": "", "demo": "project\/get-variable.md", @@ -26182,7 +26188,7 @@ "x-appwrite": { "method": "updateVariable", "group": null, - "weight": 107, + "weight": 104, "cookies": false, "type": "", "demo": "project\/update-variable.md", @@ -26265,7 +26271,7 @@ "x-appwrite": { "method": "deleteVariable", "group": null, - "weight": 108, + "weight": 105, "cookies": false, "type": "", "demo": "project\/delete-variable.md", @@ -26326,7 +26332,7 @@ "x-appwrite": { "method": "list", "group": "projects", - "weight": 426, + "weight": 414, "cookies": false, "type": "", "demo": "projects\/list.md", @@ -26409,7 +26415,7 @@ "x-appwrite": { "method": "create", "group": "projects", - "weight": 57, + "weight": 412, "cookies": false, "type": "", "demo": "projects\/create.md", @@ -26545,7 +26551,7 @@ "x-appwrite": { "method": "get", "group": "projects", - "weight": 58, + "weight": 57, "cookies": false, "type": "", "demo": "projects\/get.md", @@ -26604,7 +26610,7 @@ "x-appwrite": { "method": "update", "group": "projects", - "weight": 59, + "weight": 413, "cookies": false, "type": "", "demo": "projects\/update.md", @@ -26721,7 +26727,7 @@ "x-appwrite": { "method": "delete", "group": "projects", - "weight": 76, + "weight": 73, "cookies": false, "type": "", "demo": "projects\/delete.md", @@ -26782,7 +26788,7 @@ "x-appwrite": { "method": "updateApiStatus", "group": "projects", - "weight": 63, + "weight": 60, "cookies": false, "type": "", "demo": "projects\/update-api-status.md", @@ -26939,7 +26945,7 @@ "x-appwrite": { "method": "updateApiStatusAll", "group": "projects", - "weight": 64, + "weight": 61, "cookies": false, "type": "", "demo": "projects\/update-api-status-all.md", @@ -27079,7 +27085,7 @@ "x-appwrite": { "method": "updateAuthDuration", "group": "auth", - "weight": 69, + "weight": 66, "cookies": false, "type": "", "demo": "projects\/update-auth-duration.md", @@ -27160,7 +27166,7 @@ "x-appwrite": { "method": "updateAuthLimit", "group": "auth", - "weight": 68, + "weight": 65, "cookies": false, "type": "", "demo": "projects\/update-auth-limit.md", @@ -27241,7 +27247,7 @@ "x-appwrite": { "method": "updateAuthSessionsLimit", "group": "auth", - "weight": 74, + "weight": 71, "cookies": false, "type": "", "demo": "projects\/update-auth-sessions-limit.md", @@ -27322,7 +27328,7 @@ "x-appwrite": { "method": "updateMembershipsPrivacy", "group": "auth", - "weight": 67, + "weight": 64, "cookies": false, "type": "", "demo": "projects\/update-memberships-privacy.md", @@ -27414,7 +27420,7 @@ "x-appwrite": { "method": "updateMockNumbers", "group": "auth", - "weight": 75, + "weight": 72, "cookies": false, "type": "", "demo": "projects\/update-mock-numbers.md", @@ -27497,7 +27503,7 @@ "x-appwrite": { "method": "updateAuthPasswordDictionary", "group": "auth", - "weight": 72, + "weight": 69, "cookies": false, "type": "", "demo": "projects\/update-auth-password-dictionary.md", @@ -27577,7 +27583,7 @@ "x-appwrite": { "method": "updateAuthPasswordHistory", "group": "auth", - "weight": 71, + "weight": 68, "cookies": false, "type": "", "demo": "projects\/update-auth-password-history.md", @@ -27658,7 +27664,7 @@ "x-appwrite": { "method": "updatePersonalDataCheck", "group": "auth", - "weight": 73, + "weight": 70, "cookies": false, "type": "", "demo": "projects\/update-personal-data-check.md", @@ -27738,7 +27744,7 @@ "x-appwrite": { "method": "updateSessionAlerts", "group": "auth", - "weight": 66, + "weight": 63, "cookies": false, "type": "", "demo": "projects\/update-session-alerts.md", @@ -27818,7 +27824,7 @@ "x-appwrite": { "method": "updateSessionInvalidation", "group": "auth", - "weight": 102, + "weight": 99, "cookies": false, "type": "", "demo": "projects\/update-session-invalidation.md", @@ -27898,7 +27904,7 @@ "x-appwrite": { "method": "updateAuthStatus", "group": "auth", - "weight": 70, + "weight": 67, "cookies": false, "type": "", "demo": "projects\/update-auth-status.md", @@ -27999,7 +28005,7 @@ "x-appwrite": { "method": "listDevKeys", "group": "devKeys", - "weight": 424, + "weight": 410, "cookies": false, "type": "", "demo": "projects\/list-dev-keys.md", @@ -28070,7 +28076,7 @@ "x-appwrite": { "method": "createDevKey", "group": "devKeys", - "weight": 421, + "weight": 407, "cookies": false, "type": "", "demo": "projects\/create-dev-key.md", @@ -28155,7 +28161,7 @@ "x-appwrite": { "method": "getDevKey", "group": "devKeys", - "weight": 423, + "weight": 409, "cookies": false, "type": "", "demo": "projects\/get-dev-key.md", @@ -28223,7 +28229,7 @@ "x-appwrite": { "method": "updateDevKey", "group": "devKeys", - "weight": 422, + "weight": 408, "cookies": false, "type": "", "demo": "projects\/update-dev-key.md", @@ -28309,7 +28315,7 @@ "x-appwrite": { "method": "deleteDevKey", "group": "devKeys", - "weight": 425, + "weight": 411, "cookies": false, "type": "", "demo": "projects\/delete-dev-key.md", @@ -28379,7 +28385,7 @@ "x-appwrite": { "method": "createJWT", "group": "auth", - "weight": 88, + "weight": 85, "cookies": false, "type": "", "demo": "projects\/create-jwt.md", @@ -28527,7 +28533,7 @@ "x-appwrite": { "method": "listKeys", "group": "keys", - "weight": 84, + "weight": 81, "cookies": false, "type": "", "demo": "projects\/list-keys.md", @@ -28561,6 +28567,19 @@ }, "in": "path" }, + { + "name": "queries", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: expire, accessedAt, name, scopes", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "in": "query" + }, { "name": "total", "description": "When set to false, the total count returned will be 0 and will not be calculated.", @@ -28597,7 +28616,7 @@ "x-appwrite": { "method": "createKey", "group": "keys", - "weight": 83, + "weight": 80, "cookies": false, "type": "", "demo": "projects\/create-key.md", @@ -28638,6 +28657,11 @@ "schema": { "type": "object", "properties": { + "keyId": { + "type": "string", + "description": "Key ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can't start with a special char. Max length is 36 chars.", + "x-example": "" + }, "name": { "type": "string", "description": "Key name. Max length: 128 chars.", @@ -28752,7 +28776,7 @@ "x-appwrite": { "method": "getKey", "group": "keys", - "weight": 85, + "weight": 82, "cookies": false, "type": "", "demo": "projects\/get-key.md", @@ -28821,7 +28845,7 @@ "x-appwrite": { "method": "updateKey", "group": "keys", - "weight": 86, + "weight": 83, "cookies": false, "type": "", "demo": "projects\/update-key.md", @@ -28977,7 +29001,7 @@ "x-appwrite": { "method": "deleteKey", "group": "keys", - "weight": 87, + "weight": 84, "cookies": false, "type": "", "demo": "projects\/delete-key.md", @@ -29048,7 +29072,7 @@ "x-appwrite": { "method": "updateLabels", "group": "projects", - "weight": 427, + "weight": 415, "cookies": false, "type": "", "demo": "projects\/update-labels.md", @@ -29130,7 +29154,7 @@ "x-appwrite": { "method": "updateOAuth2", "group": "auth", - "weight": 65, + "weight": 62, "cookies": false, "type": "", "demo": "projects\/update-o-auth-2.md", @@ -29271,7 +29295,7 @@ "x-appwrite": { "method": "listPlatforms", "group": "platforms", - "weight": 90, + "weight": 87, "cookies": false, "type": "", "demo": "projects\/list-platforms.md", @@ -29341,7 +29365,7 @@ "x-appwrite": { "method": "createPlatform", "group": "platforms", - "weight": 89, + "weight": 86, "cookies": false, "type": "", "demo": "projects\/create-platform.md", @@ -29461,7 +29485,7 @@ "x-appwrite": { "method": "getPlatform", "group": "platforms", - "weight": 91, + "weight": 88, "cookies": false, "type": "", "demo": "projects\/get-platform.md", @@ -29530,7 +29554,7 @@ "x-appwrite": { "method": "updatePlatform", "group": "platforms", - "weight": 92, + "weight": 89, "cookies": false, "type": "", "demo": "projects\/update-platform.md", @@ -29626,7 +29650,7 @@ "x-appwrite": { "method": "deletePlatform", "group": "platforms", - "weight": 93, + "weight": 90, "cookies": false, "type": "", "demo": "projects\/delete-platform.md", @@ -29697,7 +29721,7 @@ "x-appwrite": { "method": "updateServiceStatus", "group": "projects", - "weight": 61, + "weight": 58, "cookies": false, "type": "", "demo": "projects\/update-service-status.md", @@ -29800,7 +29824,7 @@ "x-appwrite": { "method": "updateServiceStatusAll", "group": "projects", - "weight": 62, + "weight": 59, "cookies": false, "type": "", "demo": "projects\/update-service-status-all.md", @@ -29880,7 +29904,7 @@ "x-appwrite": { "method": "updateSmtp", "group": "templates", - "weight": 94, + "weight": 91, "cookies": false, "type": "", "demo": "projects\/update-smtp.md", @@ -30078,7 +30102,7 @@ "x-appwrite": { "method": "createSmtpTest", "group": "templates", - "weight": 95, + "weight": 92, "cookies": false, "type": "", "demo": "projects\/create-smtp-test.md", @@ -30293,7 +30317,7 @@ "x-appwrite": { "method": "updateTeam", "group": "projects", - "weight": 60, + "weight": 416, "cookies": false, "type": "", "demo": "projects\/update-team.md", @@ -30373,7 +30397,7 @@ "x-appwrite": { "method": "getEmailTemplate", "group": "templates", - "weight": 97, + "weight": 94, "cookies": false, "type": "", "demo": "projects\/get-email-template.md", @@ -30598,7 +30622,7 @@ "x-appwrite": { "method": "updateEmailTemplate", "group": "templates", - "weight": 99, + "weight": 96, "cookies": false, "type": "", "demo": "projects\/update-email-template.md", @@ -30865,7 +30889,7 @@ "x-appwrite": { "method": "deleteEmailTemplate", "group": "templates", - "weight": 101, + "weight": 98, "cookies": false, "type": "", "demo": "projects\/delete-email-template.md", @@ -31092,7 +31116,7 @@ "x-appwrite": { "method": "getSmsTemplate", "group": "templates", - "weight": 96, + "weight": 93, "cookies": false, "type": "", "demo": "projects\/get-sms-template.md", @@ -31378,7 +31402,7 @@ "x-appwrite": { "method": "updateSmsTemplate", "group": "templates", - "weight": 98, + "weight": 95, "cookies": false, "type": "", "demo": "projects\/update-sms-template.md", @@ -31687,7 +31711,7 @@ "x-appwrite": { "method": "deleteSmsTemplate", "group": "templates", - "weight": 100, + "weight": 97, "cookies": false, "type": "", "demo": "projects\/delete-sms-template.md", @@ -31975,7 +31999,7 @@ "x-appwrite": { "method": "listWebhooks", "group": "webhooks", - "weight": 78, + "weight": 75, "cookies": false, "type": "", "demo": "projects\/list-webhooks.md", @@ -32045,7 +32069,7 @@ "x-appwrite": { "method": "createWebhook", "group": "webhooks", - "weight": 77, + "weight": 74, "cookies": false, "type": "", "demo": "projects\/create-webhook.md", @@ -32161,7 +32185,7 @@ "x-appwrite": { "method": "getWebhook", "group": "webhooks", - "weight": 79, + "weight": 76, "cookies": false, "type": "", "demo": "projects\/get-webhook.md", @@ -32230,7 +32254,7 @@ "x-appwrite": { "method": "updateWebhook", "group": "webhooks", - "weight": 80, + "weight": 77, "cookies": false, "type": "", "demo": "projects\/update-webhook.md", @@ -32347,7 +32371,7 @@ "x-appwrite": { "method": "deleteWebhook", "group": "webhooks", - "weight": 82, + "weight": 79, "cookies": false, "type": "", "demo": "projects\/delete-webhook.md", @@ -32418,7 +32442,7 @@ "x-appwrite": { "method": "updateWebhookSignature", "group": "webhooks", - "weight": 81, + "weight": 78, "cookies": false, "type": "", "demo": "projects\/update-webhook-signature.md", @@ -32489,7 +32513,7 @@ "x-appwrite": { "method": "listRules", "group": null, - "weight": 528, + "weight": 517, "cookies": false, "type": "", "demo": "proxy\/list-rules.md", @@ -32574,7 +32598,7 @@ "x-appwrite": { "method": "createAPIRule", "group": null, - "weight": 523, + "weight": 512, "cookies": false, "type": "", "demo": "proxy\/create-api-rule.md", @@ -32641,7 +32665,7 @@ "x-appwrite": { "method": "createFunctionRule", "group": null, - "weight": 525, + "weight": 514, "cookies": false, "type": "", "demo": "proxy\/create-function-rule.md", @@ -32719,7 +32743,7 @@ "x-appwrite": { "method": "createRedirectRule", "group": null, - "weight": 526, + "weight": 515, "cookies": false, "type": "", "demo": "proxy\/create-redirect-rule.md", @@ -32833,7 +32857,7 @@ "x-appwrite": { "method": "createSiteRule", "group": null, - "weight": 524, + "weight": 513, "cookies": false, "type": "", "demo": "proxy\/create-site-rule.md", @@ -32911,7 +32935,7 @@ "x-appwrite": { "method": "getRule", "group": null, - "weight": 527, + "weight": 516, "cookies": false, "type": "", "demo": "proxy\/get-rule.md", @@ -32962,7 +32986,7 @@ "x-appwrite": { "method": "deleteRule", "group": null, - "weight": 529, + "weight": 518, "cookies": false, "type": "", "demo": "proxy\/delete-rule.md", @@ -33022,7 +33046,7 @@ "x-appwrite": { "method": "updateRuleVerification", "group": null, - "weight": 530, + "weight": 519, "cookies": false, "type": "", "demo": "proxy\/update-rule-verification.md", @@ -33082,7 +33106,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 485, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -33167,7 +33191,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 483, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -33306,6 +33330,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -33333,7 +33358,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -33421,7 +33447,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 488, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -33471,7 +33497,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 511, + "weight": 500, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -33521,7 +33547,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 507, + "weight": 496, "cookies": false, "type": "", "demo": "sites\/list-templates.md", @@ -33653,7 +33679,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 508, + "weight": 497, "cookies": false, "type": "", "demo": "sites\/get-template.md", @@ -33713,7 +33739,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 509, + "weight": 498, "cookies": false, "type": "", "demo": "sites\/list-usage.md", @@ -33785,7 +33811,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 484, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -33845,7 +33871,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 486, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -33991,6 +34017,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -34018,7 +34045,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -34095,7 +34123,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 487, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -34157,7 +34185,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 494, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -34238,7 +34266,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 493, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -34333,7 +34361,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 489, + "weight": 478, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -34439,7 +34467,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 497, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -34520,7 +34548,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 490, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -34637,7 +34665,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 491, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -34736,7 +34764,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 492, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -34799,7 +34827,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 495, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -34864,7 +34892,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 496, + "weight": 485, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -34955,7 +34983,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 498, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -35027,7 +35055,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 500, + "weight": 489, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -35113,7 +35141,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 499, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -35176,7 +35204,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 501, + "weight": 490, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -35248,7 +35276,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 510, + "weight": 499, "cookies": false, "type": "", "demo": "sites\/get-usage.md", @@ -35330,7 +35358,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 504, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -35390,7 +35418,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 502, + "weight": 491, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -35482,7 +35510,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 503, + "weight": 492, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -35552,7 +35580,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 505, + "weight": 494, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -35646,7 +35674,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 506, + "weight": 495, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -35718,7 +35746,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 538, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -35804,7 +35832,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 536, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -35940,7 +35968,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 537, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -36001,7 +36029,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 539, + "weight": 528, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -36134,7 +36162,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 540, + "weight": 529, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -36197,7 +36225,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 543, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -36296,7 +36324,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 541, + "weight": 530, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -36398,7 +36426,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 542, + "weight": 531, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -36472,7 +36500,7 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 544, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/update-file.md", @@ -36564,7 +36592,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 545, + "weight": 534, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -36633,7 +36661,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 547, + "weight": 536, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -36713,7 +36741,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 546, + "weight": 535, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -36943,7 +36971,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 548, + "weight": 537, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -37030,7 +37058,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 550, + "weight": 539, "cookies": false, "type": "", "demo": "storage\/get-usage.md", @@ -37103,7 +37131,7 @@ "x-appwrite": { "method": "getBucketUsage", "group": null, - "weight": 551, + "weight": 540, "cookies": false, "type": "", "demo": "storage\/get-bucket-usage.md", @@ -37186,7 +37214,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 352, + "weight": 338, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -37272,7 +37300,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 348, + "weight": 334, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -37353,7 +37381,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 419, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -37423,7 +37451,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 415, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -37497,7 +37525,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 416, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -37564,7 +37592,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 417, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -37645,7 +37673,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 418, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -37714,7 +37742,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 420, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -37802,7 +37830,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 354, + "weight": 340, "cookies": false, "type": "", "demo": "tablesdb\/list-usage.md", @@ -37901,7 +37929,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 349, + "weight": 335, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -37962,7 +37990,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 350, + "weight": 336, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -38037,7 +38065,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 351, + "weight": 337, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -38100,7 +38128,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 359, + "weight": 345, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -38199,7 +38227,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 355, + "weight": 341, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -38325,7 +38353,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 356, + "weight": 342, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -38399,7 +38427,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 357, + "weight": 343, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -38501,7 +38529,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 358, + "weight": 344, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -38577,7 +38605,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 364, + "weight": 350, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -38677,7 +38705,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 365, + "weight": 351, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -38789,7 +38817,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 366, + "weight": 352, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -38906,7 +38934,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 367, + "weight": 353, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -39018,7 +39046,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 368, + "weight": 354, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -39135,7 +39163,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 369, + "weight": 355, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -39248,7 +39276,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 370, + "weight": 356, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -39366,7 +39394,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 371, + "weight": 357, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -39487,7 +39515,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 372, + "weight": 358, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -39613,7 +39641,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 373, + "weight": 359, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -39740,7 +39768,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 374, + "weight": 360, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -39872,7 +39900,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 375, + "weight": 361, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -39999,7 +40027,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 376, + "weight": 362, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -40131,7 +40159,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 377, + "weight": 363, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -40243,7 +40271,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 378, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -40360,7 +40388,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 379, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -40474,7 +40502,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 380, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -40597,7 +40625,7 @@ "x-appwrite": { "method": "createLongtextColumn", "group": "columns", - "weight": 397, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-longtext-column.md", @@ -40709,7 +40737,7 @@ "x-appwrite": { "method": "updateLongtextColumn", "group": "columns", - "weight": 398, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-longtext-column.md", @@ -40826,7 +40854,7 @@ "x-appwrite": { "method": "createMediumtextColumn", "group": "columns", - "weight": 395, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-mediumtext-column.md", @@ -40938,7 +40966,7 @@ "x-appwrite": { "method": "updateMediumtextColumn", "group": "columns", - "weight": 396, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-mediumtext-column.md", @@ -41055,7 +41083,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 381, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -41169,7 +41197,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 382, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -41292,7 +41320,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 383, + "weight": 369, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -41406,7 +41434,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 384, + "weight": 370, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -41529,7 +41557,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 385, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -41667,7 +41695,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 387, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -41795,7 +41823,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 388, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -41923,7 +41951,7 @@ "x-appwrite": { "method": "createTextColumn", "group": "columns", - "weight": 393, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/create-text-column.md", @@ -42035,7 +42063,7 @@ "x-appwrite": { "method": "updateTextColumn", "group": "columns", - "weight": 394, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/update-text-column.md", @@ -42152,7 +42180,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 389, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -42265,7 +42293,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 390, + "weight": 376, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -42383,7 +42411,7 @@ "x-appwrite": { "method": "createVarcharColumn", "group": "columns", - "weight": 391, + "weight": 377, "cookies": false, "type": "", "demo": "tablesdb\/create-varchar-column.md", @@ -42502,7 +42530,7 @@ "x-appwrite": { "method": "updateVarcharColumn", "group": "columns", - "weight": 392, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/update-varchar-column.md", @@ -42657,7 +42685,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 362, + "weight": 348, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -42733,7 +42761,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 363, + "weight": 349, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -42818,7 +42846,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 386, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -42933,7 +42961,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 402, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -43031,7 +43059,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 399, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -43171,7 +43199,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 400, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -43247,7 +43275,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 401, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -43332,7 +43360,7 @@ "x-appwrite": { "method": "listTableLogs", "group": "tables", - "weight": 360, + "weight": 346, "cookies": false, "type": "", "demo": "tablesdb\/list-table-logs.md", @@ -43419,7 +43447,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 411, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -43530,7 +43558,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 403, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -43712,7 +43740,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 408, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -43844,7 +43872,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 406, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -43948,7 +43976,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 410, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -44049,7 +44077,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 404, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -44159,7 +44187,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 407, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -44309,7 +44337,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 405, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -44420,7 +44448,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 409, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -44526,7 +44554,7 @@ "x-appwrite": { "method": "listRowLogs", "group": "logs", - "weight": 412, + "weight": 398, "cookies": false, "type": "", "demo": "tablesdb\/list-row-logs.md", @@ -44623,7 +44651,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 414, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -44751,7 +44779,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 413, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -44879,7 +44907,7 @@ "x-appwrite": { "method": "getTableUsage", "group": null, - "weight": 361, + "weight": 347, "cookies": false, "type": "", "demo": "tablesdb\/get-table-usage.md", @@ -44975,7 +45003,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 353, + "weight": 339, "cookies": false, "type": "", "demo": "tablesdb\/get-usage.md", @@ -45087,7 +45115,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 110, + "weight": 107, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -45176,7 +45204,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 109, + "weight": 106, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -45263,7 +45291,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 111, + "weight": 108, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -45327,7 +45355,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 113, + "weight": 110, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -45403,7 +45431,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 115, + "weight": 112, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -45469,7 +45497,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 122, + "weight": 119, "cookies": false, "type": "", "demo": "teams\/list-logs.md", @@ -45554,7 +45582,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 117, + "weight": 114, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -45653,7 +45681,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 116, + "weight": 113, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -45721,14 +45749,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": { @@ -45776,7 +45797,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 118, + "weight": 115, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -45850,7 +45871,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 119, + "weight": 116, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -45911,14 +45932,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" } } }, @@ -45946,7 +45960,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 121, + "weight": 118, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -46022,7 +46036,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 120, + "weight": 117, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -46121,7 +46135,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 112, + "weight": 109, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -46183,7 +46197,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 114, + "weight": 111, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -46266,7 +46280,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 533, + "weight": 522, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -46360,7 +46374,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 531, + "weight": 520, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -46449,7 +46463,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 532, + "weight": 521, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -46509,7 +46523,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 534, + "weight": 523, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -46579,7 +46593,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 535, + "weight": 524, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -46641,7 +46655,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 132, + "weight": 129, "cookies": false, "type": "", "demo": "users\/list.md", @@ -46727,7 +46741,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 123, + "weight": 120, "cookies": false, "type": "", "demo": "users\/create.md", @@ -46821,7 +46835,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 126, + "weight": 123, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -46910,7 +46924,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 124, + "weight": 121, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -46999,7 +47013,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 140, + "weight": 137, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -47080,7 +47094,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 163, + "weight": 160, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -47143,7 +47157,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 125, + "weight": 122, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -47232,7 +47246,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 128, + "weight": 125, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -47321,7 +47335,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 129, + "weight": 126, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -47444,7 +47458,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 130, + "weight": 127, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -47551,7 +47565,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 127, + "weight": 124, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -47660,7 +47674,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 165, + "weight": 162, "cookies": false, "type": "", "demo": "users\/get-usage.md", @@ -47733,7 +47747,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 133, + "weight": 130, "cookies": false, "type": "", "demo": "users\/get.md", @@ -47787,7 +47801,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 161, + "weight": 158, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -47850,7 +47864,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 146, + "weight": 143, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -47933,7 +47947,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 164, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -48018,7 +48032,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 142, + "weight": 139, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -48103,7 +48117,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 138, + "weight": 135, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -48190,7 +48204,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 137, + "weight": 134, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -48288,7 +48302,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 151, + "weight": 148, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -48423,7 +48437,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 156, + "weight": 153, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -48559,7 +48573,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 152, + "weight": 149, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -48678,7 +48692,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 153, + "weight": 150, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -48795,7 +48809,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 155, + "weight": 152, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -48912,7 +48926,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 154, + "weight": 151, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -49031,7 +49045,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 144, + "weight": 141, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -49113,7 +49127,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 145, + "weight": 142, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -49195,7 +49209,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 147, + "weight": 144, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -49278,7 +49292,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 134, + "weight": 131, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -49339,7 +49353,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 149, + "weight": 146, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -49421,7 +49435,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 136, + "weight": 133, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -49493,7 +49507,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 157, + "weight": 154, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -49547,7 +49561,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 160, + "weight": 157, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -49603,7 +49617,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 159, + "weight": 156, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -49676,7 +49690,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 141, + "weight": 138, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -49758,7 +49772,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 139, + "weight": 136, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -49843,7 +49857,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 131, + "weight": 128, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -49954,7 +49968,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 135, + "weight": 132, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -50025,7 +50039,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 150, + "weight": 147, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -50115,7 +50129,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 162, + "weight": 159, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -50188,7 +50202,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 158, + "weight": 155, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -50274,7 +50288,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 148, + "weight": 145, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -50356,7 +50370,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 143, + "weight": 140, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -50438,7 +50452,7 @@ "x-appwrite": { "method": "createRepositoryDetection", "group": "repositories", - "weight": 169, + "weight": 551, "cookies": false, "type": "", "demo": "vcs\/create-repository-detection.md", @@ -50535,7 +50549,7 @@ "x-appwrite": { "method": "listRepositories", "group": "repositories", - "weight": 170, + "weight": 548, "cookies": false, "type": "", "demo": "vcs\/list-repositories.md", @@ -50634,7 +50648,7 @@ "x-appwrite": { "method": "createRepository", "group": "repositories", - "weight": 171, + "weight": 546, "cookies": false, "type": "", "demo": "vcs\/create-repository.md", @@ -50720,7 +50734,7 @@ "x-appwrite": { "method": "getRepository", "group": "repositories", - "weight": 172, + "weight": 547, "cookies": false, "type": "", "demo": "vcs\/get-repository.md", @@ -50791,7 +50805,7 @@ "x-appwrite": { "method": "listRepositoryBranches", "group": "repositories", - "weight": 173, + "weight": 549, "cookies": false, "type": "", "demo": "vcs\/list-repository-branches.md", @@ -50862,7 +50876,7 @@ "x-appwrite": { "method": "getRepositoryContents", "group": "repositories", - "weight": 168, + "weight": 550, "cookies": false, "type": "", "demo": "vcs\/get-repository-contents.md", @@ -50948,7 +50962,7 @@ "x-appwrite": { "method": "updateExternalDeployments", "group": "repositories", - "weight": 178, + "weight": 164, "cookies": false, "type": "", "demo": "vcs\/update-external-deployments.md", @@ -51038,7 +51052,7 @@ "x-appwrite": { "method": "listInstallations", "group": "installations", - "weight": 175, + "weight": 544, "cookies": false, "type": "", "demo": "vcs\/list-installations.md", @@ -51124,7 +51138,7 @@ "x-appwrite": { "method": "getInstallation", "group": "installations", - "weight": 176, + "weight": 543, "cookies": false, "type": "", "demo": "vcs\/get-installation.md", @@ -51176,7 +51190,7 @@ "x-appwrite": { "method": "deleteInstallation", "group": "installations", - "weight": 177, + "weight": 545, "cookies": false, "type": "", "demo": "vcs\/delete-installation.md", @@ -52922,6 +52936,18 @@ "$ref": "#\/components\/schemas\/index" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum document size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used document size in bytes based on defined attributes.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -52934,7 +52960,9 @@ "enabled", "documentSecurity", "attributes", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -52948,7 +52976,9 @@ "enabled": false, "documentSecurity": true, "attributes": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "attributeList": { @@ -54715,6 +54745,18 @@ "$ref": "#\/components\/schemas\/columnIndex" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum row size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used row size in bytes based on defined columns.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -54727,7 +54769,9 @@ "enabled", "rowSecurity", "columns", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -54741,7 +54785,9 @@ "enabled": false, "rowSecurity": true, "columns": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "columnList": { diff --git a/app/config/specs/open-api3-latest-server.json b/app/config/specs/open-api3-latest-server.json index f63942090c..89ad0cb0ff 100644 --- a/app/config/specs/open-api3-latest-server.json +++ b/app/config/specs/open-api3-latest-server.json @@ -562,7 +562,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 253, + "weight": 239, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -635,7 +635,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 255, + "weight": 241, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -762,7 +762,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 256, + "weight": 242, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -905,7 +905,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 257, + "weight": 243, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1032,7 +1032,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 261, + "weight": 247, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1169,7 +1169,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 262, + "weight": 248, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1310,7 +1310,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 254, + "weight": 240, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1414,7 +1414,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 260, + "weight": 246, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1516,7 +1516,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 258, + "weight": 244, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1618,7 +1618,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 259, + "weight": 245, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -3761,7 +3761,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 264, + "weight": 250, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -3891,7 +3891,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 263, + "weight": 249, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4027,7 +4027,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 267, + "weight": 253, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4089,7 +4089,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 265, + "weight": 251, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4581,7 +4581,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 266, + "weight": 252, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4667,7 +4667,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 269, + "weight": 255, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -4763,7 +4763,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 268, + "weight": 254, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -4859,7 +4859,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 270, + "weight": 256, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5614,7 +5614,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 278, + "weight": 264, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -5735,7 +5735,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 274, + "weight": 260, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -5854,7 +5854,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 346, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -5923,7 +5923,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 342, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -5996,7 +5996,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 343, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6062,7 +6062,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 344, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6142,7 +6142,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 345, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6210,7 +6210,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 347, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6297,7 +6297,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 275, + "weight": 261, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -6393,7 +6393,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 276, + "weight": 262, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -6505,7 +6505,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 277, + "weight": 263, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -6602,7 +6602,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 286, + "weight": 272, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -6703,7 +6703,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 282, + "weight": 268, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -6831,7 +6831,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 283, + "weight": 269, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -6907,7 +6907,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 284, + "weight": 270, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7011,7 +7011,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 285, + "weight": 271, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7089,7 +7089,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 303, + "weight": 289, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7191,7 +7191,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 304, + "weight": 290, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7305,7 +7305,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 305, + "weight": 291, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -7424,7 +7424,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 306, + "weight": 292, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -7538,7 +7538,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 307, + "weight": 293, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -7657,7 +7657,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 308, + "weight": 294, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -7772,7 +7772,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 309, + "weight": 295, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -7892,7 +7892,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 310, + "weight": 296, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8015,7 +8015,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 311, + "weight": 297, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8143,7 +8143,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 312, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8272,7 +8272,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 313, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -8406,7 +8406,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 314, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -8535,7 +8535,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 315, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -8669,7 +8669,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 316, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -8783,7 +8783,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 317, + "weight": 303, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -8902,7 +8902,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 318, + "weight": 304, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9018,7 +9018,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 319, + "weight": 305, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9143,7 +9143,7 @@ "x-appwrite": { "method": "createLongtextAttribute", "group": "attributes", - "weight": 336, + "weight": 322, "cookies": false, "type": "", "demo": "databases\/create-longtext-attribute.md", @@ -9253,7 +9253,7 @@ "x-appwrite": { "method": "updateLongtextAttribute", "group": "attributes", - "weight": 337, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/update-longtext-attribute.md", @@ -9368,7 +9368,7 @@ "x-appwrite": { "method": "createMediumtextAttribute", "group": "attributes", - "weight": 334, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/create-mediumtext-attribute.md", @@ -9478,7 +9478,7 @@ "x-appwrite": { "method": "updateMediumtextAttribute", "group": "attributes", - "weight": 335, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/update-mediumtext-attribute.md", @@ -9593,7 +9593,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 320, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -9709,7 +9709,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 321, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -9834,7 +9834,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 322, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -9950,7 +9950,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 323, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -10075,7 +10075,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 324, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -10215,7 +10215,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 326, + "weight": 312, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -10341,7 +10341,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 327, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -10467,7 +10467,7 @@ "x-appwrite": { "method": "createTextAttribute", "group": "attributes", - "weight": 332, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/create-text-attribute.md", @@ -10577,7 +10577,7 @@ "x-appwrite": { "method": "updateTextAttribute", "group": "attributes", - "weight": 333, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/update-text-attribute.md", @@ -10692,7 +10692,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 328, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -10807,7 +10807,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 329, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -10927,7 +10927,7 @@ "x-appwrite": { "method": "createVarcharAttribute", "group": "attributes", - "weight": 330, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/create-varchar-attribute.md", @@ -11044,7 +11044,7 @@ "x-appwrite": { "method": "updateVarcharAttribute", "group": "attributes", - "weight": 331, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/update-varchar-attribute.md", @@ -11197,7 +11197,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 301, + "weight": 287, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -11275,7 +11275,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 302, + "weight": 288, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -11362,7 +11362,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 325, + "weight": 311, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -11479,7 +11479,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 297, + "weight": 283, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -11593,7 +11593,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 289, + "weight": 275, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -11788,7 +11788,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 294, + "weight": 280, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -11927,7 +11927,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 292, + "weight": 278, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -12033,7 +12033,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 296, + "weight": 282, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -12136,7 +12136,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 290, + "weight": 276, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -12249,7 +12249,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 293, + "weight": 279, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -12407,7 +12407,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 291, + "weight": 277, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -12521,7 +12521,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 295, + "weight": 281, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -12630,7 +12630,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 300, + "weight": 286, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -12761,7 +12761,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 299, + "weight": 285, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -12892,7 +12892,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 341, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -12992,7 +12992,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 338, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -13134,7 +13134,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 339, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -13212,7 +13212,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 340, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -13299,7 +13299,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 431, + "weight": 420, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -13385,7 +13385,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 428, + "weight": 417, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -13470,6 +13470,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -13497,7 +13498,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -13682,7 +13684,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 433, + "weight": 422, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -13733,7 +13735,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 434, + "weight": 423, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -13784,7 +13786,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 429, + "weight": 418, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -13845,7 +13847,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 430, + "weight": 419, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -13937,6 +13939,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -13964,7 +13967,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -14139,7 +14143,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 432, + "weight": 421, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -14202,7 +14206,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 437, + "weight": 426, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -14284,7 +14288,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 438, + "weight": 427, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -14380,7 +14384,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 435, + "weight": 424, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -14481,7 +14485,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 443, + "weight": 432, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -14568,7 +14572,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 440, + "weight": 429, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -14686,7 +14690,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 441, + "weight": 430, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -14785,7 +14789,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 436, + "weight": 425, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -14849,7 +14853,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 439, + "weight": 428, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -14915,7 +14919,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 442, + "weight": 431, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -15007,7 +15011,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 444, + "weight": 433, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -15080,7 +15084,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 447, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -15169,7 +15173,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 445, + "weight": 434, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -15289,7 +15293,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 446, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -15357,7 +15361,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 448, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -15430,7 +15434,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 453, + "weight": 442, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -15491,7 +15495,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 451, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -15584,7 +15588,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 452, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -15655,7 +15659,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 454, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -15750,7 +15754,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 455, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -15823,7 +15827,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 190, + "weight": 176, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -15879,7 +15883,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 189, + "weight": 175, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -15935,7 +15939,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 458, + "weight": 447, "cookies": false, "type": "", "demo": "health\/get.md", @@ -15987,7 +15991,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 467, + "weight": 456, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -16039,7 +16043,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 461, + "weight": 450, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -16091,7 +16095,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 464, + "weight": 453, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -16154,7 +16158,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 460, + "weight": 449, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -16206,7 +16210,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 462, + "weight": 451, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -16258,7 +16262,7 @@ "x-appwrite": { "method": "getQueueAudits", "group": "queue", - "weight": 468, + "weight": 457, "cookies": false, "type": "", "demo": "health\/get-queue-audits.md", @@ -16323,7 +16327,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 472, + "weight": 461, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -16388,7 +16392,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 471, + "weight": 460, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -16453,7 +16457,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 473, + "weight": 462, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -16529,7 +16533,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 474, + "weight": 463, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -16594,7 +16598,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 481, + "weight": 470, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -16686,7 +16690,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 478, + "weight": 467, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -16751,7 +16755,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 470, + "weight": 459, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -16816,7 +16820,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 475, + "weight": 464, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -16881,7 +16885,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 476, + "weight": 465, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -16946,7 +16950,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 477, + "weight": 466, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -17011,7 +17015,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 479, + "weight": 468, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -17076,7 +17080,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 480, + "weight": 469, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -17141,7 +17145,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 469, + "weight": 458, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -17206,7 +17210,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 466, + "weight": 455, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -17258,7 +17262,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 465, + "weight": 454, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -17310,7 +17314,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 463, + "weight": 452, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -17810,7 +17814,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 245, + "weight": 231, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -17899,7 +17903,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 242, + "weight": 228, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -18046,7 +18050,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 249, + "weight": 235, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -18205,7 +18209,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 244, + "weight": 230, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -18384,7 +18388,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 251, + "weight": 237, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -18583,7 +18587,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 243, + "weight": 229, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -18767,7 +18771,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 250, + "weight": 236, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -18957,7 +18961,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 248, + "weight": 234, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -19012,7 +19016,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 252, + "weight": 238, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -19076,7 +19080,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 246, + "weight": 232, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -19164,7 +19168,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 247, + "weight": 233, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -19252,7 +19256,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 216, + "weight": 202, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -19341,7 +19345,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 215, + "weight": 201, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -19523,7 +19527,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 229, + "weight": 215, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -19707,7 +19711,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 214, + "weight": 200, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -19862,7 +19866,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 228, + "weight": 214, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -20018,7 +20022,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 205, + "weight": 191, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -20139,7 +20143,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 219, + "weight": 205, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -20262,7 +20266,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 209, + "weight": 195, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -20360,7 +20364,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 223, + "weight": 209, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -20461,7 +20465,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 207, + "weight": 193, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -20571,7 +20575,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 221, + "weight": 207, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -20683,7 +20687,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 206, + "weight": 192, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -20793,7 +20797,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 220, + "weight": 206, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -20905,7 +20909,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 208, + "weight": 194, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -21142,7 +21146,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 222, + "weight": 208, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -21378,7 +21382,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 210, + "weight": 196, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -21477,7 +21481,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 224, + "weight": 210, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -21578,7 +21582,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 211, + "weight": 197, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -21677,7 +21681,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 225, + "weight": 211, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -21778,7 +21782,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 212, + "weight": 198, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -21877,7 +21881,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 226, + "weight": 212, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -21978,7 +21982,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 213, + "weight": 199, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -22077,7 +22081,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 227, + "weight": 213, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -22178,7 +22182,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 218, + "weight": 204, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -22233,7 +22237,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 230, + "weight": 216, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -22297,7 +22301,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 217, + "weight": 203, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -22385,7 +22389,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 239, + "weight": 225, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -22473,7 +22477,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 232, + "weight": 218, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -22560,7 +22564,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 231, + "weight": 217, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -22645,7 +22649,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 234, + "weight": 220, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -22707,7 +22711,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 235, + "weight": 221, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -22788,7 +22792,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 236, + "weight": 222, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -22852,7 +22856,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 233, + "weight": 219, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -22940,7 +22944,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 238, + "weight": 224, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -23037,7 +23041,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 237, + "weight": 223, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -23130,7 +23134,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 240, + "weight": 226, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -23195,7 +23199,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 241, + "weight": 227, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -23273,7 +23277,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 485, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -23359,7 +23363,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 483, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -23499,6 +23503,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -23526,7 +23531,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -23614,7 +23620,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 488, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -23665,7 +23671,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 511, + "weight": 500, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -23716,7 +23722,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 484, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -23777,7 +23783,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 486, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -23924,6 +23930,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -23951,7 +23958,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -24028,7 +24036,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 487, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -24091,7 +24099,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 494, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -24173,7 +24181,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 493, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -24269,7 +24277,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 489, + "weight": 478, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -24376,7 +24384,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 497, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -24458,7 +24466,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 490, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -24576,7 +24584,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 491, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -24676,7 +24684,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 492, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -24740,7 +24748,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 495, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -24806,7 +24814,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 496, + "weight": 485, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -24898,7 +24906,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 498, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -24971,7 +24979,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 500, + "weight": 489, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -25058,7 +25066,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 499, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -25122,7 +25130,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 501, + "weight": 490, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -25195,7 +25203,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 504, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -25256,7 +25264,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 502, + "weight": 491, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -25349,7 +25357,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 503, + "weight": 492, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -25420,7 +25428,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 505, + "weight": 494, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -25515,7 +25523,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 506, + "weight": 495, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -25588,7 +25596,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 538, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -25675,7 +25683,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 536, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -25812,7 +25820,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 537, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -25874,7 +25882,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 539, + "weight": 528, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -26008,7 +26016,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 540, + "weight": 529, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -26072,7 +26080,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 543, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -26173,7 +26181,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 541, + "weight": 530, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -26277,7 +26285,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 542, + "weight": 531, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -26353,7 +26361,7 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 544, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/update-file.md", @@ -26447,7 +26455,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 545, + "weight": 534, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -26518,7 +26526,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 547, + "weight": 536, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -26600,7 +26608,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 546, + "weight": 535, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -26832,7 +26840,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 548, + "weight": 537, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -26921,7 +26929,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 352, + "weight": 338, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -27008,7 +27016,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 348, + "weight": 334, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -27090,7 +27098,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 419, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -27162,7 +27170,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 415, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -27238,7 +27246,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 416, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -27307,7 +27315,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 417, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -27390,7 +27398,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 418, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -27461,7 +27469,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 420, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -27551,7 +27559,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 349, + "weight": 335, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -27613,7 +27621,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 350, + "weight": 336, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -27689,7 +27697,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 351, + "weight": 337, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -27753,7 +27761,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 359, + "weight": 345, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -27853,7 +27861,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 355, + "weight": 341, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -27980,7 +27988,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 356, + "weight": 342, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -28055,7 +28063,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 357, + "weight": 343, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -28158,7 +28166,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 358, + "weight": 344, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -28235,7 +28243,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 364, + "weight": 350, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -28336,7 +28344,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 365, + "weight": 351, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -28449,7 +28457,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 366, + "weight": 352, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -28567,7 +28575,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 367, + "weight": 353, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -28680,7 +28688,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 368, + "weight": 354, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -28798,7 +28806,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 369, + "weight": 355, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -28912,7 +28920,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 370, + "weight": 356, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -29031,7 +29039,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 371, + "weight": 357, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -29153,7 +29161,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 372, + "weight": 358, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -29280,7 +29288,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 373, + "weight": 359, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -29408,7 +29416,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 374, + "weight": 360, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -29541,7 +29549,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 375, + "weight": 361, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -29669,7 +29677,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 376, + "weight": 362, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -29802,7 +29810,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 377, + "weight": 363, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -29915,7 +29923,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 378, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -30033,7 +30041,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 379, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -30148,7 +30156,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 380, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -30272,7 +30280,7 @@ "x-appwrite": { "method": "createLongtextColumn", "group": "columns", - "weight": 397, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-longtext-column.md", @@ -30385,7 +30393,7 @@ "x-appwrite": { "method": "updateLongtextColumn", "group": "columns", - "weight": 398, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-longtext-column.md", @@ -30503,7 +30511,7 @@ "x-appwrite": { "method": "createMediumtextColumn", "group": "columns", - "weight": 395, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-mediumtext-column.md", @@ -30616,7 +30624,7 @@ "x-appwrite": { "method": "updateMediumtextColumn", "group": "columns", - "weight": 396, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-mediumtext-column.md", @@ -30734,7 +30742,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 381, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -30849,7 +30857,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 382, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -30973,7 +30981,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 383, + "weight": 369, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -31088,7 +31096,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 384, + "weight": 370, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -31212,7 +31220,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 385, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -31351,7 +31359,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 387, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -31480,7 +31488,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 388, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -31609,7 +31617,7 @@ "x-appwrite": { "method": "createTextColumn", "group": "columns", - "weight": 393, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/create-text-column.md", @@ -31722,7 +31730,7 @@ "x-appwrite": { "method": "updateTextColumn", "group": "columns", - "weight": 394, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/update-text-column.md", @@ -31840,7 +31848,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 389, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -31954,7 +31962,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 390, + "weight": 376, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -32073,7 +32081,7 @@ "x-appwrite": { "method": "createVarcharColumn", "group": "columns", - "weight": 391, + "weight": 377, "cookies": false, "type": "", "demo": "tablesdb\/create-varchar-column.md", @@ -32193,7 +32201,7 @@ "x-appwrite": { "method": "updateVarcharColumn", "group": "columns", - "weight": 392, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/update-varchar-column.md", @@ -32349,7 +32357,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 362, + "weight": 348, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -32426,7 +32434,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 363, + "weight": 349, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -32512,7 +32520,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 386, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -32628,7 +32636,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 402, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -32727,7 +32735,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 399, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -32868,7 +32876,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 400, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -32945,7 +32953,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 401, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -33031,7 +33039,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 411, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -33144,7 +33152,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 403, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -33330,7 +33338,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 408, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -33464,7 +33472,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 406, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -33569,7 +33577,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 410, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -33671,7 +33679,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 404, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -33783,7 +33791,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 407, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -33936,7 +33944,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 405, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -34049,7 +34057,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 409, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -34157,7 +34165,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 414, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -34287,7 +34295,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 413, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -34417,7 +34425,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 110, + "weight": 107, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -34508,7 +34516,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 109, + "weight": 106, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -34597,7 +34605,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 111, + "weight": 108, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -34663,7 +34671,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 113, + "weight": 110, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -34741,7 +34749,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 115, + "weight": 112, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -34809,7 +34817,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 117, + "weight": 114, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -34910,7 +34918,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 116, + "weight": 113, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -34980,14 +34988,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": { @@ -35035,7 +35036,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 118, + "weight": 115, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -35111,7 +35112,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 119, + "weight": 116, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -35174,14 +35175,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" } } }, @@ -35209,7 +35203,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 121, + "weight": 118, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -35287,7 +35281,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 120, + "weight": 117, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -35388,7 +35382,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 112, + "weight": 109, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -35452,7 +35446,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 114, + "weight": 111, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -35537,7 +35531,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 533, + "weight": 522, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -35632,7 +35626,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 531, + "weight": 520, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -35722,7 +35716,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 532, + "weight": 521, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -35783,7 +35777,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 534, + "weight": 523, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -35854,7 +35848,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 535, + "weight": 524, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -35917,7 +35911,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 132, + "weight": 129, "cookies": false, "type": "", "demo": "users\/list.md", @@ -36004,7 +35998,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 123, + "weight": 120, "cookies": false, "type": "", "demo": "users\/create.md", @@ -36099,7 +36093,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 126, + "weight": 123, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -36189,7 +36183,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 124, + "weight": 121, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -36279,7 +36273,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 140, + "weight": 137, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -36361,7 +36355,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 163, + "weight": 160, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -36425,7 +36419,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 125, + "weight": 122, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -36515,7 +36509,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 128, + "weight": 125, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -36605,7 +36599,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 129, + "weight": 126, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -36729,7 +36723,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 130, + "weight": 127, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -36837,7 +36831,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 127, + "weight": 124, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -36947,7 +36941,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 133, + "weight": 130, "cookies": false, "type": "", "demo": "users\/get.md", @@ -37002,7 +36996,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 161, + "weight": 158, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -37066,7 +37060,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 146, + "weight": 143, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -37150,7 +37144,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 164, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -37236,7 +37230,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 142, + "weight": 139, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -37322,7 +37316,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 138, + "weight": 135, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -37410,7 +37404,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 137, + "weight": 134, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -37509,7 +37503,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 151, + "weight": 148, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -37647,7 +37641,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 156, + "weight": 153, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -37786,7 +37780,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 152, + "weight": 149, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -37908,7 +37902,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 153, + "weight": 150, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -38028,7 +38022,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 155, + "weight": 152, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -38148,7 +38142,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 154, + "weight": 151, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -38270,7 +38264,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 144, + "weight": 141, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -38353,7 +38347,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 145, + "weight": 142, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -38436,7 +38430,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 147, + "weight": 144, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -38520,7 +38514,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 134, + "weight": 131, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -38582,7 +38576,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 149, + "weight": 146, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -38665,7 +38659,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 136, + "weight": 133, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -38738,7 +38732,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 157, + "weight": 154, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -38793,7 +38787,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 160, + "weight": 157, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -38850,7 +38844,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 159, + "weight": 156, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -38924,7 +38918,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 141, + "weight": 138, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -39007,7 +39001,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 139, + "weight": 136, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -39093,7 +39087,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 131, + "weight": 128, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -39205,7 +39199,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 135, + "weight": 132, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -39277,7 +39271,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 150, + "weight": 147, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -39368,7 +39362,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 162, + "weight": 159, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -39442,7 +39436,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 158, + "weight": 155, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -39529,7 +39523,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 148, + "weight": 145, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -39612,7 +39606,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 143, + "weight": 140, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -40988,6 +40982,18 @@ "$ref": "#\/components\/schemas\/index" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum document size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used document size in bytes based on defined attributes.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -41000,7 +41006,9 @@ "enabled", "documentSecurity", "attributes", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -41014,7 +41022,9 @@ "enabled": false, "documentSecurity": true, "attributes": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "attributeList": { @@ -42781,6 +42791,18 @@ "$ref": "#\/components\/schemas\/columnIndex" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum row size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used row size in bytes based on defined columns.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -42793,7 +42815,9 @@ "enabled", "rowSecurity", "columns", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -42807,7 +42831,9 @@ "enabled": false, "rowSecurity": true, "columns": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "columnList": { diff --git a/app/config/specs/swagger2-1.8.x-client.json b/app/config/specs/swagger2-1.8.x-client.json index e265c1fd93..f28704dcbf 100644 --- a/app/config/specs/swagger2-1.8.x-client.json +++ b/app/config/specs/swagger2-1.8.x-client.json @@ -612,7 +612,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 253, + "weight": 239, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -687,7 +687,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 255, + "weight": 241, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -811,7 +811,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 256, + "weight": 242, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -952,7 +952,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 257, + "weight": 243, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1076,7 +1076,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 261, + "weight": 247, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1213,7 +1213,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 262, + "weight": 248, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1353,7 +1353,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 254, + "weight": 240, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1454,7 +1454,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 260, + "weight": 246, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1555,7 +1555,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 258, + "weight": 244, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1656,7 +1656,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 259, + "weight": 245, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -4203,7 +4203,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 264, + "weight": 250, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4329,7 +4329,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 263, + "weight": 249, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4461,7 +4461,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 267, + "weight": 253, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4525,7 +4525,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 265, + "weight": 251, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -5013,7 +5013,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 266, + "weight": 252, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -5097,7 +5097,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 269, + "weight": 255, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5189,7 +5189,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 268, + "weight": 254, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5281,7 +5281,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 270, + "weight": 256, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5994,7 +5994,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 346, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6061,7 +6061,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 342, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6132,7 +6132,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 343, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6195,7 +6195,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 344, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6274,7 +6274,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 345, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6339,7 +6339,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 347, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6420,7 +6420,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 297, + "weight": 283, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -6524,7 +6524,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 289, + "weight": 275, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -6683,7 +6683,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 290, + "weight": 276, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -6786,7 +6786,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 293, + "weight": 279, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -6937,7 +6937,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 291, + "weight": 277, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -7047,7 +7047,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 295, + "weight": 281, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -7148,7 +7148,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 300, + "weight": 286, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -7271,7 +7271,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 299, + "weight": 285, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -7392,7 +7392,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 447, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -7475,7 +7475,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 445, + "weight": 434, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -7594,7 +7594,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 446, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -7666,7 +7666,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 190, + "weight": 176, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -7741,7 +7741,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 189, + "weight": 175, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -8240,7 +8240,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 237, + "weight": 223, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -8325,7 +8325,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 241, + "weight": 227, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -8396,7 +8396,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 543, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -8489,7 +8489,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 541, + "weight": 530, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -8580,7 +8580,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 542, + "weight": 531, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -8651,7 +8651,7 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 544, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/update-file.md", @@ -8742,7 +8742,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 545, + "weight": 534, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -8813,7 +8813,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 547, + "weight": 536, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -8893,7 +8893,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 546, + "weight": 535, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -9101,7 +9101,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 548, + "weight": 537, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -9181,7 +9181,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 419, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -9251,7 +9251,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 415, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -9325,7 +9325,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 416, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -9391,7 +9391,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 417, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -9473,7 +9473,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 418, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -9541,7 +9541,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 420, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -9625,7 +9625,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 411, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -9728,7 +9728,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 403, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -9882,7 +9882,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 404, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -9984,7 +9984,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 407, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -10130,7 +10130,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 405, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -10239,7 +10239,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 409, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -10339,7 +10339,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 414, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -10461,7 +10461,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 413, + "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", diff --git a/app/config/specs/swagger2-1.8.x-console.json b/app/config/specs/swagger2-1.8.x-console.json index 037da99b91..41b48860a1 100644 --- a/app/config/specs/swagger2-1.8.x-console.json +++ b/app/config/specs/swagger2-1.8.x-console.json @@ -661,7 +661,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 253, + "weight": 239, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -735,7 +735,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 255, + "weight": 241, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -858,7 +858,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 256, + "weight": 242, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -998,7 +998,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 257, + "weight": 243, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1121,7 +1121,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 261, + "weight": 247, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1257,7 +1257,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 262, + "weight": 248, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1396,7 +1396,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 254, + "weight": 240, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1496,7 +1496,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 260, + "weight": 246, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1596,7 +1596,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 258, + "weight": 244, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1696,7 +1696,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 259, + "weight": 245, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -4212,7 +4212,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 264, + "weight": 250, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4338,7 +4338,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 263, + "weight": 249, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4470,7 +4470,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 267, + "weight": 253, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4534,7 +4534,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 265, + "weight": 251, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -5022,7 +5022,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 266, + "weight": 252, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -5106,7 +5106,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 269, + "weight": 255, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5198,7 +5198,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 268, + "weight": 254, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5290,7 +5290,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 270, + "weight": 256, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -6005,7 +6005,7 @@ "x-appwrite": { "method": "chat", "group": "console", - "weight": 513, + "weight": 502, "cookies": false, "type": "", "demo": "assistant\/chat.md", @@ -6069,7 +6069,7 @@ "x-appwrite": { "method": "getResource", "group": null, - "weight": 514, + "weight": 503, "cookies": false, "type": "", "demo": "console\/get-resource.md", @@ -6140,7 +6140,7 @@ "x-appwrite": { "method": "variables", "group": "console", - "weight": 512, + "weight": 501, "cookies": false, "type": "", "demo": "console\/variables.md", @@ -6189,7 +6189,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 278, + "weight": 264, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -6305,7 +6305,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 274, + "weight": 260, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -6425,7 +6425,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 346, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6492,7 +6492,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 342, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6563,7 +6563,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 343, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6626,7 +6626,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 344, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6705,7 +6705,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 345, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6770,7 +6770,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 347, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6851,7 +6851,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 281, + "weight": 267, "cookies": false, "type": "", "demo": "databases\/list-usage.md", @@ -6953,7 +6953,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 275, + "weight": 261, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -7047,7 +7047,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 276, + "weight": 262, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -7159,7 +7159,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 277, + "weight": 263, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -7252,7 +7252,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 286, + "weight": 272, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -7347,7 +7347,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 282, + "weight": 268, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -7477,7 +7477,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 283, + "weight": 269, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -7550,7 +7550,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 284, + "weight": 270, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7655,7 +7655,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 285, + "weight": 271, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7728,7 +7728,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 303, + "weight": 289, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7824,7 +7824,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 304, + "weight": 290, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7937,7 +7937,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 305, + "weight": 291, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -8052,7 +8052,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 306, + "weight": 292, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -8165,7 +8165,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 307, + "weight": 293, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -8280,7 +8280,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 308, + "weight": 294, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -8394,7 +8394,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 309, + "weight": 295, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -8510,7 +8510,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 310, + "weight": 296, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8633,7 +8633,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 311, + "weight": 297, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8758,7 +8758,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 312, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8888,7 +8888,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 313, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -9020,7 +9020,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 314, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -9150,7 +9150,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 315, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -9282,7 +9282,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 316, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -9395,7 +9395,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 317, + "weight": 303, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -9510,7 +9510,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 318, + "weight": 304, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9617,7 +9617,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 319, + "weight": 305, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9731,7 +9731,7 @@ "x-appwrite": { "method": "createLongtextAttribute", "group": "attributes", - "weight": 336, + "weight": 322, "cookies": false, "type": "", "demo": "databases\/create-longtext-attribute.md", @@ -9840,7 +9840,7 @@ "x-appwrite": { "method": "updateLongtextAttribute", "group": "attributes", - "weight": 337, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/update-longtext-attribute.md", @@ -9951,7 +9951,7 @@ "x-appwrite": { "method": "createMediumtextAttribute", "group": "attributes", - "weight": 334, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/create-mediumtext-attribute.md", @@ -10060,7 +10060,7 @@ "x-appwrite": { "method": "updateMediumtextAttribute", "group": "attributes", - "weight": 335, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/update-mediumtext-attribute.md", @@ -10171,7 +10171,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 320, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -10278,7 +10278,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 321, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -10392,7 +10392,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 322, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -10499,7 +10499,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 323, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -10613,7 +10613,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 324, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -10754,7 +10754,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 326, + "weight": 312, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -10881,7 +10881,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 327, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -11004,7 +11004,7 @@ "x-appwrite": { "method": "createTextAttribute", "group": "attributes", - "weight": 332, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/create-text-attribute.md", @@ -11113,7 +11113,7 @@ "x-appwrite": { "method": "updateTextAttribute", "group": "attributes", - "weight": 333, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/update-text-attribute.md", @@ -11224,7 +11224,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 328, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -11338,7 +11338,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 329, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -11454,7 +11454,7 @@ "x-appwrite": { "method": "createVarcharAttribute", "group": "attributes", - "weight": 330, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/create-varchar-attribute.md", @@ -11571,7 +11571,7 @@ "x-appwrite": { "method": "updateVarcharAttribute", "group": "attributes", - "weight": 331, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/update-varchar-attribute.md", @@ -11719,7 +11719,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 301, + "weight": 287, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -11794,7 +11794,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 302, + "weight": 288, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -11876,7 +11876,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 325, + "weight": 311, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -11986,7 +11986,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 297, + "weight": 283, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -12090,7 +12090,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 289, + "weight": 275, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -12281,7 +12281,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 294, + "weight": 280, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -12416,7 +12416,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 292, + "weight": 278, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -12520,7 +12520,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 296, + "weight": 282, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -12618,7 +12618,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 290, + "weight": 276, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -12721,7 +12721,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 293, + "weight": 279, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -12872,7 +12872,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 291, + "weight": 277, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -12982,7 +12982,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 295, + "weight": 281, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -13081,7 +13081,7 @@ "x-appwrite": { "method": "listDocumentLogs", "group": "logs", - "weight": 298, + "weight": 284, "cookies": false, "type": "", "demo": "databases\/list-document-logs.md", @@ -13174,7 +13174,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 300, + "weight": 286, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -13297,7 +13297,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 299, + "weight": 285, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -13418,7 +13418,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 341, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -13512,7 +13512,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 338, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -13652,7 +13652,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 339, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -13727,7 +13727,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 340, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -13807,7 +13807,7 @@ "x-appwrite": { "method": "listCollectionLogs", "group": "collections", - "weight": 287, + "weight": 273, "cookies": false, "type": "", "demo": "databases\/list-collection-logs.md", @@ -13890,7 +13890,7 @@ "x-appwrite": { "method": "getCollectionUsage", "group": null, - "weight": 288, + "weight": 274, "cookies": false, "type": "", "demo": "databases\/get-collection-usage.md", @@ -13981,7 +13981,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 279, + "weight": 265, "cookies": false, "type": "", "demo": "databases\/list-logs.md", @@ -14086,7 +14086,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 280, + "weight": 266, "cookies": false, "type": "", "demo": "databases\/get-usage.md", @@ -14199,7 +14199,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 431, + "weight": 420, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -14281,7 +14281,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 428, + "weight": 417, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -14369,6 +14369,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -14396,7 +14397,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -14595,7 +14597,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 433, + "weight": 422, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -14645,7 +14647,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 434, + "weight": 423, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -14695,7 +14697,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 457, + "weight": 446, "cookies": false, "type": "", "demo": "functions\/list-templates.md", @@ -14766,6 +14768,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -14793,7 +14796,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -14880,7 +14884,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 456, + "weight": 445, "cookies": false, "type": "", "demo": "functions\/get-template.md", @@ -14938,7 +14942,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 450, + "weight": 439, "cookies": false, "type": "", "demo": "functions\/list-usage.md", @@ -15008,7 +15012,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 429, + "weight": 418, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -15068,7 +15072,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 430, + "weight": 419, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -15158,6 +15162,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -15185,7 +15190,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -15378,7 +15384,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 432, + "weight": 421, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -15440,7 +15446,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 437, + "weight": 426, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -15518,7 +15524,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 438, + "weight": 427, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -15608,7 +15614,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 435, + "weight": 424, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -15701,7 +15707,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 443, + "weight": 432, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -15787,7 +15793,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 440, + "weight": 429, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -15908,7 +15914,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 441, + "weight": 430, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -16005,7 +16011,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 436, + "weight": 425, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -16068,7 +16074,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 439, + "weight": 428, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -16136,7 +16142,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 442, + "weight": 431, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -16222,7 +16228,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 444, + "weight": 433, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -16290,7 +16296,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 447, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -16373,7 +16379,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 445, + "weight": 434, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -16492,7 +16498,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 446, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -16557,7 +16563,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 448, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -16625,7 +16631,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 449, + "weight": 438, "cookies": false, "type": "", "demo": "functions\/get-usage.md", @@ -16703,7 +16709,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 453, + "weight": 442, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -16763,7 +16769,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 451, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -16854,7 +16860,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 452, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -16922,7 +16928,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 454, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -17017,7 +17023,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 455, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -17087,7 +17093,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 190, + "weight": 176, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -17162,7 +17168,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 189, + "weight": 175, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -17235,7 +17241,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 458, + "weight": 447, "cookies": false, "type": "", "demo": "health\/get.md", @@ -17286,7 +17292,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 467, + "weight": 456, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -17337,7 +17343,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 461, + "weight": 450, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -17388,7 +17394,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 464, + "weight": 453, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -17448,7 +17454,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 460, + "weight": 449, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -17499,7 +17505,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 462, + "weight": 451, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -17550,7 +17556,7 @@ "x-appwrite": { "method": "getQueueAudits", "group": "queue", - "weight": 468, + "weight": 457, "cookies": false, "type": "", "demo": "health\/get-queue-audits.md", @@ -17612,7 +17618,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 472, + "weight": 461, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -17674,7 +17680,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 471, + "weight": 460, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -17736,7 +17742,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 473, + "weight": 462, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -17807,7 +17813,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 474, + "weight": 463, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -17869,7 +17875,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 481, + "weight": 470, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -17956,7 +17962,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 478, + "weight": 467, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -18018,7 +18024,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 470, + "weight": 459, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -18080,7 +18086,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 475, + "weight": 464, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -18142,7 +18148,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 476, + "weight": 465, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -18204,7 +18210,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 477, + "weight": 466, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -18266,7 +18272,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 479, + "weight": 468, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -18328,7 +18334,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 480, + "weight": 469, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -18390,7 +18396,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 469, + "weight": 458, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -18452,7 +18458,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 466, + "weight": 455, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -18503,7 +18509,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 465, + "weight": 454, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -18554,7 +18560,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 463, + "weight": 452, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -19029,7 +19035,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 245, + "weight": 231, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -19114,7 +19120,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 242, + "weight": 228, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -19274,7 +19280,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 249, + "weight": 235, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -19441,7 +19447,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 244, + "weight": 230, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -19640,7 +19646,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 251, + "weight": 237, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -19854,7 +19860,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 243, + "weight": 229, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -20044,7 +20050,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 250, + "weight": 236, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -20233,7 +20239,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 248, + "weight": 234, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -20289,7 +20295,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 252, + "weight": 238, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -20350,7 +20356,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 246, + "weight": 232, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -20432,7 +20438,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 247, + "weight": 233, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -20514,7 +20520,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 216, + "weight": 202, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -20599,7 +20605,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 215, + "weight": 201, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -20788,7 +20794,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 229, + "weight": 215, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -20974,7 +20980,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 214, + "weight": 200, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -21132,7 +21138,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 228, + "weight": 214, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -21286,7 +21292,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 205, + "weight": 191, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -21418,7 +21424,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 219, + "weight": 205, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -21547,7 +21553,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 209, + "weight": 195, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -21652,7 +21658,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 223, + "weight": 209, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -21755,7 +21761,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 207, + "weight": 193, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -21874,7 +21880,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 221, + "weight": 207, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -21990,7 +21996,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 206, + "weight": 192, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -22109,7 +22115,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 220, + "weight": 206, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -22225,7 +22231,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 208, + "weight": 194, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -22475,7 +22481,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 222, + "weight": 208, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -22719,7 +22725,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 210, + "weight": 196, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -22825,7 +22831,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 224, + "weight": 210, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -22928,7 +22934,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 211, + "weight": 197, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -23034,7 +23040,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 225, + "weight": 211, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -23137,7 +23143,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 212, + "weight": 198, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -23243,7 +23249,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 226, + "weight": 212, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -23346,7 +23352,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 213, + "weight": 199, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -23452,7 +23458,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 227, + "weight": 213, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -23553,7 +23559,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 218, + "weight": 204, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -23609,7 +23615,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 230, + "weight": 216, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -23670,7 +23676,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 217, + "weight": 203, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -23752,7 +23758,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 239, + "weight": 225, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -23834,7 +23840,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 232, + "weight": 218, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -23917,7 +23923,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 231, + "weight": 217, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -24006,7 +24012,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 234, + "weight": 220, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -24067,7 +24073,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 235, + "weight": 221, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -24149,7 +24155,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 236, + "weight": 222, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -24210,7 +24216,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 233, + "weight": 219, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -24292,7 +24298,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 238, + "weight": 224, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -24383,7 +24389,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 237, + "weight": 223, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -24471,7 +24477,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 240, + "weight": 226, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -24535,7 +24541,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 241, + "weight": 227, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -24606,7 +24612,7 @@ "x-appwrite": { "method": "list", "group": null, - "weight": 197, + "weight": 183, "cookies": false, "type": "", "demo": "migrations\/list.md", @@ -24689,7 +24695,7 @@ "x-appwrite": { "method": "createAppwriteMigration", "group": null, - "weight": 191, + "weight": 177, "cookies": false, "type": "", "demo": "migrations\/create-appwrite-migration.md", @@ -24803,7 +24809,7 @@ "x-appwrite": { "method": "getAppwriteReport", "group": null, - "weight": 199, + "weight": 185, "cookies": false, "type": "", "demo": "migrations\/get-appwrite-report.md", @@ -24912,7 +24918,7 @@ "x-appwrite": { "method": "createCSVExport", "group": null, - "weight": 196, + "weight": 182, "cookies": false, "type": "", "demo": "migrations\/create-csv-export.md", @@ -25038,7 +25044,7 @@ "x-appwrite": { "method": "createCSVImport", "group": null, - "weight": 195, + "weight": 181, "cookies": false, "type": "", "demo": "migrations\/create-csv-import.md", @@ -25129,7 +25135,7 @@ "x-appwrite": { "method": "createFirebaseMigration", "group": null, - "weight": 192, + "weight": 178, "cookies": false, "type": "", "demo": "migrations\/create-firebase-migration.md", @@ -25222,7 +25228,7 @@ "x-appwrite": { "method": "getFirebaseReport", "group": null, - "weight": 200, + "weight": 186, "cookies": false, "type": "", "demo": "migrations\/get-firebase-report.md", @@ -25308,7 +25314,7 @@ "x-appwrite": { "method": "createNHostMigration", "group": null, - "weight": 194, + "weight": 180, "cookies": false, "type": "", "demo": "migrations\/create-n-host-migration.md", @@ -25444,7 +25450,7 @@ "x-appwrite": { "method": "getNHostReport", "group": null, - "weight": 202, + "weight": 188, "cookies": false, "type": "", "demo": "migrations\/get-n-host-report.md", @@ -25580,7 +25586,7 @@ "x-appwrite": { "method": "createSupabaseMigration", "group": null, - "weight": 193, + "weight": 179, "cookies": false, "type": "", "demo": "migrations\/create-supabase-migration.md", @@ -25710,7 +25716,7 @@ "x-appwrite": { "method": "getSupabaseReport", "group": null, - "weight": 201, + "weight": 187, "cookies": false, "type": "", "demo": "migrations\/get-supabase-report.md", @@ -25837,7 +25843,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 198, + "weight": 184, "cookies": false, "type": "", "demo": "migrations\/get.md", @@ -25896,7 +25902,7 @@ "x-appwrite": { "method": "retry", "group": null, - "weight": 203, + "weight": 189, "cookies": false, "type": "", "demo": "migrations\/retry.md", @@ -25950,7 +25956,7 @@ "x-appwrite": { "method": "delete", "group": null, - "weight": 204, + "weight": 190, "cookies": false, "type": "", "demo": "migrations\/delete.md", @@ -26009,7 +26015,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 103, + "weight": 100, "cookies": false, "type": "", "demo": "project\/get-usage.md", @@ -26092,7 +26098,7 @@ "x-appwrite": { "method": "listVariables", "group": null, - "weight": 105, + "weight": 102, "cookies": false, "type": "", "demo": "project\/list-variables.md", @@ -26141,7 +26147,7 @@ "x-appwrite": { "method": "createVariable", "group": null, - "weight": 104, + "weight": 101, "cookies": false, "type": "", "demo": "project\/create-variable.md", @@ -26223,7 +26229,7 @@ "x-appwrite": { "method": "getVariable", "group": null, - "weight": 106, + "weight": 103, "cookies": false, "type": "", "demo": "project\/get-variable.md", @@ -26282,7 +26288,7 @@ "x-appwrite": { "method": "updateVariable", "group": null, - "weight": 107, + "weight": 104, "cookies": false, "type": "", "demo": "project\/update-variable.md", @@ -26368,7 +26374,7 @@ "x-appwrite": { "method": "deleteVariable", "group": null, - "weight": 108, + "weight": 105, "cookies": false, "type": "", "demo": "project\/delete-variable.md", @@ -26427,7 +26433,7 @@ "x-appwrite": { "method": "list", "group": "projects", - "weight": 426, + "weight": 414, "cookies": false, "type": "", "demo": "projects\/list.md", @@ -26507,7 +26513,7 @@ "x-appwrite": { "method": "create", "group": "projects", - "weight": 57, + "weight": 412, "cookies": false, "type": "", "demo": "projects\/create.md", @@ -26656,7 +26662,7 @@ "x-appwrite": { "method": "get", "group": "projects", - "weight": 58, + "weight": 57, "cookies": false, "type": "", "demo": "projects\/get.md", @@ -26715,7 +26721,7 @@ "x-appwrite": { "method": "update", "group": "projects", - "weight": 59, + "weight": 413, "cookies": false, "type": "", "demo": "projects\/update.md", @@ -26842,7 +26848,7 @@ "x-appwrite": { "method": "delete", "group": "projects", - "weight": 76, + "weight": 73, "cookies": false, "type": "", "demo": "projects\/delete.md", @@ -26903,7 +26909,7 @@ "x-appwrite": { "method": "updateApiStatus", "group": "projects", - "weight": 63, + "weight": 60, "cookies": false, "type": "", "demo": "projects\/update-api-status.md", @@ -27060,7 +27066,7 @@ "x-appwrite": { "method": "updateApiStatusAll", "group": "projects", - "weight": 64, + "weight": 61, "cookies": false, "type": "", "demo": "projects\/update-api-status-all.md", @@ -27199,7 +27205,7 @@ "x-appwrite": { "method": "updateAuthDuration", "group": "auth", - "weight": 69, + "weight": 66, "cookies": false, "type": "", "demo": "projects\/update-auth-duration.md", @@ -27279,7 +27285,7 @@ "x-appwrite": { "method": "updateAuthLimit", "group": "auth", - "weight": 68, + "weight": 65, "cookies": false, "type": "", "demo": "projects\/update-auth-limit.md", @@ -27359,7 +27365,7 @@ "x-appwrite": { "method": "updateAuthSessionsLimit", "group": "auth", - "weight": 74, + "weight": 71, "cookies": false, "type": "", "demo": "projects\/update-auth-sessions-limit.md", @@ -27439,7 +27445,7 @@ "x-appwrite": { "method": "updateMembershipsPrivacy", "group": "auth", - "weight": 67, + "weight": 64, "cookies": false, "type": "", "demo": "projects\/update-memberships-privacy.md", @@ -27532,7 +27538,7 @@ "x-appwrite": { "method": "updateMockNumbers", "group": "auth", - "weight": 75, + "weight": 72, "cookies": false, "type": "", "demo": "projects\/update-mock-numbers.md", @@ -27614,7 +27620,7 @@ "x-appwrite": { "method": "updateAuthPasswordDictionary", "group": "auth", - "weight": 72, + "weight": 69, "cookies": false, "type": "", "demo": "projects\/update-auth-password-dictionary.md", @@ -27693,7 +27699,7 @@ "x-appwrite": { "method": "updateAuthPasswordHistory", "group": "auth", - "weight": 71, + "weight": 68, "cookies": false, "type": "", "demo": "projects\/update-auth-password-history.md", @@ -27773,7 +27779,7 @@ "x-appwrite": { "method": "updatePersonalDataCheck", "group": "auth", - "weight": 73, + "weight": 70, "cookies": false, "type": "", "demo": "projects\/update-personal-data-check.md", @@ -27852,7 +27858,7 @@ "x-appwrite": { "method": "updateSessionAlerts", "group": "auth", - "weight": 66, + "weight": 63, "cookies": false, "type": "", "demo": "projects\/update-session-alerts.md", @@ -27931,7 +27937,7 @@ "x-appwrite": { "method": "updateSessionInvalidation", "group": "auth", - "weight": 102, + "weight": 99, "cookies": false, "type": "", "demo": "projects\/update-session-invalidation.md", @@ -28010,7 +28016,7 @@ "x-appwrite": { "method": "updateAuthStatus", "group": "auth", - "weight": 70, + "weight": 67, "cookies": false, "type": "", "demo": "projects\/update-auth-status.md", @@ -28106,7 +28112,7 @@ "x-appwrite": { "method": "listDevKeys", "group": "devKeys", - "weight": 424, + "weight": 410, "cookies": false, "type": "", "demo": "projects\/list-dev-keys.md", @@ -28176,7 +28182,7 @@ "x-appwrite": { "method": "createDevKey", "group": "devKeys", - "weight": 421, + "weight": 407, "cookies": false, "type": "", "demo": "projects\/create-dev-key.md", @@ -28259,7 +28265,7 @@ "x-appwrite": { "method": "getDevKey", "group": "devKeys", - "weight": 423, + "weight": 409, "cookies": false, "type": "", "demo": "projects\/get-dev-key.md", @@ -28325,7 +28331,7 @@ "x-appwrite": { "method": "updateDevKey", "group": "devKeys", - "weight": 422, + "weight": 408, "cookies": false, "type": "", "demo": "projects\/update-dev-key.md", @@ -28411,7 +28417,7 @@ "x-appwrite": { "method": "deleteDevKey", "group": "devKeys", - "weight": 425, + "weight": 411, "cookies": false, "type": "", "demo": "projects\/delete-dev-key.md", @@ -28479,7 +28485,7 @@ "x-appwrite": { "method": "createJWT", "group": "auth", - "weight": 88, + "weight": 85, "cookies": false, "type": "", "demo": "projects\/create-jwt.md", @@ -28625,7 +28631,7 @@ "x-appwrite": { "method": "listKeys", "group": "keys", - "weight": 84, + "weight": 81, "cookies": false, "type": "", "demo": "projects\/list-keys.md", @@ -28657,6 +28663,18 @@ "x-example": "", "in": "path" }, + { + "name": "queries", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: expire, accessedAt, name, scopes", + "required": false, + "type": "array", + "collectionFormat": "multi", + "items": { + "type": "string" + }, + "default": [], + "in": "query" + }, { "name": "total", "description": "When set to false, the total count returned will be 0 and will not be calculated.", @@ -28693,7 +28711,7 @@ "x-appwrite": { "method": "createKey", "group": "keys", - "weight": 83, + "weight": 80, "cookies": false, "type": "", "demo": "projects\/create-key.md", @@ -28731,6 +28749,12 @@ "schema": { "type": "object", "properties": { + "keyId": { + "type": "string", + "description": "Key ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can't start with a special char. Max length is 36 chars.", + "default": "unique()", + "x-example": "" + }, "name": { "type": "string", "description": "Key name. Max length: 128 chars.", @@ -28847,7 +28871,7 @@ "x-appwrite": { "method": "getKey", "group": "keys", - "weight": 85, + "weight": 82, "cookies": false, "type": "", "demo": "projects\/get-key.md", @@ -28914,7 +28938,7 @@ "x-appwrite": { "method": "updateKey", "group": "keys", - "weight": 86, + "weight": 83, "cookies": false, "type": "", "demo": "projects\/update-key.md", @@ -29071,7 +29095,7 @@ "x-appwrite": { "method": "deleteKey", "group": "keys", - "weight": 87, + "weight": 84, "cookies": false, "type": "", "demo": "projects\/delete-key.md", @@ -29140,7 +29164,7 @@ "x-appwrite": { "method": "updateLabels", "group": "projects", - "weight": 427, + "weight": 415, "cookies": false, "type": "", "demo": "projects\/update-labels.md", @@ -29221,7 +29245,7 @@ "x-appwrite": { "method": "updateOAuth2", "group": "auth", - "weight": 65, + "weight": 62, "cookies": false, "type": "", "demo": "projects\/update-o-auth-2.md", @@ -29362,7 +29386,7 @@ "x-appwrite": { "method": "listPlatforms", "group": "platforms", - "weight": 90, + "weight": 87, "cookies": false, "type": "", "demo": "projects\/list-platforms.md", @@ -29430,7 +29454,7 @@ "x-appwrite": { "method": "createPlatform", "group": "platforms", - "weight": 89, + "weight": 86, "cookies": false, "type": "", "demo": "projects\/create-platform.md", @@ -29551,7 +29575,7 @@ "x-appwrite": { "method": "getPlatform", "group": "platforms", - "weight": 91, + "weight": 88, "cookies": false, "type": "", "demo": "projects\/get-platform.md", @@ -29618,7 +29642,7 @@ "x-appwrite": { "method": "updatePlatform", "group": "platforms", - "weight": 92, + "weight": 89, "cookies": false, "type": "", "demo": "projects\/update-platform.md", @@ -29716,7 +29740,7 @@ "x-appwrite": { "method": "deletePlatform", "group": "platforms", - "weight": 93, + "weight": 90, "cookies": false, "type": "", "demo": "projects\/delete-platform.md", @@ -29785,7 +29809,7 @@ "x-appwrite": { "method": "updateServiceStatus", "group": "projects", - "weight": 61, + "weight": 58, "cookies": false, "type": "", "demo": "projects\/update-service-status.md", @@ -29888,7 +29912,7 @@ "x-appwrite": { "method": "updateServiceStatusAll", "group": "projects", - "weight": 62, + "weight": 59, "cookies": false, "type": "", "demo": "projects\/update-service-status-all.md", @@ -29967,7 +29991,7 @@ "x-appwrite": { "method": "updateSmtp", "group": "templates", - "weight": 94, + "weight": 91, "cookies": false, "type": "", "demo": "projects\/update-smtp.md", @@ -30176,7 +30200,7 @@ "x-appwrite": { "method": "createSmtpTest", "group": "templates", - "weight": 95, + "weight": 92, "cookies": false, "type": "", "demo": "projects\/create-smtp-test.md", @@ -30398,7 +30422,7 @@ "x-appwrite": { "method": "updateTeam", "group": "projects", - "weight": 60, + "weight": 416, "cookies": false, "type": "", "demo": "projects\/update-team.md", @@ -30475,7 +30499,7 @@ "x-appwrite": { "method": "getEmailTemplate", "group": "templates", - "weight": 97, + "weight": 94, "cookies": false, "type": "", "demo": "projects\/get-email-template.md", @@ -30696,7 +30720,7 @@ "x-appwrite": { "method": "updateEmailTemplate", "group": "templates", - "weight": 99, + "weight": 96, "cookies": false, "type": "", "demo": "projects\/update-email-template.md", @@ -30962,7 +30986,7 @@ "x-appwrite": { "method": "deleteEmailTemplate", "group": "templates", - "weight": 101, + "weight": 98, "cookies": false, "type": "", "demo": "projects\/delete-email-template.md", @@ -31183,7 +31207,7 @@ "x-appwrite": { "method": "getSmsTemplate", "group": "templates", - "weight": 96, + "weight": 93, "cookies": false, "type": "", "demo": "projects\/get-sms-template.md", @@ -31465,7 +31489,7 @@ "x-appwrite": { "method": "updateSmsTemplate", "group": "templates", - "weight": 98, + "weight": 95, "cookies": false, "type": "", "demo": "projects\/update-sms-template.md", @@ -31769,7 +31793,7 @@ "x-appwrite": { "method": "deleteSmsTemplate", "group": "templates", - "weight": 100, + "weight": 97, "cookies": false, "type": "", "demo": "projects\/delete-sms-template.md", @@ -32051,7 +32075,7 @@ "x-appwrite": { "method": "listWebhooks", "group": "webhooks", - "weight": 78, + "weight": 75, "cookies": false, "type": "", "demo": "projects\/list-webhooks.md", @@ -32119,7 +32143,7 @@ "x-appwrite": { "method": "createWebhook", "group": "webhooks", - "weight": 77, + "weight": 74, "cookies": false, "type": "", "demo": "projects\/create-webhook.md", @@ -32238,7 +32262,7 @@ "x-appwrite": { "method": "getWebhook", "group": "webhooks", - "weight": 79, + "weight": 76, "cookies": false, "type": "", "demo": "projects\/get-webhook.md", @@ -32305,7 +32329,7 @@ "x-appwrite": { "method": "updateWebhook", "group": "webhooks", - "weight": 80, + "weight": 77, "cookies": false, "type": "", "demo": "projects\/update-webhook.md", @@ -32427,7 +32451,7 @@ "x-appwrite": { "method": "deleteWebhook", "group": "webhooks", - "weight": 82, + "weight": 79, "cookies": false, "type": "", "demo": "projects\/delete-webhook.md", @@ -32496,7 +32520,7 @@ "x-appwrite": { "method": "updateWebhookSignature", "group": "webhooks", - "weight": 81, + "weight": 78, "cookies": false, "type": "", "demo": "projects\/update-webhook-signature.md", @@ -32563,7 +32587,7 @@ "x-appwrite": { "method": "listRules", "group": null, - "weight": 528, + "weight": 517, "cookies": false, "type": "", "demo": "proxy\/list-rules.md", @@ -32645,7 +32669,7 @@ "x-appwrite": { "method": "createAPIRule", "group": null, - "weight": 523, + "weight": 512, "cookies": false, "type": "", "demo": "proxy\/create-api-rule.md", @@ -32715,7 +32739,7 @@ "x-appwrite": { "method": "createFunctionRule", "group": null, - "weight": 525, + "weight": 514, "cookies": false, "type": "", "demo": "proxy\/create-function-rule.md", @@ -32798,7 +32822,7 @@ "x-appwrite": { "method": "createRedirectRule", "group": null, - "weight": 526, + "weight": 515, "cookies": false, "type": "", "demo": "proxy\/create-redirect-rule.md", @@ -32919,7 +32943,7 @@ "x-appwrite": { "method": "createSiteRule", "group": null, - "weight": 524, + "weight": 513, "cookies": false, "type": "", "demo": "proxy\/create-site-rule.md", @@ -33000,7 +33024,7 @@ "x-appwrite": { "method": "getRule", "group": null, - "weight": 527, + "weight": 516, "cookies": false, "type": "", "demo": "proxy\/get-rule.md", @@ -33053,7 +33077,7 @@ "x-appwrite": { "method": "deleteRule", "group": null, - "weight": 529, + "weight": 518, "cookies": false, "type": "", "demo": "proxy\/delete-rule.md", @@ -33113,7 +33137,7 @@ "x-appwrite": { "method": "updateRuleVerification", "group": null, - "weight": 530, + "weight": 519, "cookies": false, "type": "", "demo": "proxy\/update-rule-verification.md", @@ -33171,7 +33195,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 485, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -33253,7 +33277,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 483, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -33403,6 +33427,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -33430,7 +33455,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -33525,7 +33551,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 488, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -33575,7 +33601,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 511, + "weight": 500, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -33625,7 +33651,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 507, + "weight": 496, "cookies": false, "type": "", "demo": "sites\/list-templates.md", @@ -33751,7 +33777,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 508, + "weight": 497, "cookies": false, "type": "", "demo": "sites\/get-template.md", @@ -33809,7 +33835,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 509, + "weight": 498, "cookies": false, "type": "", "demo": "sites\/list-usage.md", @@ -33879,7 +33905,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 484, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -33939,7 +33965,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 486, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -34091,6 +34117,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -34118,7 +34145,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -34206,7 +34234,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 487, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -34268,7 +34296,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 494, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -34346,7 +34374,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 493, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -34436,7 +34464,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 489, + "weight": 478, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -34537,7 +34565,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 497, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -34617,7 +34645,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 490, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -34738,7 +34766,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 491, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -34836,7 +34864,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 492, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -34899,7 +34927,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 495, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -34967,7 +34995,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 496, + "weight": 485, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -35053,7 +35081,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 498, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -35121,7 +35149,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 500, + "weight": 489, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -35202,7 +35230,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 499, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -35267,7 +35295,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 501, + "weight": 490, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -35335,7 +35363,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 510, + "weight": 499, "cookies": false, "type": "", "demo": "sites\/get-usage.md", @@ -35413,7 +35441,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 504, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -35473,7 +35501,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 502, + "weight": 491, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -35564,7 +35592,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 503, + "weight": 492, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -35632,7 +35660,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 505, + "weight": 494, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -35727,7 +35755,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 506, + "weight": 495, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -35795,7 +35823,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 538, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -35878,7 +35906,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 536, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -36025,7 +36053,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 537, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -36086,7 +36114,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 539, + "weight": 528, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -36229,7 +36257,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 540, + "weight": 529, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -36290,7 +36318,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 543, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -36383,7 +36411,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 541, + "weight": 530, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -36474,7 +36502,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 542, + "weight": 531, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -36545,7 +36573,7 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 544, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/update-file.md", @@ -36636,7 +36664,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 545, + "weight": 534, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -36707,7 +36735,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 547, + "weight": 536, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -36787,7 +36815,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 546, + "weight": 535, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -36995,7 +37023,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 548, + "weight": 537, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -37075,7 +37103,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 550, + "weight": 539, "cookies": false, "type": "", "demo": "storage\/get-usage.md", @@ -37146,7 +37174,7 @@ "x-appwrite": { "method": "getBucketUsage", "group": null, - "weight": 551, + "weight": 540, "cookies": false, "type": "", "demo": "storage\/get-bucket-usage.md", @@ -37225,7 +37253,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 352, + "weight": 338, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -37308,7 +37336,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 348, + "weight": 334, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -37392,7 +37420,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 419, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -37462,7 +37490,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 415, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -37536,7 +37564,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 416, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -37602,7 +37630,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 417, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -37684,7 +37712,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 418, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -37752,7 +37780,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 420, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -37836,7 +37864,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 354, + "weight": 340, "cookies": false, "type": "", "demo": "tablesdb\/list-usage.md", @@ -37933,7 +37961,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 349, + "weight": 335, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -37994,7 +38022,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 350, + "weight": 336, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -38071,7 +38099,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 351, + "weight": 337, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -38132,7 +38160,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 359, + "weight": 345, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -38226,7 +38254,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 355, + "weight": 341, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -38355,7 +38383,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 356, + "weight": 342, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -38427,7 +38455,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 357, + "weight": 343, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -38531,7 +38559,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 358, + "weight": 344, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -38603,7 +38631,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 364, + "weight": 350, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -38698,7 +38726,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 365, + "weight": 351, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -38810,7 +38838,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 366, + "weight": 352, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -38924,7 +38952,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 367, + "weight": 353, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -39036,7 +39064,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 368, + "weight": 354, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -39150,7 +39178,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 369, + "weight": 355, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -39263,7 +39291,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 370, + "weight": 356, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -39378,7 +39406,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 371, + "weight": 357, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -39500,7 +39528,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 372, + "weight": 358, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -39624,7 +39652,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 373, + "weight": 359, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -39753,7 +39781,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 374, + "weight": 360, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -39884,7 +39912,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 375, + "weight": 361, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -40013,7 +40041,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 376, + "weight": 362, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -40144,7 +40172,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 377, + "weight": 363, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -40256,7 +40284,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 378, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -40370,7 +40398,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 379, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -40476,7 +40504,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 380, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -40589,7 +40617,7 @@ "x-appwrite": { "method": "createLongtextColumn", "group": "columns", - "weight": 397, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-longtext-column.md", @@ -40701,7 +40729,7 @@ "x-appwrite": { "method": "updateLongtextColumn", "group": "columns", - "weight": 398, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-longtext-column.md", @@ -40815,7 +40843,7 @@ "x-appwrite": { "method": "createMediumtextColumn", "group": "columns", - "weight": 395, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-mediumtext-column.md", @@ -40927,7 +40955,7 @@ "x-appwrite": { "method": "updateMediumtextColumn", "group": "columns", - "weight": 396, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-mediumtext-column.md", @@ -41041,7 +41069,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 381, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -41147,7 +41175,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 382, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -41260,7 +41288,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 383, + "weight": 369, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -41366,7 +41394,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 384, + "weight": 370, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -41479,7 +41507,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 385, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -41619,7 +41647,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 387, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -41749,7 +41777,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 388, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -41875,7 +41903,7 @@ "x-appwrite": { "method": "createTextColumn", "group": "columns", - "weight": 393, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/create-text-column.md", @@ -41987,7 +42015,7 @@ "x-appwrite": { "method": "updateTextColumn", "group": "columns", - "weight": 394, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/update-text-column.md", @@ -42101,7 +42129,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 389, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -42214,7 +42242,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 390, + "weight": 376, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -42329,7 +42357,7 @@ "x-appwrite": { "method": "createVarcharColumn", "group": "columns", - "weight": 391, + "weight": 377, "cookies": false, "type": "", "demo": "tablesdb\/create-varchar-column.md", @@ -42449,7 +42477,7 @@ "x-appwrite": { "method": "updateVarcharColumn", "group": "columns", - "weight": 392, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/update-varchar-column.md", @@ -42600,7 +42628,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 362, + "weight": 348, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -42674,7 +42702,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 363, + "weight": 349, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -42755,7 +42783,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 386, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -42864,7 +42892,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 402, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -42957,7 +42985,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 399, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -43096,7 +43124,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 400, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -43170,7 +43198,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 401, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -43249,7 +43277,7 @@ "x-appwrite": { "method": "listTableLogs", "group": "tables", - "weight": 360, + "weight": 346, "cookies": false, "type": "", "demo": "tablesdb\/list-table-logs.md", @@ -43331,7 +43359,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 411, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -43434,7 +43462,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 403, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -43616,7 +43644,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 408, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -43746,7 +43774,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 406, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -43849,7 +43877,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 410, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -43946,7 +43974,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 404, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -44048,7 +44076,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 407, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -44194,7 +44222,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 405, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -44303,7 +44331,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 409, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -44401,7 +44429,7 @@ "x-appwrite": { "method": "listRowLogs", "group": "logs", - "weight": 412, + "weight": 398, "cookies": false, "type": "", "demo": "tablesdb\/list-row-logs.md", @@ -44493,7 +44521,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 414, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -44615,7 +44643,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 413, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -44735,7 +44763,7 @@ "x-appwrite": { "method": "getTableUsage", "group": null, - "weight": 361, + "weight": 347, "cookies": false, "type": "", "demo": "tablesdb\/get-table-usage.md", @@ -44825,7 +44853,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 353, + "weight": 339, "cookies": false, "type": "", "demo": "tablesdb\/get-usage.md", @@ -44933,7 +44961,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 110, + "weight": 107, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -45018,7 +45046,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 109, + "weight": 106, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -45109,7 +45137,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 111, + "weight": 108, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -45172,7 +45200,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 113, + "weight": 110, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -45248,7 +45276,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 115, + "weight": 112, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -45311,7 +45339,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 122, + "weight": 119, "cookies": false, "type": "", "demo": "teams\/list-logs.md", @@ -45391,7 +45419,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 117, + "weight": 114, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -45484,7 +45512,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 116, + "weight": 113, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -45552,14 +45580,7 @@ "default": null, "x-example": null, "items": { - "type": "string", - "enum": [ - "admin", - "developer", - "owner" - ], - "x-enum-name": null, - "x-enum-keys": [] + "type": "string" } }, "url": { @@ -45608,7 +45629,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 118, + "weight": 115, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -45679,7 +45700,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 119, + "weight": 116, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -45735,14 +45756,7 @@ "default": null, "x-example": null, "items": { - "type": "string", - "enum": [ - "admin", - "developer", - "owner" - ], - "x-enum-name": null, - "x-enum-keys": [] + "type": "string" } } }, @@ -45773,7 +45787,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 121, + "weight": 118, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -45846,7 +45860,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 120, + "weight": 117, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -45941,7 +45955,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 112, + "weight": 109, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -46003,7 +46017,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 114, + "weight": 111, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -46083,7 +46097,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 533, + "weight": 522, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -46172,7 +46186,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 531, + "weight": 520, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -46256,7 +46270,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 532, + "weight": 521, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -46316,7 +46330,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 534, + "weight": 523, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -46387,7 +46401,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 535, + "weight": 524, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -46447,7 +46461,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 132, + "weight": 129, "cookies": false, "type": "", "demo": "users\/list.md", @@ -46530,7 +46544,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 123, + "weight": 120, "cookies": false, "type": "", "demo": "users\/create.md", @@ -46631,7 +46645,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 126, + "weight": 123, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -46726,7 +46740,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 124, + "weight": 121, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -46819,7 +46833,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 140, + "weight": 137, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -46899,7 +46913,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 163, + "weight": 160, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -46962,7 +46976,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 125, + "weight": 122, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -47057,7 +47071,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 128, + "weight": 125, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -47152,7 +47166,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 129, + "weight": 126, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -47286,7 +47300,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 130, + "weight": 127, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -47402,7 +47416,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 127, + "weight": 124, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -47516,7 +47530,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 165, + "weight": 162, "cookies": false, "type": "", "demo": "users\/get-usage.md", @@ -47587,7 +47601,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 133, + "weight": 130, "cookies": false, "type": "", "demo": "users\/get.md", @@ -47643,7 +47657,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 161, + "weight": 158, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -47706,7 +47720,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 146, + "weight": 143, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -47788,7 +47802,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 164, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -47873,7 +47887,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 142, + "weight": 139, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -47955,7 +47969,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 138, + "weight": 135, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -48037,7 +48051,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 137, + "weight": 134, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -48130,7 +48144,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 151, + "weight": 148, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -48266,7 +48280,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 156, + "weight": 153, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -48398,7 +48412,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 152, + "weight": 149, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -48515,7 +48529,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 153, + "weight": 150, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -48632,7 +48646,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 155, + "weight": 152, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -48749,7 +48763,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 154, + "weight": 151, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -48868,7 +48882,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 144, + "weight": 141, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -48949,7 +48963,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 145, + "weight": 142, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -49030,7 +49044,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 147, + "weight": 144, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -49110,7 +49124,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 134, + "weight": 131, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -49171,7 +49185,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 149, + "weight": 146, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -49250,7 +49264,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 136, + "weight": 133, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -49320,7 +49334,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 157, + "weight": 154, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -49376,7 +49390,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 160, + "weight": 157, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -49434,7 +49448,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 159, + "weight": 156, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -49505,7 +49519,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 141, + "weight": 138, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -49584,7 +49598,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 139, + "weight": 136, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -49666,7 +49680,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 131, + "weight": 128, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -49778,7 +49792,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 135, + "weight": 132, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -49847,7 +49861,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 150, + "weight": 147, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -49938,7 +49952,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 162, + "weight": 159, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -50009,7 +50023,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 158, + "weight": 155, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -50095,7 +50109,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 148, + "weight": 145, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -50176,7 +50190,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 143, + "weight": 140, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -50257,7 +50271,7 @@ "x-appwrite": { "method": "createRepositoryDetection", "group": "repositories", - "weight": 169, + "weight": 551, "cookies": false, "type": "", "demo": "vcs\/create-repository-detection.md", @@ -50353,7 +50367,7 @@ "x-appwrite": { "method": "listRepositories", "group": "repositories", - "weight": 170, + "weight": 548, "cookies": false, "type": "", "demo": "vcs\/list-repositories.md", @@ -50447,7 +50461,7 @@ "x-appwrite": { "method": "createRepository", "group": "repositories", - "weight": 171, + "weight": 546, "cookies": false, "type": "", "demo": "vcs\/create-repository.md", @@ -50531,7 +50545,7 @@ "x-appwrite": { "method": "getRepository", "group": "repositories", - "weight": 172, + "weight": 547, "cookies": false, "type": "", "demo": "vcs\/get-repository.md", @@ -50598,7 +50612,7 @@ "x-appwrite": { "method": "listRepositoryBranches", "group": "repositories", - "weight": 173, + "weight": 549, "cookies": false, "type": "", "demo": "vcs\/list-repository-branches.md", @@ -50665,7 +50679,7 @@ "x-appwrite": { "method": "getRepositoryContents", "group": "repositories", - "weight": 168, + "weight": 550, "cookies": false, "type": "", "demo": "vcs\/get-repository-contents.md", @@ -50749,7 +50763,7 @@ "x-appwrite": { "method": "updateExternalDeployments", "group": "repositories", - "weight": 178, + "weight": 164, "cookies": false, "type": "", "demo": "vcs\/update-external-deployments.md", @@ -50834,7 +50848,7 @@ "x-appwrite": { "method": "listInstallations", "group": "installations", - "weight": 175, + "weight": 544, "cookies": false, "type": "", "demo": "vcs\/list-installations.md", @@ -50915,7 +50929,7 @@ "x-appwrite": { "method": "getInstallation", "group": "installations", - "weight": 176, + "weight": 543, "cookies": false, "type": "", "demo": "vcs\/get-installation.md", @@ -50969,7 +50983,7 @@ "x-appwrite": { "method": "deleteInstallation", "group": "installations", - "weight": 177, + "weight": 545, "cookies": false, "type": "", "demo": "vcs\/delete-installation.md", @@ -52726,6 +52740,18 @@ "$ref": "#\/definitions\/index" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum document size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used document size in bytes based on defined attributes.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -52738,7 +52764,9 @@ "enabled", "documentSecurity", "attributes", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -52752,7 +52780,9 @@ "enabled": false, "documentSecurity": true, "attributes": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "attributeList": { @@ -54520,6 +54550,18 @@ "$ref": "#\/definitions\/columnIndex" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum row size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used row size in bytes based on defined columns.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -54532,7 +54574,9 @@ "enabled", "rowSecurity", "columns", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -54546,7 +54590,9 @@ "enabled": false, "rowSecurity": true, "columns": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "columnList": { diff --git a/app/config/specs/swagger2-1.8.x-server.json b/app/config/specs/swagger2-1.8.x-server.json index 83f6a7ab7e..29262b5dd9 100644 --- a/app/config/specs/swagger2-1.8.x-server.json +++ b/app/config/specs/swagger2-1.8.x-server.json @@ -628,7 +628,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 253, + "weight": 239, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -704,7 +704,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 255, + "weight": 241, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -831,7 +831,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 256, + "weight": 242, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -975,7 +975,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 257, + "weight": 243, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1102,7 +1102,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 261, + "weight": 247, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1242,7 +1242,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 262, + "weight": 248, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1385,7 +1385,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 254, + "weight": 240, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1489,7 +1489,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 260, + "weight": 246, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1593,7 +1593,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 258, + "weight": 244, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1697,7 +1697,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 259, + "weight": 245, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -3919,7 +3919,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 264, + "weight": 250, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4047,7 +4047,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 263, + "weight": 249, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4181,7 +4181,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 267, + "weight": 253, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4247,7 +4247,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 265, + "weight": 251, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4737,7 +4737,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 266, + "weight": 252, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4823,7 +4823,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 269, + "weight": 255, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -4917,7 +4917,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 268, + "weight": 254, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5011,7 +5011,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 270, + "weight": 256, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5726,7 +5726,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 278, + "weight": 264, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -5844,7 +5844,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 274, + "weight": 260, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -5966,7 +5966,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 346, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6035,7 +6035,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 342, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6108,7 +6108,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 343, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6173,7 +6173,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 344, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6254,7 +6254,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 345, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6321,7 +6321,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 347, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6404,7 +6404,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 275, + "weight": 261, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -6500,7 +6500,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 276, + "weight": 262, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -6614,7 +6614,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 277, + "weight": 263, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -6709,7 +6709,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 286, + "weight": 272, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -6805,7 +6805,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 282, + "weight": 268, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -6936,7 +6936,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 283, + "weight": 269, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -7010,7 +7010,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 284, + "weight": 270, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7116,7 +7116,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 285, + "weight": 271, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7190,7 +7190,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 303, + "weight": 289, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7287,7 +7287,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 304, + "weight": 290, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7401,7 +7401,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 305, + "weight": 291, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -7517,7 +7517,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 306, + "weight": 292, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -7631,7 +7631,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 307, + "weight": 293, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -7747,7 +7747,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 308, + "weight": 294, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -7862,7 +7862,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 309, + "weight": 295, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -7979,7 +7979,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 310, + "weight": 296, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8103,7 +8103,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 311, + "weight": 297, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8229,7 +8229,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 312, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8360,7 +8360,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 313, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -8493,7 +8493,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 314, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -8624,7 +8624,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 315, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -8757,7 +8757,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 316, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -8871,7 +8871,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 317, + "weight": 303, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -8987,7 +8987,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 318, + "weight": 304, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9095,7 +9095,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 319, + "weight": 305, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9210,7 +9210,7 @@ "x-appwrite": { "method": "createLongtextAttribute", "group": "attributes", - "weight": 336, + "weight": 322, "cookies": false, "type": "", "demo": "databases\/create-longtext-attribute.md", @@ -9320,7 +9320,7 @@ "x-appwrite": { "method": "updateLongtextAttribute", "group": "attributes", - "weight": 337, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/update-longtext-attribute.md", @@ -9432,7 +9432,7 @@ "x-appwrite": { "method": "createMediumtextAttribute", "group": "attributes", - "weight": 334, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/create-mediumtext-attribute.md", @@ -9542,7 +9542,7 @@ "x-appwrite": { "method": "updateMediumtextAttribute", "group": "attributes", - "weight": 335, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/update-mediumtext-attribute.md", @@ -9654,7 +9654,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 320, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -9762,7 +9762,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 321, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -9877,7 +9877,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 322, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -9985,7 +9985,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 323, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -10100,7 +10100,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 324, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -10242,7 +10242,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 326, + "weight": 312, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -10370,7 +10370,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 327, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -10494,7 +10494,7 @@ "x-appwrite": { "method": "createTextAttribute", "group": "attributes", - "weight": 332, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/create-text-attribute.md", @@ -10604,7 +10604,7 @@ "x-appwrite": { "method": "updateTextAttribute", "group": "attributes", - "weight": 333, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/update-text-attribute.md", @@ -10716,7 +10716,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 328, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -10831,7 +10831,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 329, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -10948,7 +10948,7 @@ "x-appwrite": { "method": "createVarcharAttribute", "group": "attributes", - "weight": 330, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/create-varchar-attribute.md", @@ -11066,7 +11066,7 @@ "x-appwrite": { "method": "updateVarcharAttribute", "group": "attributes", - "weight": 331, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/update-varchar-attribute.md", @@ -11215,7 +11215,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 301, + "weight": 287, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -11291,7 +11291,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 302, + "weight": 288, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -11374,7 +11374,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 325, + "weight": 311, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -11485,7 +11485,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 297, + "weight": 283, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -11591,7 +11591,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 289, + "weight": 275, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -11786,7 +11786,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 294, + "weight": 280, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -11923,7 +11923,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 292, + "weight": 278, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -12028,7 +12028,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 296, + "weight": 282, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -12127,7 +12127,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 290, + "weight": 276, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -12232,7 +12232,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 293, + "weight": 279, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -12386,7 +12386,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 291, + "weight": 277, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -12498,7 +12498,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 295, + "weight": 281, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -12601,7 +12601,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 300, + "weight": 286, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -12726,7 +12726,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 299, + "weight": 285, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -12849,7 +12849,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 341, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -12944,7 +12944,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 338, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -13085,7 +13085,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 339, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -13161,7 +13161,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 340, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -13242,7 +13242,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 431, + "weight": 420, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -13325,7 +13325,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 428, + "weight": 417, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -13414,6 +13414,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -13441,7 +13442,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -13640,7 +13642,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 433, + "weight": 422, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -13691,7 +13693,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 434, + "weight": 423, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -13742,7 +13744,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 429, + "weight": 418, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -13803,7 +13805,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 430, + "weight": 419, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -13894,6 +13896,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -13921,7 +13924,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -14114,7 +14118,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 432, + "weight": 421, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -14177,7 +14181,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 437, + "weight": 426, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -14256,7 +14260,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 438, + "weight": 427, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -14347,7 +14351,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 435, + "weight": 424, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -14441,7 +14445,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 443, + "weight": 432, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -14528,7 +14532,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 440, + "weight": 429, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -14650,7 +14654,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 441, + "weight": 430, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -14748,7 +14752,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 436, + "weight": 425, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -14812,7 +14816,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 439, + "weight": 428, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -14881,7 +14885,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 442, + "weight": 431, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -14968,7 +14972,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 444, + "weight": 433, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -15037,7 +15041,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 447, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -15122,7 +15126,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 445, + "weight": 434, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -15243,7 +15247,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 446, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -15310,7 +15314,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 448, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -15379,7 +15383,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 453, + "weight": 442, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -15440,7 +15444,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 451, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -15532,7 +15536,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 452, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -15601,7 +15605,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 454, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -15697,7 +15701,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 455, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -15768,7 +15772,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 190, + "weight": 176, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -15845,7 +15849,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 189, + "weight": 175, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -15920,7 +15924,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 458, + "weight": 447, "cookies": false, "type": "", "demo": "health\/get.md", @@ -15972,7 +15976,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 467, + "weight": 456, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -16024,7 +16028,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 461, + "weight": 450, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -16076,7 +16080,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 464, + "weight": 453, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -16137,7 +16141,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 460, + "weight": 449, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -16189,7 +16193,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 462, + "weight": 451, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -16241,7 +16245,7 @@ "x-appwrite": { "method": "getQueueAudits", "group": "queue", - "weight": 468, + "weight": 457, "cookies": false, "type": "", "demo": "health\/get-queue-audits.md", @@ -16304,7 +16308,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 472, + "weight": 461, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -16367,7 +16371,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 471, + "weight": 460, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -16430,7 +16434,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 473, + "weight": 462, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -16502,7 +16506,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 474, + "weight": 463, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -16565,7 +16569,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 481, + "weight": 470, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -16653,7 +16657,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 478, + "weight": 467, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -16716,7 +16720,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 470, + "weight": 459, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -16779,7 +16783,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 475, + "weight": 464, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -16842,7 +16846,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 476, + "weight": 465, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -16905,7 +16909,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 477, + "weight": 466, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -16968,7 +16972,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 479, + "weight": 468, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -17031,7 +17035,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 480, + "weight": 469, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -17094,7 +17098,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 469, + "weight": 458, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -17157,7 +17161,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 466, + "weight": 455, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -17209,7 +17213,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 465, + "weight": 454, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -17261,7 +17265,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 463, + "weight": 452, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -17753,7 +17757,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 245, + "weight": 231, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -17839,7 +17843,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 242, + "weight": 228, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -18000,7 +18004,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 249, + "weight": 235, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -18168,7 +18172,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 244, + "weight": 230, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -18368,7 +18372,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 251, + "weight": 237, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -18583,7 +18587,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 243, + "weight": 229, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -18776,7 +18780,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 250, + "weight": 236, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -18968,7 +18972,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 248, + "weight": 234, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -19025,7 +19029,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 252, + "weight": 238, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -19087,7 +19091,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 246, + "weight": 232, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -19170,7 +19174,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 247, + "weight": 233, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -19253,7 +19257,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 216, + "weight": 202, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -19339,7 +19343,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 215, + "weight": 201, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -19531,7 +19535,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 229, + "weight": 215, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -19720,7 +19724,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 214, + "weight": 200, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -19881,7 +19885,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 228, + "weight": 214, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -20038,7 +20042,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 205, + "weight": 191, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -20171,7 +20175,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 219, + "weight": 205, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -20301,7 +20305,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 209, + "weight": 195, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -20407,7 +20411,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 223, + "weight": 209, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -20511,7 +20515,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 207, + "weight": 193, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -20631,7 +20635,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 221, + "weight": 207, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -20748,7 +20752,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 206, + "weight": 192, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -20868,7 +20872,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 220, + "weight": 206, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -20985,7 +20989,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 208, + "weight": 194, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -21238,7 +21242,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 222, + "weight": 208, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -21485,7 +21489,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 210, + "weight": 196, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -21592,7 +21596,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 224, + "weight": 210, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -21696,7 +21700,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 211, + "weight": 197, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -21803,7 +21807,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 225, + "weight": 211, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -21907,7 +21911,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 212, + "weight": 198, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -22014,7 +22018,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 226, + "weight": 212, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -22118,7 +22122,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 213, + "weight": 199, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -22225,7 +22229,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 227, + "weight": 213, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -22327,7 +22331,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 218, + "weight": 204, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -22384,7 +22388,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 230, + "weight": 216, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -22446,7 +22450,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 217, + "weight": 203, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -22529,7 +22533,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 239, + "weight": 225, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -22612,7 +22616,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 232, + "weight": 218, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -22696,7 +22700,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 231, + "weight": 217, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -22786,7 +22790,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 234, + "weight": 220, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -22848,7 +22852,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 235, + "weight": 221, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -22931,7 +22935,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 236, + "weight": 222, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -22993,7 +22997,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 233, + "weight": 219, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -23076,7 +23080,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 238, + "weight": 224, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -23168,7 +23172,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 237, + "weight": 223, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -23258,7 +23262,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 240, + "weight": 226, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -23323,7 +23327,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 241, + "weight": 227, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -23396,7 +23400,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 485, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -23479,7 +23483,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 483, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -23630,6 +23634,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -23657,7 +23662,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -23752,7 +23758,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 488, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -23803,7 +23809,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 511, + "weight": 500, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -23854,7 +23860,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 484, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -23915,7 +23921,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 486, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -24068,6 +24074,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -24095,7 +24102,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -24183,7 +24191,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 487, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -24246,7 +24254,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 494, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -24325,7 +24333,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 493, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -24416,7 +24424,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 489, + "weight": 478, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -24518,7 +24526,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 497, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -24599,7 +24607,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 490, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -24721,7 +24729,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 491, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -24820,7 +24828,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 492, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -24884,7 +24892,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 495, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -24953,7 +24961,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 496, + "weight": 485, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -25040,7 +25048,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 498, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -25109,7 +25117,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 500, + "weight": 489, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -25191,7 +25199,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 499, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -25257,7 +25265,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 501, + "weight": 490, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -25326,7 +25334,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 504, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -25387,7 +25395,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 502, + "weight": 491, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -25479,7 +25487,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 503, + "weight": 492, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -25548,7 +25556,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 505, + "weight": 494, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -25644,7 +25652,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 506, + "weight": 495, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -25713,7 +25721,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 538, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -25797,7 +25805,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 536, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -25945,7 +25953,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 537, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -26007,7 +26015,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 539, + "weight": 528, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -26151,7 +26159,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 540, + "weight": 529, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -26213,7 +26221,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 543, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -26308,7 +26316,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 541, + "weight": 530, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -26401,7 +26409,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 542, + "weight": 531, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -26474,7 +26482,7 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 544, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/update-file.md", @@ -26567,7 +26575,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 545, + "weight": 534, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -26640,7 +26648,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 547, + "weight": 536, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -26722,7 +26730,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 546, + "weight": 535, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -26932,7 +26940,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 548, + "weight": 537, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -27014,7 +27022,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 352, + "weight": 338, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -27098,7 +27106,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 348, + "weight": 334, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -27183,7 +27191,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 419, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -27255,7 +27263,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 415, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -27331,7 +27339,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 416, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -27399,7 +27407,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 417, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -27483,7 +27491,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 418, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -27553,7 +27561,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 420, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -27639,7 +27647,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 349, + "weight": 335, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -27701,7 +27709,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 350, + "weight": 336, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -27779,7 +27787,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 351, + "weight": 337, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -27841,7 +27849,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 359, + "weight": 345, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -27936,7 +27944,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 355, + "weight": 341, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -28066,7 +28074,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 356, + "weight": 342, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -28139,7 +28147,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 357, + "weight": 343, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -28244,7 +28252,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 358, + "weight": 344, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -28317,7 +28325,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 364, + "weight": 350, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -28413,7 +28421,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 365, + "weight": 351, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -28526,7 +28534,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 366, + "weight": 352, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -28641,7 +28649,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 367, + "weight": 353, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -28754,7 +28762,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 368, + "weight": 354, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -28869,7 +28877,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 369, + "weight": 355, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -28983,7 +28991,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 370, + "weight": 356, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -29099,7 +29107,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 371, + "weight": 357, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -29222,7 +29230,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 372, + "weight": 358, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -29347,7 +29355,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 373, + "weight": 359, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -29477,7 +29485,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 374, + "weight": 360, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -29609,7 +29617,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 375, + "weight": 361, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -29739,7 +29747,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 376, + "weight": 362, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -29871,7 +29879,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 377, + "weight": 363, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -29984,7 +29992,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 378, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -30099,7 +30107,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 379, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -30206,7 +30214,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 380, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -30320,7 +30328,7 @@ "x-appwrite": { "method": "createLongtextColumn", "group": "columns", - "weight": 397, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-longtext-column.md", @@ -30433,7 +30441,7 @@ "x-appwrite": { "method": "updateLongtextColumn", "group": "columns", - "weight": 398, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-longtext-column.md", @@ -30548,7 +30556,7 @@ "x-appwrite": { "method": "createMediumtextColumn", "group": "columns", - "weight": 395, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-mediumtext-column.md", @@ -30661,7 +30669,7 @@ "x-appwrite": { "method": "updateMediumtextColumn", "group": "columns", - "weight": 396, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-mediumtext-column.md", @@ -30776,7 +30784,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 381, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -30883,7 +30891,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 382, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -30997,7 +31005,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 383, + "weight": 369, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -31104,7 +31112,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 384, + "weight": 370, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -31218,7 +31226,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 385, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -31359,7 +31367,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 387, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -31490,7 +31498,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 388, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -31617,7 +31625,7 @@ "x-appwrite": { "method": "createTextColumn", "group": "columns", - "weight": 393, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/create-text-column.md", @@ -31730,7 +31738,7 @@ "x-appwrite": { "method": "updateTextColumn", "group": "columns", - "weight": 394, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/update-text-column.md", @@ -31845,7 +31853,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 389, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -31959,7 +31967,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 390, + "weight": 376, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -32075,7 +32083,7 @@ "x-appwrite": { "method": "createVarcharColumn", "group": "columns", - "weight": 391, + "weight": 377, "cookies": false, "type": "", "demo": "tablesdb\/create-varchar-column.md", @@ -32196,7 +32204,7 @@ "x-appwrite": { "method": "updateVarcharColumn", "group": "columns", - "weight": 392, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/update-varchar-column.md", @@ -32348,7 +32356,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 362, + "weight": 348, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -32423,7 +32431,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 363, + "weight": 349, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -32505,7 +32513,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 386, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -32615,7 +32623,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 402, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -32709,7 +32717,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 399, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -32849,7 +32857,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 400, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -32924,7 +32932,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 401, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -33004,7 +33012,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 411, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -33109,7 +33117,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 403, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -33295,7 +33303,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 408, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -33427,7 +33435,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 406, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -33531,7 +33539,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 410, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -33629,7 +33637,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 404, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -33733,7 +33741,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 407, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -33882,7 +33890,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 405, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -33993,7 +34001,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 409, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -34095,7 +34103,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 414, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -34219,7 +34227,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 413, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -34341,7 +34349,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 110, + "weight": 107, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -34428,7 +34436,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 109, + "weight": 106, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -34521,7 +34529,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 111, + "weight": 108, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -34586,7 +34594,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 113, + "weight": 110, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -34664,7 +34672,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 115, + "weight": 112, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -34729,7 +34737,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 117, + "weight": 114, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -34824,7 +34832,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 116, + "weight": 113, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -34894,14 +34902,7 @@ "default": null, "x-example": null, "items": { - "type": "string", - "enum": [ - "admin", - "developer", - "owner" - ], - "x-enum-name": null, - "x-enum-keys": [] + "type": "string" } }, "url": { @@ -34950,7 +34951,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 118, + "weight": 115, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -35023,7 +35024,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 119, + "weight": 116, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -35081,14 +35082,7 @@ "default": null, "x-example": null, "items": { - "type": "string", - "enum": [ - "admin", - "developer", - "owner" - ], - "x-enum-name": null, - "x-enum-keys": [] + "type": "string" } } }, @@ -35119,7 +35113,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 121, + "weight": 118, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -35194,7 +35188,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 120, + "weight": 117, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -35291,7 +35285,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 112, + "weight": 109, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -35355,7 +35349,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 114, + "weight": 111, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -35437,7 +35431,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 533, + "weight": 522, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -35527,7 +35521,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 531, + "weight": 520, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -35612,7 +35606,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 532, + "weight": 521, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -35673,7 +35667,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 534, + "weight": 523, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -35745,7 +35739,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 535, + "weight": 524, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -35806,7 +35800,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 132, + "weight": 129, "cookies": false, "type": "", "demo": "users\/list.md", @@ -35890,7 +35884,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 123, + "weight": 120, "cookies": false, "type": "", "demo": "users\/create.md", @@ -35992,7 +35986,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 126, + "weight": 123, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -36088,7 +36082,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 124, + "weight": 121, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -36182,7 +36176,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 140, + "weight": 137, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -36263,7 +36257,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 163, + "weight": 160, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -36327,7 +36321,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 125, + "weight": 122, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -36423,7 +36417,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 128, + "weight": 125, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -36519,7 +36513,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 129, + "weight": 126, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -36654,7 +36648,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 130, + "weight": 127, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -36771,7 +36765,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 127, + "weight": 124, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -36886,7 +36880,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 133, + "weight": 130, "cookies": false, "type": "", "demo": "users\/get.md", @@ -36943,7 +36937,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 161, + "weight": 158, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -37007,7 +37001,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 146, + "weight": 143, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -37090,7 +37084,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 164, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -37176,7 +37170,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 142, + "weight": 139, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -37259,7 +37253,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 138, + "weight": 135, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -37342,7 +37336,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 137, + "weight": 134, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -37436,7 +37430,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 151, + "weight": 148, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -37575,7 +37569,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 156, + "weight": 153, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -37710,7 +37704,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 152, + "weight": 149, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -37830,7 +37824,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 153, + "weight": 150, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -37950,7 +37944,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 155, + "weight": 152, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -38070,7 +38064,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 154, + "weight": 151, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -38192,7 +38186,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 144, + "weight": 141, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -38274,7 +38268,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 145, + "weight": 142, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -38356,7 +38350,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 147, + "weight": 144, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -38437,7 +38431,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 134, + "weight": 131, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -38499,7 +38493,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 149, + "weight": 146, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -38579,7 +38573,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 136, + "weight": 133, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -38650,7 +38644,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 157, + "weight": 154, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -38707,7 +38701,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 160, + "weight": 157, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -38766,7 +38760,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 159, + "weight": 156, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -38838,7 +38832,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 141, + "weight": 138, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -38918,7 +38912,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 139, + "weight": 136, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -39001,7 +38995,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 131, + "weight": 128, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -39114,7 +39108,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 135, + "weight": 132, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -39184,7 +39178,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 150, + "weight": 147, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -39276,7 +39270,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 162, + "weight": 159, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -39348,7 +39342,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 158, + "weight": 155, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -39435,7 +39429,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 148, + "weight": 145, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -39517,7 +39511,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 143, + "weight": 140, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -40889,6 +40883,18 @@ "$ref": "#\/definitions\/index" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum document size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used document size in bytes based on defined attributes.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -40901,7 +40907,9 @@ "enabled", "documentSecurity", "attributes", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -40915,7 +40923,9 @@ "enabled": false, "documentSecurity": true, "attributes": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "attributeList": { @@ -42683,6 +42693,18 @@ "$ref": "#\/definitions\/columnIndex" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum row size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used row size in bytes based on defined columns.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -42695,7 +42717,9 @@ "enabled", "rowSecurity", "columns", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -42709,7 +42733,9 @@ "enabled": false, "rowSecurity": true, "columns": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "columnList": { diff --git a/app/config/specs/swagger2-latest-client.json b/app/config/specs/swagger2-latest-client.json index e265c1fd93..f28704dcbf 100644 --- a/app/config/specs/swagger2-latest-client.json +++ b/app/config/specs/swagger2-latest-client.json @@ -612,7 +612,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 253, + "weight": 239, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -687,7 +687,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 255, + "weight": 241, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -811,7 +811,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 256, + "weight": 242, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -952,7 +952,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 257, + "weight": 243, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1076,7 +1076,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 261, + "weight": 247, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1213,7 +1213,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 262, + "weight": 248, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1353,7 +1353,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 254, + "weight": 240, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1454,7 +1454,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 260, + "weight": 246, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1555,7 +1555,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 258, + "weight": 244, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1656,7 +1656,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 259, + "weight": 245, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -4203,7 +4203,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 264, + "weight": 250, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4329,7 +4329,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 263, + "weight": 249, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4461,7 +4461,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 267, + "weight": 253, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4525,7 +4525,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 265, + "weight": 251, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -5013,7 +5013,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 266, + "weight": 252, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -5097,7 +5097,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 269, + "weight": 255, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5189,7 +5189,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 268, + "weight": 254, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5281,7 +5281,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 270, + "weight": 256, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5994,7 +5994,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 346, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6061,7 +6061,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 342, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6132,7 +6132,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 343, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6195,7 +6195,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 344, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6274,7 +6274,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 345, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6339,7 +6339,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 347, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6420,7 +6420,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 297, + "weight": 283, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -6524,7 +6524,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 289, + "weight": 275, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -6683,7 +6683,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 290, + "weight": 276, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -6786,7 +6786,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 293, + "weight": 279, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -6937,7 +6937,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 291, + "weight": 277, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -7047,7 +7047,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 295, + "weight": 281, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -7148,7 +7148,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 300, + "weight": 286, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -7271,7 +7271,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 299, + "weight": 285, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -7392,7 +7392,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 447, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -7475,7 +7475,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 445, + "weight": 434, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -7594,7 +7594,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 446, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -7666,7 +7666,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 190, + "weight": 176, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -7741,7 +7741,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 189, + "weight": 175, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -8240,7 +8240,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 237, + "weight": 223, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -8325,7 +8325,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 241, + "weight": 227, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -8396,7 +8396,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 543, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -8489,7 +8489,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 541, + "weight": 530, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -8580,7 +8580,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 542, + "weight": 531, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -8651,7 +8651,7 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 544, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/update-file.md", @@ -8742,7 +8742,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 545, + "weight": 534, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -8813,7 +8813,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 547, + "weight": 536, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -8893,7 +8893,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 546, + "weight": 535, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -9101,7 +9101,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 548, + "weight": 537, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -9181,7 +9181,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 419, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -9251,7 +9251,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 415, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -9325,7 +9325,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 416, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -9391,7 +9391,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 417, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -9473,7 +9473,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 418, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -9541,7 +9541,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 420, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -9625,7 +9625,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 411, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -9728,7 +9728,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 403, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -9882,7 +9882,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 404, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -9984,7 +9984,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 407, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -10130,7 +10130,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 405, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -10239,7 +10239,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 409, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -10339,7 +10339,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 414, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -10461,7 +10461,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 413, + "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", diff --git a/app/config/specs/swagger2-latest-console.json b/app/config/specs/swagger2-latest-console.json index 037da99b91..41b48860a1 100644 --- a/app/config/specs/swagger2-latest-console.json +++ b/app/config/specs/swagger2-latest-console.json @@ -661,7 +661,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 253, + "weight": 239, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -735,7 +735,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 255, + "weight": 241, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -858,7 +858,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 256, + "weight": 242, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -998,7 +998,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 257, + "weight": 243, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1121,7 +1121,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 261, + "weight": 247, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1257,7 +1257,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 262, + "weight": 248, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1396,7 +1396,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 254, + "weight": 240, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1496,7 +1496,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 260, + "weight": 246, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1596,7 +1596,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 258, + "weight": 244, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1696,7 +1696,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 259, + "weight": 245, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -4212,7 +4212,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 264, + "weight": 250, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4338,7 +4338,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 263, + "weight": 249, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4470,7 +4470,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 267, + "weight": 253, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4534,7 +4534,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 265, + "weight": 251, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -5022,7 +5022,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 266, + "weight": 252, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -5106,7 +5106,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 269, + "weight": 255, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -5198,7 +5198,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 268, + "weight": 254, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5290,7 +5290,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 270, + "weight": 256, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -6005,7 +6005,7 @@ "x-appwrite": { "method": "chat", "group": "console", - "weight": 513, + "weight": 502, "cookies": false, "type": "", "demo": "assistant\/chat.md", @@ -6069,7 +6069,7 @@ "x-appwrite": { "method": "getResource", "group": null, - "weight": 514, + "weight": 503, "cookies": false, "type": "", "demo": "console\/get-resource.md", @@ -6140,7 +6140,7 @@ "x-appwrite": { "method": "variables", "group": "console", - "weight": 512, + "weight": 501, "cookies": false, "type": "", "demo": "console\/variables.md", @@ -6189,7 +6189,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 278, + "weight": 264, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -6305,7 +6305,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 274, + "weight": 260, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -6425,7 +6425,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 346, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6492,7 +6492,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 342, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6563,7 +6563,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 343, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6626,7 +6626,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 344, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6705,7 +6705,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 345, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6770,7 +6770,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 347, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6851,7 +6851,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 281, + "weight": 267, "cookies": false, "type": "", "demo": "databases\/list-usage.md", @@ -6953,7 +6953,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 275, + "weight": 261, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -7047,7 +7047,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 276, + "weight": 262, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -7159,7 +7159,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 277, + "weight": 263, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -7252,7 +7252,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 286, + "weight": 272, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -7347,7 +7347,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 282, + "weight": 268, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -7477,7 +7477,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 283, + "weight": 269, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -7550,7 +7550,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 284, + "weight": 270, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7655,7 +7655,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 285, + "weight": 271, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7728,7 +7728,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 303, + "weight": 289, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7824,7 +7824,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 304, + "weight": 290, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7937,7 +7937,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 305, + "weight": 291, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -8052,7 +8052,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 306, + "weight": 292, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -8165,7 +8165,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 307, + "weight": 293, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -8280,7 +8280,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 308, + "weight": 294, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -8394,7 +8394,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 309, + "weight": 295, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -8510,7 +8510,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 310, + "weight": 296, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8633,7 +8633,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 311, + "weight": 297, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8758,7 +8758,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 312, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8888,7 +8888,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 313, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -9020,7 +9020,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 314, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -9150,7 +9150,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 315, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -9282,7 +9282,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 316, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -9395,7 +9395,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 317, + "weight": 303, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -9510,7 +9510,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 318, + "weight": 304, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9617,7 +9617,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 319, + "weight": 305, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9731,7 +9731,7 @@ "x-appwrite": { "method": "createLongtextAttribute", "group": "attributes", - "weight": 336, + "weight": 322, "cookies": false, "type": "", "demo": "databases\/create-longtext-attribute.md", @@ -9840,7 +9840,7 @@ "x-appwrite": { "method": "updateLongtextAttribute", "group": "attributes", - "weight": 337, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/update-longtext-attribute.md", @@ -9951,7 +9951,7 @@ "x-appwrite": { "method": "createMediumtextAttribute", "group": "attributes", - "weight": 334, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/create-mediumtext-attribute.md", @@ -10060,7 +10060,7 @@ "x-appwrite": { "method": "updateMediumtextAttribute", "group": "attributes", - "weight": 335, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/update-mediumtext-attribute.md", @@ -10171,7 +10171,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 320, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -10278,7 +10278,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 321, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -10392,7 +10392,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 322, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -10499,7 +10499,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 323, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -10613,7 +10613,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 324, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -10754,7 +10754,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 326, + "weight": 312, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -10881,7 +10881,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 327, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -11004,7 +11004,7 @@ "x-appwrite": { "method": "createTextAttribute", "group": "attributes", - "weight": 332, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/create-text-attribute.md", @@ -11113,7 +11113,7 @@ "x-appwrite": { "method": "updateTextAttribute", "group": "attributes", - "weight": 333, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/update-text-attribute.md", @@ -11224,7 +11224,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 328, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -11338,7 +11338,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 329, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -11454,7 +11454,7 @@ "x-appwrite": { "method": "createVarcharAttribute", "group": "attributes", - "weight": 330, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/create-varchar-attribute.md", @@ -11571,7 +11571,7 @@ "x-appwrite": { "method": "updateVarcharAttribute", "group": "attributes", - "weight": 331, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/update-varchar-attribute.md", @@ -11719,7 +11719,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 301, + "weight": 287, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -11794,7 +11794,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 302, + "weight": 288, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -11876,7 +11876,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 325, + "weight": 311, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -11986,7 +11986,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 297, + "weight": 283, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -12090,7 +12090,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 289, + "weight": 275, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -12281,7 +12281,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 294, + "weight": 280, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -12416,7 +12416,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 292, + "weight": 278, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -12520,7 +12520,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 296, + "weight": 282, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -12618,7 +12618,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 290, + "weight": 276, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -12721,7 +12721,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 293, + "weight": 279, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -12872,7 +12872,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 291, + "weight": 277, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -12982,7 +12982,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 295, + "weight": 281, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -13081,7 +13081,7 @@ "x-appwrite": { "method": "listDocumentLogs", "group": "logs", - "weight": 298, + "weight": 284, "cookies": false, "type": "", "demo": "databases\/list-document-logs.md", @@ -13174,7 +13174,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 300, + "weight": 286, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -13297,7 +13297,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 299, + "weight": 285, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -13418,7 +13418,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 341, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -13512,7 +13512,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 338, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -13652,7 +13652,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 339, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -13727,7 +13727,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 340, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -13807,7 +13807,7 @@ "x-appwrite": { "method": "listCollectionLogs", "group": "collections", - "weight": 287, + "weight": 273, "cookies": false, "type": "", "demo": "databases\/list-collection-logs.md", @@ -13890,7 +13890,7 @@ "x-appwrite": { "method": "getCollectionUsage", "group": null, - "weight": 288, + "weight": 274, "cookies": false, "type": "", "demo": "databases\/get-collection-usage.md", @@ -13981,7 +13981,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 279, + "weight": 265, "cookies": false, "type": "", "demo": "databases\/list-logs.md", @@ -14086,7 +14086,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 280, + "weight": 266, "cookies": false, "type": "", "demo": "databases\/get-usage.md", @@ -14199,7 +14199,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 431, + "weight": 420, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -14281,7 +14281,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 428, + "weight": 417, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -14369,6 +14369,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -14396,7 +14397,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -14595,7 +14597,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 433, + "weight": 422, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -14645,7 +14647,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 434, + "weight": 423, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -14695,7 +14697,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 457, + "weight": 446, "cookies": false, "type": "", "demo": "functions\/list-templates.md", @@ -14766,6 +14768,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -14793,7 +14796,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -14880,7 +14884,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 456, + "weight": 445, "cookies": false, "type": "", "demo": "functions\/get-template.md", @@ -14938,7 +14942,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 450, + "weight": 439, "cookies": false, "type": "", "demo": "functions\/list-usage.md", @@ -15008,7 +15012,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 429, + "weight": 418, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -15068,7 +15072,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 430, + "weight": 419, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -15158,6 +15162,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -15185,7 +15190,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -15378,7 +15384,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 432, + "weight": 421, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -15440,7 +15446,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 437, + "weight": 426, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -15518,7 +15524,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 438, + "weight": 427, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -15608,7 +15614,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 435, + "weight": 424, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -15701,7 +15707,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 443, + "weight": 432, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -15787,7 +15793,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 440, + "weight": 429, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -15908,7 +15914,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 441, + "weight": 430, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -16005,7 +16011,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 436, + "weight": 425, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -16068,7 +16074,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 439, + "weight": 428, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -16136,7 +16142,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 442, + "weight": 431, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -16222,7 +16228,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 444, + "weight": 433, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -16290,7 +16296,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 447, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -16373,7 +16379,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 445, + "weight": 434, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -16492,7 +16498,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 446, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -16557,7 +16563,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 448, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -16625,7 +16631,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 449, + "weight": 438, "cookies": false, "type": "", "demo": "functions\/get-usage.md", @@ -16703,7 +16709,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 453, + "weight": 442, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -16763,7 +16769,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 451, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -16854,7 +16860,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 452, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -16922,7 +16928,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 454, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -17017,7 +17023,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 455, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -17087,7 +17093,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 190, + "weight": 176, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -17162,7 +17168,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 189, + "weight": 175, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -17235,7 +17241,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 458, + "weight": 447, "cookies": false, "type": "", "demo": "health\/get.md", @@ -17286,7 +17292,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 467, + "weight": 456, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -17337,7 +17343,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 461, + "weight": 450, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -17388,7 +17394,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 464, + "weight": 453, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -17448,7 +17454,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 460, + "weight": 449, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -17499,7 +17505,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 462, + "weight": 451, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -17550,7 +17556,7 @@ "x-appwrite": { "method": "getQueueAudits", "group": "queue", - "weight": 468, + "weight": 457, "cookies": false, "type": "", "demo": "health\/get-queue-audits.md", @@ -17612,7 +17618,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 472, + "weight": 461, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -17674,7 +17680,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 471, + "weight": 460, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -17736,7 +17742,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 473, + "weight": 462, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -17807,7 +17813,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 474, + "weight": 463, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -17869,7 +17875,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 481, + "weight": 470, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -17956,7 +17962,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 478, + "weight": 467, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -18018,7 +18024,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 470, + "weight": 459, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -18080,7 +18086,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 475, + "weight": 464, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -18142,7 +18148,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 476, + "weight": 465, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -18204,7 +18210,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 477, + "weight": 466, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -18266,7 +18272,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 479, + "weight": 468, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -18328,7 +18334,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 480, + "weight": 469, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -18390,7 +18396,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 469, + "weight": 458, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -18452,7 +18458,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 466, + "weight": 455, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -18503,7 +18509,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 465, + "weight": 454, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -18554,7 +18560,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 463, + "weight": 452, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -19029,7 +19035,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 245, + "weight": 231, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -19114,7 +19120,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 242, + "weight": 228, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -19274,7 +19280,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 249, + "weight": 235, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -19441,7 +19447,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 244, + "weight": 230, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -19640,7 +19646,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 251, + "weight": 237, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -19854,7 +19860,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 243, + "weight": 229, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -20044,7 +20050,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 250, + "weight": 236, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -20233,7 +20239,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 248, + "weight": 234, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -20289,7 +20295,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 252, + "weight": 238, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -20350,7 +20356,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 246, + "weight": 232, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -20432,7 +20438,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 247, + "weight": 233, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -20514,7 +20520,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 216, + "weight": 202, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -20599,7 +20605,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 215, + "weight": 201, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -20788,7 +20794,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 229, + "weight": 215, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -20974,7 +20980,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 214, + "weight": 200, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -21132,7 +21138,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 228, + "weight": 214, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -21286,7 +21292,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 205, + "weight": 191, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -21418,7 +21424,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 219, + "weight": 205, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -21547,7 +21553,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 209, + "weight": 195, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -21652,7 +21658,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 223, + "weight": 209, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -21755,7 +21761,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 207, + "weight": 193, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -21874,7 +21880,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 221, + "weight": 207, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -21990,7 +21996,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 206, + "weight": 192, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -22109,7 +22115,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 220, + "weight": 206, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -22225,7 +22231,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 208, + "weight": 194, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -22475,7 +22481,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 222, + "weight": 208, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -22719,7 +22725,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 210, + "weight": 196, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -22825,7 +22831,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 224, + "weight": 210, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -22928,7 +22934,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 211, + "weight": 197, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -23034,7 +23040,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 225, + "weight": 211, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -23137,7 +23143,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 212, + "weight": 198, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -23243,7 +23249,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 226, + "weight": 212, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -23346,7 +23352,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 213, + "weight": 199, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -23452,7 +23458,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 227, + "weight": 213, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -23553,7 +23559,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 218, + "weight": 204, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -23609,7 +23615,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 230, + "weight": 216, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -23670,7 +23676,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 217, + "weight": 203, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -23752,7 +23758,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 239, + "weight": 225, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -23834,7 +23840,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 232, + "weight": 218, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -23917,7 +23923,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 231, + "weight": 217, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -24006,7 +24012,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 234, + "weight": 220, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -24067,7 +24073,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 235, + "weight": 221, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -24149,7 +24155,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 236, + "weight": 222, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -24210,7 +24216,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 233, + "weight": 219, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -24292,7 +24298,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 238, + "weight": 224, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -24383,7 +24389,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 237, + "weight": 223, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -24471,7 +24477,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 240, + "weight": 226, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -24535,7 +24541,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 241, + "weight": 227, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -24606,7 +24612,7 @@ "x-appwrite": { "method": "list", "group": null, - "weight": 197, + "weight": 183, "cookies": false, "type": "", "demo": "migrations\/list.md", @@ -24689,7 +24695,7 @@ "x-appwrite": { "method": "createAppwriteMigration", "group": null, - "weight": 191, + "weight": 177, "cookies": false, "type": "", "demo": "migrations\/create-appwrite-migration.md", @@ -24803,7 +24809,7 @@ "x-appwrite": { "method": "getAppwriteReport", "group": null, - "weight": 199, + "weight": 185, "cookies": false, "type": "", "demo": "migrations\/get-appwrite-report.md", @@ -24912,7 +24918,7 @@ "x-appwrite": { "method": "createCSVExport", "group": null, - "weight": 196, + "weight": 182, "cookies": false, "type": "", "demo": "migrations\/create-csv-export.md", @@ -25038,7 +25044,7 @@ "x-appwrite": { "method": "createCSVImport", "group": null, - "weight": 195, + "weight": 181, "cookies": false, "type": "", "demo": "migrations\/create-csv-import.md", @@ -25129,7 +25135,7 @@ "x-appwrite": { "method": "createFirebaseMigration", "group": null, - "weight": 192, + "weight": 178, "cookies": false, "type": "", "demo": "migrations\/create-firebase-migration.md", @@ -25222,7 +25228,7 @@ "x-appwrite": { "method": "getFirebaseReport", "group": null, - "weight": 200, + "weight": 186, "cookies": false, "type": "", "demo": "migrations\/get-firebase-report.md", @@ -25308,7 +25314,7 @@ "x-appwrite": { "method": "createNHostMigration", "group": null, - "weight": 194, + "weight": 180, "cookies": false, "type": "", "demo": "migrations\/create-n-host-migration.md", @@ -25444,7 +25450,7 @@ "x-appwrite": { "method": "getNHostReport", "group": null, - "weight": 202, + "weight": 188, "cookies": false, "type": "", "demo": "migrations\/get-n-host-report.md", @@ -25580,7 +25586,7 @@ "x-appwrite": { "method": "createSupabaseMigration", "group": null, - "weight": 193, + "weight": 179, "cookies": false, "type": "", "demo": "migrations\/create-supabase-migration.md", @@ -25710,7 +25716,7 @@ "x-appwrite": { "method": "getSupabaseReport", "group": null, - "weight": 201, + "weight": 187, "cookies": false, "type": "", "demo": "migrations\/get-supabase-report.md", @@ -25837,7 +25843,7 @@ "x-appwrite": { "method": "get", "group": null, - "weight": 198, + "weight": 184, "cookies": false, "type": "", "demo": "migrations\/get.md", @@ -25896,7 +25902,7 @@ "x-appwrite": { "method": "retry", "group": null, - "weight": 203, + "weight": 189, "cookies": false, "type": "", "demo": "migrations\/retry.md", @@ -25950,7 +25956,7 @@ "x-appwrite": { "method": "delete", "group": null, - "weight": 204, + "weight": 190, "cookies": false, "type": "", "demo": "migrations\/delete.md", @@ -26009,7 +26015,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 103, + "weight": 100, "cookies": false, "type": "", "demo": "project\/get-usage.md", @@ -26092,7 +26098,7 @@ "x-appwrite": { "method": "listVariables", "group": null, - "weight": 105, + "weight": 102, "cookies": false, "type": "", "demo": "project\/list-variables.md", @@ -26141,7 +26147,7 @@ "x-appwrite": { "method": "createVariable", "group": null, - "weight": 104, + "weight": 101, "cookies": false, "type": "", "demo": "project\/create-variable.md", @@ -26223,7 +26229,7 @@ "x-appwrite": { "method": "getVariable", "group": null, - "weight": 106, + "weight": 103, "cookies": false, "type": "", "demo": "project\/get-variable.md", @@ -26282,7 +26288,7 @@ "x-appwrite": { "method": "updateVariable", "group": null, - "weight": 107, + "weight": 104, "cookies": false, "type": "", "demo": "project\/update-variable.md", @@ -26368,7 +26374,7 @@ "x-appwrite": { "method": "deleteVariable", "group": null, - "weight": 108, + "weight": 105, "cookies": false, "type": "", "demo": "project\/delete-variable.md", @@ -26427,7 +26433,7 @@ "x-appwrite": { "method": "list", "group": "projects", - "weight": 426, + "weight": 414, "cookies": false, "type": "", "demo": "projects\/list.md", @@ -26507,7 +26513,7 @@ "x-appwrite": { "method": "create", "group": "projects", - "weight": 57, + "weight": 412, "cookies": false, "type": "", "demo": "projects\/create.md", @@ -26656,7 +26662,7 @@ "x-appwrite": { "method": "get", "group": "projects", - "weight": 58, + "weight": 57, "cookies": false, "type": "", "demo": "projects\/get.md", @@ -26715,7 +26721,7 @@ "x-appwrite": { "method": "update", "group": "projects", - "weight": 59, + "weight": 413, "cookies": false, "type": "", "demo": "projects\/update.md", @@ -26842,7 +26848,7 @@ "x-appwrite": { "method": "delete", "group": "projects", - "weight": 76, + "weight": 73, "cookies": false, "type": "", "demo": "projects\/delete.md", @@ -26903,7 +26909,7 @@ "x-appwrite": { "method": "updateApiStatus", "group": "projects", - "weight": 63, + "weight": 60, "cookies": false, "type": "", "demo": "projects\/update-api-status.md", @@ -27060,7 +27066,7 @@ "x-appwrite": { "method": "updateApiStatusAll", "group": "projects", - "weight": 64, + "weight": 61, "cookies": false, "type": "", "demo": "projects\/update-api-status-all.md", @@ -27199,7 +27205,7 @@ "x-appwrite": { "method": "updateAuthDuration", "group": "auth", - "weight": 69, + "weight": 66, "cookies": false, "type": "", "demo": "projects\/update-auth-duration.md", @@ -27279,7 +27285,7 @@ "x-appwrite": { "method": "updateAuthLimit", "group": "auth", - "weight": 68, + "weight": 65, "cookies": false, "type": "", "demo": "projects\/update-auth-limit.md", @@ -27359,7 +27365,7 @@ "x-appwrite": { "method": "updateAuthSessionsLimit", "group": "auth", - "weight": 74, + "weight": 71, "cookies": false, "type": "", "demo": "projects\/update-auth-sessions-limit.md", @@ -27439,7 +27445,7 @@ "x-appwrite": { "method": "updateMembershipsPrivacy", "group": "auth", - "weight": 67, + "weight": 64, "cookies": false, "type": "", "demo": "projects\/update-memberships-privacy.md", @@ -27532,7 +27538,7 @@ "x-appwrite": { "method": "updateMockNumbers", "group": "auth", - "weight": 75, + "weight": 72, "cookies": false, "type": "", "demo": "projects\/update-mock-numbers.md", @@ -27614,7 +27620,7 @@ "x-appwrite": { "method": "updateAuthPasswordDictionary", "group": "auth", - "weight": 72, + "weight": 69, "cookies": false, "type": "", "demo": "projects\/update-auth-password-dictionary.md", @@ -27693,7 +27699,7 @@ "x-appwrite": { "method": "updateAuthPasswordHistory", "group": "auth", - "weight": 71, + "weight": 68, "cookies": false, "type": "", "demo": "projects\/update-auth-password-history.md", @@ -27773,7 +27779,7 @@ "x-appwrite": { "method": "updatePersonalDataCheck", "group": "auth", - "weight": 73, + "weight": 70, "cookies": false, "type": "", "demo": "projects\/update-personal-data-check.md", @@ -27852,7 +27858,7 @@ "x-appwrite": { "method": "updateSessionAlerts", "group": "auth", - "weight": 66, + "weight": 63, "cookies": false, "type": "", "demo": "projects\/update-session-alerts.md", @@ -27931,7 +27937,7 @@ "x-appwrite": { "method": "updateSessionInvalidation", "group": "auth", - "weight": 102, + "weight": 99, "cookies": false, "type": "", "demo": "projects\/update-session-invalidation.md", @@ -28010,7 +28016,7 @@ "x-appwrite": { "method": "updateAuthStatus", "group": "auth", - "weight": 70, + "weight": 67, "cookies": false, "type": "", "demo": "projects\/update-auth-status.md", @@ -28106,7 +28112,7 @@ "x-appwrite": { "method": "listDevKeys", "group": "devKeys", - "weight": 424, + "weight": 410, "cookies": false, "type": "", "demo": "projects\/list-dev-keys.md", @@ -28176,7 +28182,7 @@ "x-appwrite": { "method": "createDevKey", "group": "devKeys", - "weight": 421, + "weight": 407, "cookies": false, "type": "", "demo": "projects\/create-dev-key.md", @@ -28259,7 +28265,7 @@ "x-appwrite": { "method": "getDevKey", "group": "devKeys", - "weight": 423, + "weight": 409, "cookies": false, "type": "", "demo": "projects\/get-dev-key.md", @@ -28325,7 +28331,7 @@ "x-appwrite": { "method": "updateDevKey", "group": "devKeys", - "weight": 422, + "weight": 408, "cookies": false, "type": "", "demo": "projects\/update-dev-key.md", @@ -28411,7 +28417,7 @@ "x-appwrite": { "method": "deleteDevKey", "group": "devKeys", - "weight": 425, + "weight": 411, "cookies": false, "type": "", "demo": "projects\/delete-dev-key.md", @@ -28479,7 +28485,7 @@ "x-appwrite": { "method": "createJWT", "group": "auth", - "weight": 88, + "weight": 85, "cookies": false, "type": "", "demo": "projects\/create-jwt.md", @@ -28625,7 +28631,7 @@ "x-appwrite": { "method": "listKeys", "group": "keys", - "weight": 84, + "weight": 81, "cookies": false, "type": "", "demo": "projects\/list-keys.md", @@ -28657,6 +28663,18 @@ "x-example": "", "in": "path" }, + { + "name": "queries", + "description": "Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https:\/\/appwrite.io\/docs\/queries). Maximum of 100 queries are allowed, each 4096 characters long. You may filter on the following attributes: expire, accessedAt, name, scopes", + "required": false, + "type": "array", + "collectionFormat": "multi", + "items": { + "type": "string" + }, + "default": [], + "in": "query" + }, { "name": "total", "description": "When set to false, the total count returned will be 0 and will not be calculated.", @@ -28693,7 +28711,7 @@ "x-appwrite": { "method": "createKey", "group": "keys", - "weight": 83, + "weight": 80, "cookies": false, "type": "", "demo": "projects\/create-key.md", @@ -28731,6 +28749,12 @@ "schema": { "type": "object", "properties": { + "keyId": { + "type": "string", + "description": "Key ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can't start with a special char. Max length is 36 chars.", + "default": "unique()", + "x-example": "" + }, "name": { "type": "string", "description": "Key name. Max length: 128 chars.", @@ -28847,7 +28871,7 @@ "x-appwrite": { "method": "getKey", "group": "keys", - "weight": 85, + "weight": 82, "cookies": false, "type": "", "demo": "projects\/get-key.md", @@ -28914,7 +28938,7 @@ "x-appwrite": { "method": "updateKey", "group": "keys", - "weight": 86, + "weight": 83, "cookies": false, "type": "", "demo": "projects\/update-key.md", @@ -29071,7 +29095,7 @@ "x-appwrite": { "method": "deleteKey", "group": "keys", - "weight": 87, + "weight": 84, "cookies": false, "type": "", "demo": "projects\/delete-key.md", @@ -29140,7 +29164,7 @@ "x-appwrite": { "method": "updateLabels", "group": "projects", - "weight": 427, + "weight": 415, "cookies": false, "type": "", "demo": "projects\/update-labels.md", @@ -29221,7 +29245,7 @@ "x-appwrite": { "method": "updateOAuth2", "group": "auth", - "weight": 65, + "weight": 62, "cookies": false, "type": "", "demo": "projects\/update-o-auth-2.md", @@ -29362,7 +29386,7 @@ "x-appwrite": { "method": "listPlatforms", "group": "platforms", - "weight": 90, + "weight": 87, "cookies": false, "type": "", "demo": "projects\/list-platforms.md", @@ -29430,7 +29454,7 @@ "x-appwrite": { "method": "createPlatform", "group": "platforms", - "weight": 89, + "weight": 86, "cookies": false, "type": "", "demo": "projects\/create-platform.md", @@ -29551,7 +29575,7 @@ "x-appwrite": { "method": "getPlatform", "group": "platforms", - "weight": 91, + "weight": 88, "cookies": false, "type": "", "demo": "projects\/get-platform.md", @@ -29618,7 +29642,7 @@ "x-appwrite": { "method": "updatePlatform", "group": "platforms", - "weight": 92, + "weight": 89, "cookies": false, "type": "", "demo": "projects\/update-platform.md", @@ -29716,7 +29740,7 @@ "x-appwrite": { "method": "deletePlatform", "group": "platforms", - "weight": 93, + "weight": 90, "cookies": false, "type": "", "demo": "projects\/delete-platform.md", @@ -29785,7 +29809,7 @@ "x-appwrite": { "method": "updateServiceStatus", "group": "projects", - "weight": 61, + "weight": 58, "cookies": false, "type": "", "demo": "projects\/update-service-status.md", @@ -29888,7 +29912,7 @@ "x-appwrite": { "method": "updateServiceStatusAll", "group": "projects", - "weight": 62, + "weight": 59, "cookies": false, "type": "", "demo": "projects\/update-service-status-all.md", @@ -29967,7 +29991,7 @@ "x-appwrite": { "method": "updateSmtp", "group": "templates", - "weight": 94, + "weight": 91, "cookies": false, "type": "", "demo": "projects\/update-smtp.md", @@ -30176,7 +30200,7 @@ "x-appwrite": { "method": "createSmtpTest", "group": "templates", - "weight": 95, + "weight": 92, "cookies": false, "type": "", "demo": "projects\/create-smtp-test.md", @@ -30398,7 +30422,7 @@ "x-appwrite": { "method": "updateTeam", "group": "projects", - "weight": 60, + "weight": 416, "cookies": false, "type": "", "demo": "projects\/update-team.md", @@ -30475,7 +30499,7 @@ "x-appwrite": { "method": "getEmailTemplate", "group": "templates", - "weight": 97, + "weight": 94, "cookies": false, "type": "", "demo": "projects\/get-email-template.md", @@ -30696,7 +30720,7 @@ "x-appwrite": { "method": "updateEmailTemplate", "group": "templates", - "weight": 99, + "weight": 96, "cookies": false, "type": "", "demo": "projects\/update-email-template.md", @@ -30962,7 +30986,7 @@ "x-appwrite": { "method": "deleteEmailTemplate", "group": "templates", - "weight": 101, + "weight": 98, "cookies": false, "type": "", "demo": "projects\/delete-email-template.md", @@ -31183,7 +31207,7 @@ "x-appwrite": { "method": "getSmsTemplate", "group": "templates", - "weight": 96, + "weight": 93, "cookies": false, "type": "", "demo": "projects\/get-sms-template.md", @@ -31465,7 +31489,7 @@ "x-appwrite": { "method": "updateSmsTemplate", "group": "templates", - "weight": 98, + "weight": 95, "cookies": false, "type": "", "demo": "projects\/update-sms-template.md", @@ -31769,7 +31793,7 @@ "x-appwrite": { "method": "deleteSmsTemplate", "group": "templates", - "weight": 100, + "weight": 97, "cookies": false, "type": "", "demo": "projects\/delete-sms-template.md", @@ -32051,7 +32075,7 @@ "x-appwrite": { "method": "listWebhooks", "group": "webhooks", - "weight": 78, + "weight": 75, "cookies": false, "type": "", "demo": "projects\/list-webhooks.md", @@ -32119,7 +32143,7 @@ "x-appwrite": { "method": "createWebhook", "group": "webhooks", - "weight": 77, + "weight": 74, "cookies": false, "type": "", "demo": "projects\/create-webhook.md", @@ -32238,7 +32262,7 @@ "x-appwrite": { "method": "getWebhook", "group": "webhooks", - "weight": 79, + "weight": 76, "cookies": false, "type": "", "demo": "projects\/get-webhook.md", @@ -32305,7 +32329,7 @@ "x-appwrite": { "method": "updateWebhook", "group": "webhooks", - "weight": 80, + "weight": 77, "cookies": false, "type": "", "demo": "projects\/update-webhook.md", @@ -32427,7 +32451,7 @@ "x-appwrite": { "method": "deleteWebhook", "group": "webhooks", - "weight": 82, + "weight": 79, "cookies": false, "type": "", "demo": "projects\/delete-webhook.md", @@ -32496,7 +32520,7 @@ "x-appwrite": { "method": "updateWebhookSignature", "group": "webhooks", - "weight": 81, + "weight": 78, "cookies": false, "type": "", "demo": "projects\/update-webhook-signature.md", @@ -32563,7 +32587,7 @@ "x-appwrite": { "method": "listRules", "group": null, - "weight": 528, + "weight": 517, "cookies": false, "type": "", "demo": "proxy\/list-rules.md", @@ -32645,7 +32669,7 @@ "x-appwrite": { "method": "createAPIRule", "group": null, - "weight": 523, + "weight": 512, "cookies": false, "type": "", "demo": "proxy\/create-api-rule.md", @@ -32715,7 +32739,7 @@ "x-appwrite": { "method": "createFunctionRule", "group": null, - "weight": 525, + "weight": 514, "cookies": false, "type": "", "demo": "proxy\/create-function-rule.md", @@ -32798,7 +32822,7 @@ "x-appwrite": { "method": "createRedirectRule", "group": null, - "weight": 526, + "weight": 515, "cookies": false, "type": "", "demo": "proxy\/create-redirect-rule.md", @@ -32919,7 +32943,7 @@ "x-appwrite": { "method": "createSiteRule", "group": null, - "weight": 524, + "weight": 513, "cookies": false, "type": "", "demo": "proxy\/create-site-rule.md", @@ -33000,7 +33024,7 @@ "x-appwrite": { "method": "getRule", "group": null, - "weight": 527, + "weight": 516, "cookies": false, "type": "", "demo": "proxy\/get-rule.md", @@ -33053,7 +33077,7 @@ "x-appwrite": { "method": "deleteRule", "group": null, - "weight": 529, + "weight": 518, "cookies": false, "type": "", "demo": "proxy\/delete-rule.md", @@ -33113,7 +33137,7 @@ "x-appwrite": { "method": "updateRuleVerification", "group": null, - "weight": 530, + "weight": 519, "cookies": false, "type": "", "demo": "proxy\/update-rule-verification.md", @@ -33171,7 +33195,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 485, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -33253,7 +33277,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 483, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -33403,6 +33427,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -33430,7 +33455,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -33525,7 +33551,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 488, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -33575,7 +33601,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 511, + "weight": 500, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -33625,7 +33651,7 @@ "x-appwrite": { "method": "listTemplates", "group": "templates", - "weight": 507, + "weight": 496, "cookies": false, "type": "", "demo": "sites\/list-templates.md", @@ -33751,7 +33777,7 @@ "x-appwrite": { "method": "getTemplate", "group": "templates", - "weight": 508, + "weight": 497, "cookies": false, "type": "", "demo": "sites\/get-template.md", @@ -33809,7 +33835,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 509, + "weight": 498, "cookies": false, "type": "", "demo": "sites\/list-usage.md", @@ -33879,7 +33905,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 484, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -33939,7 +33965,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 486, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -34091,6 +34117,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -34118,7 +34145,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -34206,7 +34234,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 487, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -34268,7 +34296,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 494, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -34346,7 +34374,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 493, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -34436,7 +34464,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 489, + "weight": 478, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -34537,7 +34565,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 497, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -34617,7 +34645,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 490, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -34738,7 +34766,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 491, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -34836,7 +34864,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 492, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -34899,7 +34927,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 495, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -34967,7 +34995,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 496, + "weight": 485, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -35053,7 +35081,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 498, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -35121,7 +35149,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 500, + "weight": 489, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -35202,7 +35230,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 499, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -35267,7 +35295,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 501, + "weight": 490, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -35335,7 +35363,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 510, + "weight": 499, "cookies": false, "type": "", "demo": "sites\/get-usage.md", @@ -35413,7 +35441,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 504, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -35473,7 +35501,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 502, + "weight": 491, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -35564,7 +35592,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 503, + "weight": 492, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -35632,7 +35660,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 505, + "weight": 494, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -35727,7 +35755,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 506, + "weight": 495, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -35795,7 +35823,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 538, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -35878,7 +35906,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 536, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -36025,7 +36053,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 537, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -36086,7 +36114,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 539, + "weight": 528, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -36229,7 +36257,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 540, + "weight": 529, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -36290,7 +36318,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 543, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -36383,7 +36411,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 541, + "weight": 530, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -36474,7 +36502,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 542, + "weight": 531, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -36545,7 +36573,7 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 544, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/update-file.md", @@ -36636,7 +36664,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 545, + "weight": 534, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -36707,7 +36735,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 547, + "weight": 536, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -36787,7 +36815,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 546, + "weight": 535, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -36995,7 +37023,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 548, + "weight": 537, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -37075,7 +37103,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 550, + "weight": 539, "cookies": false, "type": "", "demo": "storage\/get-usage.md", @@ -37146,7 +37174,7 @@ "x-appwrite": { "method": "getBucketUsage", "group": null, - "weight": 551, + "weight": 540, "cookies": false, "type": "", "demo": "storage\/get-bucket-usage.md", @@ -37225,7 +37253,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 352, + "weight": 338, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -37308,7 +37336,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 348, + "weight": 334, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -37392,7 +37420,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 419, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -37462,7 +37490,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 415, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -37536,7 +37564,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 416, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -37602,7 +37630,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 417, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -37684,7 +37712,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 418, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -37752,7 +37780,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 420, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -37836,7 +37864,7 @@ "x-appwrite": { "method": "listUsage", "group": null, - "weight": 354, + "weight": 340, "cookies": false, "type": "", "demo": "tablesdb\/list-usage.md", @@ -37933,7 +37961,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 349, + "weight": 335, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -37994,7 +38022,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 350, + "weight": 336, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -38071,7 +38099,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 351, + "weight": 337, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -38132,7 +38160,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 359, + "weight": 345, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -38226,7 +38254,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 355, + "weight": 341, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -38355,7 +38383,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 356, + "weight": 342, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -38427,7 +38455,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 357, + "weight": 343, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -38531,7 +38559,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 358, + "weight": 344, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -38603,7 +38631,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 364, + "weight": 350, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -38698,7 +38726,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 365, + "weight": 351, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -38810,7 +38838,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 366, + "weight": 352, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -38924,7 +38952,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 367, + "weight": 353, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -39036,7 +39064,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 368, + "weight": 354, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -39150,7 +39178,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 369, + "weight": 355, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -39263,7 +39291,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 370, + "weight": 356, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -39378,7 +39406,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 371, + "weight": 357, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -39500,7 +39528,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 372, + "weight": 358, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -39624,7 +39652,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 373, + "weight": 359, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -39753,7 +39781,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 374, + "weight": 360, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -39884,7 +39912,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 375, + "weight": 361, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -40013,7 +40041,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 376, + "weight": 362, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -40144,7 +40172,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 377, + "weight": 363, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -40256,7 +40284,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 378, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -40370,7 +40398,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 379, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -40476,7 +40504,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 380, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -40589,7 +40617,7 @@ "x-appwrite": { "method": "createLongtextColumn", "group": "columns", - "weight": 397, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-longtext-column.md", @@ -40701,7 +40729,7 @@ "x-appwrite": { "method": "updateLongtextColumn", "group": "columns", - "weight": 398, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-longtext-column.md", @@ -40815,7 +40843,7 @@ "x-appwrite": { "method": "createMediumtextColumn", "group": "columns", - "weight": 395, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-mediumtext-column.md", @@ -40927,7 +40955,7 @@ "x-appwrite": { "method": "updateMediumtextColumn", "group": "columns", - "weight": 396, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-mediumtext-column.md", @@ -41041,7 +41069,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 381, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -41147,7 +41175,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 382, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -41260,7 +41288,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 383, + "weight": 369, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -41366,7 +41394,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 384, + "weight": 370, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -41479,7 +41507,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 385, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -41619,7 +41647,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 387, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -41749,7 +41777,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 388, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -41875,7 +41903,7 @@ "x-appwrite": { "method": "createTextColumn", "group": "columns", - "weight": 393, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/create-text-column.md", @@ -41987,7 +42015,7 @@ "x-appwrite": { "method": "updateTextColumn", "group": "columns", - "weight": 394, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/update-text-column.md", @@ -42101,7 +42129,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 389, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -42214,7 +42242,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 390, + "weight": 376, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -42329,7 +42357,7 @@ "x-appwrite": { "method": "createVarcharColumn", "group": "columns", - "weight": 391, + "weight": 377, "cookies": false, "type": "", "demo": "tablesdb\/create-varchar-column.md", @@ -42449,7 +42477,7 @@ "x-appwrite": { "method": "updateVarcharColumn", "group": "columns", - "weight": 392, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/update-varchar-column.md", @@ -42600,7 +42628,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 362, + "weight": 348, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -42674,7 +42702,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 363, + "weight": 349, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -42755,7 +42783,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 386, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -42864,7 +42892,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 402, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -42957,7 +42985,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 399, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -43096,7 +43124,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 400, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -43170,7 +43198,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 401, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -43249,7 +43277,7 @@ "x-appwrite": { "method": "listTableLogs", "group": "tables", - "weight": 360, + "weight": 346, "cookies": false, "type": "", "demo": "tablesdb\/list-table-logs.md", @@ -43331,7 +43359,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 411, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -43434,7 +43462,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 403, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -43616,7 +43644,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 408, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -43746,7 +43774,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 406, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -43849,7 +43877,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 410, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -43946,7 +43974,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 404, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -44048,7 +44076,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 407, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -44194,7 +44222,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 405, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -44303,7 +44331,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 409, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -44401,7 +44429,7 @@ "x-appwrite": { "method": "listRowLogs", "group": "logs", - "weight": 412, + "weight": 398, "cookies": false, "type": "", "demo": "tablesdb\/list-row-logs.md", @@ -44493,7 +44521,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 414, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -44615,7 +44643,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 413, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -44735,7 +44763,7 @@ "x-appwrite": { "method": "getTableUsage", "group": null, - "weight": 361, + "weight": 347, "cookies": false, "type": "", "demo": "tablesdb\/get-table-usage.md", @@ -44825,7 +44853,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 353, + "weight": 339, "cookies": false, "type": "", "demo": "tablesdb\/get-usage.md", @@ -44933,7 +44961,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 110, + "weight": 107, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -45018,7 +45046,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 109, + "weight": 106, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -45109,7 +45137,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 111, + "weight": 108, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -45172,7 +45200,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 113, + "weight": 110, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -45248,7 +45276,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 115, + "weight": 112, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -45311,7 +45339,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 122, + "weight": 119, "cookies": false, "type": "", "demo": "teams\/list-logs.md", @@ -45391,7 +45419,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 117, + "weight": 114, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -45484,7 +45512,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 116, + "weight": 113, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -45552,14 +45580,7 @@ "default": null, "x-example": null, "items": { - "type": "string", - "enum": [ - "admin", - "developer", - "owner" - ], - "x-enum-name": null, - "x-enum-keys": [] + "type": "string" } }, "url": { @@ -45608,7 +45629,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 118, + "weight": 115, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -45679,7 +45700,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 119, + "weight": 116, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -45735,14 +45756,7 @@ "default": null, "x-example": null, "items": { - "type": "string", - "enum": [ - "admin", - "developer", - "owner" - ], - "x-enum-name": null, - "x-enum-keys": [] + "type": "string" } } }, @@ -45773,7 +45787,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 121, + "weight": 118, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -45846,7 +45860,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 120, + "weight": 117, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -45941,7 +45955,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 112, + "weight": 109, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -46003,7 +46017,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 114, + "weight": 111, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -46083,7 +46097,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 533, + "weight": 522, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -46172,7 +46186,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 531, + "weight": 520, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -46256,7 +46270,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 532, + "weight": 521, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -46316,7 +46330,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 534, + "weight": 523, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -46387,7 +46401,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 535, + "weight": 524, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -46447,7 +46461,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 132, + "weight": 129, "cookies": false, "type": "", "demo": "users\/list.md", @@ -46530,7 +46544,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 123, + "weight": 120, "cookies": false, "type": "", "demo": "users\/create.md", @@ -46631,7 +46645,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 126, + "weight": 123, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -46726,7 +46740,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 124, + "weight": 121, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -46819,7 +46833,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 140, + "weight": 137, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -46899,7 +46913,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 163, + "weight": 160, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -46962,7 +46976,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 125, + "weight": 122, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -47057,7 +47071,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 128, + "weight": 125, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -47152,7 +47166,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 129, + "weight": 126, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -47286,7 +47300,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 130, + "weight": 127, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -47402,7 +47416,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 127, + "weight": 124, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -47516,7 +47530,7 @@ "x-appwrite": { "method": "getUsage", "group": null, - "weight": 165, + "weight": 162, "cookies": false, "type": "", "demo": "users\/get-usage.md", @@ -47587,7 +47601,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 133, + "weight": 130, "cookies": false, "type": "", "demo": "users\/get.md", @@ -47643,7 +47657,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 161, + "weight": 158, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -47706,7 +47720,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 146, + "weight": 143, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -47788,7 +47802,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 164, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -47873,7 +47887,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 142, + "weight": 139, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -47955,7 +47969,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 138, + "weight": 135, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -48037,7 +48051,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 137, + "weight": 134, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -48130,7 +48144,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 151, + "weight": 148, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -48266,7 +48280,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 156, + "weight": 153, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -48398,7 +48412,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 152, + "weight": 149, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -48515,7 +48529,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 153, + "weight": 150, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -48632,7 +48646,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 155, + "weight": 152, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -48749,7 +48763,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 154, + "weight": 151, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -48868,7 +48882,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 144, + "weight": 141, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -48949,7 +48963,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 145, + "weight": 142, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -49030,7 +49044,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 147, + "weight": 144, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -49110,7 +49124,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 134, + "weight": 131, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -49171,7 +49185,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 149, + "weight": 146, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -49250,7 +49264,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 136, + "weight": 133, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -49320,7 +49334,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 157, + "weight": 154, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -49376,7 +49390,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 160, + "weight": 157, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -49434,7 +49448,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 159, + "weight": 156, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -49505,7 +49519,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 141, + "weight": 138, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -49584,7 +49598,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 139, + "weight": 136, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -49666,7 +49680,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 131, + "weight": 128, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -49778,7 +49792,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 135, + "weight": 132, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -49847,7 +49861,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 150, + "weight": 147, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -49938,7 +49952,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 162, + "weight": 159, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -50009,7 +50023,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 158, + "weight": 155, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -50095,7 +50109,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 148, + "weight": 145, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -50176,7 +50190,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 143, + "weight": 140, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -50257,7 +50271,7 @@ "x-appwrite": { "method": "createRepositoryDetection", "group": "repositories", - "weight": 169, + "weight": 551, "cookies": false, "type": "", "demo": "vcs\/create-repository-detection.md", @@ -50353,7 +50367,7 @@ "x-appwrite": { "method": "listRepositories", "group": "repositories", - "weight": 170, + "weight": 548, "cookies": false, "type": "", "demo": "vcs\/list-repositories.md", @@ -50447,7 +50461,7 @@ "x-appwrite": { "method": "createRepository", "group": "repositories", - "weight": 171, + "weight": 546, "cookies": false, "type": "", "demo": "vcs\/create-repository.md", @@ -50531,7 +50545,7 @@ "x-appwrite": { "method": "getRepository", "group": "repositories", - "weight": 172, + "weight": 547, "cookies": false, "type": "", "demo": "vcs\/get-repository.md", @@ -50598,7 +50612,7 @@ "x-appwrite": { "method": "listRepositoryBranches", "group": "repositories", - "weight": 173, + "weight": 549, "cookies": false, "type": "", "demo": "vcs\/list-repository-branches.md", @@ -50665,7 +50679,7 @@ "x-appwrite": { "method": "getRepositoryContents", "group": "repositories", - "weight": 168, + "weight": 550, "cookies": false, "type": "", "demo": "vcs\/get-repository-contents.md", @@ -50749,7 +50763,7 @@ "x-appwrite": { "method": "updateExternalDeployments", "group": "repositories", - "weight": 178, + "weight": 164, "cookies": false, "type": "", "demo": "vcs\/update-external-deployments.md", @@ -50834,7 +50848,7 @@ "x-appwrite": { "method": "listInstallations", "group": "installations", - "weight": 175, + "weight": 544, "cookies": false, "type": "", "demo": "vcs\/list-installations.md", @@ -50915,7 +50929,7 @@ "x-appwrite": { "method": "getInstallation", "group": "installations", - "weight": 176, + "weight": 543, "cookies": false, "type": "", "demo": "vcs\/get-installation.md", @@ -50969,7 +50983,7 @@ "x-appwrite": { "method": "deleteInstallation", "group": "installations", - "weight": 177, + "weight": 545, "cookies": false, "type": "", "demo": "vcs\/delete-installation.md", @@ -52726,6 +52740,18 @@ "$ref": "#\/definitions\/index" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum document size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used document size in bytes based on defined attributes.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -52738,7 +52764,9 @@ "enabled", "documentSecurity", "attributes", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -52752,7 +52780,9 @@ "enabled": false, "documentSecurity": true, "attributes": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "attributeList": { @@ -54520,6 +54550,18 @@ "$ref": "#\/definitions\/columnIndex" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum row size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used row size in bytes based on defined columns.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -54532,7 +54574,9 @@ "enabled", "rowSecurity", "columns", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -54546,7 +54590,9 @@ "enabled": false, "rowSecurity": true, "columns": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "columnList": { diff --git a/app/config/specs/swagger2-latest-server.json b/app/config/specs/swagger2-latest-server.json index 83f6a7ab7e..29262b5dd9 100644 --- a/app/config/specs/swagger2-latest-server.json +++ b/app/config/specs/swagger2-latest-server.json @@ -628,7 +628,7 @@ "x-appwrite": { "method": "updateMFA", "group": "mfa", - "weight": 253, + "weight": 239, "cookies": false, "type": "", "demo": "account\/update-mfa.md", @@ -704,7 +704,7 @@ "x-appwrite": { "method": "createMfaAuthenticator", "group": "mfa", - "weight": 255, + "weight": 241, "cookies": false, "type": "", "demo": "account\/create-mfa-authenticator.md", @@ -831,7 +831,7 @@ "x-appwrite": { "method": "updateMfaAuthenticator", "group": "mfa", - "weight": 256, + "weight": 242, "cookies": false, "type": "", "demo": "account\/update-mfa-authenticator.md", @@ -975,7 +975,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 257, + "weight": 243, "cookies": false, "type": "", "demo": "account\/delete-mfa-authenticator.md", @@ -1102,7 +1102,7 @@ "x-appwrite": { "method": "createMfaChallenge", "group": "mfa", - "weight": 261, + "weight": 247, "cookies": false, "type": "", "demo": "account\/create-mfa-challenge.md", @@ -1242,7 +1242,7 @@ "x-appwrite": { "method": "updateMfaChallenge", "group": "mfa", - "weight": 262, + "weight": 248, "cookies": false, "type": "", "demo": "account\/update-mfa-challenge.md", @@ -1385,7 +1385,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 254, + "weight": 240, "cookies": false, "type": "", "demo": "account\/list-mfa-factors.md", @@ -1489,7 +1489,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 260, + "weight": 246, "cookies": false, "type": "", "demo": "account\/get-mfa-recovery-codes.md", @@ -1593,7 +1593,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 258, + "weight": 244, "cookies": false, "type": "", "demo": "account\/create-mfa-recovery-codes.md", @@ -1697,7 +1697,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 259, + "weight": 245, "cookies": false, "type": "", "demo": "account\/update-mfa-recovery-codes.md", @@ -3919,7 +3919,7 @@ "x-appwrite": { "method": "getBrowser", "group": null, - "weight": 264, + "weight": 250, "cookies": false, "type": "location", "demo": "avatars\/get-browser.md", @@ -4047,7 +4047,7 @@ "x-appwrite": { "method": "getCreditCard", "group": null, - "weight": 263, + "weight": 249, "cookies": false, "type": "location", "demo": "avatars\/get-credit-card.md", @@ -4181,7 +4181,7 @@ "x-appwrite": { "method": "getFavicon", "group": null, - "weight": 267, + "weight": 253, "cookies": false, "type": "location", "demo": "avatars\/get-favicon.md", @@ -4247,7 +4247,7 @@ "x-appwrite": { "method": "getFlag", "group": null, - "weight": 265, + "weight": 251, "cookies": false, "type": "location", "demo": "avatars\/get-flag.md", @@ -4737,7 +4737,7 @@ "x-appwrite": { "method": "getImage", "group": null, - "weight": 266, + "weight": 252, "cookies": false, "type": "location", "demo": "avatars\/get-image.md", @@ -4823,7 +4823,7 @@ "x-appwrite": { "method": "getInitials", "group": null, - "weight": 269, + "weight": 255, "cookies": false, "type": "location", "demo": "avatars\/get-initials.md", @@ -4917,7 +4917,7 @@ "x-appwrite": { "method": "getQR", "group": null, - "weight": 268, + "weight": 254, "cookies": false, "type": "location", "demo": "avatars\/get-qr.md", @@ -5011,7 +5011,7 @@ "x-appwrite": { "method": "getScreenshot", "group": null, - "weight": 270, + "weight": 256, "cookies": false, "type": "location", "demo": "avatars\/get-screenshot.md", @@ -5726,7 +5726,7 @@ "x-appwrite": { "method": "list", "group": "databases", - "weight": 278, + "weight": 264, "cookies": false, "type": "", "demo": "databases\/list.md", @@ -5844,7 +5844,7 @@ "x-appwrite": { "method": "create", "group": "databases", - "weight": 274, + "weight": 260, "cookies": false, "type": "", "demo": "databases\/create.md", @@ -5966,7 +5966,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 346, + "weight": 332, "cookies": false, "type": "", "demo": "databases\/list-transactions.md", @@ -6035,7 +6035,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 342, + "weight": 328, "cookies": false, "type": "", "demo": "databases\/create-transaction.md", @@ -6108,7 +6108,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 343, + "weight": 329, "cookies": false, "type": "", "demo": "databases\/get-transaction.md", @@ -6173,7 +6173,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 344, + "weight": 330, "cookies": false, "type": "", "demo": "databases\/update-transaction.md", @@ -6254,7 +6254,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 345, + "weight": 331, "cookies": false, "type": "", "demo": "databases\/delete-transaction.md", @@ -6321,7 +6321,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 347, + "weight": 333, "cookies": false, "type": "", "demo": "databases\/create-operations.md", @@ -6404,7 +6404,7 @@ "x-appwrite": { "method": "get", "group": "databases", - "weight": 275, + "weight": 261, "cookies": false, "type": "", "demo": "databases\/get.md", @@ -6500,7 +6500,7 @@ "x-appwrite": { "method": "update", "group": "databases", - "weight": 276, + "weight": 262, "cookies": false, "type": "", "demo": "databases\/update.md", @@ -6614,7 +6614,7 @@ "x-appwrite": { "method": "delete", "group": "databases", - "weight": 277, + "weight": 263, "cookies": false, "type": "", "demo": "databases\/delete.md", @@ -6709,7 +6709,7 @@ "x-appwrite": { "method": "listCollections", "group": "collections", - "weight": 286, + "weight": 272, "cookies": false, "type": "", "demo": "databases\/list-collections.md", @@ -6805,7 +6805,7 @@ "x-appwrite": { "method": "createCollection", "group": "collections", - "weight": 282, + "weight": 268, "cookies": false, "type": "", "demo": "databases\/create-collection.md", @@ -6936,7 +6936,7 @@ "x-appwrite": { "method": "getCollection", "group": "collections", - "weight": 283, + "weight": 269, "cookies": false, "type": "", "demo": "databases\/get-collection.md", @@ -7010,7 +7010,7 @@ "x-appwrite": { "method": "updateCollection", "group": "collections", - "weight": 284, + "weight": 270, "cookies": false, "type": "", "demo": "databases\/update-collection.md", @@ -7116,7 +7116,7 @@ "x-appwrite": { "method": "deleteCollection", "group": "collections", - "weight": 285, + "weight": 271, "cookies": false, "type": "", "demo": "databases\/delete-collection.md", @@ -7190,7 +7190,7 @@ "x-appwrite": { "method": "listAttributes", "group": "attributes", - "weight": 303, + "weight": 289, "cookies": false, "type": "", "demo": "databases\/list-attributes.md", @@ -7287,7 +7287,7 @@ "x-appwrite": { "method": "createBooleanAttribute", "group": "attributes", - "weight": 304, + "weight": 290, "cookies": false, "type": "", "demo": "databases\/create-boolean-attribute.md", @@ -7401,7 +7401,7 @@ "x-appwrite": { "method": "updateBooleanAttribute", "group": "attributes", - "weight": 305, + "weight": 291, "cookies": false, "type": "", "demo": "databases\/update-boolean-attribute.md", @@ -7517,7 +7517,7 @@ "x-appwrite": { "method": "createDatetimeAttribute", "group": "attributes", - "weight": 306, + "weight": 292, "cookies": false, "type": "", "demo": "databases\/create-datetime-attribute.md", @@ -7631,7 +7631,7 @@ "x-appwrite": { "method": "updateDatetimeAttribute", "group": "attributes", - "weight": 307, + "weight": 293, "cookies": false, "type": "", "demo": "databases\/update-datetime-attribute.md", @@ -7747,7 +7747,7 @@ "x-appwrite": { "method": "createEmailAttribute", "group": "attributes", - "weight": 308, + "weight": 294, "cookies": false, "type": "", "demo": "databases\/create-email-attribute.md", @@ -7862,7 +7862,7 @@ "x-appwrite": { "method": "updateEmailAttribute", "group": "attributes", - "weight": 309, + "weight": 295, "cookies": false, "type": "", "demo": "databases\/update-email-attribute.md", @@ -7979,7 +7979,7 @@ "x-appwrite": { "method": "createEnumAttribute", "group": "attributes", - "weight": 310, + "weight": 296, "cookies": false, "type": "", "demo": "databases\/create-enum-attribute.md", @@ -8103,7 +8103,7 @@ "x-appwrite": { "method": "updateEnumAttribute", "group": "attributes", - "weight": 311, + "weight": 297, "cookies": false, "type": "", "demo": "databases\/update-enum-attribute.md", @@ -8229,7 +8229,7 @@ "x-appwrite": { "method": "createFloatAttribute", "group": "attributes", - "weight": 312, + "weight": 298, "cookies": false, "type": "", "demo": "databases\/create-float-attribute.md", @@ -8360,7 +8360,7 @@ "x-appwrite": { "method": "updateFloatAttribute", "group": "attributes", - "weight": 313, + "weight": 299, "cookies": false, "type": "", "demo": "databases\/update-float-attribute.md", @@ -8493,7 +8493,7 @@ "x-appwrite": { "method": "createIntegerAttribute", "group": "attributes", - "weight": 314, + "weight": 300, "cookies": false, "type": "", "demo": "databases\/create-integer-attribute.md", @@ -8624,7 +8624,7 @@ "x-appwrite": { "method": "updateIntegerAttribute", "group": "attributes", - "weight": 315, + "weight": 301, "cookies": false, "type": "", "demo": "databases\/update-integer-attribute.md", @@ -8757,7 +8757,7 @@ "x-appwrite": { "method": "createIpAttribute", "group": "attributes", - "weight": 316, + "weight": 302, "cookies": false, "type": "", "demo": "databases\/create-ip-attribute.md", @@ -8871,7 +8871,7 @@ "x-appwrite": { "method": "updateIpAttribute", "group": "attributes", - "weight": 317, + "weight": 303, "cookies": false, "type": "", "demo": "databases\/update-ip-attribute.md", @@ -8987,7 +8987,7 @@ "x-appwrite": { "method": "createLineAttribute", "group": "attributes", - "weight": 318, + "weight": 304, "cookies": false, "type": "", "demo": "databases\/create-line-attribute.md", @@ -9095,7 +9095,7 @@ "x-appwrite": { "method": "updateLineAttribute", "group": "attributes", - "weight": 319, + "weight": 305, "cookies": false, "type": "", "demo": "databases\/update-line-attribute.md", @@ -9210,7 +9210,7 @@ "x-appwrite": { "method": "createLongtextAttribute", "group": "attributes", - "weight": 336, + "weight": 322, "cookies": false, "type": "", "demo": "databases\/create-longtext-attribute.md", @@ -9320,7 +9320,7 @@ "x-appwrite": { "method": "updateLongtextAttribute", "group": "attributes", - "weight": 337, + "weight": 323, "cookies": false, "type": "", "demo": "databases\/update-longtext-attribute.md", @@ -9432,7 +9432,7 @@ "x-appwrite": { "method": "createMediumtextAttribute", "group": "attributes", - "weight": 334, + "weight": 320, "cookies": false, "type": "", "demo": "databases\/create-mediumtext-attribute.md", @@ -9542,7 +9542,7 @@ "x-appwrite": { "method": "updateMediumtextAttribute", "group": "attributes", - "weight": 335, + "weight": 321, "cookies": false, "type": "", "demo": "databases\/update-mediumtext-attribute.md", @@ -9654,7 +9654,7 @@ "x-appwrite": { "method": "createPointAttribute", "group": "attributes", - "weight": 320, + "weight": 306, "cookies": false, "type": "", "demo": "databases\/create-point-attribute.md", @@ -9762,7 +9762,7 @@ "x-appwrite": { "method": "updatePointAttribute", "group": "attributes", - "weight": 321, + "weight": 307, "cookies": false, "type": "", "demo": "databases\/update-point-attribute.md", @@ -9877,7 +9877,7 @@ "x-appwrite": { "method": "createPolygonAttribute", "group": "attributes", - "weight": 322, + "weight": 308, "cookies": false, "type": "", "demo": "databases\/create-polygon-attribute.md", @@ -9985,7 +9985,7 @@ "x-appwrite": { "method": "updatePolygonAttribute", "group": "attributes", - "weight": 323, + "weight": 309, "cookies": false, "type": "", "demo": "databases\/update-polygon-attribute.md", @@ -10100,7 +10100,7 @@ "x-appwrite": { "method": "createRelationshipAttribute", "group": "attributes", - "weight": 324, + "weight": 310, "cookies": false, "type": "", "demo": "databases\/create-relationship-attribute.md", @@ -10242,7 +10242,7 @@ "x-appwrite": { "method": "createStringAttribute", "group": "attributes", - "weight": 326, + "weight": 312, "cookies": false, "type": "", "demo": "databases\/create-string-attribute.md", @@ -10370,7 +10370,7 @@ "x-appwrite": { "method": "updateStringAttribute", "group": "attributes", - "weight": 327, + "weight": 313, "cookies": false, "type": "", "demo": "databases\/update-string-attribute.md", @@ -10494,7 +10494,7 @@ "x-appwrite": { "method": "createTextAttribute", "group": "attributes", - "weight": 332, + "weight": 318, "cookies": false, "type": "", "demo": "databases\/create-text-attribute.md", @@ -10604,7 +10604,7 @@ "x-appwrite": { "method": "updateTextAttribute", "group": "attributes", - "weight": 333, + "weight": 319, "cookies": false, "type": "", "demo": "databases\/update-text-attribute.md", @@ -10716,7 +10716,7 @@ "x-appwrite": { "method": "createUrlAttribute", "group": "attributes", - "weight": 328, + "weight": 314, "cookies": false, "type": "", "demo": "databases\/create-url-attribute.md", @@ -10831,7 +10831,7 @@ "x-appwrite": { "method": "updateUrlAttribute", "group": "attributes", - "weight": 329, + "weight": 315, "cookies": false, "type": "", "demo": "databases\/update-url-attribute.md", @@ -10948,7 +10948,7 @@ "x-appwrite": { "method": "createVarcharAttribute", "group": "attributes", - "weight": 330, + "weight": 316, "cookies": false, "type": "", "demo": "databases\/create-varchar-attribute.md", @@ -11066,7 +11066,7 @@ "x-appwrite": { "method": "updateVarcharAttribute", "group": "attributes", - "weight": 331, + "weight": 317, "cookies": false, "type": "", "demo": "databases\/update-varchar-attribute.md", @@ -11215,7 +11215,7 @@ "x-appwrite": { "method": "getAttribute", "group": "attributes", - "weight": 301, + "weight": 287, "cookies": false, "type": "", "demo": "databases\/get-attribute.md", @@ -11291,7 +11291,7 @@ "x-appwrite": { "method": "deleteAttribute", "group": "attributes", - "weight": 302, + "weight": 288, "cookies": false, "type": "", "demo": "databases\/delete-attribute.md", @@ -11374,7 +11374,7 @@ "x-appwrite": { "method": "updateRelationshipAttribute", "group": "attributes", - "weight": 325, + "weight": 311, "cookies": false, "type": "", "demo": "databases\/update-relationship-attribute.md", @@ -11485,7 +11485,7 @@ "x-appwrite": { "method": "listDocuments", "group": "documents", - "weight": 297, + "weight": 283, "cookies": false, "type": "", "demo": "databases\/list-documents.md", @@ -11591,7 +11591,7 @@ "x-appwrite": { "method": "createDocument", "group": "documents", - "weight": 289, + "weight": 275, "cookies": false, "type": "", "demo": "databases\/create-document.md", @@ -11786,7 +11786,7 @@ "x-appwrite": { "method": "upsertDocuments", "group": "documents", - "weight": 294, + "weight": 280, "cookies": false, "type": "", "demo": "databases\/upsert-documents.md", @@ -11923,7 +11923,7 @@ "x-appwrite": { "method": "updateDocuments", "group": "documents", - "weight": 292, + "weight": 278, "cookies": false, "type": "", "demo": "databases\/update-documents.md", @@ -12028,7 +12028,7 @@ "x-appwrite": { "method": "deleteDocuments", "group": "documents", - "weight": 296, + "weight": 282, "cookies": false, "type": "", "demo": "databases\/delete-documents.md", @@ -12127,7 +12127,7 @@ "x-appwrite": { "method": "getDocument", "group": "documents", - "weight": 290, + "weight": 276, "cookies": false, "type": "", "demo": "databases\/get-document.md", @@ -12232,7 +12232,7 @@ "x-appwrite": { "method": "upsertDocument", "group": "documents", - "weight": 293, + "weight": 279, "cookies": false, "type": "", "demo": "databases\/upsert-document.md", @@ -12386,7 +12386,7 @@ "x-appwrite": { "method": "updateDocument", "group": "documents", - "weight": 291, + "weight": 277, "cookies": false, "type": "", "demo": "databases\/update-document.md", @@ -12498,7 +12498,7 @@ "x-appwrite": { "method": "deleteDocument", "group": "documents", - "weight": 295, + "weight": 281, "cookies": false, "type": "", "demo": "databases\/delete-document.md", @@ -12601,7 +12601,7 @@ "x-appwrite": { "method": "decrementDocumentAttribute", "group": "documents", - "weight": 300, + "weight": 286, "cookies": false, "type": "", "demo": "databases\/decrement-document-attribute.md", @@ -12726,7 +12726,7 @@ "x-appwrite": { "method": "incrementDocumentAttribute", "group": "documents", - "weight": 299, + "weight": 285, "cookies": false, "type": "", "demo": "databases\/increment-document-attribute.md", @@ -12849,7 +12849,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 341, + "weight": 327, "cookies": false, "type": "", "demo": "databases\/list-indexes.md", @@ -12944,7 +12944,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 338, + "weight": 324, "cookies": false, "type": "", "demo": "databases\/create-index.md", @@ -13085,7 +13085,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 339, + "weight": 325, "cookies": false, "type": "", "demo": "databases\/get-index.md", @@ -13161,7 +13161,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 340, + "weight": 326, "cookies": false, "type": "", "demo": "databases\/delete-index.md", @@ -13242,7 +13242,7 @@ "x-appwrite": { "method": "list", "group": "functions", - "weight": 431, + "weight": 420, "cookies": false, "type": "", "demo": "functions\/list.md", @@ -13325,7 +13325,7 @@ "x-appwrite": { "method": "create", "group": "functions", - "weight": 428, + "weight": 417, "cookies": false, "type": "", "demo": "functions\/create.md", @@ -13414,6 +13414,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -13441,7 +13442,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -13640,7 +13642,7 @@ "x-appwrite": { "method": "listRuntimes", "group": "runtimes", - "weight": 433, + "weight": 422, "cookies": false, "type": "", "demo": "functions\/list-runtimes.md", @@ -13691,7 +13693,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "runtimes", - "weight": 434, + "weight": 423, "cookies": false, "type": "", "demo": "functions\/list-specifications.md", @@ -13742,7 +13744,7 @@ "x-appwrite": { "method": "get", "group": "functions", - "weight": 429, + "weight": 418, "cookies": false, "type": "", "demo": "functions\/get.md", @@ -13803,7 +13805,7 @@ "x-appwrite": { "method": "update", "group": "functions", - "weight": 430, + "weight": 419, "cookies": false, "type": "", "demo": "functions\/update.md", @@ -13894,6 +13896,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -13921,7 +13924,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -14114,7 +14118,7 @@ "x-appwrite": { "method": "delete", "group": "functions", - "weight": 432, + "weight": 421, "cookies": false, "type": "", "demo": "functions\/delete.md", @@ -14177,7 +14181,7 @@ "x-appwrite": { "method": "updateFunctionDeployment", "group": "functions", - "weight": 437, + "weight": 426, "cookies": false, "type": "", "demo": "functions\/update-function-deployment.md", @@ -14256,7 +14260,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 438, + "weight": 427, "cookies": false, "type": "", "demo": "functions\/list-deployments.md", @@ -14347,7 +14351,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 435, + "weight": 424, "cookies": false, "type": "upload", "demo": "functions\/create-deployment.md", @@ -14441,7 +14445,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 443, + "weight": 432, "cookies": false, "type": "", "demo": "functions\/create-duplicate-deployment.md", @@ -14528,7 +14532,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 440, + "weight": 429, "cookies": false, "type": "", "demo": "functions\/create-template-deployment.md", @@ -14650,7 +14654,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 441, + "weight": 430, "cookies": false, "type": "", "demo": "functions\/create-vcs-deployment.md", @@ -14748,7 +14752,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 436, + "weight": 425, "cookies": false, "type": "", "demo": "functions\/get-deployment.md", @@ -14812,7 +14816,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 439, + "weight": 428, "cookies": false, "type": "", "demo": "functions\/delete-deployment.md", @@ -14881,7 +14885,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 442, + "weight": 431, "cookies": false, "type": "location", "demo": "functions\/get-deployment-download.md", @@ -14968,7 +14972,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 444, + "weight": 433, "cookies": false, "type": "", "demo": "functions\/update-deployment-status.md", @@ -15037,7 +15041,7 @@ "x-appwrite": { "method": "listExecutions", "group": "executions", - "weight": 447, + "weight": 436, "cookies": false, "type": "", "demo": "functions\/list-executions.md", @@ -15122,7 +15126,7 @@ "x-appwrite": { "method": "createExecution", "group": "executions", - "weight": 445, + "weight": 434, "cookies": false, "type": "", "demo": "functions\/create-execution.md", @@ -15243,7 +15247,7 @@ "x-appwrite": { "method": "getExecution", "group": "executions", - "weight": 446, + "weight": 435, "cookies": false, "type": "", "demo": "functions\/get-execution.md", @@ -15310,7 +15314,7 @@ "x-appwrite": { "method": "deleteExecution", "group": "executions", - "weight": 448, + "weight": 437, "cookies": false, "type": "", "demo": "functions\/delete-execution.md", @@ -15379,7 +15383,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 453, + "weight": 442, "cookies": false, "type": "", "demo": "functions\/list-variables.md", @@ -15440,7 +15444,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 451, + "weight": 440, "cookies": false, "type": "", "demo": "functions\/create-variable.md", @@ -15532,7 +15536,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 452, + "weight": 441, "cookies": false, "type": "", "demo": "functions\/get-variable.md", @@ -15601,7 +15605,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 454, + "weight": 443, "cookies": false, "type": "", "demo": "functions\/update-variable.md", @@ -15697,7 +15701,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 455, + "weight": 444, "cookies": false, "type": "", "demo": "functions\/delete-variable.md", @@ -15768,7 +15772,7 @@ "x-appwrite": { "method": "query", "group": "graphql", - "weight": 190, + "weight": 176, "cookies": false, "type": "graphql", "demo": "graphql\/query.md", @@ -15845,7 +15849,7 @@ "x-appwrite": { "method": "mutation", "group": "graphql", - "weight": 189, + "weight": 175, "cookies": false, "type": "graphql", "demo": "graphql\/mutation.md", @@ -15920,7 +15924,7 @@ "x-appwrite": { "method": "get", "group": "health", - "weight": 458, + "weight": 447, "cookies": false, "type": "", "demo": "health\/get.md", @@ -15972,7 +15976,7 @@ "x-appwrite": { "method": "getAntivirus", "group": "health", - "weight": 467, + "weight": 456, "cookies": false, "type": "", "demo": "health\/get-antivirus.md", @@ -16024,7 +16028,7 @@ "x-appwrite": { "method": "getCache", "group": "health", - "weight": 461, + "weight": 450, "cookies": false, "type": "", "demo": "health\/get-cache.md", @@ -16076,7 +16080,7 @@ "x-appwrite": { "method": "getCertificate", "group": "health", - "weight": 464, + "weight": 453, "cookies": false, "type": "", "demo": "health\/get-certificate.md", @@ -16137,7 +16141,7 @@ "x-appwrite": { "method": "getDB", "group": "health", - "weight": 460, + "weight": 449, "cookies": false, "type": "", "demo": "health\/get-db.md", @@ -16189,7 +16193,7 @@ "x-appwrite": { "method": "getPubSub", "group": "health", - "weight": 462, + "weight": 451, "cookies": false, "type": "", "demo": "health\/get-pub-sub.md", @@ -16241,7 +16245,7 @@ "x-appwrite": { "method": "getQueueAudits", "group": "queue", - "weight": 468, + "weight": 457, "cookies": false, "type": "", "demo": "health\/get-queue-audits.md", @@ -16304,7 +16308,7 @@ "x-appwrite": { "method": "getQueueBuilds", "group": "queue", - "weight": 472, + "weight": 461, "cookies": false, "type": "", "demo": "health\/get-queue-builds.md", @@ -16367,7 +16371,7 @@ "x-appwrite": { "method": "getQueueCertificates", "group": "queue", - "weight": 471, + "weight": 460, "cookies": false, "type": "", "demo": "health\/get-queue-certificates.md", @@ -16430,7 +16434,7 @@ "x-appwrite": { "method": "getQueueDatabases", "group": "queue", - "weight": 473, + "weight": 462, "cookies": false, "type": "", "demo": "health\/get-queue-databases.md", @@ -16502,7 +16506,7 @@ "x-appwrite": { "method": "getQueueDeletes", "group": "queue", - "weight": 474, + "weight": 463, "cookies": false, "type": "", "demo": "health\/get-queue-deletes.md", @@ -16565,7 +16569,7 @@ "x-appwrite": { "method": "getFailedJobs", "group": "queue", - "weight": 481, + "weight": 470, "cookies": false, "type": "", "demo": "health\/get-failed-jobs.md", @@ -16653,7 +16657,7 @@ "x-appwrite": { "method": "getQueueFunctions", "group": "queue", - "weight": 478, + "weight": 467, "cookies": false, "type": "", "demo": "health\/get-queue-functions.md", @@ -16716,7 +16720,7 @@ "x-appwrite": { "method": "getQueueLogs", "group": "queue", - "weight": 470, + "weight": 459, "cookies": false, "type": "", "demo": "health\/get-queue-logs.md", @@ -16779,7 +16783,7 @@ "x-appwrite": { "method": "getQueueMails", "group": "queue", - "weight": 475, + "weight": 464, "cookies": false, "type": "", "demo": "health\/get-queue-mails.md", @@ -16842,7 +16846,7 @@ "x-appwrite": { "method": "getQueueMessaging", "group": "queue", - "weight": 476, + "weight": 465, "cookies": false, "type": "", "demo": "health\/get-queue-messaging.md", @@ -16905,7 +16909,7 @@ "x-appwrite": { "method": "getQueueMigrations", "group": "queue", - "weight": 477, + "weight": 466, "cookies": false, "type": "", "demo": "health\/get-queue-migrations.md", @@ -16968,7 +16972,7 @@ "x-appwrite": { "method": "getQueueStatsResources", "group": "queue", - "weight": 479, + "weight": 468, "cookies": false, "type": "", "demo": "health\/get-queue-stats-resources.md", @@ -17031,7 +17035,7 @@ "x-appwrite": { "method": "getQueueUsage", "group": "queue", - "weight": 480, + "weight": 469, "cookies": false, "type": "", "demo": "health\/get-queue-usage.md", @@ -17094,7 +17098,7 @@ "x-appwrite": { "method": "getQueueWebhooks", "group": "queue", - "weight": 469, + "weight": 458, "cookies": false, "type": "", "demo": "health\/get-queue-webhooks.md", @@ -17157,7 +17161,7 @@ "x-appwrite": { "method": "getStorage", "group": "storage", - "weight": 466, + "weight": 455, "cookies": false, "type": "", "demo": "health\/get-storage.md", @@ -17209,7 +17213,7 @@ "x-appwrite": { "method": "getStorageLocal", "group": "storage", - "weight": 465, + "weight": 454, "cookies": false, "type": "", "demo": "health\/get-storage-local.md", @@ -17261,7 +17265,7 @@ "x-appwrite": { "method": "getTime", "group": "health", - "weight": 463, + "weight": 452, "cookies": false, "type": "", "demo": "health\/get-time.md", @@ -17753,7 +17757,7 @@ "x-appwrite": { "method": "listMessages", "group": "messages", - "weight": 245, + "weight": 231, "cookies": false, "type": "", "demo": "messaging\/list-messages.md", @@ -17839,7 +17843,7 @@ "x-appwrite": { "method": "createEmail", "group": "messages", - "weight": 242, + "weight": 228, "cookies": false, "type": "", "demo": "messaging\/create-email.md", @@ -18000,7 +18004,7 @@ "x-appwrite": { "method": "updateEmail", "group": "messages", - "weight": 249, + "weight": 235, "cookies": false, "type": "", "demo": "messaging\/update-email.md", @@ -18168,7 +18172,7 @@ "x-appwrite": { "method": "createPush", "group": "messages", - "weight": 244, + "weight": 230, "cookies": false, "type": "", "demo": "messaging\/create-push.md", @@ -18368,7 +18372,7 @@ "x-appwrite": { "method": "updatePush", "group": "messages", - "weight": 251, + "weight": 237, "cookies": false, "type": "", "demo": "messaging\/update-push.md", @@ -18583,7 +18587,7 @@ "x-appwrite": { "method": "createSms", "group": "messages", - "weight": 243, + "weight": 229, "cookies": false, "type": "", "demo": "messaging\/create-sms.md", @@ -18776,7 +18780,7 @@ "x-appwrite": { "method": "updateSms", "group": "messages", - "weight": 250, + "weight": 236, "cookies": false, "type": "", "demo": "messaging\/update-sms.md", @@ -18968,7 +18972,7 @@ "x-appwrite": { "method": "getMessage", "group": "messages", - "weight": 248, + "weight": 234, "cookies": false, "type": "", "demo": "messaging\/get-message.md", @@ -19025,7 +19029,7 @@ "x-appwrite": { "method": "delete", "group": "messages", - "weight": 252, + "weight": 238, "cookies": false, "type": "", "demo": "messaging\/delete.md", @@ -19087,7 +19091,7 @@ "x-appwrite": { "method": "listMessageLogs", "group": "logs", - "weight": 246, + "weight": 232, "cookies": false, "type": "", "demo": "messaging\/list-message-logs.md", @@ -19170,7 +19174,7 @@ "x-appwrite": { "method": "listTargets", "group": "messages", - "weight": 247, + "weight": 233, "cookies": false, "type": "", "demo": "messaging\/list-targets.md", @@ -19253,7 +19257,7 @@ "x-appwrite": { "method": "listProviders", "group": "providers", - "weight": 216, + "weight": 202, "cookies": false, "type": "", "demo": "messaging\/list-providers.md", @@ -19339,7 +19343,7 @@ "x-appwrite": { "method": "createApnsProvider", "group": "providers", - "weight": 215, + "weight": 201, "cookies": false, "type": "", "demo": "messaging\/create-apns-provider.md", @@ -19531,7 +19535,7 @@ "x-appwrite": { "method": "updateApnsProvider", "group": "providers", - "weight": 229, + "weight": 215, "cookies": false, "type": "", "demo": "messaging\/update-apns-provider.md", @@ -19720,7 +19724,7 @@ "x-appwrite": { "method": "createFcmProvider", "group": "providers", - "weight": 214, + "weight": 200, "cookies": false, "type": "", "demo": "messaging\/create-fcm-provider.md", @@ -19881,7 +19885,7 @@ "x-appwrite": { "method": "updateFcmProvider", "group": "providers", - "weight": 228, + "weight": 214, "cookies": false, "type": "", "demo": "messaging\/update-fcm-provider.md", @@ -20038,7 +20042,7 @@ "x-appwrite": { "method": "createMailgunProvider", "group": "providers", - "weight": 205, + "weight": 191, "cookies": false, "type": "", "demo": "messaging\/create-mailgun-provider.md", @@ -20171,7 +20175,7 @@ "x-appwrite": { "method": "updateMailgunProvider", "group": "providers", - "weight": 219, + "weight": 205, "cookies": false, "type": "", "demo": "messaging\/update-mailgun-provider.md", @@ -20301,7 +20305,7 @@ "x-appwrite": { "method": "createMsg91Provider", "group": "providers", - "weight": 209, + "weight": 195, "cookies": false, "type": "", "demo": "messaging\/create-msg-91-provider.md", @@ -20407,7 +20411,7 @@ "x-appwrite": { "method": "updateMsg91Provider", "group": "providers", - "weight": 223, + "weight": 209, "cookies": false, "type": "", "demo": "messaging\/update-msg-91-provider.md", @@ -20511,7 +20515,7 @@ "x-appwrite": { "method": "createResendProvider", "group": "providers", - "weight": 207, + "weight": 193, "cookies": false, "type": "", "demo": "messaging\/create-resend-provider.md", @@ -20631,7 +20635,7 @@ "x-appwrite": { "method": "updateResendProvider", "group": "providers", - "weight": 221, + "weight": 207, "cookies": false, "type": "", "demo": "messaging\/update-resend-provider.md", @@ -20748,7 +20752,7 @@ "x-appwrite": { "method": "createSendgridProvider", "group": "providers", - "weight": 206, + "weight": 192, "cookies": false, "type": "", "demo": "messaging\/create-sendgrid-provider.md", @@ -20868,7 +20872,7 @@ "x-appwrite": { "method": "updateSendgridProvider", "group": "providers", - "weight": 220, + "weight": 206, "cookies": false, "type": "", "demo": "messaging\/update-sendgrid-provider.md", @@ -20985,7 +20989,7 @@ "x-appwrite": { "method": "createSmtpProvider", "group": "providers", - "weight": 208, + "weight": 194, "cookies": false, "type": "", "demo": "messaging\/create-smtp-provider.md", @@ -21238,7 +21242,7 @@ "x-appwrite": { "method": "updateSmtpProvider", "group": "providers", - "weight": 222, + "weight": 208, "cookies": false, "type": "", "demo": "messaging\/update-smtp-provider.md", @@ -21485,7 +21489,7 @@ "x-appwrite": { "method": "createTelesignProvider", "group": "providers", - "weight": 210, + "weight": 196, "cookies": false, "type": "", "demo": "messaging\/create-telesign-provider.md", @@ -21592,7 +21596,7 @@ "x-appwrite": { "method": "updateTelesignProvider", "group": "providers", - "weight": 224, + "weight": 210, "cookies": false, "type": "", "demo": "messaging\/update-telesign-provider.md", @@ -21696,7 +21700,7 @@ "x-appwrite": { "method": "createTextmagicProvider", "group": "providers", - "weight": 211, + "weight": 197, "cookies": false, "type": "", "demo": "messaging\/create-textmagic-provider.md", @@ -21803,7 +21807,7 @@ "x-appwrite": { "method": "updateTextmagicProvider", "group": "providers", - "weight": 225, + "weight": 211, "cookies": false, "type": "", "demo": "messaging\/update-textmagic-provider.md", @@ -21907,7 +21911,7 @@ "x-appwrite": { "method": "createTwilioProvider", "group": "providers", - "weight": 212, + "weight": 198, "cookies": false, "type": "", "demo": "messaging\/create-twilio-provider.md", @@ -22014,7 +22018,7 @@ "x-appwrite": { "method": "updateTwilioProvider", "group": "providers", - "weight": 226, + "weight": 212, "cookies": false, "type": "", "demo": "messaging\/update-twilio-provider.md", @@ -22118,7 +22122,7 @@ "x-appwrite": { "method": "createVonageProvider", "group": "providers", - "weight": 213, + "weight": 199, "cookies": false, "type": "", "demo": "messaging\/create-vonage-provider.md", @@ -22225,7 +22229,7 @@ "x-appwrite": { "method": "updateVonageProvider", "group": "providers", - "weight": 227, + "weight": 213, "cookies": false, "type": "", "demo": "messaging\/update-vonage-provider.md", @@ -22327,7 +22331,7 @@ "x-appwrite": { "method": "getProvider", "group": "providers", - "weight": 218, + "weight": 204, "cookies": false, "type": "", "demo": "messaging\/get-provider.md", @@ -22384,7 +22388,7 @@ "x-appwrite": { "method": "deleteProvider", "group": "providers", - "weight": 230, + "weight": 216, "cookies": false, "type": "", "demo": "messaging\/delete-provider.md", @@ -22446,7 +22450,7 @@ "x-appwrite": { "method": "listProviderLogs", "group": "providers", - "weight": 217, + "weight": 203, "cookies": false, "type": "", "demo": "messaging\/list-provider-logs.md", @@ -22529,7 +22533,7 @@ "x-appwrite": { "method": "listSubscriberLogs", "group": "subscribers", - "weight": 239, + "weight": 225, "cookies": false, "type": "", "demo": "messaging\/list-subscriber-logs.md", @@ -22612,7 +22616,7 @@ "x-appwrite": { "method": "listTopics", "group": "topics", - "weight": 232, + "weight": 218, "cookies": false, "type": "", "demo": "messaging\/list-topics.md", @@ -22696,7 +22700,7 @@ "x-appwrite": { "method": "createTopic", "group": "topics", - "weight": 231, + "weight": 217, "cookies": false, "type": "", "demo": "messaging\/create-topic.md", @@ -22786,7 +22790,7 @@ "x-appwrite": { "method": "getTopic", "group": "topics", - "weight": 234, + "weight": 220, "cookies": false, "type": "", "demo": "messaging\/get-topic.md", @@ -22848,7 +22852,7 @@ "x-appwrite": { "method": "updateTopic", "group": "topics", - "weight": 235, + "weight": 221, "cookies": false, "type": "", "demo": "messaging\/update-topic.md", @@ -22931,7 +22935,7 @@ "x-appwrite": { "method": "deleteTopic", "group": "topics", - "weight": 236, + "weight": 222, "cookies": false, "type": "", "demo": "messaging\/delete-topic.md", @@ -22993,7 +22997,7 @@ "x-appwrite": { "method": "listTopicLogs", "group": "topics", - "weight": 233, + "weight": 219, "cookies": false, "type": "", "demo": "messaging\/list-topic-logs.md", @@ -23076,7 +23080,7 @@ "x-appwrite": { "method": "listSubscribers", "group": "subscribers", - "weight": 238, + "weight": 224, "cookies": false, "type": "", "demo": "messaging\/list-subscribers.md", @@ -23168,7 +23172,7 @@ "x-appwrite": { "method": "createSubscriber", "group": "subscribers", - "weight": 237, + "weight": 223, "cookies": false, "type": "", "demo": "messaging\/create-subscriber.md", @@ -23258,7 +23262,7 @@ "x-appwrite": { "method": "getSubscriber", "group": "subscribers", - "weight": 240, + "weight": 226, "cookies": false, "type": "", "demo": "messaging\/get-subscriber.md", @@ -23323,7 +23327,7 @@ "x-appwrite": { "method": "deleteSubscriber", "group": "subscribers", - "weight": 241, + "weight": 227, "cookies": false, "type": "", "demo": "messaging\/delete-subscriber.md", @@ -23396,7 +23400,7 @@ "x-appwrite": { "method": "list", "group": "sites", - "weight": 485, + "weight": 474, "cookies": false, "type": "", "demo": "sites\/list.md", @@ -23479,7 +23483,7 @@ "x-appwrite": { "method": "create", "group": "sites", - "weight": 483, + "weight": 472, "cookies": false, "type": "", "demo": "sites\/create.md", @@ -23630,6 +23634,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -23657,7 +23662,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -23752,7 +23758,7 @@ "x-appwrite": { "method": "listFrameworks", "group": "frameworks", - "weight": 488, + "weight": 477, "cookies": false, "type": "", "demo": "sites\/list-frameworks.md", @@ -23803,7 +23809,7 @@ "x-appwrite": { "method": "listSpecifications", "group": "frameworks", - "weight": 511, + "weight": 500, "cookies": false, "type": "", "demo": "sites\/list-specifications.md", @@ -23854,7 +23860,7 @@ "x-appwrite": { "method": "get", "group": "sites", - "weight": 484, + "weight": 473, "cookies": false, "type": "", "demo": "sites\/get.md", @@ -23915,7 +23921,7 @@ "x-appwrite": { "method": "update", "group": "sites", - "weight": 486, + "weight": 475, "cookies": false, "type": "", "demo": "sites\/update.md", @@ -24068,6 +24074,7 @@ "dart-3.5", "dart-3.8", "dart-3.9", + "dart-3.10", "dotnet-6.0", "dotnet-7.0", "dotnet-8.0", @@ -24095,7 +24102,8 @@ "flutter-3.27", "flutter-3.29", "flutter-3.32", - "flutter-3.35" + "flutter-3.35", + "flutter-3.38" ], "x-enum-name": null, "x-enum-keys": [] @@ -24183,7 +24191,7 @@ "x-appwrite": { "method": "delete", "group": "sites", - "weight": 487, + "weight": 476, "cookies": false, "type": "", "demo": "sites\/delete.md", @@ -24246,7 +24254,7 @@ "x-appwrite": { "method": "updateSiteDeployment", "group": "sites", - "weight": 494, + "weight": 483, "cookies": false, "type": "", "demo": "sites\/update-site-deployment.md", @@ -24325,7 +24333,7 @@ "x-appwrite": { "method": "listDeployments", "group": "deployments", - "weight": 493, + "weight": 482, "cookies": false, "type": "", "demo": "sites\/list-deployments.md", @@ -24416,7 +24424,7 @@ "x-appwrite": { "method": "createDeployment", "group": "deployments", - "weight": 489, + "weight": 478, "cookies": false, "type": "upload", "demo": "sites\/create-deployment.md", @@ -24518,7 +24526,7 @@ "x-appwrite": { "method": "createDuplicateDeployment", "group": "deployments", - "weight": 497, + "weight": 486, "cookies": false, "type": "", "demo": "sites\/create-duplicate-deployment.md", @@ -24599,7 +24607,7 @@ "x-appwrite": { "method": "createTemplateDeployment", "group": "deployments", - "weight": 490, + "weight": 479, "cookies": false, "type": "", "demo": "sites\/create-template-deployment.md", @@ -24721,7 +24729,7 @@ "x-appwrite": { "method": "createVcsDeployment", "group": "deployments", - "weight": 491, + "weight": 480, "cookies": false, "type": "", "demo": "sites\/create-vcs-deployment.md", @@ -24820,7 +24828,7 @@ "x-appwrite": { "method": "getDeployment", "group": "deployments", - "weight": 492, + "weight": 481, "cookies": false, "type": "", "demo": "sites\/get-deployment.md", @@ -24884,7 +24892,7 @@ "x-appwrite": { "method": "deleteDeployment", "group": "deployments", - "weight": 495, + "weight": 484, "cookies": false, "type": "", "demo": "sites\/delete-deployment.md", @@ -24953,7 +24961,7 @@ "x-appwrite": { "method": "getDeploymentDownload", "group": "deployments", - "weight": 496, + "weight": 485, "cookies": false, "type": "location", "demo": "sites\/get-deployment-download.md", @@ -25040,7 +25048,7 @@ "x-appwrite": { "method": "updateDeploymentStatus", "group": "deployments", - "weight": 498, + "weight": 487, "cookies": false, "type": "", "demo": "sites\/update-deployment-status.md", @@ -25109,7 +25117,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 500, + "weight": 489, "cookies": false, "type": "", "demo": "sites\/list-logs.md", @@ -25191,7 +25199,7 @@ "x-appwrite": { "method": "getLog", "group": "logs", - "weight": 499, + "weight": 488, "cookies": false, "type": "", "demo": "sites\/get-log.md", @@ -25257,7 +25265,7 @@ "x-appwrite": { "method": "deleteLog", "group": "logs", - "weight": 501, + "weight": 490, "cookies": false, "type": "", "demo": "sites\/delete-log.md", @@ -25326,7 +25334,7 @@ "x-appwrite": { "method": "listVariables", "group": "variables", - "weight": 504, + "weight": 493, "cookies": false, "type": "", "demo": "sites\/list-variables.md", @@ -25387,7 +25395,7 @@ "x-appwrite": { "method": "createVariable", "group": "variables", - "weight": 502, + "weight": 491, "cookies": false, "type": "", "demo": "sites\/create-variable.md", @@ -25479,7 +25487,7 @@ "x-appwrite": { "method": "getVariable", "group": "variables", - "weight": 503, + "weight": 492, "cookies": false, "type": "", "demo": "sites\/get-variable.md", @@ -25548,7 +25556,7 @@ "x-appwrite": { "method": "updateVariable", "group": "variables", - "weight": 505, + "weight": 494, "cookies": false, "type": "", "demo": "sites\/update-variable.md", @@ -25644,7 +25652,7 @@ "x-appwrite": { "method": "deleteVariable", "group": "variables", - "weight": 506, + "weight": 495, "cookies": false, "type": "", "demo": "sites\/delete-variable.md", @@ -25713,7 +25721,7 @@ "x-appwrite": { "method": "listBuckets", "group": "buckets", - "weight": 538, + "weight": 527, "cookies": false, "type": "", "demo": "storage\/list-buckets.md", @@ -25797,7 +25805,7 @@ "x-appwrite": { "method": "createBucket", "group": "buckets", - "weight": 536, + "weight": 525, "cookies": false, "type": "", "demo": "storage\/create-bucket.md", @@ -25945,7 +25953,7 @@ "x-appwrite": { "method": "getBucket", "group": "buckets", - "weight": 537, + "weight": 526, "cookies": false, "type": "", "demo": "storage\/get-bucket.md", @@ -26007,7 +26015,7 @@ "x-appwrite": { "method": "updateBucket", "group": "buckets", - "weight": 539, + "weight": 528, "cookies": false, "type": "", "demo": "storage\/update-bucket.md", @@ -26151,7 +26159,7 @@ "x-appwrite": { "method": "deleteBucket", "group": "buckets", - "weight": 540, + "weight": 529, "cookies": false, "type": "", "demo": "storage\/delete-bucket.md", @@ -26213,7 +26221,7 @@ "x-appwrite": { "method": "listFiles", "group": "files", - "weight": 543, + "weight": 532, "cookies": false, "type": "", "demo": "storage\/list-files.md", @@ -26308,7 +26316,7 @@ "x-appwrite": { "method": "createFile", "group": "files", - "weight": 541, + "weight": 530, "cookies": false, "type": "upload", "demo": "storage\/create-file.md", @@ -26401,7 +26409,7 @@ "x-appwrite": { "method": "getFile", "group": "files", - "weight": 542, + "weight": 531, "cookies": false, "type": "", "demo": "storage\/get-file.md", @@ -26474,7 +26482,7 @@ "x-appwrite": { "method": "updateFile", "group": "files", - "weight": 544, + "weight": 533, "cookies": false, "type": "", "demo": "storage\/update-file.md", @@ -26567,7 +26575,7 @@ "x-appwrite": { "method": "deleteFile", "group": "files", - "weight": 545, + "weight": 534, "cookies": false, "type": "", "demo": "storage\/delete-file.md", @@ -26640,7 +26648,7 @@ "x-appwrite": { "method": "getFileDownload", "group": "files", - "weight": 547, + "weight": 536, "cookies": false, "type": "location", "demo": "storage\/get-file-download.md", @@ -26722,7 +26730,7 @@ "x-appwrite": { "method": "getFilePreview", "group": "files", - "weight": 546, + "weight": 535, "cookies": false, "type": "location", "demo": "storage\/get-file-preview.md", @@ -26932,7 +26940,7 @@ "x-appwrite": { "method": "getFileView", "group": "files", - "weight": 548, + "weight": 537, "cookies": false, "type": "location", "demo": "storage\/get-file-view.md", @@ -27014,7 +27022,7 @@ "x-appwrite": { "method": "list", "group": "tablesdb", - "weight": 352, + "weight": 338, "cookies": false, "type": "", "demo": "tablesdb\/list.md", @@ -27098,7 +27106,7 @@ "x-appwrite": { "method": "create", "group": "tablesdb", - "weight": 348, + "weight": 334, "cookies": false, "type": "", "demo": "tablesdb\/create.md", @@ -27183,7 +27191,7 @@ "x-appwrite": { "method": "listTransactions", "group": "transactions", - "weight": 419, + "weight": 405, "cookies": false, "type": "", "demo": "tablesdb\/list-transactions.md", @@ -27255,7 +27263,7 @@ "x-appwrite": { "method": "createTransaction", "group": "transactions", - "weight": 415, + "weight": 401, "cookies": false, "type": "", "demo": "tablesdb\/create-transaction.md", @@ -27331,7 +27339,7 @@ "x-appwrite": { "method": "getTransaction", "group": "transactions", - "weight": 416, + "weight": 402, "cookies": false, "type": "", "demo": "tablesdb\/get-transaction.md", @@ -27399,7 +27407,7 @@ "x-appwrite": { "method": "updateTransaction", "group": "transactions", - "weight": 417, + "weight": 403, "cookies": false, "type": "", "demo": "tablesdb\/update-transaction.md", @@ -27483,7 +27491,7 @@ "x-appwrite": { "method": "deleteTransaction", "group": "transactions", - "weight": 418, + "weight": 404, "cookies": false, "type": "", "demo": "tablesdb\/delete-transaction.md", @@ -27553,7 +27561,7 @@ "x-appwrite": { "method": "createOperations", "group": "transactions", - "weight": 420, + "weight": 406, "cookies": false, "type": "", "demo": "tablesdb\/create-operations.md", @@ -27639,7 +27647,7 @@ "x-appwrite": { "method": "get", "group": "tablesdb", - "weight": 349, + "weight": 335, "cookies": false, "type": "", "demo": "tablesdb\/get.md", @@ -27701,7 +27709,7 @@ "x-appwrite": { "method": "update", "group": "tablesdb", - "weight": 350, + "weight": 336, "cookies": false, "type": "", "demo": "tablesdb\/update.md", @@ -27779,7 +27787,7 @@ "x-appwrite": { "method": "delete", "group": "tablesdb", - "weight": 351, + "weight": 337, "cookies": false, "type": "", "demo": "tablesdb\/delete.md", @@ -27841,7 +27849,7 @@ "x-appwrite": { "method": "listTables", "group": "tables", - "weight": 359, + "weight": 345, "cookies": false, "type": "", "demo": "tablesdb\/list-tables.md", @@ -27936,7 +27944,7 @@ "x-appwrite": { "method": "createTable", "group": "tables", - "weight": 355, + "weight": 341, "cookies": false, "type": "", "demo": "tablesdb\/create-table.md", @@ -28066,7 +28074,7 @@ "x-appwrite": { "method": "getTable", "group": "tables", - "weight": 356, + "weight": 342, "cookies": false, "type": "", "demo": "tablesdb\/get-table.md", @@ -28139,7 +28147,7 @@ "x-appwrite": { "method": "updateTable", "group": "tables", - "weight": 357, + "weight": 343, "cookies": false, "type": "", "demo": "tablesdb\/update-table.md", @@ -28244,7 +28252,7 @@ "x-appwrite": { "method": "deleteTable", "group": "tables", - "weight": 358, + "weight": 344, "cookies": false, "type": "", "demo": "tablesdb\/delete-table.md", @@ -28317,7 +28325,7 @@ "x-appwrite": { "method": "listColumns", "group": "columns", - "weight": 364, + "weight": 350, "cookies": false, "type": "", "demo": "tablesdb\/list-columns.md", @@ -28413,7 +28421,7 @@ "x-appwrite": { "method": "createBooleanColumn", "group": "columns", - "weight": 365, + "weight": 351, "cookies": false, "type": "", "demo": "tablesdb\/create-boolean-column.md", @@ -28526,7 +28534,7 @@ "x-appwrite": { "method": "updateBooleanColumn", "group": "columns", - "weight": 366, + "weight": 352, "cookies": false, "type": "", "demo": "tablesdb\/update-boolean-column.md", @@ -28641,7 +28649,7 @@ "x-appwrite": { "method": "createDatetimeColumn", "group": "columns", - "weight": 367, + "weight": 353, "cookies": false, "type": "", "demo": "tablesdb\/create-datetime-column.md", @@ -28754,7 +28762,7 @@ "x-appwrite": { "method": "updateDatetimeColumn", "group": "columns", - "weight": 368, + "weight": 354, "cookies": false, "type": "", "demo": "tablesdb\/update-datetime-column.md", @@ -28869,7 +28877,7 @@ "x-appwrite": { "method": "createEmailColumn", "group": "columns", - "weight": 369, + "weight": 355, "cookies": false, "type": "", "demo": "tablesdb\/create-email-column.md", @@ -28983,7 +28991,7 @@ "x-appwrite": { "method": "updateEmailColumn", "group": "columns", - "weight": 370, + "weight": 356, "cookies": false, "type": "", "demo": "tablesdb\/update-email-column.md", @@ -29099,7 +29107,7 @@ "x-appwrite": { "method": "createEnumColumn", "group": "columns", - "weight": 371, + "weight": 357, "cookies": false, "type": "", "demo": "tablesdb\/create-enum-column.md", @@ -29222,7 +29230,7 @@ "x-appwrite": { "method": "updateEnumColumn", "group": "columns", - "weight": 372, + "weight": 358, "cookies": false, "type": "", "demo": "tablesdb\/update-enum-column.md", @@ -29347,7 +29355,7 @@ "x-appwrite": { "method": "createFloatColumn", "group": "columns", - "weight": 373, + "weight": 359, "cookies": false, "type": "", "demo": "tablesdb\/create-float-column.md", @@ -29477,7 +29485,7 @@ "x-appwrite": { "method": "updateFloatColumn", "group": "columns", - "weight": 374, + "weight": 360, "cookies": false, "type": "", "demo": "tablesdb\/update-float-column.md", @@ -29609,7 +29617,7 @@ "x-appwrite": { "method": "createIntegerColumn", "group": "columns", - "weight": 375, + "weight": 361, "cookies": false, "type": "", "demo": "tablesdb\/create-integer-column.md", @@ -29739,7 +29747,7 @@ "x-appwrite": { "method": "updateIntegerColumn", "group": "columns", - "weight": 376, + "weight": 362, "cookies": false, "type": "", "demo": "tablesdb\/update-integer-column.md", @@ -29871,7 +29879,7 @@ "x-appwrite": { "method": "createIpColumn", "group": "columns", - "weight": 377, + "weight": 363, "cookies": false, "type": "", "demo": "tablesdb\/create-ip-column.md", @@ -29984,7 +29992,7 @@ "x-appwrite": { "method": "updateIpColumn", "group": "columns", - "weight": 378, + "weight": 364, "cookies": false, "type": "", "demo": "tablesdb\/update-ip-column.md", @@ -30099,7 +30107,7 @@ "x-appwrite": { "method": "createLineColumn", "group": "columns", - "weight": 379, + "weight": 365, "cookies": false, "type": "", "demo": "tablesdb\/create-line-column.md", @@ -30206,7 +30214,7 @@ "x-appwrite": { "method": "updateLineColumn", "group": "columns", - "weight": 380, + "weight": 366, "cookies": false, "type": "", "demo": "tablesdb\/update-line-column.md", @@ -30320,7 +30328,7 @@ "x-appwrite": { "method": "createLongtextColumn", "group": "columns", - "weight": 397, + "weight": 383, "cookies": false, "type": "", "demo": "tablesdb\/create-longtext-column.md", @@ -30433,7 +30441,7 @@ "x-appwrite": { "method": "updateLongtextColumn", "group": "columns", - "weight": 398, + "weight": 384, "cookies": false, "type": "", "demo": "tablesdb\/update-longtext-column.md", @@ -30548,7 +30556,7 @@ "x-appwrite": { "method": "createMediumtextColumn", "group": "columns", - "weight": 395, + "weight": 381, "cookies": false, "type": "", "demo": "tablesdb\/create-mediumtext-column.md", @@ -30661,7 +30669,7 @@ "x-appwrite": { "method": "updateMediumtextColumn", "group": "columns", - "weight": 396, + "weight": 382, "cookies": false, "type": "", "demo": "tablesdb\/update-mediumtext-column.md", @@ -30776,7 +30784,7 @@ "x-appwrite": { "method": "createPointColumn", "group": "columns", - "weight": 381, + "weight": 367, "cookies": false, "type": "", "demo": "tablesdb\/create-point-column.md", @@ -30883,7 +30891,7 @@ "x-appwrite": { "method": "updatePointColumn", "group": "columns", - "weight": 382, + "weight": 368, "cookies": false, "type": "", "demo": "tablesdb\/update-point-column.md", @@ -30997,7 +31005,7 @@ "x-appwrite": { "method": "createPolygonColumn", "group": "columns", - "weight": 383, + "weight": 369, "cookies": false, "type": "", "demo": "tablesdb\/create-polygon-column.md", @@ -31104,7 +31112,7 @@ "x-appwrite": { "method": "updatePolygonColumn", "group": "columns", - "weight": 384, + "weight": 370, "cookies": false, "type": "", "demo": "tablesdb\/update-polygon-column.md", @@ -31218,7 +31226,7 @@ "x-appwrite": { "method": "createRelationshipColumn", "group": "columns", - "weight": 385, + "weight": 371, "cookies": false, "type": "", "demo": "tablesdb\/create-relationship-column.md", @@ -31359,7 +31367,7 @@ "x-appwrite": { "method": "createStringColumn", "group": "columns", - "weight": 387, + "weight": 373, "cookies": false, "type": "", "demo": "tablesdb\/create-string-column.md", @@ -31490,7 +31498,7 @@ "x-appwrite": { "method": "updateStringColumn", "group": "columns", - "weight": 388, + "weight": 374, "cookies": false, "type": "", "demo": "tablesdb\/update-string-column.md", @@ -31617,7 +31625,7 @@ "x-appwrite": { "method": "createTextColumn", "group": "columns", - "weight": 393, + "weight": 379, "cookies": false, "type": "", "demo": "tablesdb\/create-text-column.md", @@ -31730,7 +31738,7 @@ "x-appwrite": { "method": "updateTextColumn", "group": "columns", - "weight": 394, + "weight": 380, "cookies": false, "type": "", "demo": "tablesdb\/update-text-column.md", @@ -31845,7 +31853,7 @@ "x-appwrite": { "method": "createUrlColumn", "group": "columns", - "weight": 389, + "weight": 375, "cookies": false, "type": "", "demo": "tablesdb\/create-url-column.md", @@ -31959,7 +31967,7 @@ "x-appwrite": { "method": "updateUrlColumn", "group": "columns", - "weight": 390, + "weight": 376, "cookies": false, "type": "", "demo": "tablesdb\/update-url-column.md", @@ -32075,7 +32083,7 @@ "x-appwrite": { "method": "createVarcharColumn", "group": "columns", - "weight": 391, + "weight": 377, "cookies": false, "type": "", "demo": "tablesdb\/create-varchar-column.md", @@ -32196,7 +32204,7 @@ "x-appwrite": { "method": "updateVarcharColumn", "group": "columns", - "weight": 392, + "weight": 378, "cookies": false, "type": "", "demo": "tablesdb\/update-varchar-column.md", @@ -32348,7 +32356,7 @@ "x-appwrite": { "method": "getColumn", "group": "columns", - "weight": 362, + "weight": 348, "cookies": false, "type": "", "demo": "tablesdb\/get-column.md", @@ -32423,7 +32431,7 @@ "x-appwrite": { "method": "deleteColumn", "group": "columns", - "weight": 363, + "weight": 349, "cookies": false, "type": "", "demo": "tablesdb\/delete-column.md", @@ -32505,7 +32513,7 @@ "x-appwrite": { "method": "updateRelationshipColumn", "group": "columns", - "weight": 386, + "weight": 372, "cookies": false, "type": "", "demo": "tablesdb\/update-relationship-column.md", @@ -32615,7 +32623,7 @@ "x-appwrite": { "method": "listIndexes", "group": "indexes", - "weight": 402, + "weight": 388, "cookies": false, "type": "", "demo": "tablesdb\/list-indexes.md", @@ -32709,7 +32717,7 @@ "x-appwrite": { "method": "createIndex", "group": "indexes", - "weight": 399, + "weight": 385, "cookies": false, "type": "", "demo": "tablesdb\/create-index.md", @@ -32849,7 +32857,7 @@ "x-appwrite": { "method": "getIndex", "group": "indexes", - "weight": 400, + "weight": 386, "cookies": false, "type": "", "demo": "tablesdb\/get-index.md", @@ -32924,7 +32932,7 @@ "x-appwrite": { "method": "deleteIndex", "group": "indexes", - "weight": 401, + "weight": 387, "cookies": false, "type": "", "demo": "tablesdb\/delete-index.md", @@ -33004,7 +33012,7 @@ "x-appwrite": { "method": "listRows", "group": "rows", - "weight": 411, + "weight": 397, "cookies": false, "type": "", "demo": "tablesdb\/list-rows.md", @@ -33109,7 +33117,7 @@ "x-appwrite": { "method": "createRow", "group": "rows", - "weight": 403, + "weight": 389, "cookies": false, "type": "", "demo": "tablesdb\/create-row.md", @@ -33295,7 +33303,7 @@ "x-appwrite": { "method": "upsertRows", "group": "rows", - "weight": 408, + "weight": 394, "cookies": false, "type": "", "demo": "tablesdb\/upsert-rows.md", @@ -33427,7 +33435,7 @@ "x-appwrite": { "method": "updateRows", "group": "rows", - "weight": 406, + "weight": 392, "cookies": false, "type": "", "demo": "tablesdb\/update-rows.md", @@ -33531,7 +33539,7 @@ "x-appwrite": { "method": "deleteRows", "group": "rows", - "weight": 410, + "weight": 396, "cookies": false, "type": "", "demo": "tablesdb\/delete-rows.md", @@ -33629,7 +33637,7 @@ "x-appwrite": { "method": "getRow", "group": "rows", - "weight": 404, + "weight": 390, "cookies": false, "type": "", "demo": "tablesdb\/get-row.md", @@ -33733,7 +33741,7 @@ "x-appwrite": { "method": "upsertRow", "group": "rows", - "weight": 407, + "weight": 393, "cookies": false, "type": "", "demo": "tablesdb\/upsert-row.md", @@ -33882,7 +33890,7 @@ "x-appwrite": { "method": "updateRow", "group": "rows", - "weight": 405, + "weight": 391, "cookies": false, "type": "", "demo": "tablesdb\/update-row.md", @@ -33993,7 +34001,7 @@ "x-appwrite": { "method": "deleteRow", "group": "rows", - "weight": 409, + "weight": 395, "cookies": false, "type": "", "demo": "tablesdb\/delete-row.md", @@ -34095,7 +34103,7 @@ "x-appwrite": { "method": "decrementRowColumn", "group": "rows", - "weight": 414, + "weight": 400, "cookies": false, "type": "", "demo": "tablesdb\/decrement-row-column.md", @@ -34219,7 +34227,7 @@ "x-appwrite": { "method": "incrementRowColumn", "group": "rows", - "weight": 413, + "weight": 399, "cookies": false, "type": "", "demo": "tablesdb\/increment-row-column.md", @@ -34341,7 +34349,7 @@ "x-appwrite": { "method": "list", "group": "teams", - "weight": 110, + "weight": 107, "cookies": false, "type": "", "demo": "teams\/list.md", @@ -34428,7 +34436,7 @@ "x-appwrite": { "method": "create", "group": "teams", - "weight": 109, + "weight": 106, "cookies": false, "type": "", "demo": "teams\/create.md", @@ -34521,7 +34529,7 @@ "x-appwrite": { "method": "get", "group": "teams", - "weight": 111, + "weight": 108, "cookies": false, "type": "", "demo": "teams\/get.md", @@ -34586,7 +34594,7 @@ "x-appwrite": { "method": "updateName", "group": "teams", - "weight": 113, + "weight": 110, "cookies": false, "type": "", "demo": "teams\/update-name.md", @@ -34664,7 +34672,7 @@ "x-appwrite": { "method": "delete", "group": "teams", - "weight": 115, + "weight": 112, "cookies": false, "type": "", "demo": "teams\/delete.md", @@ -34729,7 +34737,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 117, + "weight": 114, "cookies": false, "type": "", "demo": "teams\/list-memberships.md", @@ -34824,7 +34832,7 @@ "x-appwrite": { "method": "createMembership", "group": "memberships", - "weight": 116, + "weight": 113, "cookies": false, "type": "", "demo": "teams\/create-membership.md", @@ -34894,14 +34902,7 @@ "default": null, "x-example": null, "items": { - "type": "string", - "enum": [ - "admin", - "developer", - "owner" - ], - "x-enum-name": null, - "x-enum-keys": [] + "type": "string" } }, "url": { @@ -34950,7 +34951,7 @@ "x-appwrite": { "method": "getMembership", "group": "memberships", - "weight": 118, + "weight": 115, "cookies": false, "type": "", "demo": "teams\/get-membership.md", @@ -35023,7 +35024,7 @@ "x-appwrite": { "method": "updateMembership", "group": "memberships", - "weight": 119, + "weight": 116, "cookies": false, "type": "", "demo": "teams\/update-membership.md", @@ -35081,14 +35082,7 @@ "default": null, "x-example": null, "items": { - "type": "string", - "enum": [ - "admin", - "developer", - "owner" - ], - "x-enum-name": null, - "x-enum-keys": [] + "type": "string" } } }, @@ -35119,7 +35113,7 @@ "x-appwrite": { "method": "deleteMembership", "group": "memberships", - "weight": 121, + "weight": 118, "cookies": false, "type": "", "demo": "teams\/delete-membership.md", @@ -35194,7 +35188,7 @@ "x-appwrite": { "method": "updateMembershipStatus", "group": "memberships", - "weight": 120, + "weight": 117, "cookies": false, "type": "", "demo": "teams\/update-membership-status.md", @@ -35291,7 +35285,7 @@ "x-appwrite": { "method": "getPrefs", "group": "teams", - "weight": 112, + "weight": 109, "cookies": false, "type": "", "demo": "teams\/get-prefs.md", @@ -35355,7 +35349,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "teams", - "weight": 114, + "weight": 111, "cookies": false, "type": "", "demo": "teams\/update-prefs.md", @@ -35437,7 +35431,7 @@ "x-appwrite": { "method": "list", "group": "files", - "weight": 533, + "weight": 522, "cookies": false, "type": "", "demo": "tokens\/list.md", @@ -35527,7 +35521,7 @@ "x-appwrite": { "method": "createFileToken", "group": "files", - "weight": 531, + "weight": 520, "cookies": false, "type": "", "demo": "tokens\/create-file-token.md", @@ -35612,7 +35606,7 @@ "x-appwrite": { "method": "get", "group": "tokens", - "weight": 532, + "weight": 521, "cookies": false, "type": "", "demo": "tokens\/get.md", @@ -35673,7 +35667,7 @@ "x-appwrite": { "method": "update", "group": "tokens", - "weight": 534, + "weight": 523, "cookies": false, "type": "", "demo": "tokens\/update.md", @@ -35745,7 +35739,7 @@ "x-appwrite": { "method": "delete", "group": "tokens", - "weight": 535, + "weight": 524, "cookies": false, "type": "", "demo": "tokens\/delete.md", @@ -35806,7 +35800,7 @@ "x-appwrite": { "method": "list", "group": "users", - "weight": 132, + "weight": 129, "cookies": false, "type": "", "demo": "users\/list.md", @@ -35890,7 +35884,7 @@ "x-appwrite": { "method": "create", "group": "users", - "weight": 123, + "weight": 120, "cookies": false, "type": "", "demo": "users\/create.md", @@ -35992,7 +35986,7 @@ "x-appwrite": { "method": "createArgon2User", "group": "users", - "weight": 126, + "weight": 123, "cookies": false, "type": "", "demo": "users\/create-argon-2-user.md", @@ -36088,7 +36082,7 @@ "x-appwrite": { "method": "createBcryptUser", "group": "users", - "weight": 124, + "weight": 121, "cookies": false, "type": "", "demo": "users\/create-bcrypt-user.md", @@ -36182,7 +36176,7 @@ "x-appwrite": { "method": "listIdentities", "group": "identities", - "weight": 140, + "weight": 137, "cookies": false, "type": "", "demo": "users\/list-identities.md", @@ -36263,7 +36257,7 @@ "x-appwrite": { "method": "deleteIdentity", "group": "identities", - "weight": 163, + "weight": 160, "cookies": false, "type": "", "demo": "users\/delete-identity.md", @@ -36327,7 +36321,7 @@ "x-appwrite": { "method": "createMD5User", "group": "users", - "weight": 125, + "weight": 122, "cookies": false, "type": "", "demo": "users\/create-md-5-user.md", @@ -36423,7 +36417,7 @@ "x-appwrite": { "method": "createPHPassUser", "group": "users", - "weight": 128, + "weight": 125, "cookies": false, "type": "", "demo": "users\/create-ph-pass-user.md", @@ -36519,7 +36513,7 @@ "x-appwrite": { "method": "createScryptUser", "group": "users", - "weight": 129, + "weight": 126, "cookies": false, "type": "", "demo": "users\/create-scrypt-user.md", @@ -36654,7 +36648,7 @@ "x-appwrite": { "method": "createScryptModifiedUser", "group": "users", - "weight": 130, + "weight": 127, "cookies": false, "type": "", "demo": "users\/create-scrypt-modified-user.md", @@ -36771,7 +36765,7 @@ "x-appwrite": { "method": "createSHAUser", "group": "users", - "weight": 127, + "weight": 124, "cookies": false, "type": "", "demo": "users\/create-sha-user.md", @@ -36886,7 +36880,7 @@ "x-appwrite": { "method": "get", "group": "users", - "weight": 133, + "weight": 130, "cookies": false, "type": "", "demo": "users\/get.md", @@ -36943,7 +36937,7 @@ "x-appwrite": { "method": "delete", "group": "users", - "weight": 161, + "weight": 158, "cookies": false, "type": "", "demo": "users\/delete.md", @@ -37007,7 +37001,7 @@ "x-appwrite": { "method": "updateEmail", "group": "users", - "weight": 146, + "weight": 143, "cookies": false, "type": "", "demo": "users\/update-email.md", @@ -37090,7 +37084,7 @@ "x-appwrite": { "method": "createJWT", "group": "sessions", - "weight": 164, + "weight": 161, "cookies": false, "type": "", "demo": "users\/create-jwt.md", @@ -37176,7 +37170,7 @@ "x-appwrite": { "method": "updateLabels", "group": "users", - "weight": 142, + "weight": 139, "cookies": false, "type": "", "demo": "users\/update-labels.md", @@ -37259,7 +37253,7 @@ "x-appwrite": { "method": "listLogs", "group": "logs", - "weight": 138, + "weight": 135, "cookies": false, "type": "", "demo": "users\/list-logs.md", @@ -37342,7 +37336,7 @@ "x-appwrite": { "method": "listMemberships", "group": "memberships", - "weight": 137, + "weight": 134, "cookies": false, "type": "", "demo": "users\/list-memberships.md", @@ -37436,7 +37430,7 @@ "x-appwrite": { "method": "updateMfa", "group": "users", - "weight": 151, + "weight": 148, "cookies": false, "type": "", "demo": "users\/update-mfa.md", @@ -37575,7 +37569,7 @@ "x-appwrite": { "method": "deleteMfaAuthenticator", "group": "mfa", - "weight": 156, + "weight": 153, "cookies": false, "type": "", "demo": "users\/delete-mfa-authenticator.md", @@ -37710,7 +37704,7 @@ "x-appwrite": { "method": "listMfaFactors", "group": "mfa", - "weight": 152, + "weight": 149, "cookies": false, "type": "", "demo": "users\/list-mfa-factors.md", @@ -37830,7 +37824,7 @@ "x-appwrite": { "method": "getMfaRecoveryCodes", "group": "mfa", - "weight": 153, + "weight": 150, "cookies": false, "type": "", "demo": "users\/get-mfa-recovery-codes.md", @@ -37950,7 +37944,7 @@ "x-appwrite": { "method": "updateMfaRecoveryCodes", "group": "mfa", - "weight": 155, + "weight": 152, "cookies": false, "type": "", "demo": "users\/update-mfa-recovery-codes.md", @@ -38070,7 +38064,7 @@ "x-appwrite": { "method": "createMfaRecoveryCodes", "group": "mfa", - "weight": 154, + "weight": 151, "cookies": false, "type": "", "demo": "users\/create-mfa-recovery-codes.md", @@ -38192,7 +38186,7 @@ "x-appwrite": { "method": "updateName", "group": "users", - "weight": 144, + "weight": 141, "cookies": false, "type": "", "demo": "users\/update-name.md", @@ -38274,7 +38268,7 @@ "x-appwrite": { "method": "updatePassword", "group": "users", - "weight": 145, + "weight": 142, "cookies": false, "type": "", "demo": "users\/update-password.md", @@ -38356,7 +38350,7 @@ "x-appwrite": { "method": "updatePhone", "group": "users", - "weight": 147, + "weight": 144, "cookies": false, "type": "", "demo": "users\/update-phone.md", @@ -38437,7 +38431,7 @@ "x-appwrite": { "method": "getPrefs", "group": "users", - "weight": 134, + "weight": 131, "cookies": false, "type": "", "demo": "users\/get-prefs.md", @@ -38499,7 +38493,7 @@ "x-appwrite": { "method": "updatePrefs", "group": "users", - "weight": 149, + "weight": 146, "cookies": false, "type": "", "demo": "users\/update-prefs.md", @@ -38579,7 +38573,7 @@ "x-appwrite": { "method": "listSessions", "group": "sessions", - "weight": 136, + "weight": 133, "cookies": false, "type": "", "demo": "users\/list-sessions.md", @@ -38650,7 +38644,7 @@ "x-appwrite": { "method": "createSession", "group": "sessions", - "weight": 157, + "weight": 154, "cookies": false, "type": "", "demo": "users\/create-session.md", @@ -38707,7 +38701,7 @@ "x-appwrite": { "method": "deleteSessions", "group": "sessions", - "weight": 160, + "weight": 157, "cookies": false, "type": "", "demo": "users\/delete-sessions.md", @@ -38766,7 +38760,7 @@ "x-appwrite": { "method": "deleteSession", "group": "sessions", - "weight": 159, + "weight": 156, "cookies": false, "type": "", "demo": "users\/delete-session.md", @@ -38838,7 +38832,7 @@ "x-appwrite": { "method": "updateStatus", "group": "users", - "weight": 141, + "weight": 138, "cookies": false, "type": "", "demo": "users\/update-status.md", @@ -38918,7 +38912,7 @@ "x-appwrite": { "method": "listTargets", "group": "targets", - "weight": 139, + "weight": 136, "cookies": false, "type": "", "demo": "users\/list-targets.md", @@ -39001,7 +38995,7 @@ "x-appwrite": { "method": "createTarget", "group": "targets", - "weight": 131, + "weight": 128, "cookies": false, "type": "", "demo": "users\/create-target.md", @@ -39114,7 +39108,7 @@ "x-appwrite": { "method": "getTarget", "group": "targets", - "weight": 135, + "weight": 132, "cookies": false, "type": "", "demo": "users\/get-target.md", @@ -39184,7 +39178,7 @@ "x-appwrite": { "method": "updateTarget", "group": "targets", - "weight": 150, + "weight": 147, "cookies": false, "type": "", "demo": "users\/update-target.md", @@ -39276,7 +39270,7 @@ "x-appwrite": { "method": "deleteTarget", "group": "targets", - "weight": 162, + "weight": 159, "cookies": false, "type": "", "demo": "users\/delete-target.md", @@ -39348,7 +39342,7 @@ "x-appwrite": { "method": "createToken", "group": "sessions", - "weight": 158, + "weight": 155, "cookies": false, "type": "", "demo": "users\/create-token.md", @@ -39435,7 +39429,7 @@ "x-appwrite": { "method": "updateEmailVerification", "group": "users", - "weight": 148, + "weight": 145, "cookies": false, "type": "", "demo": "users\/update-email-verification.md", @@ -39517,7 +39511,7 @@ "x-appwrite": { "method": "updatePhoneVerification", "group": "users", - "weight": 143, + "weight": 140, "cookies": false, "type": "", "demo": "users\/update-phone-verification.md", @@ -40889,6 +40883,18 @@ "$ref": "#\/definitions\/index" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum document size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used document size in bytes based on defined attributes.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -40901,7 +40907,9 @@ "enabled", "documentSecurity", "attributes", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -40915,7 +40923,9 @@ "enabled": false, "documentSecurity": true, "attributes": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "attributeList": { @@ -42683,6 +42693,18 @@ "$ref": "#\/definitions\/columnIndex" }, "x-example": {} + }, + "bytesMax": { + "type": "integer", + "description": "Maximum row size in bytes. Returns 0 when no limit applies.", + "x-example": 65535, + "format": "int32" + }, + "bytesUsed": { + "type": "integer", + "description": "Currently used row size in bytes based on defined columns.", + "x-example": 1500, + "format": "int32" } }, "required": [ @@ -42695,7 +42717,9 @@ "enabled", "rowSecurity", "columns", - "indexes" + "indexes", + "bytesMax", + "bytesUsed" ], "example": { "$id": "5e5ea5c16897e", @@ -42709,7 +42733,9 @@ "enabled": false, "rowSecurity": true, "columns": {}, - "indexes": {} + "indexes": {}, + "bytesMax": 65535, + "bytesUsed": 1500 } }, "columnList": { diff --git a/app/config/variables.php b/app/config/variables.php index 36f691e534..0303cd7977 100644 --- a/app/config/variables.php +++ b/app/config/variables.php @@ -358,6 +358,15 @@ return [ 'question' => '', 'filter' => '' ], + [ + 'name' => '_APP_DB_ADAPTER', + 'description' => 'Which database adapter to use. Must be one of: mariadb, postgresql.', + 'introduction' => '1.6.0', + 'default' => 'mariadb', + 'required' => true, + 'question' => 'Choose your database (mariadb|postgresql)', + 'filter' => '' + ], [ 'name' => '_APP_TRUSTED_HEADERS', 'description' => 'This option allows you to set the list of trusted headers, the value is a comma‑separated list of HTTP header names, evaluated left-to-right for the first valid IP. Header names are treated case-insensitively.', diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 3f3211797c..2ab880d307 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -60,7 +60,7 @@ use Utopia\Database\Validator\Query\Limit; use Utopia\Database\Validator\Query\Offset; use Utopia\Database\Validator\UID; use Utopia\Emails\Email; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Locale\Locale; use Utopia\Storage\Validator\FileName; use Utopia\System\System; @@ -1469,13 +1469,14 @@ Http::get('/v1/account/sessions/oauth2/:provider/redirect') ->inject('devKey') ->inject('user') ->inject('dbForProject') + ->inject('dbForPlatform') ->inject('geodb') ->inject('queueForEvents') ->inject('store') ->inject('proofForPassword') ->inject('proofForToken') ->inject('authorization') - ->action(function (string $provider, string $code, string $state, string $error, string $error_description, Request $request, Response $response, Document $project, Validator $redirectValidator, Document $devKey, User $user, Database $dbForProject, Reader $geodb, Event $queueForEvents, Store $store, ProofsPassword $proofForPassword, ProofsToken $proofForToken, Authorization $authorization) use ($oauthDefaultSuccess) { + ->action(function (string $provider, string $code, string $state, string $error, string $error_description, Request $request, Response $response, Document $project, Validator $redirectValidator, Document $devKey, User $user, Database $dbForProject, Database $dbForPlatform, Reader $geodb, Event $queueForEvents, Store $store, ProofsPassword $proofForPassword, ProofsToken $proofForToken, Authorization $authorization) use ($oauthDefaultSuccess) { $protocol = System::getEnv('_APP_OPTIONS_FORCE_HTTPS') === 'disabled' ? 'http' : 'https'; $port = $request->getPort(); $callbackBase = $protocol . '://' . $request->getHostname(); @@ -1512,6 +1513,29 @@ Http::get('/v1/account/sessions/oauth2/:provider/redirect') $state = $defaultState; } + // Allow redirect to rule URL if related to project + // Check if $redirectValidator is instance of Redirect class + if ($redirectValidator instanceof Redirect) { + $domains = \array_filter([ + parse_url($state['success'], PHP_URL_HOST) ?? '', + parse_url($state['failure'], PHP_URL_HOST) ?? '' + ], fn ($domain) => \is_string($domain) && $domain !== ''); + + if (!empty($domains)) { + $rules = $authorization->skip(fn () => $dbForPlatform->find('rules', [ + Query::equal('domain', \array_values(\array_unique($domains))), + Query::equal('projectInternalId', [$project->getSequence()]), + Query::limit(2) + ])); + + foreach ($rules as $rule) { + $allowedHostnames = $redirectValidator->getAllowedHostnames(); + $allowedHostnames[] = $rule->getAttribute('domain', ''); + $redirectValidator->setAllowedHostnames($allowedHostnames); + } + } + } + if ($devKey->isEmpty() && !$redirectValidator->isValid($state['success'])) { throw new Exception(Exception::PROJECT_INVALID_SUCCESS_URL); } @@ -4574,16 +4598,10 @@ Http::get('/v1/account/identities') $queries[] = Query::equal('userInternalId', [$user->getSequence()]); - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index 7c516ae4e0..2d0a840bd6 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -20,7 +20,7 @@ use GraphQL\Validator\Rules\QueryDepth; use Swoole\Coroutine\WaitGroup; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\System\System; use Utopia\Validator\JSON; use Utopia\Validator\Text; diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php index a368854cde..d6b4bb814d 100644 --- a/app/controllers/api/locale.php +++ b/app/controllers/api/locale.php @@ -8,7 +8,7 @@ use Appwrite\Utopia\Response; use MaxMind\Db\Reader; use Utopia\Config\Config; use Utopia\Database\Document; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Locale\Locale; Http::get('/v1/locale') diff --git a/app/controllers/api/messaging.php b/app/controllers/api/messaging.php index 7f762d8545..4e5c4ef3ec 100644 --- a/app/controllers/api/messaging.php +++ b/app/controllers/api/messaging.php @@ -43,7 +43,7 @@ use Utopia\Database\Validator\Query\Limit; use Utopia\Database\Validator\Query\Offset; use Utopia\Database\Validator\Roles; use Utopia\Database\Validator\UID; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Locale\Locale; use Utopia\System\System; use Utopia\Validator\ArrayList; @@ -1087,15 +1087,10 @@ Http::get('/v1/messaging/providers') $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); - if ($cursor) { + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); @@ -2496,15 +2491,10 @@ Http::get('/v1/messaging/topics') $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); - if ($cursor) { + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); @@ -2904,15 +2894,10 @@ Http::get('/v1/messaging/topics/:topicId/subscribers') $queries[] = Query::equal('topicInternalId', [$topic->getSequence()]); - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); - if ($cursor) { + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); @@ -3719,15 +3704,10 @@ Http::get('/v1/messaging/messages') $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); - if ($cursor) { + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); @@ -3899,15 +3879,10 @@ Http::get('/v1/messaging/messages/:messageId/targets') $queries[] = Query::equal('$id', $targetIDs); - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); - if ($cursor) { + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/app/controllers/api/migrations.php b/app/controllers/api/migrations.php index 4d651dbcb9..9d5e013cdc 100644 --- a/app/controllers/api/migrations.php +++ b/app/controllers/api/migrations.php @@ -21,7 +21,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Queries\Documents; use Utopia\Database\Validator\Query\Cursor; use Utopia\Database\Validator\UID; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Migration\Resource; use Utopia\Migration\Sources\Appwrite; use Utopia\Migration\Sources\CSV; @@ -629,16 +629,10 @@ Http::get('/v1/migrations') $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/app/controllers/api/project.php b/app/controllers/api/project.php index 182098927c..73c6344974 100644 --- a/app/controllers/api/project.php +++ b/app/controllers/api/project.php @@ -16,7 +16,7 @@ use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Datetime as DateTimeValidator; use Utopia\Database\Validator\UID; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index ae4e4615fa..51d141dc27 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -6,7 +6,6 @@ use Appwrite\Event\Delete; use Appwrite\Event\Mail; use Appwrite\Event\Validator\Event; use Appwrite\Extend\Exception; -use Appwrite\Hooks\Hooks; use Appwrite\Network\Platform; use Appwrite\Network\Validator\Email; use Appwrite\SDK\AuthType; @@ -15,31 +14,25 @@ use Appwrite\SDK\Deprecated; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Template\Template; -use Appwrite\Utopia\Database\Validator\ProjectId; -use Appwrite\Utopia\Database\Validator\Queries\Projects; -use Appwrite\Utopia\Request; +use Appwrite\Utopia\Database\Validator\CustomId; +use Appwrite\Utopia\Database\Validator\Queries\Keys; use Appwrite\Utopia\Response; use PHPMailer\PHPMailer\PHPMailer; -use Utopia\Audit\Adapter\Database as AdapterDatabase; -use Utopia\Audit\Audit; -use Utopia\Cache\Cache; use Utopia\Config\Config; -use Utopia\Database\Adapter\Pool as DatabasePool; use Utopia\Database\Database; -use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate; +use Utopia\Database\Exception\Query as QueryException; use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; use Utopia\Database\Query; use Utopia\Database\Validator\Datetime as DatetimeValidator; +use Utopia\Database\Validator\Query\Cursor; use Utopia\Database\Validator\UID; use Utopia\Domains\Validator\PublicDomain; -use Utopia\DSN\DSN; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Locale\Locale; -use Utopia\Pools\Group; use Utopia\System\System; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; @@ -61,251 +54,6 @@ Http::init() } }); -Http::post('/v1/projects') - ->desc('Create project') - ->groups(['api', 'projects']) - ->label('audits.event', 'projects.create') - ->label('audits.resource', 'project/{response.$id}') - ->label('scope', 'projects.write') - ->label('sdk', new Method( - namespace: 'projects', - group: 'projects', - name: 'create', - description: '/docs/references/projects/create.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_CREATED, - model: Response::MODEL_PROJECT, - ) - ] - )) - ->param('projectId', '', new ProjectId(), 'Unique Id. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, and hyphen. Can\'t start with a special char. Max length is 36 chars.') - ->param('name', null, new Text(128), 'Project name. Max length: 128 chars.') - ->param('teamId', '', new UID(), 'Team unique ID.') - ->param('region', System::getEnv('_APP_REGION', 'default'), new Whitelist(array_keys(array_filter(Config::getParam('regions'), fn ($config) => !$config['disabled']))), 'Project Region.', true) - ->param('description', '', new Text(256), 'Project description. Max length: 256 chars.', true) - ->param('logo', '', new Text(1024), 'Project logo.', true) - ->param('url', '', new URL(), 'Project URL.', true) - ->param('legalName', '', new Text(256), 'Project legal Name. Max length: 256 chars.', true) - ->param('legalCountry', '', new Text(256), 'Project legal Country. Max length: 256 chars.', true) - ->param('legalState', '', new Text(256), 'Project legal State. Max length: 256 chars.', true) - ->param('legalCity', '', new Text(256), 'Project legal City. Max length: 256 chars.', true) - ->param('legalAddress', '', new Text(256), 'Project legal Address. Max length: 256 chars.', true) - ->param('legalTaxId', '', new Text(256), 'Project legal Tax ID. Max length: 256 chars.', true) - ->inject('request') - ->inject('response') - ->inject('dbForPlatform') - ->inject('cache') - ->inject('pools') - ->inject('hooks') - ->action(function (string $projectId, string $name, string $teamId, string $region, string $description, string $logo, string $url, string $legalName, string $legalCountry, string $legalState, string $legalCity, string $legalAddress, string $legalTaxId, Request $request, Response $response, Database $dbForPlatform, Cache $cache, Group $pools, Hooks $hooks) { - - $team = $dbForPlatform->getDocument('teams', $teamId); - - if ($team->isEmpty()) { - throw new Exception(Exception::TEAM_NOT_FOUND); - } - - $allowList = \array_filter(\explode(',', System::getEnv('_APP_PROJECT_REGIONS', ''))); - - if (!empty($allowList) && !\in_array($region, $allowList)) { - throw new Exception(Exception::PROJECT_REGION_UNSUPPORTED, 'Region "' . $region . '" is not supported'); - } - - $auth = Config::getParam('auth', []); - $auths = [ - 'limit' => 0, - 'maxSessions' => APP_LIMIT_USER_SESSIONS_DEFAULT, - 'passwordHistory' => 0, - 'passwordDictionary' => false, - 'duration' => TOKEN_EXPIRATION_LOGIN_LONG, - 'personalDataCheck' => false, - 'mockNumbers' => [], - 'sessionAlerts' => false, - 'membershipsUserName' => false, - 'membershipsUserEmail' => false, - 'membershipsMfa' => false, - 'invalidateSessions' => true - ]; - - foreach ($auth as $method) { - $auths[$method['key'] ?? ''] = true; - } - - $projectId = ($projectId == 'unique()') ? ID::unique() : $projectId; - - if ($projectId === 'console') { - throw new Exception(Exception::PROJECT_RESERVED_PROJECT, "'console' is a reserved project."); - } - - $databases = Config::getParam('pools-database', []); - - if ($region !== 'default') { - $databaseKeys = System::getEnv('_APP_DATABASE_KEYS', ''); - $keys = explode(',', $databaseKeys); - $databases = array_filter($keys, function ($value) use ($region) { - return str_contains($value, $region); - }); - } - - $databaseOverride = System::getEnv('_APP_DATABASE_OVERRIDE'); - $index = \array_search($databaseOverride, $databases); - if ($index !== false) { - $dsn = $databases[$index]; - } else { - $dsn = $databases[array_rand($databases)]; - } - - // TODO: Temporary until all projects are using shared tables. - $sharedTables = \explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', '')); - - if (\in_array($dsn, $sharedTables)) { - $schema = 'appwrite'; - $database = 'appwrite'; - $namespace = System::getEnv('_APP_DATABASE_SHARED_NAMESPACE', ''); - $dsn = $schema . '://' . $dsn . '?database=' . $database; - - if (!empty($namespace)) { - $dsn .= '&namespace=' . $namespace; - } - } - - try { - $project = $dbForPlatform->createDocument('projects', new Document([ - '$id' => $projectId, - '$permissions' => [ - Permission::read(Role::team(ID::custom($teamId))), - Permission::update(Role::team(ID::custom($teamId), 'owner')), - Permission::update(Role::team(ID::custom($teamId), 'developer')), - Permission::delete(Role::team(ID::custom($teamId), 'owner')), - Permission::delete(Role::team(ID::custom($teamId), 'developer')), - ], - 'name' => $name, - 'teamInternalId' => $team->getSequence(), - 'teamId' => $team->getId(), - 'region' => $region, - 'description' => $description, - 'logo' => $logo, - 'url' => $url, - 'version' => APP_VERSION_STABLE, - 'legalName' => $legalName, - 'legalCountry' => $legalCountry, - 'legalState' => $legalState, - 'legalCity' => $legalCity, - 'legalAddress' => $legalAddress, - 'legalTaxId' => ID::custom($legalTaxId), - 'services' => new stdClass(), - 'platforms' => null, - 'oAuthProviders' => [], - 'webhooks' => null, - 'keys' => null, - 'auths' => $auths, - 'accessedAt' => DateTime::now(), - 'search' => implode(' ', [$projectId, $name]), - 'database' => $dsn, - 'labels' => [], - ])); - } catch (Duplicate) { - throw new Exception(Exception::PROJECT_ALREADY_EXISTS); - } - - try { - $dsn = new DSN($dsn); - } catch (\InvalidArgumentException) { - // TODO: Temporary until all projects are using shared tables - $dsn = new DSN('mysql://' . $dsn); - } - - $sharedTables = \explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', '')); - $sharedTablesV1 = \explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES_V1', '')); - $projectTables = !\in_array($dsn->getHost(), $sharedTables); - $sharedTablesV1 = \in_array($dsn->getHost(), $sharedTablesV1); - $sharedTablesV2 = !$projectTables && !$sharedTablesV1; - $sharedTables = $sharedTablesV1 || $sharedTablesV2; - - if (!$sharedTablesV2) { - $adapter = new DatabasePool($pools->get($dsn->getHost())); - $dbForProject = new Database($adapter, $cache); - $dbForProject->setDatabase(APP_DATABASE); - - if ($sharedTables) { - $dbForProject - ->setSharedTables(true) - ->setTenant($sharedTablesV1 ? (int)$project->getSequence() : null) - ->setNamespace($dsn->getParam('namespace')); - } else { - $dbForProject - ->setSharedTables(false) - ->setTenant(null) - ->setNamespace('_' . $project->getSequence()); - } - - $create = true; - - try { - $dbForProject->create(); - } catch (Duplicate) { - $create = false; - } - - if ($create || $projectTables) { - $adapter = new AdapterDatabase($dbForProject); - $audit = new Audit($adapter); - $audit->setup(); - } - - if (!$create && $sharedTablesV1) { - $adapter = new AdapterDatabase($dbForProject); - $attributes = $adapter->getAttributeDocuments(); - $indexes = $adapter->getIndexDocuments(); - $dbForProject->createDocument(Database::METADATA, new Document([ - '$id' => ID::custom('audit'), - '$permissions' => [Permission::create(Role::any())], - 'name' => 'audit', - 'attributes' => $attributes, - 'indexes' => $indexes, - 'documentSecurity' => true - ])); - } - - if ($create || $sharedTablesV1) { - /** @var array $collections */ - $collections = Config::getParam('collections', [])['projects'] ?? []; - - foreach ($collections as $key => $collection) { - if (($collection['$collection'] ?? '') !== Database::METADATA) { - continue; - } - - $attributes = \array_map(fn ($attribute) => new Document($attribute), $collection['attributes']); - $indexes = \array_map(fn (array $index) => new Document($index), $collection['indexes']); - - try { - $dbForProject->createCollection($key, $attributes, $indexes); - } catch (Duplicate) { - $dbForProject->createDocument(Database::METADATA, new Document([ - '$id' => ID::custom($key), - '$permissions' => [Permission::create(Role::any())], - 'name' => $key, - 'attributes' => $attributes, - 'indexes' => $indexes, - 'documentSecurity' => true - ])); - } - } - } - } - - // Hook allowing instant project mirroring during migration - // Outside of migration, hook is not registered and has no effect - $hooks->trigger('afterProjectCreation', [$project, $pools, $cache]); - - $response - ->setStatusCode(Response::STATUS_CODE_CREATED) - ->dynamic($project, Response::MODEL_PROJECT); - }); - Http::get('/v1/projects/:projectId') ->desc('Get project') ->groups(['api', 'projects']) @@ -337,137 +85,6 @@ Http::get('/v1/projects/:projectId') $response->dynamic($project, Response::MODEL_PROJECT); }); -Http::patch('/v1/projects/:projectId') - ->desc('Update project') - ->groups(['api', 'projects']) - ->label('scope', 'projects.write') - ->label('audits.event', 'projects.update') - ->label('audits.resource', 'project/{request.projectId}') - ->label('sdk', new Method( - namespace: 'projects', - group: 'projects', - name: 'update', - description: '/docs/references/projects/update.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_PROJECT, - ) - ] - )) - ->param('projectId', '', new UID(), 'Project unique ID.') - ->param('name', null, new Text(128), 'Project name. Max length: 128 chars.') - ->param('description', '', new Text(256), 'Project description. Max length: 256 chars.', true) - ->param('logo', '', new Text(1024), 'Project logo.', true) - ->param('url', '', new URL(), 'Project URL.', true) - ->param('legalName', '', new Text(256), 'Project legal name. Max length: 256 chars.', true) - ->param('legalCountry', '', new Text(256), 'Project legal country. Max length: 256 chars.', true) - ->param('legalState', '', new Text(256), 'Project legal state. Max length: 256 chars.', true) - ->param('legalCity', '', new Text(256), 'Project legal city. Max length: 256 chars.', true) - ->param('legalAddress', '', new Text(256), 'Project legal address. Max length: 256 chars.', true) - ->param('legalTaxId', '', new Text(256), 'Project legal tax ID. Max length: 256 chars.', true) - ->inject('response') - ->inject('dbForPlatform') - ->action(function (string $projectId, string $name, string $description, string $logo, string $url, string $legalName, string $legalCountry, string $legalState, string $legalCity, string $legalAddress, string $legalTaxId, Response $response, Database $dbForPlatform) { - - $project = $dbForPlatform->getDocument('projects', $projectId); - - if ($project->isEmpty()) { - throw new Exception(Exception::PROJECT_NOT_FOUND); - } - - $project = $dbForPlatform->updateDocument('projects', $project->getId(), $project - ->setAttribute('name', $name) - ->setAttribute('description', $description) - ->setAttribute('logo', $logo) - ->setAttribute('url', $url) - ->setAttribute('legalName', $legalName) - ->setAttribute('legalCountry', $legalCountry) - ->setAttribute('legalState', $legalState) - ->setAttribute('legalCity', $legalCity) - ->setAttribute('legalAddress', $legalAddress) - ->setAttribute('legalTaxId', $legalTaxId) - ->setAttribute('search', implode(' ', [$projectId, $name]))); - - $response->dynamic($project, Response::MODEL_PROJECT); - }); - -Http::patch('/v1/projects/:projectId/team') - ->desc('Update project team') - ->groups(['api', 'projects']) - ->label('scope', 'projects.write') - ->label('sdk', new Method( - namespace: 'projects', - group: 'projects', - name: 'updateTeam', - description: '/docs/references/projects/update-team.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_PROJECT, - ) - ] - )) - ->param('projectId', '', new UID(), 'Project unique ID.') - ->param('teamId', '', new UID(), 'Team ID of the team to transfer project to.') - ->inject('response') - ->inject('dbForPlatform') - ->action(function (string $projectId, string $teamId, Response $response, Database $dbForPlatform) { - - $project = $dbForPlatform->getDocument('projects', $projectId); - $team = $dbForPlatform->getDocument('teams', $teamId); - - if ($project->isEmpty()) { - throw new Exception(Exception::PROJECT_NOT_FOUND); - } - - if ($team->isEmpty()) { - throw new Exception(Exception::TEAM_NOT_FOUND); - } - - $permissions = [ - Permission::read(Role::team(ID::custom($teamId))), - Permission::update(Role::team(ID::custom($teamId), 'owner')), - Permission::update(Role::team(ID::custom($teamId), 'developer')), - Permission::delete(Role::team(ID::custom($teamId), 'owner')), - Permission::delete(Role::team(ID::custom($teamId), 'developer')), - ]; - - $project - ->setAttribute('teamId', $teamId) - ->setAttribute('teamInternalId', $team->getSequence()) - ->setAttribute('$permissions', $permissions); - $project = $dbForPlatform->updateDocument('projects', $project->getId(), $project); - - $installations = $dbForPlatform->find('installations', [ - Query::equal('projectInternalId', [$project->getSequence()]), - ]); - foreach ($installations as $installation) { - $installation->getAttribute('$permissions', $permissions); - $dbForPlatform->updateDocument('installations', $installation->getId(), $installation); - } - - $repositories = $dbForPlatform->find('repositories', [ - Query::equal('projectInternalId', [$project->getSequence()]), - ]); - foreach ($repositories as $repository) { - $repository->getAttribute('$permissions', $permissions); - $dbForPlatform->updateDocument('repositories', $repository->getId(), $repository); - } - - $vcsComments = $dbForPlatform->find('vcsComments', [ - Query::equal('projectInternalId', [$project->getSequence()]), - ]); - foreach ($vcsComments as $vcsComment) { - $vcsComment->getAttribute('$permissions', $permissions); - $dbForPlatform->updateDocument('vcsComments', $vcsComment->getId(), $vcsComment); - } - - $response->dynamic($project, Response::MODEL_PROJECT); - }); - Http::patch('/v1/projects/:projectId/service') ->desc('Update service status') ->groups(['api', 'projects']) @@ -1482,12 +1099,15 @@ Http::post('/v1/projects/:projectId/keys') ] )) ->param('projectId', '', new UID(), 'Project unique ID.') + // TODO: When migrating to Platform API, mark keyId required for consistency + ->param('keyId', 'unique()', new CustomId(), 'Key ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.', true) ->param('name', null, new Text(128), 'Key name. Max length: 128 chars.') ->param('scopes', null, new Nullable(new ArrayList(new WhiteList(array_keys(Config::getParam('projectScopes')), true), APP_LIMIT_ARRAY_PARAMS_SIZE)), 'Key scopes list. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' scopes are allowed.') ->param('expire', null, new Nullable(new DatetimeValidator()), 'Expiration time in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. Use null for unlimited expiration.', true) ->inject('response') ->inject('dbForPlatform') - ->action(function (string $projectId, string $name, array $scopes, ?string $expire, Response $response, Database $dbForPlatform) { + ->action(function (string $projectId, string $keyId, string $name, array $scopes, ?string $expire, Response $response, Database $dbForPlatform) { + $keyId = $keyId == 'unique()' ? ID::unique() : $keyId; $project = $dbForPlatform->getDocument('projects', $projectId); @@ -1496,7 +1116,7 @@ Http::post('/v1/projects/:projectId/keys') } $key = new Document([ - '$id' => ID::unique(), + '$id' => $keyId, '$permissions' => [ Permission::read(Role::any()), Permission::update(Role::any()), @@ -1513,7 +1133,11 @@ Http::post('/v1/projects/:projectId/keys') 'secret' => API_KEY_STANDARD . '_' . \bin2hex(\random_bytes(128)), ]); - $key = $dbForPlatform->createDocument('keys', $key); + try { + $key = $dbForPlatform->createDocument('keys', $key); + } catch (Duplicate) { + throw new Exception(Exception::KEY_ALREADY_EXISTS); + } $dbForPlatform->purgeCachedDocument('projects', $project->getId()); @@ -1540,10 +1164,11 @@ Http::get('/v1/projects/:projectId/keys') ] )) ->param('projectId', '', new UID(), 'Project unique ID.') + ->param('queries', [], new Keys(), '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(', ', Keys::ALLOWED_ATTRIBUTES), true) ->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true) ->inject('response') ->inject('dbForPlatform') - ->action(function (string $projectId, bool $includeTotal, Response $response, Database $dbForPlatform) { + ->action(function (string $projectId, array $queries, bool $includeTotal, Response $response, Database $dbForPlatform) { $project = $dbForPlatform->getDocument('projects', $projectId); @@ -1551,15 +1176,46 @@ Http::get('/v1/projects/:projectId/keys') throw new Exception(Exception::PROJECT_NOT_FOUND); } - $keys = $dbForPlatform->find('keys', [ - Query::equal('resourceType', ['projects']), - Query::equal('resourceInternalId', [$project->getSequence()]), - Query::limit(5000), - ]); + try { + $queries = Query::parseQueries($queries); + } catch (QueryException $e) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); + } + + // Backwards compatibility + if (\count(Query::getByType($queries, [Query::TYPE_LIMIT])) === 0) { + $queries[] = Query::limit(5000); + } + + $queries[] = Query::equal('resourceType', ['projects']); + $queries[] = Query::equal('resourceInternalId', [$project->getSequence()]); + + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + + if ($cursor !== false) { + $validator = new Cursor(); + if (!$validator->isValid($cursor)) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); + } + + $keyId = $cursor->getValue(); + $cursorDocument = $dbForPlatform->getDocument('keys', $keyId); + + if ($cursorDocument->isEmpty()) { + throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "Key '{$keyId}' for the 'cursor' value not found."); + } + + $cursor->setValue($cursorDocument); + } + + $filterQueries = Query::groupByType($queries)['filters']; + + $keys = $dbForPlatform->find('keys', $queries); $response->dynamic(new Document([ 'keys' => $keys, - 'total' => $includeTotal ? count($keys) : 0, + 'total' => $includeTotal ? $dbForPlatform->count('keys', $filterQueries, APP_LIMIT_COUNT) : 0, ]), Response::MODEL_KEY_LIST); }); diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index e44565db93..bf708a06f8 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -51,14 +51,13 @@ use Utopia\Database\Validator\Query\Limit; use Utopia\Database\Validator\Query\Offset; use Utopia\Database\Validator\UID; use Utopia\Emails\Email; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Locale\Locale; use Utopia\System\System; use Utopia\Validator\ArrayList; use Utopia\Validator\Assoc; use Utopia\Validator\Boolean; use Utopia\Validator\Text; -use Utopia\Validator\WhiteList; Http::post('/v1/teams') ->desc('Create team') @@ -191,16 +190,10 @@ Http::get('/v1/teams') $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); @@ -484,16 +477,7 @@ Http::post('/v1/teams/:teamId/memberships') ->param('email', '', new EmailValidator(), 'Email of the new team member.', true) ->param('userId', '', new UID(), 'ID of the user to be added to a team.', true) ->param('phone', '', new Phone(), 'Phone number. Format this number with a leading \'+\' and a country code, e.g., +16175551212.', true) - ->param('roles', [], function (Document $project) { - if ($project->getId() === 'console') { - $roles = array_keys(Config::getParam('roles', [])); - $roles = array_filter($roles, function ($role) { - return !in_array($role, [User::ROLE_APPS, User::ROLE_GUESTS, User::ROLE_USERS]); - }); - return new ArrayList(new WhiteList($roles), APP_LIMIT_ARRAY_PARAMS_SIZE); - } - return new ArrayList(new Key(), APP_LIMIT_ARRAY_PARAMS_SIZE); - }, '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 ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' roles are allowed, each 32 characters long.', false, ['project']) + ->param('roles', [], new ArrayList(new Key(), APP_LIMIT_ARRAY_PARAMS_SIZE), '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 ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' roles are allowed, each 32 characters long.', false, ['project']) ->param('url', '', fn ($redirectValidator) => $redirectValidator, 'URL to redirect the user back to your app from the invitation email. This parameter is not required when an API key is supplied. Only URLs from hostnames in your project platform list are allowed. This requirement helps to prevent an [open redirect](https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html) attack against your project API.', true, ['redirectValidator']) // TODO add our own built-in confirm page ->param('name', '', new Text(128), 'Name of the new team member. Max length: 128 chars.', true) ->inject('response') @@ -889,22 +873,15 @@ Http::get('/v1/teams/:teamId/memberships') // Set internal queries $queries[] = Query::equal('teamInternalId', [$team->getSequence()]); - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); } - $membershipId = $cursor->getValue(); $cursorDocument = $dbForProject->getDocument('memberships', $membershipId); @@ -1095,16 +1072,7 @@ Http::patch('/v1/teams/:teamId/memberships/:membershipId') )) ->param('teamId', '', new UID(), 'Team ID.') ->param('membershipId', '', new UID(), 'Membership ID.') - ->param('roles', [], function (Document $project) { - if ($project->getId() === 'console') { - $roles = array_keys(Config::getParam('roles', [])); - $roles = array_filter($roles, function ($role) { - return !in_array($role, [User::ROLE_APPS, User::ROLE_GUESTS, User::ROLE_USERS]); - }); - return new ArrayList(new WhiteList($roles), APP_LIMIT_ARRAY_PARAMS_SIZE); - } - return new ArrayList(new Key(), APP_LIMIT_ARRAY_PARAMS_SIZE); - }, '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 ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' roles are allowed, each 32 characters long.', false, ['project']) + ->param('roles', [], new ArrayList(new Key(), APP_LIMIT_ARRAY_PARAMS_SIZE), '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 ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' roles are allowed, each 32 characters long.', false, ['project']) ->inject('request') ->inject('response') ->inject('user') diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 56d9e2d292..f16a74ceaf 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -60,7 +60,7 @@ use Utopia\Database\Validator\Query\Limit; use Utopia\Database\Validator\Query\Offset; use Utopia\Database\Validator\UID; use Utopia\Emails\Email; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Locale\Locale; use Utopia\System\System; use Utopia\Validator\ArrayList; @@ -675,16 +675,10 @@ Http::get('/v1/users') $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); @@ -1042,14 +1036,11 @@ Http::get('/v1/users/:userId/targets') throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } $queries[] = Query::equal('userId', [$userId]); - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { + + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); @@ -1106,15 +1097,11 @@ Http::get('/v1/users/identities') if (!empty($search)) { $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/app/controllers/api/vcs.php b/app/controllers/api/vcs.php index 867f9bd3be..126e575be4 100644 --- a/app/controllers/api/vcs.php +++ b/app/controllers/api/vcs.php @@ -1,83 +1,30 @@ desc('Create GitHub app installation') - ->groups(['api', 'vcs']) - ->label('scope', 'vcs.read') - ->label('error', __DIR__ . '/../../views/general/error.phtml') - ->label('sdk', new Method( - namespace: 'vcs', - group: 'installations', - name: 'createGitHubInstallation', - description: '/docs/references/vcs/create-github-installation.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_MOVED_PERMANENTLY, - model: Response::MODEL_NONE, - ) - ], - contentType: ContentType::HTML, - type: MethodType::WEBAUTH, - hide: true, - )) - ->param('success', '', fn ($redirectValidator) => $redirectValidator, 'URL to redirect back to console after a successful installation attempt.', true, ['redirectValidator']) - ->param('failure', '', fn ($redirectValidator) => $redirectValidator, 'URL to redirect back to console after a failed installation attempt.', true, ['redirectValidator']) - ->inject('response') - ->inject('project') - ->inject('platform') - ->action(function (string $success, string $failure, Response $response, Document $project, array $platform) { - $state = \json_encode([ - 'projectId' => $project->getId(), - 'success' => $success, - 'failure' => $failure, - ]); - - $appName = System::getEnv('_APP_VCS_GITHUB_APP_NAME'); - $protocol = System::getEnv('_APP_OPTIONS_FORCE_HTTPS') === 'disabled' ? 'http' : 'https'; - $hostname = $platform['consoleHostname'] ?? ''; - - if (empty($appName)) { - throw new Exception(Exception::GENERAL_SERVER_ERROR, 'GitHub App name is not configured. Please configure VCS (Version Control System) variables in .env file.'); - } - - $url = "https://github.com/apps/$appName/installations/new?" . \http_build_query([ - 'state' => $state, - 'redirect_uri' => $protocol . '://' . $hostname . "/v1/vcs/github/callback" - ]); - - $response - ->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') - ->addHeader('Pragma', 'no-cache') - ->redirect($url); - }); - -Http::get('/v1/vcs/github/callback') - ->desc('Get installation and authorization from GitHub app') - ->groups(['api', 'vcs']) - ->label('scope', 'public') - ->label('error', __DIR__ . '/../../views/general/error.phtml') - ->param('installation_id', '', new Text(256, 0), 'GitHub installation ID', true) - ->param('setup_action', '', new Text(256, 0), 'GitHub setup action type', true) - ->param('state', '', new Text(2048), 'GitHub state. Contains info sent when starting authorization flow.', true) - ->param('code', '', new Text(2048, 0), 'OAuth2 code. This is a temporary code that the will be later exchanged for an access token.', true) - ->inject('gitHub') - ->inject('user') - ->inject('project') - ->inject('response') - ->inject('dbForPlatform') - ->inject('platform') - ->action(function (string $providerInstallationId, string $setupAction, string $state, string $code, GitHub $github, Document $user, Document $project, Response $response, Database $dbForPlatform, array $platform) { - if (empty($state)) { - $error = 'Installation requests from organisation members for the Appwrite GitHub App are currently unsupported. To proceed with the installation, login to the Appwrite Console and install the GitHub App.'; - throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, $error); - } - - $state = \json_decode($state, true); - $projectId = $state['projectId'] ?? ''; - - $project = $dbForPlatform->getDocument('projects', $projectId); - - if ($project->isEmpty()) { - $error = 'Project with the ID from state could not be found.'; - - if (!empty($redirectFailure)) { - $separator = \str_contains($redirectFailure, '?') ? '&' : ':'; - return $response - ->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') - ->addHeader('Pragma', 'no-cache') - ->redirect($redirectFailure . $separator . \http_build_query(['error' => $error])); - } - - throw new Exception(Exception::PROJECT_NOT_FOUND, $error); - } - - $region = $project->getAttribute('region', 'default'); - $protocol = System::getEnv('_APP_OPTIONS_FORCE_HTTPS') === 'disabled' ? 'http' : 'https'; - $hostname = $platform['consoleHostname'] ?? ''; - - $defaultState = [ - 'success' => $protocol . '://' . $hostname . "/console/project-$region-$projectId/settings/git-installations", - 'failure' => $protocol . '://' . $hostname . "/console/project-$region-$projectId/settings/git-installations", - ]; - - $state = \array_merge($defaultState, $state ?? []); - - $redirectSuccess = $state['success'] ?? ''; - $redirectFailure = $state['failure'] ?? ''; - - // Create / Update installation - if (!empty($providerInstallationId)) { - $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); - $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); - $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); - $owner = $github->getOwnerName($providerInstallationId) ?? ''; - - $projectInternalId = $project->getSequence(); - - $installation = $dbForPlatform->findOne('installations', [ - Query::equal('providerInstallationId', [$providerInstallationId]), - Query::equal('projectInternalId', [$projectInternalId]) - ]); - - $personal = false; - $refreshToken = null; - $accessToken = null; - $accessTokenExpiry = null; - - if (!empty($code)) { - $oauth2 = new OAuth2Github(System::getEnv('_APP_VCS_GITHUB_CLIENT_ID', ''), System::getEnv('_APP_VCS_GITHUB_CLIENT_SECRET', ''), ""); - - $accessToken = $oauth2->getAccessToken($code) ?? ''; - $refreshToken = $oauth2->getRefreshToken($code) ?? ''; - $accessTokenExpiry = DateTime::addSeconds(new \DateTime(), \intval($oauth2->getAccessTokenExpiry($code))); - - $personalSlug = $oauth2->getUserSlug($accessToken) ?? ''; - $personal = $personalSlug === $owner; - } - - if ($installation->isEmpty()) { - $teamId = $project->getAttribute('teamId', ''); - - $installation = new Document([ - '$id' => ID::unique(), - '$permissions' => [ - Permission::read(Role::team(ID::custom($teamId))), - Permission::update(Role::team(ID::custom($teamId), 'owner')), - Permission::update(Role::team(ID::custom($teamId), 'developer')), - Permission::delete(Role::team(ID::custom($teamId), 'owner')), - Permission::delete(Role::team(ID::custom($teamId), 'developer')), - ], - 'providerInstallationId' => $providerInstallationId, - 'projectId' => $projectId, - 'projectInternalId' => $projectInternalId, - 'provider' => 'github', - 'organization' => $owner, - 'personal' => $personal, - 'personalRefreshToken' => $refreshToken, - 'personalAccessToken' => $accessToken, - 'personalAccessTokenExpiry' => $accessTokenExpiry, - ]); - - $installation = $dbForPlatform->createDocument('installations', $installation); - } else { - $installation = $installation - ->setAttribute('organization', $owner) - ->setAttribute('personal', $personal) - ->setAttribute('personalRefreshToken', $refreshToken) - ->setAttribute('personalAccessToken', $accessToken) - ->setAttribute('personalAccessTokenExpiry', $accessTokenExpiry); - $installation = $dbForPlatform->updateDocument('installations', $installation->getId(), $installation); - } - } else { - $error = 'Installation of the Appwrite GitHub App on organization accounts is restricted to organization owners. As a member of the organization, you do not have the necessary permissions to install this GitHub App. Please contact the organization owner to create the installation from the Appwrite console.'; - - if (!empty($redirectFailure)) { - $separator = \str_contains($redirectFailure, '?') ? '&' : ':'; - return $response - ->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') - ->addHeader('Pragma', 'no-cache') - ->redirect($redirectFailure . $separator . \http_build_query(['error' => $error])); - } - - throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, $error); - } - - $response - ->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') - ->addHeader('Pragma', 'no-cache') - ->redirect($redirectSuccess); - }); - -Http::get('/v1/vcs/github/installations/:installationId/providerRepositories/:providerRepositoryId/contents') - ->desc('Get files and directories of a VCS repository') - ->groups(['api', 'vcs']) - ->label('scope', 'vcs.read') - ->label('sdk', new Method( - namespace: 'vcs', - group: 'repositories', - name: 'getRepositoryContents', - description: '/docs/references/vcs/get-repository-contents.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_VCS_CONTENT_LIST, - ) - ] - )) - ->param('installationId', '', new Text(256), 'Installation Id') - ->param('providerRepositoryId', '', new Text(256), 'Repository Id') - ->param('providerRootDirectory', '', new Text(256, 0), 'Path to get contents of nested directory', true) - ->param('providerReference', '', new Text(256, 0), 'Git reference (branch, tag, commit) to get contents from', true) - ->inject('gitHub') - ->inject('response') - ->inject('project') - ->inject('dbForPlatform') - ->action(function (string $installationId, string $providerRepositoryId, string $providerRootDirectory, string $providerReference, GitHub $github, Response $response, Document $project, Database $dbForPlatform) { - $installation = $dbForPlatform->getDocument('installations', $installationId); - - if ($installation->isEmpty()) { - throw new Exception(Exception::INSTALLATION_NOT_FOUND); - } - - $providerInstallationId = $installation->getAttribute('providerInstallationId'); - $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); - $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); - $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); - - $owner = $github->getOwnerName($providerInstallationId); - try { - $repositoryName = $github->getRepositoryName($providerRepositoryId) ?? ''; - if (empty($repositoryName)) { - throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); - } - } catch (RepositoryNotFound $e) { - throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); - } - - $contents = $github->listRepositoryContents($owner, $repositoryName, $providerRootDirectory, $providerReference); - - $vcsContents = []; - foreach ($contents as $content) { - $isDirectory = false; - if ($content['type'] === GitHub::CONTENTS_DIRECTORY) { - $isDirectory = true; - } - - $vcsContents[] = new Document([ - 'isDirectory' => $isDirectory, - 'name' => $content['name'] ?? '', - 'size' => $content['size'] ?? 0 - ]); - } - - $response->dynamic(new Document([ - 'contents' => $vcsContents - ]), Response::MODEL_VCS_CONTENT_LIST); - }); - -Http::post('/v1/vcs/github/installations/:installationId/detections') - ->alias('/v1/vcs/github/installations/:installationId/providerRepositories/:providerRepositoryId/detection') - ->desc('Create repository detection') - ->groups(['api', 'vcs']) - ->label('scope', 'vcs.write') - ->label('sdk', new Method( - namespace: 'vcs', - group: 'repositories', - name: 'createRepositoryDetection', - description: '/docs/references/vcs/create-repository-detection.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_DETECTION_RUNTIME, - ), - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_DETECTION_FRAMEWORK, - ) - ] - )) - ->param('installationId', '', new Text(256), 'Installation Id') - ->param('providerRepositoryId', '', new Text(256), 'Repository Id') - ->param('type', '', new WhiteList(['runtime', 'framework']), 'Detector type. Must be one of the following: runtime, framework') - ->param('providerRootDirectory', '', new Text(256, 0), 'Path to Root Directory', true) - ->inject('gitHub') - ->inject('response') - ->inject('dbForPlatform') - ->action(function (string $installationId, string $providerRepositoryId, string $type, string $providerRootDirectory, GitHub $github, Response $response, Database $dbForPlatform) { - $installation = $dbForPlatform->getDocument('installations', $installationId); - - if ($installation->isEmpty()) { - throw new Exception(Exception::INSTALLATION_NOT_FOUND); - } - - $providerInstallationId = $installation->getAttribute('providerInstallationId'); - $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); - $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); - $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); - - $owner = $github->getOwnerName($providerInstallationId); - try { - $repositoryName = $github->getRepositoryName($providerRepositoryId) ?? ''; - if (empty($repositoryName)) { - throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); - } - } catch (RepositoryNotFound $e) { - throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); - } - - $files = $github->listRepositoryContents($owner, $repositoryName, $providerRootDirectory); - $files = \array_column($files, 'name'); - $languages = $github->listRepositoryLanguages($owner, $repositoryName); - - $detector = new Packager(); - foreach ($files as $file) { - $detector->addInput($file); - } - $detector - ->addOption(new Yarn()) - ->addOption(new PNPM()) - ->addOption(new NPM()); - $detection = $detector->detect(); - - $packager = !\is_null($detection) ? $detection->getName() : 'npm'; - - if ($type === 'framework') { - $packages = ''; - try { - $contentResponse = $github->getRepositoryContent($owner, $repositoryName, \rtrim($providerRootDirectory, '/') . '/package.json'); - $packages = $contentResponse['content'] ?? ''; - } catch (FileNotFound $e) { - // Continue detection without package.json - } - - $output = new Document([ - 'framework' => '', - 'installCommand' => '', - 'buildCommand' => '', - 'outputDirectory' => '', - ]); - - $detector = new Framework($packager); - $detector->addInput($packages, Framework::INPUT_PACKAGES); - foreach ($files as $file) { - $detector->addInput($file, Framework::INPUT_FILE); - } - - $detector - ->addOption(new Analog()) - ->addOption(new Angular()) - ->addOption(new Astro()) - ->addOption(new Flutter()) - ->addOption(new Lynx()) - ->addOption(new NextJs()) - ->addOption(new Nuxt()) - ->addOption(new React()) - ->addOption(new ReactNative()) - ->addOption(new Remix()) - ->addOption(new Svelte()) - ->addOption(new SvelteKit()) - ->addOption(new TanStackStart()) - ->addOption(new Vue()); - - $framework = $detector->detect(); - - if (!\is_null($framework)) { - $output->setAttribute('installCommand', $framework->getInstallCommand()); - $output->setAttribute('buildCommand', $framework->getBuildCommand()); - $output->setAttribute('outputDirectory', $framework->getOutputDirectory()); - $framework = $framework->getName(); - } else { - $framework = 'other'; - $output->setAttribute('installCommand', ''); - $output->setAttribute('buildCommand', ''); - $output->setAttribute('outputDirectory', ''); - } - - $frameworks = Config::getParam('frameworks'); - if (!\in_array($framework, \array_keys($frameworks), true)) { - $framework = 'other'; - } - $output->setAttribute('framework', $framework); - } else { - $output = new Document([ - 'runtime' => '', - 'commands' => '', - 'entrypoint' => '', - ]); - - $strategies = [ - new Strategy(Strategy::FILEMATCH), - new Strategy(Strategy::LANGUAGES), - new Strategy(Strategy::EXTENSION), - ]; - - foreach ($strategies as $strategy) { - $detector = new Runtime($strategy, $packager); - - if ($strategy === Strategy::LANGUAGES) { - foreach ($languages as $language) { - $detector->addInput($language); - } - } else { - foreach ($files as $file) { - $detector->addInput($file); - } - } - - $detector - ->addOption(new Node()) - ->addOption(new Bun()) - ->addOption(new Deno()) - ->addOption(new PHP()) - ->addOption(new Python()) - ->addOption(new Dart()) - ->addOption(new Swift()) - ->addOption(new Ruby()) - ->addOption(new Java()) - ->addOption(new CPP()) - ->addOption(new Dotnet()); - - $runtime = $detector->detect(); - - if (!\is_null($runtime)) { - $output->setAttribute('commands', $runtime->getCommands()); - $output->setAttribute('entrypoint', $runtime->getEntrypoint()); - $runtime = $runtime->getName(); - break; - } - } - - if (!empty($runtime)) { - $runtimes = Config::getParam('runtimes'); - $runtimeWithVersion = ''; - foreach ($runtimes as $runtimeKey => $runtimeConfig) { - if ($runtimeConfig['key'] === $runtime) { - $runtimeWithVersion = $runtimeKey; - } - } - - if (empty($runtimeWithVersion)) { - throw new Exception(Exception::FUNCTION_RUNTIME_NOT_DETECTED); - } - - $output->setAttribute('runtime', $runtimeWithVersion); - } else { - throw new Exception(Exception::FUNCTION_RUNTIME_NOT_DETECTED); - } - } - - $wg = new WaitGroup(); - $envs = []; - foreach ($files as $file) { - if (!(\str_starts_with($file, '.env'))) { - continue; - } - - $wg->add(); - go(function () use ($github, $owner, $repositoryName, $providerRootDirectory, $file, $wg, &$envs) { - try { - $contentResponse = $github->getRepositoryContent($owner, $repositoryName, \rtrim($providerRootDirectory, '/') . '/' . $file); - $envFile = $contentResponse['content'] ?? ''; - - $configAdapter = new ConfigDotenv(); - try { - $envObject = $configAdapter->parse($envFile); - foreach ($envObject as $envName => $envValue) { - $envs[$envName] = $envValue; - } - } catch (Parse $err) { - // Silence error, so rest of endpoint can return - } - } finally { - $wg->done(); - } - }); - } - $wg->wait(); - - $variables = []; - foreach ($envs as $key => $value) { - $variables[] = [ - 'name' => $key, - 'value' => $value, - ]; - } - - $output->setAttribute('variables', $variables); - - $response->dynamic($output, $type === 'framework' ? Response::MODEL_DETECTION_FRAMEWORK : Response::MODEL_DETECTION_RUNTIME); - }); - -Http::get('/v1/vcs/github/installations/:installationId/providerRepositories') - ->desc('List repositories') - ->groups(['api', 'vcs']) - ->label('scope', 'vcs.read') - ->label('sdk', new Method( - namespace: 'vcs', - group: 'repositories', - name: 'listRepositories', - description: '/docs/references/vcs/list-repositories.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_PROVIDER_REPOSITORY_RUNTIME_LIST, - ), - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_PROVIDER_REPOSITORY_FRAMEWORK_LIST, - ) - ] - )) - ->param('installationId', '', new Text(256), 'Installation Id') - ->param('type', '', new WhiteList(['runtime', 'framework']), 'Detector type. Must be one of the following: runtime, framework') - ->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true) - ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) - ->inject('gitHub') - ->inject('response') - ->inject('dbForPlatform') - ->action(function (string $installationId, string $type, string $search, array $queries, GitHub $github, Response $response, Database $dbForPlatform) { - if (empty($search)) { - $search = ""; - } - - $installation = $dbForPlatform->getDocument('installations', $installationId); - - if ($installation->isEmpty()) { - throw new Exception(Exception::INSTALLATION_NOT_FOUND); - } - - $providerInstallationId = $installation->getAttribute('providerInstallationId'); - $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); - $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); - $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); - - $queries = Query::parseQueries($queries); - $limitQuery = current(array_filter($queries, fn ($query) => $query->getMethod() === Query::TYPE_LIMIT)); - $offsetQuery = current(array_filter($queries, fn ($query) => $query->getMethod() === Query::TYPE_OFFSET)); - - $limit = !empty($limitQuery) ? $limitQuery->getValue() : 4; - $offset = !empty($offsetQuery) ? $offsetQuery->getValue() : 0; - - if ($offset % $limit !== 0) { - throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, 'offset must be a multiple of the limit'); - } - - $page = ($offset / $limit) + 1; - $owner = $github->getOwnerName($providerInstallationId); - ['items' => $repos, 'total' => $total] = $github->searchRepositories($owner, $page, $limit, $search); - - $repos = \array_map(function ($repo) use ($installation) { - $repo['id'] = \strval($repo['id'] ?? ''); - $repo['pushedAt'] = $repo['pushed_at'] ?? null; - $repo['provider'] = $installation->getAttribute('provider', '') ?? ''; - $repo['organization'] = $installation->getAttribute('organization', '') ?? ''; - return $repo; - }, $repos); - - $repos = batch(\array_map(function ($repo) use ($type, $github) { - return function () use ($repo, $type, $github) { - $files = $github->listRepositoryContents($repo['organization'], $repo['name'], ''); - $files = \array_column($files, 'name'); - - $detector = new Packager(); - foreach ($files as $file) { - $detector->addInput($file); - } - $detector - ->addOption(new Yarn()) - ->addOption(new PNPM()) - ->addOption(new NPM()); - $detection = $detector->detect(); - - $packager = !\is_null($detection) ? $detection->getName() : 'npm'; - - if ($type === 'framework') { - $packages = ''; - try { - $contentResponse = $github->getRepositoryContent($repo['organization'], $repo['name'], 'package.json'); - $packages = $contentResponse['content'] ?? ''; - } catch (FileNotFound $e) { - // Continue detection without package.json - } - - $frameworkDetector = new Framework($packager); - $frameworkDetector->addInput($packages, Framework::INPUT_PACKAGES); - foreach ($files as $file) { - $frameworkDetector->addInput($file, Framework::INPUT_FILE); - } - - $frameworkDetector - ->addOption(new Analog()) - ->addOption(new Angular()) - ->addOption(new Astro()) - ->addOption(new Flutter()) - ->addOption(new Lynx()) - ->addOption(new NextJs()) - ->addOption(new Nuxt()) - ->addOption(new React()) - ->addOption(new ReactNative()) - ->addOption(new Remix()) - ->addOption(new Svelte()) - ->addOption(new SvelteKit()) - ->addOption(new TanStackStart()) - ->addOption(new Vue()); - - $detectedFramework = $frameworkDetector->detect(); - - if (!\is_null($detectedFramework)) { - $framework = $detectedFramework->getName(); - } else { - $framework = 'other'; - } - - $frameworks = Config::getParam('frameworks'); - if (!\in_array($framework, \array_keys($frameworks), true)) { - $framework = 'other'; - } - $repo['framework'] = $framework; - } else { - $languages = $github->listRepositoryLanguages($repo['organization'], $repo['name']); - - $strategies = [ - new Strategy(Strategy::FILEMATCH), - new Strategy(Strategy::LANGUAGES), - new Strategy(Strategy::EXTENSION), - ]; - - foreach ($strategies as $strategy) { - $detector = new Runtime($strategy, $packager); - if ($strategy === Strategy::LANGUAGES) { - foreach ($languages as $language) { - $detector->addInput($language); - } - } else { - foreach ($files as $file) { - $detector->addInput($file); - } - } - $detector - ->addOption(new Node()) - ->addOption(new Bun()) - ->addOption(new Deno()) - ->addOption(new PHP()) - ->addOption(new Python()) - ->addOption(new Dart()) - ->addOption(new Swift()) - ->addOption(new Ruby()) - ->addOption(new Java()) - ->addOption(new CPP()) - ->addOption(new Dotnet()); - - $runtime = $detector->detect(); - - if (!\is_null($runtime)) { - $runtime = $runtime->getName(); - break; - } - } - - if (!empty($runtime)) { - $runtimes = Config::getParam('runtimes'); - $runtimeWithVersion = ''; - foreach ($runtimes as $runtimeKey => $runtimeConfig) { - if ($runtimeConfig['key'] === $runtime) { - $runtimeWithVersion = $runtimeKey; - } - } - - $repo['runtime'] = $runtimeWithVersion ?? ''; - } - } - - $wg = new WaitGroup(); - $envs = []; - foreach ($files as $file) { - if (!(\str_starts_with($file, '.env'))) { - continue; - } - - $wg->add(); - go(function () use ($github, $repo, $file, $wg, &$envs) { - try { - $contentResponse = $github->getRepositoryContent($repo['organization'], $repo['name'], $file); - $envFile = $contentResponse['content'] ?? ''; - - $configAdapter = new ConfigDotenv(); - try { - $envObject = $configAdapter->parse($envFile); - foreach ($envObject as $envName => $envValue) { - $envs[$envName] = $envValue; - } - } catch (Parse) { - // Silence error, so rest of endpoint can return - } - } finally { - $wg->done(); - } - }); - } - $wg->wait(); - - $repo['variables'] = []; - foreach ($envs as $key => $value) { - $repo['variables'][] = [ - 'name' => $key, - 'value' => $value, - ]; - } - - return $repo; - }; - }, $repos)); - - $repos = \array_map(function ($repo) { - return new Document($repo); - }, $repos); - - $response->dynamic(new Document([ - $type === 'framework' ? 'frameworkProviderRepositories' : 'runtimeProviderRepositories' => $repos, - 'total' => $total, - ]), ($type === 'framework') ? Response::MODEL_PROVIDER_REPOSITORY_FRAMEWORK_LIST : Response::MODEL_PROVIDER_REPOSITORY_RUNTIME_LIST); - }); - -Http::post('/v1/vcs/github/installations/:installationId/providerRepositories') - ->desc('Create repository') - ->groups(['api', 'vcs']) - ->label('scope', 'vcs.write') - ->label('sdk', new Method( - namespace: 'vcs', - group: 'repositories', - name: 'createRepository', - description: '/docs/references/vcs/create-repository.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_PROVIDER_REPOSITORY, - ) - ] - )) - ->param('installationId', '', new Text(256), 'Installation Id') - ->param('name', '', new Text(256), 'Repository name (slug)') - ->param('private', '', new Boolean(false), 'Mark repository public or private') - ->inject('gitHub') - ->inject('user') - ->inject('response') - ->inject('project') - ->inject('dbForPlatform') - ->action(function (string $installationId, string $name, bool $private, GitHub $github, Document $user, Response $response, Document $project, Database $dbForPlatform) { - $installation = $dbForPlatform->getDocument('installations', $installationId); - - if ($installation->isEmpty()) { - throw new Exception(Exception::INSTALLATION_NOT_FOUND); - } - - if ($installation->getAttribute('personal', false) === true) { - $oauth2 = new OAuth2Github(System::getEnv('_APP_VCS_GITHUB_CLIENT_ID', ''), System::getEnv('_APP_VCS_GITHUB_CLIENT_SECRET', ''), ""); - - $accessToken = $installation->getAttribute('personalAccessToken'); - $refreshToken = $installation->getAttribute('personalRefreshToken'); - $accessTokenExpiry = $installation->getAttribute('personalAccessTokenExpiry'); - - if (empty($accessToken) || empty($refreshToken) || empty($accessTokenExpiry)) { - $identity = $dbForPlatform->findOne('identities', [ - Query::equal('provider', ['github']), - Query::equal('userInternalId', [$user->getSequence()]), - ]); - if ($identity->isEmpty()) { - throw new Exception(Exception::USER_IDENTITY_NOT_FOUND); - } - - $accessToken = $accessToken ?? $identity->getAttribute('providerAccessToken'); - $refreshToken = $refreshToken ?? $identity->getAttribute('providerRefreshToken'); - $accessTokenExpiry = $accessTokenExpiry ?? $identity->getAttribute('providerAccessTokenExpiry'); - } - - $isExpired = new \DateTime($accessTokenExpiry) < new \DateTime('now'); - if ($isExpired) { - $oauth2->refreshTokens($refreshToken); - - $accessToken = $oauth2->getAccessToken(''); - $refreshToken = $oauth2->getRefreshToken(''); - - $verificationId = $oauth2->getUserID($accessToken); - - if (empty($verificationId)) { - throw new Exception(Exception::GENERAL_RATE_LIMIT_EXCEEDED, "Another request is currently refreshing OAuth token. Please try again."); - } - - $installation = $installation - ->setAttribute('personalAccessToken', $accessToken) - ->setAttribute('personalRefreshToken', $refreshToken) - ->setAttribute('personalAccessTokenExpiry', DateTime::addSeconds(new \DateTime(), (int)$oauth2->getAccessTokenExpiry(''))); - - $dbForPlatform->updateDocument('installations', $installation->getId(), $installation); - } - - try { - $repository = $oauth2->createRepository($accessToken, $name, $private); - } catch (Exception $exception) { - throw new Exception(Exception::GENERAL_PROVIDER_FAILURE, "GitHub failed to process the request: " . $exception->getMessage()); - } - } else { - $providerInstallationId = $installation->getAttribute('providerInstallationId'); - $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); - $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); - $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); - $owner = $github->getOwnerName($providerInstallationId); - - try { - $repository = $github->createRepository($owner, $name, $private); - } catch (Exception $exception) { - throw new Exception(Exception::GENERAL_PROVIDER_FAILURE, "GitHub failed to process the request: " . $exception->getMessage()); - } - } - - if (isset($repository['errors'])) { - $message = $repository['message'] ?? 'Unknown error.'; - if (isset($repository['errors'][0])) { - $message .= ' ' . $repository['errors'][0]['message']; - } - throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, 'Provider Error: ' . $message); - } - - if (isset($repository['message'])) { - throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, 'Provider Error: ' . $repository['message']); - } - - $repository['id'] = \strval($repository['id']) ?? ''; - $repository['pushedAt'] = $repository['pushed_at'] ?? ''; - $repository['organization'] = $installation->getAttribute('organization', ''); - $repository['provider'] = $installation->getAttribute('provider', ''); - - $response->dynamic(new Document($repository), Response::MODEL_PROVIDER_REPOSITORY); - }); - -Http::get('/v1/vcs/github/installations/:installationId/providerRepositories/:providerRepositoryId') - ->desc('Get repository') - ->groups(['api', 'vcs']) - ->label('scope', 'vcs.read') - ->label('sdk', new Method( - namespace: 'vcs', - group: 'repositories', - name: 'getRepository', - description: '/docs/references/vcs/get-repository.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_PROVIDER_REPOSITORY, - ) - ] - )) - ->param('installationId', '', new Text(256), 'Installation Id') - ->param('providerRepositoryId', '', new Text(256), 'Repository Id') - ->inject('gitHub') - ->inject('response') - ->inject('project') - ->inject('dbForPlatform') - ->action(function (string $installationId, string $providerRepositoryId, GitHub $github, Response $response, Document $project, Database $dbForPlatform) { - $installation = $dbForPlatform->getDocument('installations', $installationId); - - if ($installation->isEmpty()) { - throw new Exception(Exception::INSTALLATION_NOT_FOUND); - } - - $providerInstallationId = $installation->getAttribute('providerInstallationId'); - $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); - $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); - $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); - - $owner = $github->getOwnerName($providerInstallationId) ?? ''; - try { - $repositoryName = $github->getRepositoryName($providerRepositoryId) ?? ''; - if (empty($repositoryName)) { - throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); - } - } catch (RepositoryNotFound $e) { - throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); - } - - $repository = $github->getRepository($owner, $repositoryName); - - $repository['id'] = \strval($repository['id']) ?? ''; - $repository['pushedAt'] = $repository['pushed_at'] ?? ''; - $repository['organization'] = $installation->getAttribute('organization', ''); - $repository['provider'] = $installation->getAttribute('provider', ''); - $repository['defaultBranch'] = $repository['default_branch'] ?? ''; - - $response->dynamic(new Document($repository), Response::MODEL_PROVIDER_REPOSITORY); - }); - -Http::get('/v1/vcs/github/installations/:installationId/providerRepositories/:providerRepositoryId/branches') - ->desc('List repository branches') - ->groups(['api', 'vcs']) - ->label('scope', 'vcs.read') - ->label('sdk', new Method( - namespace: 'vcs', - group: 'repositories', - name: 'listRepositoryBranches', - description: '/docs/references/vcs/list-repository-branches.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_BRANCH_LIST, - ) - ] - )) - ->param('installationId', '', new Text(256), 'Installation Id') - ->param('providerRepositoryId', '', new Text(256), 'Repository Id') - ->inject('gitHub') - ->inject('response') - ->inject('project') - ->inject('dbForPlatform') - ->action(function (string $installationId, string $providerRepositoryId, GitHub $github, Response $response, Document $project, Database $dbForPlatform) { - $installation = $dbForPlatform->getDocument('installations', $installationId); - - if ($installation->isEmpty()) { - throw new Exception(Exception::INSTALLATION_NOT_FOUND); - } - - $providerInstallationId = $installation->getAttribute('providerInstallationId'); - $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); - $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); - $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); - - $owner = $github->getOwnerName($providerInstallationId) ?? ''; - try { - $repositoryName = $github->getRepositoryName($providerRepositoryId) ?? ''; - if (empty($repositoryName)) { - throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); - } - } catch (RepositoryNotFound $e) { - throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); - } - - $branches = $github->listBranches($owner, $repositoryName) ?? []; - - $response->dynamic(new Document([ - 'branches' => \array_map(function ($branch) { - return new Document(['name' => $branch]); - }, $branches), - 'total' => \count($branches), - ]), Response::MODEL_BRANCH_LIST); - }); - Http::post('/v1/vcs/github/events') ->desc('Create event') ->groups(['api', 'vcs']) @@ -1617,158 +616,6 @@ Http::post('/v1/vcs/github/events') } ); -Http::get('/v1/vcs/installations') - ->desc('List installations') - ->groups(['api', 'vcs']) - ->label('scope', 'vcs.read') - ->label('sdk', new Method( - namespace: 'vcs', - group: 'installations', - name: 'listInstallations', - description: '/docs/references/vcs/list-installations.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_INSTALLATION_LIST, - ) - ] - )) - ->param('queries', [], new Installations(), '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(', ', Installations::ALLOWED_ATTRIBUTES), true) - ->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true) - ->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true) - ->inject('response') - ->inject('project') - ->inject('dbForProject') - ->inject('dbForPlatform') - ->action(function (array $queries, string $search, bool $includeTotal, Response $response, Document $project, Database $dbForProject, Database $dbForPlatform) { - try { - $queries = Query::parseQueries($queries); - } catch (QueryException $e) { - throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); - } - - $queries[] = Query::equal('projectInternalId', [$project->getSequence()]); - - if (!empty($search)) { - $queries[] = Query::search('search', $search); - } - - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ - - $validator = new Cursor(); - if (!$validator->isValid($cursor)) { - throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); - } - - $installationId = $cursor->getValue(); - $cursorDocument = $dbForPlatform->getDocument('installations', $installationId); - - if ($cursorDocument->isEmpty()) { - throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "Installation '{$installationId}' for the 'cursor' value not found."); - } - - $cursor->setValue($cursorDocument); - } - - $filterQueries = Query::groupByType($queries)['filters']; - try { - $results = $dbForPlatform->find('installations', $queries); - $total = $includeTotal ? $dbForPlatform->count('installations', $filterQueries, APP_LIMIT_COUNT) : 0; - } catch (OrderException $e) { - throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."); - } - - $response->dynamic(new Document([ - 'installations' => $results, - 'total' => $total, - ]), Response::MODEL_INSTALLATION_LIST); - }); - -Http::get('/v1/vcs/installations/:installationId') - ->desc('Get installation') - ->groups(['api', 'vcs']) - ->label('scope', 'vcs.read') - ->label('sdk', new Method( - namespace: 'vcs', - group: 'installations', - name: 'getInstallation', - description: '/docs/references/vcs/get-installation.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_OK, - model: Response::MODEL_INSTALLATION, - ) - ] - )) - ->param('installationId', '', new Text(256), 'Installation Id') - ->inject('response') - ->inject('project') - ->inject('dbForPlatform') - ->action(function (string $installationId, Response $response, Document $project, Database $dbForPlatform) { - $installation = $dbForPlatform->getDocument('installations', $installationId); - - if ($installation === false || $installation->isEmpty()) { - throw new Exception(Exception::INSTALLATION_NOT_FOUND); - } - - if ($installation->getAttribute('projectInternalId') !== $project->getSequence()) { - throw new Exception(Exception::INSTALLATION_NOT_FOUND); - } - - $response->dynamic($installation, Response::MODEL_INSTALLATION); - }); - -Http::delete('/v1/vcs/installations/:installationId') - ->desc('Delete installation') - ->groups(['api', 'vcs']) - ->label('scope', 'vcs.write') - ->label('sdk', new Method( - namespace: 'vcs', - group: 'installations', - name: 'deleteInstallation', - description: '/docs/references/vcs/delete-installation.md', - auth: [AuthType::ADMIN], - responses: [ - new SDKResponse( - code: Response::STATUS_CODE_NOCONTENT, - model: Response::MODEL_NONE, - ) - ], - contentType: ContentType::NONE - )) - ->param('installationId', '', new Text(256), 'Installation Id') - ->inject('response') - ->inject('project') - ->inject('dbForPlatform') - ->inject('queueForDeletes') - ->action(function (string $installationId, Response $response, Document $project, Database $dbForPlatform, Delete $queueForDeletes) { - $installation = $dbForPlatform->getDocument('installations', $installationId); - - if ($installation->isEmpty()) { - throw new Exception(Exception::INSTALLATION_NOT_FOUND); - } - - if (!$dbForPlatform->deleteDocument('installations', $installation->getId())) { - throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to remove installation from DB'); - } - - $queueForDeletes - ->setType(DELETE_TYPE_DOCUMENT) - ->setDocument($installation); - - $response->noContent(); - }); - Http::patch('/v1/vcs/github/installations/:installationId/repositories/:repositoryId') ->desc('Update external deployment (authorize)') ->groups(['api', 'vcs']) diff --git a/app/controllers/general.php b/app/controllers/general.php index 8be918a7dc..2d3bde69d6 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -8,7 +8,7 @@ use Appwrite\Auth\Key; use Appwrite\Event\Certificate; use Appwrite\Event\Delete as DeleteEvent; use Appwrite\Event\Event; -use Appwrite\Event\Func; +use Appwrite\Event\Execution; use Appwrite\Event\StatsUsage; use Appwrite\Extend\Exception as AppwriteException; use Appwrite\Network\Cors; @@ -34,8 +34,8 @@ use Appwrite\Utopia\View; use Executor\Executor; use MaxMind\Db\Reader; use Swoole\Http\Request as SwooleRequest; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; @@ -45,13 +45,14 @@ use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Domains\Domain; use Utopia\DSN\DSN; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Locale\Locale; use Utopia\Logger\Adapter\Sentry; 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; @@ -60,7 +61,7 @@ Config::setParam('domainVerification', false); Config::setParam('cookieDomain', 'localhost'); Config::setParam('cookieSamesite', Response::COOKIE_SAMESITE_NONE); -function router(Http $utopia, Database $dbForPlatform, callable $getProjectDB, SwooleRequest $swooleRequest, Request $request, Response $response, Log $log, Event $queueForEvents, StatsUsage $queueForStatsUsage, Func $queueForFunctions, Executor $executor, Reader $geodb, callable $isResourceBlocked, array $platform, string $previewHostname, Authorization $authorization, ?Key $apiKey, DeleteEvent $queueForDeletes, int $executionsRetentionCount) +function router(Http $utopia, Database $dbForPlatform, callable $getProjectDB, SwooleRequest $swooleRequest, Request $request, Response $response, Log $log, Event $queueForEvents, StatsUsage $queueForStatsUsage, Execution $queueForExecutions, Executor $executor, Reader $geodb, callable $isResourceBlocked, array $platform, string $previewHostname, Authorization $authorization, ?Key $apiKey, DeleteEvent $queueForDeletes, int $executionsRetentionCount) { $host = $request->getHostname() ?? ''; if (!empty($previewHostname)) { @@ -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 { @@ -696,14 +704,11 @@ function router(Http $utopia, Database $dbForPlatform, callable $getProjectDB, S throw $th; } } finally { - if ($type === 'function') { - $queueForFunctions - ->setType(Func::TYPE_ASYNC_WRITE) + if ($type === 'function' || $type === 'site') { + $queueForExecutions ->setExecution($execution) ->setProject($project) ->trigger(); - } elseif ($type === 'site') { // TODO: Move it to logs worker later - $dbForProject->createDocument('executions', $execution); } } @@ -877,7 +882,7 @@ Http::init() ->inject('geodb') ->inject('queueForStatsUsage') ->inject('queueForEvents') - ->inject('queueForFunctions') + ->inject('queueForExecutions') ->inject('executor') ->inject('platform') ->inject('isResourceBlocked') @@ -888,7 +893,7 @@ Http::init() ->inject('authorization') ->inject('queueForDeletes') ->inject('executionsRetentionCount') - ->action(function (Http $utopia, SwooleRequest $swooleRequest, Request $request, Response $response, Log $log, Document $project, Database $dbForPlatform, callable $getProjectDB, Locale $locale, array $localeCodes, Reader $geodb, StatsUsage $queueForStatsUsage, Event $queueForEvents, Func $queueForFunctions, Executor $executor, array $platform, callable $isResourceBlocked, string $previewHostname, Document $devKey, ?Key $apiKey, Cors $cors, Authorization $authorization, DeleteEvent $queueForDeletes, int $executionsRetentionCount) { + ->action(function (Http $utopia, SwooleRequest $swooleRequest, Request $request, Response $response, Log $log, Document $project, Database $dbForPlatform, callable $getProjectDB, Locale $locale, array $localeCodes, Reader $geodb, StatsUsage $queueForStatsUsage, Event $queueForEvents, Execution $queueForExecutions, Executor $executor, array $platform, callable $isResourceBlocked, string $previewHostname, Document $devKey, ?Key $apiKey, Cors $cors, Authorization $authorization, DeleteEvent $queueForDeletes, int $executionsRetentionCount) { /* * Appwrite Router */ @@ -896,7 +901,7 @@ Http::init() $platformHostnames = $platform['hostnames'] ?? []; // Only run Router when external domain if (!\in_array($hostname, $platformHostnames) || !empty($previewHostname)) { - if (router($utopia, $dbForPlatform, $getProjectDB, $swooleRequest, $request, $response, $log, $queueForEvents, $queueForStatsUsage, $queueForFunctions, $executor, $geodb, $isResourceBlocked, $platform, $previewHostname, $authorization, $apiKey, $queueForDeletes, $executionsRetentionCount)) { + if (router($utopia, $dbForPlatform, $getProjectDB, $swooleRequest, $request, $response, $log, $queueForEvents, $queueForStatsUsage, $queueForExecutions, $executor, $geodb, $isResourceBlocked, $platform, $previewHostname, $authorization, $apiKey, $queueForDeletes, $executionsRetentionCount)) { $utopia->getRoute()?->label('router', true); } } @@ -950,7 +955,15 @@ Http::init() $endDomain->getRegisterable() !== '' ); - $isLocalHost = $request->getHostname() === 'localhost' || $request->getHostname() === 'localhost:' . $request->getPort(); + $localHosts = ['localhost','localhost:'.$request->getPort()]; + + $migrationHost = System::getEnv('_APP_MIGRATION_HOST'); + if (!empty($migrationHost)) { + $localHosts[] = $migrationHost; + $localHosts[] = $migrationHost.':'.$request->getPort(); + } + + $isLocalHost = in_array($request->getHostname(), $localHosts); $isIpAddress = filter_var($request->getHostname(), FILTER_VALIDATE_IP) !== false; $isConsoleProject = $project->getAttribute('$id', '') === 'console'; @@ -997,7 +1010,7 @@ Http::init() } if (System::getEnv('_APP_OPTIONS_FORCE_HTTPS', 'disabled') === 'enabled') { // Force HTTPS - if ($request->getProtocol() !== 'https' && ($swooleRequest->header['host'] ?? '') !== 'localhost') { // localhost allowed for proxy, APP_HOSTNAME_INTERNAL allowed for migrations + if ($request->getProtocol() !== 'https' && !in_array(($swooleRequest->header['host'] ?? ''), $localHosts)) { // localhost allowed for proxy if ($request->getMethod() !== Request::METHOD_GET) { throw new AppwriteException(AppwriteException::GENERAL_PROTOCOL_UNSUPPORTED, 'Method unsupported over HTTP. Please use HTTPS instead.'); } @@ -1167,7 +1180,7 @@ Http::options() ->inject('getProjectDB') ->inject('queueForEvents') ->inject('queueForStatsUsage') - ->inject('queueForFunctions') + ->inject('queueForExecutions') ->inject('executor') ->inject('geodb') ->inject('isResourceBlocked') @@ -1180,14 +1193,14 @@ Http::options() ->inject('authorization') ->inject('queueForDeletes') ->inject('executionsRetentionCount') - ->action(function (Http $utopia, SwooleRequest $swooleRequest, Request $request, Response $response, Log $log, Database $dbForPlatform, callable $getProjectDB, Event $queueForEvents, StatsUsage $queueForStatsUsage, Func $queueForFunctions, Executor $executor, Reader $geodb, callable $isResourceBlocked, array $platform, string $previewHostname, Document $project, Document $devKey, ?Key $apiKey, Cors $cors, Authorization $authorization, DeleteEvent $queueForDeletes, int $executionsRetentionCount) { + ->action(function (Http $utopia, SwooleRequest $swooleRequest, Request $request, Response $response, Log $log, Database $dbForPlatform, callable $getProjectDB, Event $queueForEvents, StatsUsage $queueForStatsUsage, Execution $queueForExecutions, Executor $executor, Reader $geodb, callable $isResourceBlocked, array $platform, string $previewHostname, Document $project, Document $devKey, ?Key $apiKey, Cors $cors, Authorization $authorization, DeleteEvent $queueForDeletes, int $executionsRetentionCount) { /* * Appwrite Router */ $platformHostnames = $platform['hostnames'] ?? []; // Only run Router when external domain if (!in_array($request->getHostname(), $platformHostnames) || !empty($previewHostname)) { - if (router($utopia, $dbForPlatform, $getProjectDB, $swooleRequest, $request, $response, $log, $queueForEvents, $queueForStatsUsage, $queueForFunctions, $executor, $geodb, $isResourceBlocked, $platform, $previewHostname, $authorization, $apiKey, $queueForDeletes, $executionsRetentionCount)) { + if (router($utopia, $dbForPlatform, $getProjectDB, $swooleRequest, $request, $response, $log, $queueForEvents, $queueForStatsUsage, $queueForExecutions, $executor, $geodb, $isResourceBlocked, $platform, $previewHostname, $authorization, $apiKey, $queueForDeletes, $executionsRetentionCount)) { $utopia->getRoute()?->label('router', true); } } @@ -1233,21 +1246,11 @@ 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) { - case Utopia\Exception::class: + case Utopia\Http\Exception::class: $error = new AppwriteException(AppwriteException::GENERAL_UNKNOWN, $message, $code, $error); switch ($code) { case 400: @@ -1563,7 +1566,7 @@ Http::get('/robots.txt') ->inject('getProjectDB') ->inject('queueForEvents') ->inject('queueForStatsUsage') - ->inject('queueForFunctions') + ->inject('queueForExecutions') ->inject('executor') ->inject('geodb') ->inject('isResourceBlocked') @@ -1573,13 +1576,13 @@ Http::get('/robots.txt') ->inject('authorization') ->inject('queueForDeletes') ->inject('executionsRetentionCount') - ->action(function (Http $utopia, SwooleRequest $swooleRequest, Request $request, Response $response, Log $log, Database $dbForPlatform, callable $getProjectDB, Event $queueForEvents, StatsUsage $queueForStatsUsage, Func $queueForFunctions, Executor $executor, Reader $geodb, callable $isResourceBlocked, array $platform, string $previewHostname, ?Key $apiKey, Authorization $authorization, DeleteEvent $queueForDeletes, int $executionsRetentionCount) { + ->action(function (Http $utopia, SwooleRequest $swooleRequest, Request $request, Response $response, Log $log, Database $dbForPlatform, callable $getProjectDB, Event $queueForEvents, StatsUsage $queueForStatsUsage, Execution $queueForExecutions, Executor $executor, Reader $geodb, callable $isResourceBlocked, array $platform, string $previewHostname, ?Key $apiKey, Authorization $authorization, DeleteEvent $queueForDeletes, int $executionsRetentionCount) { $platformHostnames = $platform['hostnames'] ?? []; if (in_array($request->getHostname(), $platformHostnames) || !empty($previewHostname)) { $template = new View(__DIR__ . '/../views/general/robots.phtml'); $response->text($template->render(false)); } else { - if (router($utopia, $dbForPlatform, $getProjectDB, $swooleRequest, $request, $response, $log, $queueForEvents, $queueForStatsUsage, $queueForFunctions, $executor, $geodb, $isResourceBlocked, $platform, $previewHostname, $authorization, $apiKey, $queueForDeletes, $executionsRetentionCount)) { + if (router($utopia, $dbForPlatform, $getProjectDB, $swooleRequest, $request, $response, $log, $queueForEvents, $queueForStatsUsage, $queueForExecutions, $executor, $geodb, $isResourceBlocked, $platform, $previewHostname, $authorization, $apiKey, $queueForDeletes, $executionsRetentionCount)) { $utopia->getRoute()?->label('router', true); } } @@ -1598,7 +1601,7 @@ Http::get('/humans.txt') ->inject('getProjectDB') ->inject('queueForEvents') ->inject('queueForStatsUsage') - ->inject('queueForFunctions') + ->inject('queueForExecutions') ->inject('executor') ->inject('geodb') ->inject('isResourceBlocked') @@ -1608,13 +1611,13 @@ Http::get('/humans.txt') ->inject('authorization') ->inject('queueForDeletes') ->inject('executionsRetentionCount') - ->action(function (Http $utopia, SwooleRequest $swooleRequest, Request $request, Response $response, Log $log, Database $dbForPlatform, callable $getProjectDB, Event $queueForEvents, StatsUsage $queueForStatsUsage, Func $queueForFunctions, Executor $executor, Reader $geodb, callable $isResourceBlocked, array $platform, string $previewHostname, ?Key $apiKey, Authorization $authorization, DeleteEvent $queueForDeletes, int $executionsRetentionCount) { + ->action(function (Http $utopia, SwooleRequest $swooleRequest, Request $request, Response $response, Log $log, Database $dbForPlatform, callable $getProjectDB, Event $queueForEvents, StatsUsage $queueForStatsUsage, Execution $queueForExecutions, Executor $executor, Reader $geodb, callable $isResourceBlocked, array $platform, string $previewHostname, ?Key $apiKey, Authorization $authorization, DeleteEvent $queueForDeletes, int $executionsRetentionCount) { $platformHostnames = $platform['hostnames'] ?? []; if (in_array($request->getHostname(), $platformHostnames) || !empty($previewHostname)) { $template = new View(__DIR__ . '/../views/general/humans.phtml'); $response->text($template->render(false)); } else { - if (router($utopia, $dbForPlatform, $getProjectDB, $swooleRequest, $request, $response, $log, $queueForEvents, $queueForStatsUsage, $queueForFunctions, $executor, $geodb, $isResourceBlocked, $platform, $previewHostname, $authorization, $apiKey, $queueForDeletes, $executionsRetentionCount)) { + if (router($utopia, $dbForPlatform, $getProjectDB, $swooleRequest, $request, $response, $log, $queueForEvents, $queueForStatsUsage, $queueForExecutions, $executor, $geodb, $isResourceBlocked, $platform, $previewHostname, $authorization, $apiKey, $queueForDeletes, $executionsRetentionCount)) { $utopia->getRoute()?->label('router', true); } } diff --git a/app/controllers/mock.php b/app/controllers/mock.php index e58a601786..fbe3eb9b20 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -12,7 +12,7 @@ use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\UID; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Locale\Locale; use Utopia\System\System; use Utopia\Validator\Text; diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 2df2c80918..f25f9717ed 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -30,7 +30,7 @@ use Utopia\Database\Document; use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Authorization\Input; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\System\System; use Utopia\Telemetry\Adapter as Telemetry; use Utopia\Validator\WhiteList; diff --git a/app/controllers/shared/api/auth.php b/app/controllers/shared/api/auth.php index 7eba5a7021..6e1f9f389f 100644 --- a/app/controllers/shared/api/auth.php +++ b/app/controllers/shared/api/auth.php @@ -8,7 +8,7 @@ use Utopia\Config\Config; use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\System\System; Http::init() diff --git a/app/controllers/web/home.php b/app/controllers/web/home.php index 3ceb5b2c8a..d23c9840a6 100644 --- a/app/controllers/web/home.php +++ b/app/controllers/web/home.php @@ -2,7 +2,7 @@ use Appwrite\Utopia\Response; use Utopia\Config\Config; -use Utopia\Http; +use Utopia\Http\Http; Http::get('/versions') ->desc('Get Version') diff --git a/app/http.php b/app/http.php index 333f6d4de2..1d7949da86 100644 --- a/app/http.php +++ b/app/http.php @@ -1,6 +1,7 @@ column('value', Table::TYPE_INT, 1); $domains->create(); @@ -162,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) { @@ -181,7 +186,7 @@ $http->on(Constant::EVENT_AFTER_RELOAD, function ($server) { include __DIR__ . '/controllers/general.php'; -function createDatabase(Http $app, string $resourceKey, string $dbName, array $collections, mixed $pools, callable $extraSetup = null): void +function createDatabase(Http $app, string $resourceKey, string $dbName, array $collections, mixed $pools, ?callable $extraSetup = null): void { $max = 10; $sleep = 1; @@ -203,17 +208,18 @@ 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); // Attempt to create the database try { - Console::info(" └── Creating database: $dbName..."); $database->create(); } catch (\Exception $e) { - Console::info(" └── Skip: metadata table already exists"); + Span::add('database.exists', true); } // Process collections + $collectionsCreated = 0; foreach ($collections as $key => $collection) { if (($collection['$collection'] ?? '') !== Database::METADATA) { continue; @@ -223,8 +229,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'], @@ -246,14 +250,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) { @@ -278,7 +287,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'), @@ -301,7 +309,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.'); @@ -331,7 +338,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'), @@ -349,7 +355,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.'); @@ -387,6 +392,9 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg $cache = $app->getResource('cache'); foreach ($sharedTablesV2 as $hostname) { + Span::init('database.setup'); + Span::add('database.hostname', $hostname); + $adapter = new DatabasePool($pools->get($hostname)); $dbForProject = (new Database($adapter, $cache)) ->setDatabase('appwrite') @@ -395,10 +403,9 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg ->setNamespace(System::getEnv('_APP_DATABASE_SHARED_NAMESPACE', '')); try { - Console::success('[Setup] - Creating project database: ' . $hostname . '...'); $dbForProject->create(); } catch (DuplicateException) { - Console::success('[Setup] - Skip: metadata table already exists'); + Span::add('database.exists', true); } if ($dbForProject->getCollection(AuditAdapterSQL::COLLECTION)->isEmpty()) { @@ -407,6 +414,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; @@ -418,17 +426,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); @@ -440,21 +452,25 @@ $http->on(Constant::EVENT_START, function (Server $http) use ($payloadSize, $reg }); }); -$http->on(Constant::EVENT_REQUEST, function (SwooleRequest $swooleRequest, SwooleResponse $swooleResponse) use ($register) { +$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())) + ->setContentType($files->getFileMimeType($request->getURI())) ->addHeader('Cache-Control', 'public, max-age=' . $time) ->addHeader('Expires', \date('D, d M Y H:i:s', \time() + $time) . ' GMT') // 45 days cache - ->send(Files::getFileContents($request->getURI())); + ->send($files->getFileContents($request->getURI())); return; } @@ -475,7 +491,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"); @@ -538,12 +559,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())) ? [ @@ -560,6 +575,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(); } }); diff --git a/app/init/constants.php b/app/init/constants.php index 7912cb823a..fe9af93436 100644 --- a/app/init/constants.php +++ b/app/init/constants.php @@ -5,6 +5,8 @@ use Appwrite\Platform\Modules\Compute\Specification; const APP_NAME = 'Appwrite'; const APP_DOMAIN = 'appwrite.io'; +const APP_VIEWS_DIR = __DIR__ . '/../views'; + // Email const APP_EMAIL_TEAM = 'team@localhost.test'; // Default email address const APP_EMAIL_SECURITY = ''; // Default security email address @@ -369,6 +371,7 @@ const RESOURCE_TYPE_TOPICS = 'topics'; const RESOURCE_TYPE_SUBSCRIBERS = 'subscribers'; const RESOURCE_TYPE_MESSAGES = 'messages'; const RESOURCE_TYPE_EXECUTIONS = 'executions'; +const RESOURCE_TYPE_VCS = 'vcs'; // Resource types for Tokens const TOKENS_RESOURCE_TYPE_FILES = 'files'; @@ -387,3 +390,6 @@ const COOKIE_NAME_PREVIEW = 'a_jwt_console'; // Cache Reconnect const CACHE_RECONNECT_MAX_RETRIES = 2; const CACHE_RECONNECT_RETRY_DELAY = 1000; + +// Project status +const PROJECT_STATUS_ACTIVE = 'active'; diff --git a/app/init/registers.php b/app/init/registers.php index 2db7f487ca..7a21db987a 100644 --- a/app/init/registers.php +++ b/app/init/registers.php @@ -9,15 +9,16 @@ use MaxMind\Db\Reader; use PHPMailer\PHPMailer\PHPMailer; use Swoole\Database\PDOProxy; use Utopia\Cache\Adapter\Redis as RedisCache; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Adapter\MariaDB; use Utopia\Database\Adapter\MySQL; +use Utopia\Database\Adapter\Postgres; use Utopia\Database\Adapter\SQL; use Utopia\Database\PDO; use Utopia\Domains\Validator\PublicDomain; use Utopia\DSN\DSN; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Logger\Adapter\AppSignal; use Utopia\Logger\Adapter\LogOwl; use Utopia\Logger\Adapter\Raygun; @@ -150,7 +151,7 @@ $register->set('pools', function () { $group = new Group(); $fallbackForDB = 'db_main=' . AppwriteURL::unparse([ - 'scheme' => 'mariadb', + 'scheme' => System::getEnv('_APP_DB_ADAPTER', 'mariadb'), 'host' => System::getEnv('_APP_DB_HOST', 'mariadb'), 'port' => System::getEnv('_APP_DB_PORT', '3306'), 'user' => System::getEnv('_APP_DB_USER', ''), @@ -170,19 +171,19 @@ $register->set('pools', function () { 'type' => 'database', 'dsns' => $fallbackForDB, 'multiple' => false, - 'schemes' => ['mariadb', 'mysql'], + 'schemes' => ['mariadb', 'mysql','postgresql'], ], 'database' => [ 'type' => 'database', 'dsns' => $fallbackForDB, 'multiple' => true, - 'schemes' => ['mariadb', 'mysql'], + 'schemes' => ['mariadb', 'mysql','postgresql'], ], 'logs' => [ 'type' => 'database', 'dsns' => System::getEnv('_APP_CONNECTIONS_DB_LOGS', $fallbackForDB), 'multiple' => false, - 'schemes' => ['mariadb', 'mysql'], + 'schemes' => ['mariadb', 'mysql','postgresql'], ], 'publisher' => [ 'type' => 'publisher', @@ -275,6 +276,17 @@ $register->set('pools', function () { ]); }); }, + 'postgresql' => function () use ($dsnHost, $dsnPort, $dsnUser, $dsnPass, $dsnDatabase) { + return new PDOProxy(function () use ($dsnHost, $dsnPort, $dsnUser, $dsnPass, $dsnDatabase) { + return new PDO("pgsql:host={$dsnHost};port={$dsnPort};dbname={$dsnDatabase}", $dsnUser, $dsnPass, array( + \PDO::ATTR_TIMEOUT => 3, // Seconds + \PDO::ATTR_PERSISTENT => false, + \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, + \PDO::ATTR_EMULATE_PREPARES => true, + \PDO::ATTR_STRINGIFY_FETCHES => true + )); + }); + }, 'redis' => function () use ($dsnHost, $dsnPort, $dsnPass) { $redis = new \Redis(); @$redis->pconnect($dsnHost, (int)$dsnPort); @@ -297,6 +309,7 @@ $register->set('pools', function () { $adapter = match ($dsn->getScheme()) { 'mariadb' => new MariaDB($resource()), 'mysql' => new MySQL($resource()), + 'postgresql' => new Postgres($resource()), default => null }; @@ -351,10 +364,25 @@ $register->set('db', function () { $dbPort = System::getEnv('_APP_DB_PORT', ''); $dbUser = System::getEnv('_APP_DB_USER', ''); $dbPass = System::getEnv('_APP_DB_PASS', ''); - $dbScheme = System::getEnv('_APP_DB_SCHEMA', ''); + $dbSchema = System::getEnv('_APP_DB_SCHEMA', ''); + $dbAdapter = System::getEnv('_APP_DB_ADAPTER', 'mariadb'); + $dsn = ''; + + switch ($dbAdapter) { + case 'postgresql': + $dsn = "pgsql:host={$dbHost};port={$dbPort};dbname={$dbSchema}"; + break; + + case 'mysql': + case 'mariadb': + default: + $dsn = "mysql:host={$dbHost};port={$dbPort};dbname={$dbSchema};charset=utf8mb4"; + break; + } + return new PDO( - "mysql:host={$dbHost};port={$dbPort};dbname={$dbScheme};charset=utf8mb4", + $dsn, $dbUser, $dbPass, SQL::getPDOAttributes() diff --git a/app/init/resources.php b/app/init/resources.php index 163a26c876..cdc2e8a367 100644 --- a/app/init/resources.php +++ b/app/init/resources.php @@ -10,6 +10,7 @@ use Appwrite\Event\Certificate; use Appwrite\Event\Database as EventDatabase; use Appwrite\Event\Delete; use Appwrite\Event\Event; +use Appwrite\Event\Execution; use Appwrite\Event\Func; use Appwrite\Event\Mail; use Appwrite\Event\Messaging; @@ -42,8 +43,8 @@ use Utopia\Auth\Store; use Utopia\Cache\Adapter\Pool as CachePool; use Utopia\Cache\Adapter\Sharding; use Utopia\Cache\Cache; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Adapter\Pool as DatabasePool; use Utopia\Database\Database; use Utopia\Database\DateTime as DatabaseDateTime; @@ -51,7 +52,7 @@ use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\DSN\DSN; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Locale\Locale; use Utopia\Logger\Log; use Utopia\Pools\Group; @@ -159,6 +160,9 @@ Http::setResource('queueForAudits', function (Publisher $publisher) { Http::setResource('queueForFunctions', function (Publisher $publisher) { return new Func($publisher); }, ['publisher']); +Http::setResource('queueForExecutions', function (Publisher $publisher) { + return new Execution($publisher); +}, ['publisher']); Http::setResource('eventProcessor', function () { return new EventProcessor(); }, []); @@ -198,15 +202,26 @@ Http::setResource('allowedHostnames', function (array $platform, Document $proje } $originHostname = parse_url($request->getOrigin(), PHP_URL_HOST); + $refererHostname = parse_url($request->getReferer(), PHP_URL_HOST); + + $hostname = $originHostname; + if (empty($hostname)) { + $hostname = $refererHostname; + } /* Add request hostname for preflight requests */ if ($request->getMethod() === 'OPTIONS') { - $allowed[] = $originHostname; + $allowed[] = $hostname; } - /* Allow the request origin if a dev key or rule is found */ - if ((!$rule->isEmpty() || !$devKey->isEmpty()) && !empty($originHostname)) { - $allowed[] = $originHostname; + /* Allow the request origin of rule */ + if (!$rule->isEmpty() && !empty($rule->getAttribute('domain', ''))) { + $allowed[] = $rule->getAttribute('domain', ''); + } + + /* Allow the request origin if a dev key is found */ + if (!$devKey->isEmpty() && !empty($hostname)) { + $allowed[] = $hostname; } return array_unique($allowed); @@ -237,6 +252,11 @@ Http::setResource('allowedSchemes', function (Document $project) { */ Http::setResource('rule', function (Request $request, Database $dbForPlatform, Document $project, Authorization $authorization) { $domain = \parse_url($request->getOrigin(), PHP_URL_HOST); + + if (empty($domain)) { + $domain = \parse_url($request->getReferer(), PHP_URL_HOST); + } + if (empty($domain)) { return new Document(); } @@ -253,7 +273,24 @@ Http::setResource('rule', function (Request $request, Database $dbForPlatform, D ]) ?? new Document(); }); - if ($rule->getAttribute('projectInternalId') !== $project->getSequence()) { + $permitsCurrentProject = $rule->getAttribute('projectInternalId', '') === $project->getSequence(); + + // Temporary implementation until custom wildcard domains are an official feature + // Allow trusted projects; Used for Console (website) previews + if (!$permitsCurrentProject && !$rule->isEmpty() && !empty($rule->getAttribute('projectId', ''))) { + $trustedProjects = []; + foreach (\explode(',', System::getEnv('_APP_CONSOLE_TRUSTED_PROJECTS', '')) as $trustedProject) { + if (empty($trustedProject)) { + continue; + } + $trustedProjects[] = $trustedProject; + } + if (\in_array($rule->getAttribute('projectId', ''), $trustedProjects)) { + $permitsCurrentProject = true; + } + } + + if (!$permitsCurrentProject) { return new Document(); } @@ -487,6 +524,10 @@ Http::setResource('project', function ($dbForPlatform, $request, $console, $auth /** @var Utopia\Database\Document $console */ $projectId = $request->getParam('project', $request->getHeader('x-appwrite-project', '')); + // Realtime channel "project" can send project=Query array + if (!\is_string($projectId)) { + $projectId = $request->getHeader('x-appwrite-project', ''); + } if (empty($projectId) || $projectId === 'console') { return $console; diff --git a/app/init/span.php b/app/init/span.php new file mode 100644 index 0000000000..76f37f5300 --- /dev/null +++ b/app/init/span.php @@ -0,0 +1,8 @@ +onWorkerStart(function (int $workerId) use ($server, $register, $stats, ] ]; - $subscribers = $realtime->getSubscribers($event); // [connectionId => [subId => queries]] + $subscribers = $realtime->getSubscribers($event); - // For test events, send to all connections with their matched subscription queries - foreach ($subscribers as $connectionId => $matchedSubscriptions) { + $groups = []; + foreach ($subscribers as $id => $matched) { + $key = implode(',', array_keys($matched)); + $groups[$key]['ids'][] = $id; + $groups[$key]['subscriptions'] = array_keys($matched); + } + + foreach ($groups as $group) { $data = $event['data']; - // Send matched subscription IDs - $data['subscriptions'] = array_keys($matchedSubscriptions); + $data['subscriptions'] = $group['subscriptions']; - $server->send([$connectionId], json_encode([ + $server->send($group['ids'], json_encode([ 'type' => 'event', 'data' => $data ])); @@ -484,18 +489,18 @@ $server->onWorkerStart(function (int $workerId) use ($server, $register, $stats, $roles = $user->getRoles($database->getAuthorization()); $authorization = $realtime->connections[$connection]['authorization'] ?? null; - $subscriptionMetadata = $realtime->getSubscriptionMetadata($connection); + $meta = $realtime->getSubscriptionMetadata($connection); $realtime->unsubscribe($connection); - foreach ($subscriptionMetadata as $subscriptionId => $metadata) { - $queries = Query::parseQueries($metadata['queries'] ?? []); + foreach ($meta as $subscriptionId => $subscription) { + $queries = Query::parseQueries($subscription['queries'] ?? []); $realtime->subscribe( $projectId, $connection, $subscriptionId, $roles, - $metadata['channels'] ?? [], + $subscription['channels'] ?? [], $queries ); } @@ -507,35 +512,38 @@ $server->onWorkerStart(function (int $workerId) use ($server, $register, $stats, } } - $receivers = $realtime->getSubscribers($event); // [connectionId => [subId => queries]] + $receivers = $realtime->getSubscribers($event); if (Http::isDevelopment() && !empty($receivers)) { Console::log("[Debug][Worker {$workerId}] Receivers: " . count($receivers)); - Console::log("[Debug][Worker {$workerId}] Receivers Connection IDs: " . json_encode(array_keys($receivers))); - Console::log("[Debug][Worker {$workerId}] Event Query: " . json_encode(array_values($receivers))); + Console::log("[Debug][Worker {$workerId}] Connection IDs: " . json_encode(array_keys($receivers))); + Console::log("[Debug][Worker {$workerId}] Matched: " . json_encode(array_values($receivers))); Console::log("[Debug][Worker {$workerId}] Event: " . $payload); } - $totalMessages = 0; - - foreach ($receivers as $connectionId => $matchedSubscriptions) { - $data = $event['data']; - // Send matched subscription IDs - $data['subscriptions'] = array_keys($matchedSubscriptions); - - $server->send( - [$connectionId], - json_encode([ - 'type' => 'event', - 'data' => $data - ]) - ); - $totalMessages++; + // Group connections by matched subscription IDs for batch sending + $groups = []; + foreach ($receivers as $id => $matched) { + $key = implode(',', array_keys($matched)); + $groups[$key]['ids'][] = $id; + $groups[$key]['subscriptions'] = array_keys($matched); } - if ($totalMessages > 0) { - $register->get('telemetry.messageSentCounter')->add($totalMessages); - $stats->incr($event['project'], 'messages', $totalMessages); + $total = 0; + foreach ($groups as $group) { + $data = $event['data']; + $data['subscriptions'] = $group['subscriptions']; + + $server->send($group['ids'], json_encode([ + 'type' => 'event', + 'data' => $data + ])); + $total += count($group['ids']); + } + + if ($total > 0) { + $register->get('telemetry.messageSentCounter')->add($total); + $stats->incr($event['project'], 'messages', $total); } }); } catch (Throwable $th) { @@ -624,21 +632,19 @@ $server->onOpen(function (int $connection, SwooleRequest $request) use ($server, throw new Exception(Exception::REALTIME_POLICY_VIOLATION, 'Missing channels'); } - // Reconstruct subscriptions from query params using helper method - $channelNames = array_keys($channels); + $names = array_keys($channels); try { - $subscriptionsByIndex = Realtime::constructSubscriptions( - $channelNames, + $subscriptions = Realtime::constructSubscriptions( + $names, fn ($channel) => $request->getQuery($channel, null) ); } catch (QueryException $e) { throw new Exception(Exception::REALTIME_POLICY_VIOLATION, $e->getMessage()); } - // Generate subscription IDs and subscribe - $subscriptionMapping = []; - foreach ($subscriptionsByIndex as $index => $subscription) { + $mapping = []; + foreach ($subscriptions as $index => $subscription) { $subscriptionId = ID::unique(); $realtime->subscribe( @@ -647,10 +653,10 @@ $server->onOpen(function (int $connection, SwooleRequest $request) use ($server, $subscriptionId, $roles, $subscription['channels'], - $subscription['queries'] // Query objects + $subscription['queries'] ); - $subscriptionMapping[$index] = $subscriptionId; + $mapping[$index] = $subscriptionId; } $realtime->connections[$connection]['authorization'] = $authorization; @@ -660,8 +666,8 @@ $server->onOpen(function (int $connection, SwooleRequest $request) use ($server, $server->send([$connection], json_encode([ 'type' => 'connected', 'data' => [ - 'channels' => $channelNames, - 'subscriptions' => $subscriptionMapping, + 'channels' => $names, + 'subscriptions' => $mapping, 'user' => $user ] ])); @@ -684,11 +690,11 @@ $server->onOpen(function (int $connection, SwooleRequest $request) use ($server, $code = 500; } - $message = $th->getMessage(); // sanitize 0 && 5xx errors - if (($code === 0 || $code >= 500) && !Http::isDevelopment()) { + $realtimeViolation = $th instanceof AppwriteException && $th->getType() === AppwriteException::REALTIME_POLICY_VIOLATION; + if (($code === 0 || $code >= 500) && !$realtimeViolation && !Http::isDevelopment()) { $message = 'Error: Server Error'; } @@ -711,7 +717,7 @@ $server->onOpen(function (int $connection, SwooleRequest $request) use ($server, } }); -$server->onMessage(function (int $connection, string $message) use ($server, $register, $realtime, $containerId) { +$server->onMessage(function (int $connection, string $message) use ($server, $register, $realtime, $containerId, $logError) { try { $response = new Response(new SwooleResponse()); $projectId = $realtime->connections[$connection]['projectId'] ?? null; @@ -791,32 +797,29 @@ $server->onMessage(function (int $connection, string $message) use ($server, $re } $roles = $user->getRoles($database->getAuthorization()); - $channelNames = $realtime->connections[$connection]['channels'] ?? []; - $channels = Realtime::convertChannels(array_flip($channelNames), $user->getId()); $authorization = $realtime->connections[$connection]['authorization'] ?? null; $projectId = $realtime->connections[$connection]['projectId'] ?? null; - $subscriptionMetadata = $realtime->getSubscriptionMetadata($connection); + $meta = $realtime->getSubscriptionMetadata($connection); $realtime->unsubscribe($connection); if (!empty($projectId)) { - foreach ($subscriptionMetadata as $subscriptionId => $metadata) { - $queries = Query::parseQueries($metadata['queries'] ?? []); + foreach ($meta as $subscriptionId => $subscription) { + $queries = Query::parseQueries($subscription['queries'] ?? []); $realtime->subscribe( $projectId, $connection, $subscriptionId, $roles, - $metadata['channels'] ?? [], + $subscription['channels'] ?? [], $queries ); } } - // Restore authorization after subscribe if ($authorization !== null) { $realtime->connections[$connection]['authorization'] = $authorization; } @@ -837,6 +840,7 @@ $server->onMessage(function (int $connection, string $message) use ($server, $re throw new Exception(Exception::REALTIME_MESSAGE_FORMAT_INVALID, 'Message type is not valid.'); } } catch (Throwable $th) { + $logError($th, "realtimeMessage"); $code = $th->getCode(); if (!is_int($code)) { $code = 500; diff --git a/app/views/install/compose.phtml b/app/views/install/compose.phtml index 16af33ca3a..5f0030fa5e 100644 --- a/app/views/install/compose.phtml +++ b/app/views/install/compose.phtml @@ -12,9 +12,10 @@ $version = $this->getParam('version', ''); $organization = $this->getParam('organization', ''); $image = $this->getParam('image', ''); $enableAssistant = $this->getParam('enableAssistant', false); +$dbService = $this->getParam('database'); ?>services: traefik: - image: traefik:2.11 + image: traefik:3.6 container_name: appwrite-traefik <<: *x-logging command: @@ -70,8 +71,8 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite-sites:/storage/sites:rw - appwrite-builds:/storage/builds:rw depends_on: - - mariadb - redis + - # - clamav environment: - _APP_ENV @@ -108,6 +109,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_SMTP_HOST - _APP_SMTP_PORT - _APP_SMTP_SECURE @@ -223,8 +225,8 @@ $enableAssistant = $this->getParam('enableAssistant', false); networks: - appwrite depends_on: - - mariadb - redis + - environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -240,6 +242,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_USAGE_STATS - _APP_LOGGING_CONFIG @@ -253,7 +256,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite depends_on: - redis - - mariadb + - environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -267,6 +270,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_LOGGING_CONFIG appwrite-worker-webhooks: @@ -279,7 +283,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite depends_on: - redis - - mariadb + - environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -291,6 +295,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_REDIS_HOST - _APP_REDIS_PORT - _APP_REDIS_USER @@ -307,7 +312,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite depends_on: - redis - - mariadb + - volumes: - appwrite-uploads:/storage/uploads:rw - appwrite-cache:/storage/cache:rw @@ -328,6 +333,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_STORAGE_DEVICE - _APP_STORAGE_S3_ACCESS_KEY - _APP_STORAGE_S3_SECRET @@ -370,7 +376,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite depends_on: - redis - - mariadb + - environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -384,6 +390,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_LOGGING_CONFIG appwrite-worker-builds: @@ -396,7 +403,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite depends_on: - redis - - mariadb + - volumes: - appwrite-functions:/storage/functions:rw - appwrite-sites:/storage/sites:rw @@ -417,6 +424,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_LOGGING_CONFIG - _APP_VCS_GITHUB_APP_NAME - _APP_VCS_GITHUB_PRIVATE_KEY @@ -464,7 +472,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite depends_on: - redis - - mariadb + - volumes: - appwrite-config:/storage/config:rw - appwrite-certificates:/storage/certificates:rw @@ -489,6 +497,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_LOGGING_CONFIG appwrite-worker-functions: @@ -501,7 +510,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite depends_on: - redis - - mariadb + - - openruntimes-executor environment: - _APP_ENV @@ -518,6 +527,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_FUNCTIONS_TIMEOUT - _APP_SITES_TIMEOUT - _APP_COMPUTE_BUILD_TIMEOUT @@ -540,6 +550,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite depends_on: - redis + - environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -551,6 +562,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_REDIS_HOST - _APP_REDIS_PORT - _APP_REDIS_USER @@ -576,6 +588,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite-uploads:/storage/uploads:rw depends_on: - redis + - environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -589,6 +602,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_LOGGING_CONFIG - _APP_SMS_FROM - _APP_SMS_PROVIDER @@ -626,7 +640,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); volumes: - appwrite-imports:/storage/imports:rw depends_on: - - mariadb + - environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -647,6 +661,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_LOGGING_CONFIG - _APP_MIGRATIONS_FIREBASE_CLIENT_ID - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET @@ -661,6 +676,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite depends_on: - redis + - environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -681,6 +697,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_MAINTENANCE_INTERVAL - _APP_MAINTENANCE_RETENTION_EXECUTION - _APP_MAINTENANCE_RETENTION_CACHE @@ -700,7 +717,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite depends_on: - redis - - mariadb + - environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -710,6 +727,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_REDIS_HOST - _APP_REDIS_PORT - _APP_REDIS_USER @@ -729,7 +747,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite depends_on: - redis - - mariadb + - environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -739,6 +757,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_REDIS_HOST - _APP_REDIS_PORT - _APP_REDIS_USER @@ -757,7 +776,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - appwrite depends_on: - redis - - mariadb + - environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -767,6 +786,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_REDIS_HOST - _APP_REDIS_PORT - _APP_REDIS_USER @@ -784,7 +804,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); networks: - appwrite depends_on: - - mariadb + - - redis environment: - _APP_ENV @@ -799,6 +819,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER appwrite-task-scheduler-executions: image: /: @@ -809,7 +830,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); networks: - appwrite depends_on: - - mariadb + - - redis environment: - _APP_ENV @@ -824,6 +845,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER appwrite-task-scheduler-messages: image: /: @@ -834,7 +856,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); networks: - appwrite depends_on: - - mariadb + - - redis environment: - _APP_ENV @@ -849,6 +871,7 @@ $enableAssistant = $this->getParam('enableAssistant', false); - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER appwrite-assistant: @@ -922,10 +945,12 @@ $enableAssistant = $this->getParam('enableAssistant', false); - OPR_EXECUTOR_STORAGE_WASABI_REGION=$_APP_STORAGE_WASABI_REGION - OPR_EXECUTOR_STORAGE_WASABI_BUCKET=$_APP_STORAGE_WASABI_BUCKET + + + mariadb: - image: mariadb:10.11 # fix issues when upgrading using: mysql_upgrade -u root -p + image: mariadb:10.11 container_name: appwrite-mariadb - <<: *x-logging restart: unless-stopped networks: - appwrite @@ -939,6 +964,24 @@ $enableAssistant = $this->getParam('enableAssistant', false); - MARIADB_AUTO_UPGRADE=1 command: 'mysqld --innodb-flush-method=fsync' + + + postgresql: + image: postgres:15 + container_name: appwrite-postgresql + restart: unless-stopped + networks: + - appwrite + volumes: + - appwrite-postgresql:/var/lib/postgresql/data:rw + environment: + - POSTGRES_DB=${_APP_DB_SCHEMA} + - POSTGRES_USER=${_APP_DB_USER} + - POSTGRES_PASSWORD=${_APP_DB_PASS} + command: "postgres" + + + redis: image: redis:7.2.4-alpine container_name: appwrite-redis @@ -972,7 +1015,11 @@ networks: name: runtimes volumes: + appwrite-mariadb: + + appwrite-postgresql: + appwrite-redis: appwrite-cache: appwrite-uploads: diff --git a/app/worker.php b/app/worker.php index d0094222a7..106a2db24a 100644 --- a/app/worker.php +++ b/app/worker.php @@ -9,6 +9,7 @@ use Appwrite\Event\Certificate; use Appwrite\Event\Database as EventDatabase; use Appwrite\Event\Delete; use Appwrite\Event\Event; +use Appwrite\Event\Execution; use Appwrite\Event\Func; use Appwrite\Event\Mail; use Appwrite\Event\Messaging; @@ -27,8 +28,8 @@ use Utopia\Audit\Audit as UtopiaAudit; use Utopia\Cache\Adapter\Pool as CachePool; use Utopia\Cache\Adapter\Sharding; use Utopia\Cache\Cache; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Adapter\Pool as DatabasePool; use Utopia\Database\Database; use Utopia\Database\DateTime; @@ -44,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); @@ -358,6 +355,10 @@ Server::setResource('queueForFunctions', function (Publisher $publisher) { return new Func($publisher); }, ['publisher']); +Server::setResource('queueForExecutions', function (Publisher $publisher) { + return new Execution($publisher); +}, ['publisher']); + Server::setResource('queueForRealtime', function () { return new Realtime(); }, []); diff --git a/bin/worker-executions b/bin/worker-executions new file mode 100755 index 0000000000..6789fb8da8 --- /dev/null +++ b/bin/worker-executions @@ -0,0 +1,3 @@ +#!/bin/sh + +exec php /usr/src/code/app/worker.php executions "$@" diff --git a/composer.json b/composer.json index d42dcc63c4..15346eb169 100644 --- a/composer.json +++ b/composer.json @@ -46,17 +46,18 @@ "appwrite/php-runtimes": "0.19.*", "appwrite/php-clamav": "2.0.*", "utopia-php/abuse": "1.2.*", - "utopia-php/analytics": "0.10.*", + "utopia-php/analytics": "0.15.*", "utopia-php/audit": "2.2.*", "utopia-php/auth": "0.5.*", "utopia-php/cache": "1.0.*", - "utopia-php/cli": "0.15.*", + "utopia-php/cli": "0.22.*", "utopia-php/config": "1.*", + "utopia-php/console": "0.1.*", "utopia-php/database": "5.*", "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.*", @@ -65,24 +66,23 @@ "utopia-php/logger": "0.6.*", "utopia-php/messaging": "0.20.*", "utopia-php/migration": "1.5.*", - "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.*", "utopia-php/storage": "0.18.*", - "utopia-php/swoole": "1.*", - "utopia-php/system": "0.9.*", + "utopia-php/system": "0.10.*", "utopia-php/telemetry": "0.2.*", "utopia-php/vcs": "1.*", - "utopia-php/websocket": "0.3.*", + "utopia-php/websocket": "1.0.*", "matomo/device-detector": "6.4.*", "dragonmantank/cron-expression": "3.4.*", "phpmailer/phpmailer": "6.9.*", "chillerlan/php-qrcode": "4.4.*", "adhocore/jwt": "1.1.*", - "spomky-labs/otphp": "10.0.*", + "spomky-labs/otphp": "^11.4.2", "webonyx/graphql-php": "14.11.*", "league/csv": "9.24.*", "enshrined/svg-sanitize": "0.22.*" @@ -92,7 +92,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.*" diff --git a/composer.lock b/composer.lock index d4c7939166..f522fc29ca 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "78db79de4948322d4e6307f9eb9a74a6", + "content-hash": "9397ae16877660a3ea485cfdcaab906c", "packages": [ { "name": "adhocore/jwt", @@ -161,21 +161,21 @@ }, { "name": "appwrite/php-runtimes", - "version": "0.19.2", + "version": "0.19.3", "source": { "type": "git", "url": "https://github.com/appwrite/runtimes.git", - "reference": "e5c142519df5aced37de9c302971c29c079ce3d9" + "reference": "bfe9f3c730c8c203c5e2d80bd5a81c9b1579714e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/runtimes/zipball/e5c142519df5aced37de9c302971c29c079ce3d9", - "reference": "e5c142519df5aced37de9c302971c29c079ce3d9", + "url": "https://api.github.com/repos/appwrite/runtimes/zipball/bfe9f3c730c8c203c5e2d80bd5a81c9b1579714e", + "reference": "bfe9f3c730c8c203c5e2d80bd5a81c9b1579714e", "shasum": "" }, "require": { "php": ">=8.0", - "utopia-php/system": "0.9.*" + "utopia-php/system": "0.10.*" }, "require-dev": { "laravel/pint": "^1.15", @@ -210,89 +210,22 @@ ], "support": { "issues": "https://github.com/appwrite/runtimes/issues", - "source": "https://github.com/appwrite/runtimes/tree/0.19.2" + "source": "https://github.com/appwrite/runtimes/tree/0.19.3" }, - "time": "2025-11-11T13:44:44+00:00" - }, - { - "name": "beberlei/assert", - "version": "v3.3.3", - "source": { - "type": "git", - "url": "https://github.com/beberlei/assert.git", - "reference": "b5fd8eacd8915a1b627b8bfc027803f1939734dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/beberlei/assert/zipball/b5fd8eacd8915a1b627b8bfc027803f1939734dd", - "reference": "b5fd8eacd8915a1b627b8bfc027803f1939734dd", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-mbstring": "*", - "ext-simplexml": "*", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "*", - "phpstan/phpstan": "*", - "phpunit/phpunit": ">=6.0.0", - "yoast/phpunit-polyfills": "^0.1.0" - }, - "suggest": { - "ext-intl": "Needed to allow Assertion::count(), Assertion::isCountable(), Assertion::minCount(), and Assertion::maxCount() to operate on ResourceBundles" - }, - "type": "library", - "autoload": { - "files": [ - "lib/Assert/functions.php" - ], - "psr-4": { - "Assert\\": "lib/Assert" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de", - "role": "Lead Developer" - }, - { - "name": "Richard Quadling", - "email": "rquadling@gmail.com", - "role": "Collaborator" - } - ], - "description": "Thin assertion library for input validation in business models.", - "keywords": [ - "assert", - "assertion", - "validation" - ], - "support": { - "issues": "https://github.com/beberlei/assert/issues", - "source": "https://github.com/beberlei/assert/tree/v3.3.3" - }, - "time": "2024-07-15T13:18:35+00:00" + "time": "2026-02-06T10:08:18+00:00" }, { "name": "brick/math", - "version": "0.14.5", + "version": "0.14.8", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "618a8077b3c326045e10d5788ed713b341fcfe40" + "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/618a8077b3c326045e10d5788ed713b341fcfe40", - "reference": "618a8077b3c326045e10d5788ed713b341fcfe40", + "url": "https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629", + "reference": "63422359a44b7f06cae63c3b429b59e8efcc0629", "shasum": "" }, "require": { @@ -331,7 +264,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.14.5" + "source": "https://github.com/brick/math/tree/0.14.8" }, "funding": [ { @@ -339,7 +272,7 @@ "type": "github" } ], - "time": "2026-02-03T18:06:51+00:00" + "time": "2026-02-10T14:33:43+00:00" }, { "name": "chillerlan/php-qrcode", @@ -673,16 +606,16 @@ }, { "name": "giggsey/libphonenumber-for-php-lite", - "version": "8.13.36", + "version": "9.0.23", "source": { "type": "git", "url": "https://github.com/giggsey/libphonenumber-for-php-lite.git", - "reference": "144bbe70d67664b5245910a475c7190ff140ab4b" + "reference": "e8f6f896c1bef398136849934a934904bd9bf072" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php-lite/zipball/144bbe70d67664b5245910a475c7190ff140ab4b", - "reference": "144bbe70d67664b5245910a475c7190ff140ab4b", + "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php-lite/zipball/e8f6f896c1bef398136849934a934904bd9bf072", + "reference": "e8f6f896c1bef398136849934a934904bd9bf072", "shasum": "" }, "require": { @@ -694,18 +627,19 @@ }, "require-dev": { "ext-dom": "*", - "friendsofphp/php-cs-fixer": "^3.12", - "infection/infection": "^0.28", - "pear/pear-core-minimal": "^1.10.11", - "pear/pear_exception": "^1.0.2", - "pear/versioncontrol_git": "^0.7", - "phing/phing": "^2.17.4", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.2", - "phpunit/phpunit": "^10.5", - "symfony/console": "^6.0", - "symfony/var-exporter": "^6.0" + "friendsofphp/php-cs-fixer": "^3.71", + "infection/infection": "^0.29|^0.31.0", + "nette/php-generator": "^4.1", + "php-coveralls/php-coveralls": "^2.7", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.7", + "phpstan/phpstan-deprecation-rules": "^2.0.1", + "phpstan/phpstan-phpunit": "^2.0.4", + "phpstan/phpstan-strict-rules": "^2.0.3", + "phpunit/phpunit": "^10.5.45", + "symfony/console": "^6.4", + "symfony/filesystem": "^6.4", + "symfony/process": "^6.4" }, "suggest": { "giggsey/libphonenumber-for-php": "Use libphonenumber-for-php for geocoding, carriers, timezones and matching" @@ -713,19 +647,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "8.x-dev" + "dev-master": "9.x-dev" } }, "autoload": { "psr-4": { "libphonenumber\\": "src/" - }, - "exclude-from-classmap": [ - "/src/data/", - "/src/carrier/data/", - "/src/geocoding/data/", - "/src/timezone/data/" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -752,7 +680,7 @@ "issues": "https://github.com/giggsey/libphonenumber-for-php-lite/issues", "source": "https://github.com/giggsey/libphonenumber-for-php-lite" }, - "time": "2024-05-03T06:31:11+00:00" + "time": "2026-01-30T12:33:03+00:00" }, { "name": "google/protobuf", @@ -1427,16 +1355,16 @@ }, { "name": "open-telemetry/exporter-otlp", - "version": "1.3.4", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/exporter-otlp.git", - "reference": "62e680d587beb42e5247aa6ecd89ad1ca406e8ca" + "reference": "283a0d66522f2adc6d8d7debfd7686be91c282be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/exporter-otlp/zipball/62e680d587beb42e5247aa6ecd89ad1ca406e8ca", - "reference": "62e680d587beb42e5247aa6ecd89ad1ca406e8ca", + "url": "https://api.github.com/repos/opentelemetry-php/exporter-otlp/zipball/283a0d66522f2adc6d8d7debfd7686be91c282be", + "reference": "283a0d66522f2adc6d8d7debfd7686be91c282be", "shasum": "" }, "require": { @@ -1487,7 +1415,7 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2026-01-15T09:31:34+00:00" + "time": "2026-02-05T09:44:52+00:00" }, { "name": "open-telemetry/gen-otlp-protobuf", @@ -1554,16 +1482,16 @@ }, { "name": "open-telemetry/sdk", - "version": "1.12.0", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/opentelemetry-php/sdk.git", - "reference": "7f1bd524465c1ca42755a9ef1143ba09913f5be0" + "reference": "c76f91203bf7ef98ab3f4e0a82ca21699af185e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/opentelemetry-php/sdk/zipball/7f1bd524465c1ca42755a9ef1143ba09913f5be0", - "reference": "7f1bd524465c1ca42755a9ef1143ba09913f5be0", + "url": "https://api.github.com/repos/opentelemetry-php/sdk/zipball/c76f91203bf7ef98ab3f4e0a82ca21699af185e1", + "reference": "c76f91203bf7ef98ab3f4e0a82ca21699af185e1", "shasum": "" }, "require": { @@ -1647,7 +1575,7 @@ "issues": "https://github.com/open-telemetry/opentelemetry-php/issues", "source": "https://github.com/open-telemetry/opentelemetry-php" }, - "time": "2026-01-21T04:14:03+00:00" + "time": "2026-01-28T11:38:11+00:00" }, { "name": "open-telemetry/sem-conv", @@ -1708,24 +1636,26 @@ }, { "name": "paragonie/constant_time_encoding", - "version": "v2.8.2", + "version": "v3.1.3", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "e30811f7bc69e4b5b6d5783e712c06c8eabf0226" + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/e30811f7bc69e4b5b6d5783e712c06c8eabf0226", - "reference": "e30811f7bc69e4b5b6d5783e712c06c8eabf0226", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", "shasum": "" }, "require": { - "php": "^7|^8" + "php": "^8" }, "require-dev": { - "phpunit/phpunit": "^6|^7|^8|^9", - "vimeo/psalm": "^1|^2|^3|^4" + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" }, "type": "library", "autoload": { @@ -1771,7 +1701,7 @@ "issues": "https://github.com/paragonie/constant_time_encoding/issues", "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2025-09-24T15:12:37+00:00" + "time": "2025-09-24T15:06:41+00:00" }, { "name": "paragonie/random_compat", @@ -2174,6 +2104,54 @@ ], "time": "2026-01-27T09:17:28+00:00" }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, { "name": "psr/container", "version": "2.0.2", @@ -2593,43 +2571,28 @@ }, { "name": "spomky-labs/otphp", - "version": "v10.0.3", + "version": "11.4.2", "source": { "type": "git", "url": "https://github.com/Spomky-Labs/otphp.git", - "reference": "9784d9f7c790eed26e102d6c78f12c754036c366" + "reference": "2a1b503fd1c1a5c751ab3c5cd37f2d2d26ab74ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/9784d9f7c790eed26e102d6c78f12c754036c366", - "reference": "9784d9f7c790eed26e102d6c78f12c754036c366", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/2a1b503fd1c1a5c751ab3c5cd37f2d2d26ab74ad", + "reference": "2a1b503fd1c1a5c751ab3c5cd37f2d2d26ab74ad", "shasum": "" }, "require": { - "beberlei/assert": "^3.0", - "ext-mbstring": "*", - "paragonie/constant_time_encoding": "^2.0", - "php": "^7.2|^8.0", - "thecodingmachine/safe": "^0.1.14|^1.0|^2.0" + "paragonie/constant_time_encoding": "^2.0 || ^3.0", + "php": ">=8.1", + "psr/clock": "^1.0", + "symfony/deprecation-contracts": "^3.2" }, "require-dev": { - "php-coveralls/php-coveralls": "^2.0", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-beberlei-assert": "^0.12", - "phpstan/phpstan-deprecation-rules": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpunit/phpunit": "^8.0", - "thecodingmachine/phpstan-safe-rule": "^1.0 || ^2.0" + "symfony/error-handler": "^6.4|^7.0|^8.0" }, "type": "library", - "extra": { - "branch-alias": { - "v8.3": "8.3.x-dev", - "v9.0": "9.0.x-dev", - "v10.0": "10.0.x-dev" - } - }, "autoload": { "psr-4": { "OTPHP\\": "src/" @@ -2662,9 +2625,19 @@ ], "support": { "issues": "https://github.com/Spomky-Labs/otphp/issues", - "source": "https://github.com/Spomky-Labs/otphp/tree/v10.0.3" + "source": "https://github.com/Spomky-Labs/otphp/tree/11.4.2" }, - "time": "2022-03-17T08:00:35+00:00" + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2026-01-23T10:53:01+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3376,145 +3349,6 @@ }, "time": "2025-06-29T15:42:06+00:00" }, - { - "name": "thecodingmachine/safe", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/thecodingmachine/safe.git", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "reference": "3115ecd6b4391662b4931daac4eba6b07a2ac1f0", - "shasum": "" - }, - "require": { - "php": "^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^9.5", - "squizlabs/php_codesniffer": "^3.2", - "thecodingmachine/phpstan-strict-rules": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "files": [ - "deprecated/apc.php", - "deprecated/array.php", - "deprecated/datetime.php", - "deprecated/libevent.php", - "deprecated/misc.php", - "deprecated/password.php", - "deprecated/mssql.php", - "deprecated/stats.php", - "deprecated/strings.php", - "lib/special_cases.php", - "deprecated/mysqli.php", - "generated/apache.php", - "generated/apcu.php", - "generated/array.php", - "generated/bzip2.php", - "generated/calendar.php", - "generated/classobj.php", - "generated/com.php", - "generated/cubrid.php", - "generated/curl.php", - "generated/datetime.php", - "generated/dir.php", - "generated/eio.php", - "generated/errorfunc.php", - "generated/exec.php", - "generated/fileinfo.php", - "generated/filesystem.php", - "generated/filter.php", - "generated/fpm.php", - "generated/ftp.php", - "generated/funchand.php", - "generated/gettext.php", - "generated/gmp.php", - "generated/gnupg.php", - "generated/hash.php", - "generated/ibase.php", - "generated/ibmDb2.php", - "generated/iconv.php", - "generated/image.php", - "generated/imap.php", - "generated/info.php", - "generated/inotify.php", - "generated/json.php", - "generated/ldap.php", - "generated/libxml.php", - "generated/lzf.php", - "generated/mailparse.php", - "generated/mbstring.php", - "generated/misc.php", - "generated/mysql.php", - "generated/network.php", - "generated/oci8.php", - "generated/opcache.php", - "generated/openssl.php", - "generated/outcontrol.php", - "generated/pcntl.php", - "generated/pcre.php", - "generated/pgsql.php", - "generated/posix.php", - "generated/ps.php", - "generated/pspell.php", - "generated/readline.php", - "generated/rpminfo.php", - "generated/rrd.php", - "generated/sem.php", - "generated/session.php", - "generated/shmop.php", - "generated/sockets.php", - "generated/sodium.php", - "generated/solr.php", - "generated/spl.php", - "generated/sqlsrv.php", - "generated/ssdeep.php", - "generated/ssh2.php", - "generated/stream.php", - "generated/strings.php", - "generated/swoole.php", - "generated/uodbc.php", - "generated/uopz.php", - "generated/url.php", - "generated/var.php", - "generated/xdiff.php", - "generated/xml.php", - "generated/xmlrpc.php", - "generated/yaml.php", - "generated/yaz.php", - "generated/zip.php", - "generated/zlib.php" - ], - "classmap": [ - "lib/DateTime.php", - "lib/DateTimeImmutable.php", - "lib/Exceptions/", - "deprecated/Exceptions/", - "generated/Exceptions/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHP core functions that throw exceptions instead of returning FALSE on error", - "support": { - "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v2.5.0" - }, - "time": "2023-04-05T11:54:14+00:00" - }, { "name": "utopia-php/abuse", "version": "1.2.2", @@ -3569,25 +3403,25 @@ }, { "name": "utopia-php/analytics", - "version": "0.10.2", + "version": "0.15.2", "source": { "type": "git", "url": "https://github.com/utopia-php/analytics.git", - "reference": "14c805114736f44c26d6d24b176a2f8b93d86a1f" + "reference": "ce5be7042ad518b83e401dcd785d20c4cc872c67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/analytics/zipball/14c805114736f44c26d6d24b176a2f8b93d86a1f", - "reference": "14c805114736f44c26d6d24b176a2f8b93d86a1f", + "url": "https://api.github.com/repos/utopia-php/analytics/zipball/ce5be7042ad518b83e401dcd785d20c4cc872c67", + "reference": "ce5be7042ad518b83e401dcd785d20c4cc872c67", "shasum": "" }, "require": { - "php": ">=8.0", - "utopia-php/cli": "^0.15.0" + "php": ">=8.0" }, "require-dev": { "laravel/pint": "dev-main", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.3", + "utopia-php/system": "0.10.*" }, "type": "library", "autoload": { @@ -3609,9 +3443,9 @@ ], "support": { "issues": "https://github.com/utopia-php/analytics/issues", - "source": "https://github.com/utopia-php/analytics/tree/0.10.2" + "source": "https://github.com/utopia-php/analytics/tree/0.15.2" }, - "time": "2023-03-22T12:01:09+00:00" + "time": "2026-02-09T12:46:39+00:00" }, { "name": "utopia-php/audit", @@ -3771,27 +3605,29 @@ }, { "name": "utopia-php/cli", - "version": "0.15.2", + "version": "0.22.0", "source": { "type": "git", "url": "https://github.com/utopia-php/cli.git", - "reference": "da00ff6b8b29a826a1794002ae43442cdf3a0f5f" + "reference": "a7ac387ee626fd27075a87e836fb72c5be38add4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/cli/zipball/da00ff6b8b29a826a1794002ae43442cdf3a0f5f", - "reference": "da00ff6b8b29a826a1794002ae43442cdf3a0f5f", + "url": "https://api.github.com/repos/utopia-php/cli/zipball/a7ac387ee626fd27075a87e836fb72c5be38add4", + "reference": "a7ac387ee626fd27075a87e836fb72c5be38add4", "shasum": "" }, "require": { "php": ">=7.4", - "utopia-php/framework": "0.*.*" + "utopia-php/servers": "0.2.*" }, "require-dev": { "laravel/pint": "1.2.*", + "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.3", "squizlabs/php_codesniffer": "^3.6", - "vimeo/psalm": "4.0.1" + "swoole/ide-helper": "4.8.8", + "utopia-php/console": "0.0.*" }, "type": "library", "autoload": { @@ -3814,9 +3650,9 @@ ], "support": { "issues": "https://github.com/utopia-php/cli/issues", - "source": "https://github.com/utopia-php/cli/tree/0.15.2" + "source": "https://github.com/utopia-php/cli/tree/0.22.0" }, - "time": "2025-04-15T10:08:48+00:00" + "time": "2025-10-21T10:42:45+00:00" }, { "name": "utopia-php/compression", @@ -3913,20 +3749,20 @@ }, { "name": "utopia-php/console", - "version": "0.0.1", + "version": "0.1.1", "source": { "type": "git", "url": "https://github.com/utopia-php/console.git", - "reference": "f77104e4a888fa9cb3e08f32955ec09479ab7a92" + "reference": "d298e43960780e6d76e66de1228c75dc81220e3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/console/zipball/f77104e4a888fa9cb3e08f32955ec09479ab7a92", - "reference": "f77104e4a888fa9cb3e08f32955ec09479ab7a92", + "url": "https://api.github.com/repos/utopia-php/console/zipball/d298e43960780e6d76e66de1228c75dc81220e3e", + "reference": "d298e43960780e6d76e66de1228c75dc81220e3e", "shasum": "" }, "require": { - "php": ">=7.4" + "php": ">=8.0" }, "require-dev": { "laravel/pint": "1.2.*", @@ -3955,22 +3791,22 @@ ], "support": { "issues": "https://github.com/utopia-php/console/issues", - "source": "https://github.com/utopia-php/console/tree/0.0.1" + "source": "https://github.com/utopia-php/console/tree/0.1.1" }, - "time": "2025-10-20T14:41:36+00:00" + "time": "2026-02-10T10:20:29+00:00" }, { "name": "utopia-php/database", - "version": "5.0.1", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "2783f07e74ddd86dda6e711d79212dd34158540d" + "reference": "94815bfa605282096272625827d0314f9ed99066" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/2783f07e74ddd86dda6e711d79212dd34158540d", - "reference": "2783f07e74ddd86dda6e711d79212dd34158540d", + "url": "https://api.github.com/repos/utopia-php/database/zipball/94815bfa605282096272625827d0314f9ed99066", + "reference": "94815bfa605282096272625827d0314f9ed99066", "shasum": "" }, "require": { @@ -3978,10 +3814,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.*", @@ -4013,9 +3849,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/5.0.1" + "source": "https://github.com/utopia-php/database/tree/5.1.1" }, - "time": "2026-02-03T10:31:12+00:00" + "time": "2026-02-12T11:44:58+00:00" }, { "name": "utopia-php/detector", @@ -4112,22 +3948,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.*" }, @@ -4163,22 +3999,22 @@ ], "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", - "version": "1.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/utopia-php/domains.git", - "reference": "ecac82392e83d4a8ede76c3c94258d868d82f709" + "reference": "20b6a6868234d766fef35a47814dccc66906c2af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/domains/zipball/ecac82392e83d4a8ede76c3c94258d868d82f709", - "reference": "ecac82392e83d4a8ede76c3c94258d868d82f709", + "url": "https://api.github.com/repos/utopia-php/domains/zipball/20b6a6868234d766fef35a47814dccc66906c2af", + "reference": "20b6a6868234d766fef35a47814dccc66906c2af", "shasum": "" }, "require": { @@ -4225,9 +4061,9 @@ ], "support": { "issues": "https://github.com/utopia-php/domains/issues", - "source": "https://github.com/utopia-php/domains/tree/1.0.0" + "source": "https://github.com/utopia-php/domains/tree/1.0.1" }, - "time": "2026-01-30T06:15:50+00:00" + "time": "2026-02-06T12:45:12+00:00" }, { "name": "utopia-php/dsn", @@ -4278,21 +4114,20 @@ }, { "name": "utopia-php/emails", - "version": "0.6.6", + "version": "0.6.8", "source": { "type": "git", "url": "https://github.com/utopia-php/emails.git", - "reference": "354f7fe591e1fba7736afada558cb3b02ec03fea" + "reference": "25dfcd46ed47b862d2a7e7c98d92a3a4680b6f1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/emails/zipball/354f7fe591e1fba7736afada558cb3b02ec03fea", - "reference": "354f7fe591e1fba7736afada558cb3b02ec03fea", + "url": "https://api.github.com/repos/utopia-php/emails/zipball/25dfcd46ed47b862d2a7e7c98d92a3a4680b6f1b", + "reference": "25dfcd46ed47b862d2a7e7c98d92a3a4680b6f1b", "shasum": "" }, "require": { "php": ">=8.0", - "utopia-php/cli": "^0.15", "utopia-php/domains": "^1.0", "utopia-php/fetch": "^0.5", "utopia-php/validators": "0.*" @@ -4300,7 +4135,9 @@ "require-dev": { "laravel/pint": "1.25.*", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.3", + "utopia-php/cli": "^0.22", + "utopia-php/console": "0.*" }, "type": "library", "autoload": { @@ -4332,9 +4169,9 @@ ], "support": { "issues": "https://github.com/utopia-php/emails/issues", - "source": "https://github.com/utopia-php/emails/tree/0.6.6" + "source": "https://github.com/utopia-php/emails/tree/0.6.8" }, - "time": "2026-02-02T10:41:22+00:00" + "time": "2026-02-09T12:31:56+00:00" }, { "name": "utopia-php/fetch", @@ -4377,16 +4214,16 @@ }, { "name": "utopia-php/framework", - "version": "0.33.38", + "version": "0.33.39", "source": { "type": "git", "url": "https://github.com/utopia-php/http.git", - "reference": "decfa49d60d99e922de364c49169b396fafd5ab8" + "reference": "409a258814d664d3a50fa2f48b6695679334d30b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/http/zipball/decfa49d60d99e922de364c49169b396fafd5ab8", - "reference": "decfa49d60d99e922de364c49169b396fafd5ab8", + "url": "https://api.github.com/repos/utopia-php/http/zipball/409a258814d664d3a50fa2f48b6695679334d30b", + "reference": "409a258814d664d3a50fa2f48b6695679334d30b", "shasum": "" }, "require": { @@ -4399,7 +4236,8 @@ "laravel/pint": "1.*", "phpbench/phpbench": "1.*", "phpstan/phpstan": "1.*", - "phpunit/phpunit": "9.*" + "phpunit/phpunit": "9.*", + "swoole/ide-helper": "^6.0" }, "type": "library", "autoload": { @@ -4419,9 +4257,9 @@ ], "support": { "issues": "https://github.com/utopia-php/http/issues", - "source": "https://github.com/utopia-php/http/tree/0.33.38" + "source": "https://github.com/utopia-php/http/tree/0.33.39" }, - "time": "2026-02-04T04:59:25+00:00" + "time": "2026-02-11T06:33:42+00:00" }, { "name": "utopia-php/image", @@ -4575,22 +4413,22 @@ }, { "name": "utopia-php/messaging", - "version": "0.20.0", + "version": "0.20.1", "source": { "type": "git", "url": "https://github.com/utopia-php/messaging.git", - "reference": "6c5be4588d97e3732a1907ecb13cd8a098eade96" + "reference": "fcb4c3c46a48008a677957690bd45ec934dd33b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/messaging/zipball/6c5be4588d97e3732a1907ecb13cd8a098eade96", - "reference": "6c5be4588d97e3732a1907ecb13cd8a098eade96", + "url": "https://api.github.com/repos/utopia-php/messaging/zipball/fcb4c3c46a48008a677957690bd45ec934dd33b0", + "reference": "fcb4c3c46a48008a677957690bd45ec934dd33b0", "shasum": "" }, "require": { "ext-curl": "*", "ext-openssl": "*", - "giggsey/libphonenumber-for-php-lite": "8.13.36", + "giggsey/libphonenumber-for-php-lite": "9.0.23", "php": ">=8.0.0", "phpmailer/phpmailer": "6.9.1" }, @@ -4620,22 +4458,22 @@ ], "support": { "issues": "https://github.com/utopia-php/messaging/issues", - "source": "https://github.com/utopia-php/messaging/tree/0.20.0" + "source": "https://github.com/utopia-php/messaging/tree/0.20.1" }, - "time": "2025-10-22T04:27:37+00:00" + "time": "2026-02-06T09:56:06+00:00" }, { "name": "utopia-php/migration", - "version": "1.5.0", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/utopia-php/migration.git", - "reference": "0d6e77748ca7d9302a88953751bd89d577610afd" + "reference": "93904948f6dd07491821615fd9b9acbcaadec12e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/migration/zipball/0d6e77748ca7d9302a88953751bd89d577610afd", - "reference": "0d6e77748ca7d9302a88953751bd89d577610afd", + "url": "https://api.github.com/repos/utopia-php/migration/zipball/93904948f6dd07491821615fd9b9acbcaadec12e", + "reference": "93904948f6dd07491821615fd9b9acbcaadec12e", "shasum": "" }, "require": { @@ -4644,7 +4482,6 @@ "ext-openssl": "*", "halaxa/json-machine": "^1.2", "php": ">=8.1", - "utopia-php/console": "0.0.*", "utopia-php/database": "5.*", "utopia-php/dsn": "0.2.*", "utopia-php/storage": "0.18.*" @@ -4676,22 +4513,22 @@ ], "support": { "issues": "https://github.com/utopia-php/migration/issues", - "source": "https://github.com/utopia-php/migration/tree/1.5.0" + "source": "https://github.com/utopia-php/migration/tree/1.5.2" }, - "time": "2026-02-02T10:42:04+00:00" + "time": "2026-02-11T06:19:35+00:00" }, { "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": { @@ -4737,79 +4574,29 @@ ], "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" - }, - { - "name": "utopia-php/orchestration", - "version": "0.9.1", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/orchestration.git", - "reference": "55f43513b3f940a3f4f9c2cde7682d0c2581beb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/orchestration/zipball/55f43513b3f940a3f4f9c2cde7682d0c2581beb0", - "reference": "55f43513b3f940a3f4f9c2cde7682d0c2581beb0", - "shasum": "" - }, - "require": { - "php": ">=8.0", - "utopia-php/cli": "0.15.*" - }, - "require-dev": { - "laravel/pint": "^1.2", - "phpunit/phpunit": "^9.3", - "vimeo/psalm": "4.0.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Orchestration\\": "src/Orchestration" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Lite & fast micro PHP abstraction library for container orchestration", - "keywords": [ - "docker", - "framework", - "kubernetes", - "orchestration", - "php", - "swarm", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/orchestration/issues", - "source": "https://github.com/utopia-php/orchestration/tree/0.9.1" - }, - "time": "2023-03-17T15:05:06+00:00" + "time": "2026-02-12T05:54:06+00:00" }, { "name": "utopia-php/platform", - "version": "0.7.15", + "version": "0.7.16", "source": { "type": "git", "url": "https://github.com/utopia-php/platform.git", - "reference": "1b94e9b7c3f86d8955178ed05696bb7c8f49839a" + "reference": "34e67e4b80b5741c380071fe765fbc12a132de4f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/platform/zipball/1b94e9b7c3f86d8955178ed05696bb7c8f49839a", - "reference": "1b94e9b7c3f86d8955178ed05696bb7c8f49839a", + "url": "https://api.github.com/repos/utopia-php/platform/zipball/34e67e4b80b5741c380071fe765fbc12a132de4f", + "reference": "34e67e4b80b5741c380071fe765fbc12a132de4f", "shasum": "" }, "require": { "ext-json": "*", "ext-redis": "*", "php": ">=8.0", - "utopia-php/cli": "0.15.*", + "utopia-php/cli": "0.22.*", "utopia-php/framework": "0.33.*", "utopia-php/queue": "0.15.*" }, @@ -4838,9 +4625,9 @@ ], "support": { "issues": "https://github.com/utopia-php/platform/issues", - "source": "https://github.com/utopia-php/platform/tree/0.7.15" + "source": "https://github.com/utopia-php/platform/tree/0.7.16" }, - "time": "2026-02-04T05:28:13+00:00" + "time": "2026-02-11T06:36:48+00:00" }, { "name": "utopia-php/pools", @@ -4950,22 +4737,21 @@ }, { "name": "utopia-php/queue", - "version": "0.15.4", + "version": "0.15.5", "source": { "type": "git", "url": "https://github.com/utopia-php/queue.git", - "reference": "2d693ec59119f853602f4be271602fddefbab507" + "reference": "aa80ffe6350efd3394615c3763dba138223a225a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/queue/zipball/2d693ec59119f853602f4be271602fddefbab507", - "reference": "2d693ec59119f853602f4be271602fddefbab507", + "url": "https://api.github.com/repos/utopia-php/queue/zipball/aa80ffe6350efd3394615c3763dba138223a225a", + "reference": "aa80ffe6350efd3394615c3763dba138223a225a", "shasum": "" }, "require": { "php": ">=8.3", "php-amqplib/php-amqplib": "^3.7", - "utopia-php/console": "0.0.*", "utopia-php/fetch": "0.5.*", "utopia-php/pools": "1.*", "utopia-php/servers": "0.2.*", @@ -5011,9 +4797,9 @@ ], "support": { "issues": "https://github.com/utopia-php/queue/issues", - "source": "https://github.com/utopia-php/queue/tree/0.15.4" + "source": "https://github.com/utopia-php/queue/tree/0.15.5" }, - "time": "2026-02-04T08:50:35+00:00" + "time": "2026-02-10T12:30:46+00:00" }, { "name": "utopia-php/registry", @@ -5069,16 +4855,16 @@ }, { "name": "utopia-php/servers", - "version": "0.2.4", + "version": "0.2.5", "source": { "type": "git", "url": "https://github.com/utopia-php/servers.git", - "reference": "8675d32f4315e91cdb7757a829356030029ed4f5" + "reference": "4770e879a90685af4ba14e7e5d95d0a17c7fdf03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/servers/zipball/8675d32f4315e91cdb7757a829356030029ed4f5", - "reference": "8675d32f4315e91cdb7757a829356030029ed4f5", + "url": "https://api.github.com/repos/utopia-php/servers/zipball/4770e879a90685af4ba14e7e5d95d0a17c7fdf03", + "reference": "4770e879a90685af4ba14e7e5d95d0a17c7fdf03", "shasum": "" }, "require": { @@ -5117,31 +4903,32 @@ ], "support": { "issues": "https://github.com/utopia-php/servers/issues", - "source": "https://github.com/utopia-php/servers/tree/0.2.4" + "source": "https://github.com/utopia-php/servers/tree/0.2.5" }, - "time": "2026-02-04T07:15:26+00:00" + "time": "2026-02-10T04:21:53+00:00" }, { "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": { @@ -5160,9 +4947,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", @@ -5222,69 +5009,18 @@ }, "time": "2025-12-17T13:55:20+00:00" }, - { - "name": "utopia-php/swoole", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/utopia-php/swoole.git", - "reference": "8c89f38ff163de6c6f8a4898e467ca38c1f03133" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/utopia-php/swoole/zipball/8c89f38ff163de6c6f8a4898e467ca38c1f03133", - "reference": "8c89f38ff163de6c6f8a4898e467ca38c1f03133", - "shasum": "" - }, - "require": { - "ext-swoole": "6.*", - "php": ">=8.1", - "utopia-php/framework": "0.33.*" - }, - "require-dev": { - "laravel/pint": "1.2.*", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.3", - "swoole/ide-helper": "6.0.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Utopia\\Swoole\\": "src/Swoole" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "An extension for Utopia Framework to work with PHP Swoole as a PHP FPM alternative", - "keywords": [ - "framework", - "http", - "php", - "server", - "swoole", - "upf", - "utopia" - ], - "support": { - "issues": "https://github.com/utopia-php/swoole/issues", - "source": "https://github.com/utopia-php/swoole/tree/1.0.2" - }, - "time": "2026-02-04T05:12:48+00:00" - }, { "name": "utopia-php/system", - "version": "0.9.0", + "version": "0.10.0", "source": { "type": "git", "url": "https://github.com/utopia-php/system.git", - "reference": "8e4a7edaf2dfeb4c9524e9f766d27754f2c4b64d" + "reference": "6441a9c180958a373e5ddb330264dd638539dfdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/system/zipball/8e4a7edaf2dfeb4c9524e9f766d27754f2c4b64d", - "reference": "8e4a7edaf2dfeb4c9524e9f766d27754f2c4b64d", + "url": "https://api.github.com/repos/utopia-php/system/zipball/6441a9c180958a373e5ddb330264dd638539dfdb", + "reference": "6441a9c180958a373e5ddb330264dd638539dfdb", "shasum": "" }, "require": { @@ -5292,7 +5028,7 @@ }, "require-dev": { "laravel/pint": "1.13.*", - "phpstan/phpstan": "1.10.*", + "phpstan/phpstan": "1.12.*", "phpunit/phpunit": "9.6.*" }, "type": "library", @@ -5325,9 +5061,9 @@ ], "support": { "issues": "https://github.com/utopia-php/system/issues", - "source": "https://github.com/utopia-php/system/tree/0.9.0" + "source": "https://github.com/utopia-php/system/tree/0.10.0" }, - "time": "2024-10-09T14:44:01+00:00" + "time": "2025-10-15T19:12:00+00:00" }, { "name": "utopia-php/telemetry", @@ -5431,16 +5167,16 @@ }, { "name": "utopia-php/vcs", - "version": "1.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/utopia-php/vcs.git", - "reference": "3a427529dae09c0794541adac19062603d441e28" + "reference": "0f942f667319bb22cd420431e4e79107b41061f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/vcs/zipball/3a427529dae09c0794541adac19062603d441e28", - "reference": "3a427529dae09c0794541adac19062603d441e28", + "url": "https://api.github.com/repos/utopia-php/vcs/zipball/0f942f667319bb22cd420431e4e79107b41061f3", + "reference": "0f942f667319bb22cd420431e4e79107b41061f3", "shasum": "" }, "require": { @@ -5448,7 +5184,7 @@ "php": ">=8.0", "utopia-php/cache": "1.0.*", "utopia-php/framework": "0.*.*", - "utopia-php/system": "0.9.*" + "utopia-php/system": "0.10.*" }, "require-dev": { "laravel/pint": "1.*.*", @@ -5474,22 +5210,22 @@ ], "support": { "issues": "https://github.com/utopia-php/vcs/issues", - "source": "https://github.com/utopia-php/vcs/tree/1.0.0" + "source": "https://github.com/utopia-php/vcs/tree/1.0.1" }, - "time": "2026-01-30T06:18:24+00:00" + "time": "2026-02-06T10:11:58+00:00" }, { "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": { @@ -5523,9 +5259,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", @@ -5654,16 +5390,16 @@ "packages-dev": [ { "name": "appwrite/sdk-generator", - "version": "1.8.24", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "6bfe521d2b6762d1da94c234f6ef4eab54e5e269" + "reference": "94a2d7ef55ea63c6e8afb166d39a82c07d01c8c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/6bfe521d2b6762d1da94c234f6ef4eab54e5e269", - "reference": "6bfe521d2b6762d1da94c234f6ef4eab54e5e269", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/94a2d7ef55ea63c6e8afb166d39a82c07d01c8c0", + "reference": "94a2d7ef55ea63c6e8afb166d39a82c07d01c8c0", "shasum": "" }, "require": { @@ -5699,9 +5435,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.24" + "source": "https://github.com/appwrite/sdk-generator/tree/1.9.0" }, - "time": "2026-02-04T04:42:05+00:00" + "time": "2026-02-12T12:08:13+00:00" }, { "name": "doctrine/annotations", @@ -5928,16 +5664,16 @@ }, { "name": "laravel/pint", - "version": "v1.27.0", + "version": "v1.27.1", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "c67b4195b75491e4dfc6b00b1c78b68d86f54c90" + "reference": "54cca2de13790570c7b6f0f94f37896bee4abcb5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/c67b4195b75491e4dfc6b00b1c78b68d86f54c90", - "reference": "c67b4195b75491e4dfc6b00b1c78b68d86f54c90", + "url": "https://api.github.com/repos/laravel/pint/zipball/54cca2de13790570c7b6f0f94f37896bee4abcb5", + "reference": "54cca2de13790570c7b6f0f94f37896bee4abcb5", "shasum": "" }, "require": { @@ -5948,13 +5684,13 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.92.4", - "illuminate/view": "^12.44.0", - "larastan/larastan": "^3.8.1", - "laravel-zero/framework": "^12.0.4", + "friendsofphp/php-cs-fixer": "^3.93.1", + "illuminate/view": "^12.51.0", + "larastan/larastan": "^3.9.2", + "laravel-zero/framework": "^12.0.5", "mockery/mockery": "^1.6.12", "nunomaduro/termwind": "^2.3.3", - "pestphp/pest": "^3.8.4" + "pestphp/pest": "^3.8.5" }, "bin": [ "builds/pint" @@ -5991,7 +5727,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2026-01-05T16:49:17+00:00" + "time": "2026-02-10T20:00:20+00:00" }, { "name": "matthiasmullie/minify", @@ -6503,16 +6239,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": { @@ -6541,8 +6272,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": [ { @@ -6552,13 +6286,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", @@ -9184,5 +8914,5 @@ "platform-overrides": { "php": "8.3" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/docker-compose.yml b/docker-compose.yml index 0eee94a999..5a6367f402 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,7 +12,7 @@ x-logging: &x-logging services: traefik: - image: traefik:2.11 + image: traefik:3.6 <<: *x-logging container_name: appwrite-traefik command: @@ -100,7 +100,7 @@ services: - ./dev:/usr/src/code/dev # - ./vendor/utopia-php/framework:/usr/src/code/vendor/utopia-php/framework depends_on: - - mariadb + - ${_APP_DB_HOST:-mariadb} - redis - coredns # - clamav @@ -133,6 +133,7 @@ services: - _APP_OPENSSL_KEY_V1 - _APP_DOMAIN - _APP_CONSOLE_DOMAIN + - _APP_CONSOLE_TRUSTED_PROJECTS - _APP_DOMAIN_TARGET_CNAME - _APP_DOMAIN_TARGET_AAAA - _APP_DOMAIN_TARGET_A @@ -148,6 +149,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_SMTP_HOST - _APP_SMTP_PORT - _APP_SMTP_SECURE @@ -228,6 +230,7 @@ services: - _APP_FUNCTIONS_CREATION_ABUSE_LIMIT - _APP_CUSTOM_DOMAIN_DENY_LIST - _APP_TRUSTED_HEADERS + - _APP_MIGRATION_HOST extra_hosts: - "host.docker.internal:host-gateway" @@ -281,7 +284,7 @@ services: - ./app:/usr/src/code/app - ./src:/usr/src/code/src depends_on: - - mariadb + - ${_APP_DB_HOST:-mariadb} - redis environment: - _APP_ENV @@ -298,6 +301,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_USAGE_STATS - _APP_LOGGING_CONFIG - _APP_LOGGING_CONFIG_REALTIME @@ -316,7 +320,7 @@ services: - ./src:/usr/src/code/src depends_on: - redis - - mariadb + - ${_APP_DB_HOST:-mariadb} environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -331,6 +335,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_LOGGING_CONFIG - _APP_DATABASE_SHARED_TABLES @@ -346,7 +351,7 @@ services: - ./src:/usr/src/code/src depends_on: - redis - - mariadb + - ${_APP_DB_HOST:-mariadb} - request-catcher-sms - request-catcher-webhook environment: @@ -360,6 +365,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_REDIS_HOST - _APP_REDIS_PORT - _APP_REDIS_USER @@ -377,7 +383,7 @@ services: - appwrite depends_on: - redis - - mariadb + - ${_APP_DB_HOST:-mariadb} volumes: - appwrite-uploads:/storage/uploads:rw - appwrite-cache:/storage/cache:rw @@ -401,6 +407,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_STORAGE_DEVICE - _APP_STORAGE_S3_ACCESS_KEY - _APP_STORAGE_S3_SECRET @@ -444,7 +451,7 @@ services: - ./src:/usr/src/code/src depends_on: - redis - - mariadb + - ${_APP_DB_HOST:-mariadb} environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -459,6 +466,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_LOGGING_CONFIG - _APP_WORKERS_NUM - _APP_QUEUE_NAME @@ -479,7 +487,7 @@ services: - ./src:/usr/src/code/src depends_on: - redis - - mariadb + - ${_APP_DB_HOST:-mariadb} environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -496,6 +504,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_LOGGING_CONFIG - _APP_VCS_GITHUB_APP_NAME - _APP_VCS_GITHUB_PRIVATE_KEY @@ -510,6 +519,7 @@ services: - _APP_OPTIONS_ROUTER_FORCE_HTTPS - _APP_DOMAIN - _APP_CONSOLE_DOMAIN + - _APP_CONSOLE_TRUSTED_PROJECTS - _APP_STORAGE_DEVICE - _APP_STORAGE_S3_ACCESS_KEY - _APP_STORAGE_S3_SECRET @@ -554,6 +564,7 @@ services: environment: # Specific - _APP_BROWSER_HOST + - _APP_WORKER_SCREENSHOTS_ROUTER # Basic - _APP_ENV - _APP_WORKER_PER_CORE @@ -606,7 +617,7 @@ services: - appwrite depends_on: - redis - - mariadb + - ${_APP_DB_HOST:-mariadb} volumes: - appwrite-config:/storage/config:rw - appwrite-certificates:/storage/certificates:rw @@ -635,6 +646,38 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER + - _APP_LOGGING_CONFIG + - _APP_DATABASE_SHARED_TABLES + + appwrite-worker-executions: + entrypoint: worker-executions + <<: *x-logging + container_name: appwrite-worker-executions + image: appwrite-dev + networks: + - appwrite + volumes: + - ./app:/usr/src/code/app + - ./src:/usr/src/code/src + depends_on: + redis: + condition: service_started + mariadb: + condition: service_started + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_POOL_ADAPTER + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS - _APP_LOGGING_CONFIG - _APP_DATABASE_SHARED_TABLES @@ -649,12 +692,8 @@ services: - ./app:/usr/src/code/app - ./src:/usr/src/code/src depends_on: - redis: - condition: service_started - mariadb: - condition: service_started - openruntimes-executor: - condition: service_healthy + - ${_APP_DB_HOST:-mariadb} + - redis environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -671,6 +710,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_FUNCTIONS_TIMEOUT - _APP_SITES_TIMEOUT - _APP_COMPUTE_BUILD_TIMEOUT @@ -748,6 +788,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_LOGGING_CONFIG - _APP_SMS_FROM - _APP_SMS_PROVIDER @@ -791,7 +832,7 @@ services: - ./src:/usr/src/code/src - ./tests:/usr/src/code/tests depends_on: - - mariadb + - ${_APP_DB_HOST:-mariadb} environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -813,11 +854,13 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_LOGGING_CONFIG - _APP_MIGRATIONS_FIREBASE_CLIENT_ID - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET - _APP_DATABASE_SHARED_TABLES - _APP_OPTIONS_FORCE_HTTPS + - _APP_MIGRATION_HOST appwrite-task-maintenance: entrypoint: maintenance @@ -853,6 +896,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_MAINTENANCE_INTERVAL - _APP_MAINTENANCE_RETENTION_EXECUTION - _APP_MAINTENANCE_RETENTION_CACHE @@ -915,7 +959,7 @@ services: - ./src:/usr/src/code/src depends_on: - redis - - mariadb + - ${_APP_DB_HOST:-mariadb} environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -926,6 +970,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_REDIS_HOST - _APP_REDIS_PORT - _APP_REDIS_USER @@ -947,7 +992,7 @@ services: - ./src:/usr/src/code/src depends_on: - redis - - mariadb + - ${_APP_DB_HOST:-mariadb} environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -958,6 +1003,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_REDIS_HOST - _APP_REDIS_PORT - _APP_REDIS_USER @@ -979,7 +1025,7 @@ services: - ./src:/usr/src/code/src depends_on: - redis - - mariadb + - ${_APP_DB_HOST:-mariadb} environment: - _APP_ENV - _APP_WORKER_PER_CORE @@ -990,6 +1036,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_REDIS_HOST - _APP_REDIS_PORT - _APP_REDIS_USER @@ -1010,7 +1057,7 @@ services: - ./app:/usr/src/code/app - ./src:/usr/src/code/src depends_on: - - mariadb + - ${_APP_DB_HOST:-mariadb} - redis environment: - _APP_ENV @@ -1026,6 +1073,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_DATABASE_SHARED_TABLES appwrite-task-scheduler-executions: @@ -1039,7 +1087,7 @@ services: - ./app:/usr/src/code/app - ./src:/usr/src/code/src depends_on: - - mariadb + - ${_APP_DB_HOST:-mariadb} - redis environment: - _APP_ENV @@ -1055,6 +1103,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER appwrite-task-scheduler-messages: entrypoint: schedule-messages @@ -1067,7 +1116,7 @@ services: - ./app:/usr/src/code/app - ./src:/usr/src/code/src depends_on: - - mariadb + - ${_APP_DB_HOST:-mariadb} - redis environment: - _APP_ENV @@ -1083,6 +1132,7 @@ services: - _APP_DB_SCHEMA - _APP_DB_USER - _APP_DB_PASS + - _APP_DB_ADAPTER - _APP_DATABASE_SHARED_TABLES appwrite-assistant: @@ -1176,6 +1226,22 @@ services: - MARIADB_AUTO_UPGRADE=1 command: "mysqld --innodb-flush-method=fsync" + postgresql: + image: postgres:18 + container_name: appwrite-postgresql + <<: *x-logging + networks: + - appwrite + volumes: + - appwrite-postgresql:/var/lib/postgresql/data:rw + ports: + - "5432:5432" + environment: + - POSTGRES_DB=${_APP_DB_SCHEMA} + - POSTGRES_USER=${_APP_DB_USER} + - POSTGRES_PASSWORD=${_APP_DB_PASS} + command: "postgres" + redis: image: redis:7.2.4-alpine <<: *x-logging @@ -1403,6 +1469,7 @@ configs: volumes: appwrite-mariadb: + appwrite-postgresql: appwrite-redis: appwrite-cache: appwrite-uploads: diff --git a/docs/examples/1.8.x/client-android/java/teams/create-membership.md b/docs/examples/1.8.x/client-android/java/teams/create-membership.md index 8021f370f5..8ec9e0fab4 100644 --- a/docs/examples/1.8.x/client-android/java/teams/create-membership.md +++ b/docs/examples/1.8.x/client-android/java/teams/create-membership.md @@ -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://.cloud.appwrite.io/v1") // Your API Endpoint @@ -12,7 +11,7 @@ Teams teams = new Teams(client); teams.createMembership( "", // teamId - Roles.ADMIN, // roles + List.of(), // roles "email@example.com", // email (optional) "", // userId (optional) "+12065550100", // phone (optional) diff --git a/docs/examples/1.8.x/client-android/java/teams/update-membership.md b/docs/examples/1.8.x/client-android/java/teams/update-membership.md index 4977610a08..c2a0b980c3 100644 --- a/docs/examples/1.8.x/client-android/java/teams/update-membership.md +++ b/docs/examples/1.8.x/client-android/java/teams/update-membership.md @@ -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://.cloud.appwrite.io/v1") // Your API Endpoint @@ -13,7 +12,7 @@ Teams teams = new Teams(client); teams.updateMembership( "", // teamId "", // membershipId - Roles.ADMIN, // roles + List.of(), // roles new CoroutineCallback<>((result, error) -> { if (error != null) { error.printStackTrace(); diff --git a/docs/examples/1.8.x/client-android/kotlin/teams/create-membership.md b/docs/examples/1.8.x/client-android/kotlin/teams/create-membership.md index f1580572b7..5adfe4ea81 100644 --- a/docs/examples/1.8.x/client-android/kotlin/teams/create-membership.md +++ b/docs/examples/1.8.x/client-android/kotlin/teams/create-membership.md @@ -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://.cloud.appwrite.io/v1") // Your API Endpoint @@ -12,7 +11,7 @@ val teams = Teams(client) val result = teams.createMembership( teamId = "", - roles = roles.ADMIN, + roles = listOf(), email = "email@example.com", // (optional) userId = "", // (optional) phone = "+12065550100", // (optional) diff --git a/docs/examples/1.8.x/client-android/kotlin/teams/update-membership.md b/docs/examples/1.8.x/client-android/kotlin/teams/update-membership.md index 0f3fcfbcc4..1c8b236a7b 100644 --- a/docs/examples/1.8.x/client-android/kotlin/teams/update-membership.md +++ b/docs/examples/1.8.x/client-android/kotlin/teams/update-membership.md @@ -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://.cloud.appwrite.io/v1") // Your API Endpoint @@ -13,5 +12,5 @@ val teams = Teams(client) val result = teams.updateMembership( teamId = "", membershipId = "", - roles = roles.ADMIN, + roles = listOf(), )``` diff --git a/docs/examples/1.8.x/client-apple/examples/teams/create-membership.md b/docs/examples/1.8.x/client-apple/examples/teams/create-membership.md index ded2b8b2b9..124765abfb 100644 --- a/docs/examples/1.8.x/client-apple/examples/teams/create-membership.md +++ b/docs/examples/1.8.x/client-apple/examples/teams/create-membership.md @@ -1,6 +1,5 @@ ```swift import Appwrite -import AppwriteEnums let client = Client() .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint @@ -10,7 +9,7 @@ let teams = Teams(client) let membership = try await teams.createMembership( teamId: "", - roles: [.admin], + roles: [], email: "email@example.com", // optional userId: "", // optional phone: "+12065550100", // optional diff --git a/docs/examples/1.8.x/client-apple/examples/teams/update-membership.md b/docs/examples/1.8.x/client-apple/examples/teams/update-membership.md index 3c8874fd92..5663848d17 100644 --- a/docs/examples/1.8.x/client-apple/examples/teams/update-membership.md +++ b/docs/examples/1.8.x/client-apple/examples/teams/update-membership.md @@ -1,6 +1,5 @@ ```swift import Appwrite -import AppwriteEnums let client = Client() .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint @@ -11,7 +10,7 @@ let teams = Teams(client) let membership = try await teams.updateMembership( teamId: "", membershipId: "", - roles: [.admin] + roles: [] ) ``` diff --git a/docs/examples/1.8.x/client-flutter/examples/teams/create-membership.md b/docs/examples/1.8.x/client-flutter/examples/teams/create-membership.md index 812219f1f2..caab7926c3 100644 --- a/docs/examples/1.8.x/client-flutter/examples/teams/create-membership.md +++ b/docs/examples/1.8.x/client-flutter/examples/teams/create-membership.md @@ -1,6 +1,5 @@ ```dart import 'package:appwrite/appwrite.dart'; -import 'package:appwrite/enums.dart' as enums; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -10,7 +9,7 @@ Teams teams = Teams(client); Membership result = await teams.createMembership( teamId: '', - roles: [enums.Roles.admin], + roles: [], email: 'email@example.com', // optional userId: '', // optional phone: '+12065550100', // optional diff --git a/docs/examples/1.8.x/client-flutter/examples/teams/update-membership.md b/docs/examples/1.8.x/client-flutter/examples/teams/update-membership.md index 2eb65e9023..2d7c25c87f 100644 --- a/docs/examples/1.8.x/client-flutter/examples/teams/update-membership.md +++ b/docs/examples/1.8.x/client-flutter/examples/teams/update-membership.md @@ -1,6 +1,5 @@ ```dart import 'package:appwrite/appwrite.dart'; -import 'package:appwrite/enums.dart' as enums; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -11,6 +10,6 @@ Teams teams = Teams(client); Membership result = await teams.updateMembership( teamId: '', membershipId: '', - roles: [enums.Roles.admin], + roles: [], ); ``` diff --git a/docs/examples/1.8.x/client-react-native/examples/teams/create-membership.md b/docs/examples/1.8.x/client-react-native/examples/teams/create-membership.md index 41c726c78d..824c129cb3 100644 --- a/docs/examples/1.8.x/client-react-native/examples/teams/create-membership.md +++ b/docs/examples/1.8.x/client-react-native/examples/teams/create-membership.md @@ -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://.cloud.appwrite.io/v1') // Your API Endpoint @@ -9,7 +9,7 @@ const teams = new Teams(client); const result = await teams.createMembership({ teamId: '', - roles: [Roles.Admin], + roles: [], email: 'email@example.com', // optional userId: '', // optional phone: '+12065550100', // optional diff --git a/docs/examples/1.8.x/client-react-native/examples/teams/update-membership.md b/docs/examples/1.8.x/client-react-native/examples/teams/update-membership.md index a5109fcbed..0f00f5ee7e 100644 --- a/docs/examples/1.8.x/client-react-native/examples/teams/update-membership.md +++ b/docs/examples/1.8.x/client-react-native/examples/teams/update-membership.md @@ -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://.cloud.appwrite.io/v1') // Your API Endpoint @@ -10,7 +10,7 @@ const teams = new Teams(client); const result = await teams.updateMembership({ teamId: '', membershipId: '', - roles: [Roles.Admin] + roles: [] }); console.log(result); diff --git a/docs/examples/1.8.x/client-web/examples/teams/create-membership.md b/docs/examples/1.8.x/client-web/examples/teams/create-membership.md index a9ad199373..5a23e078f0 100644 --- a/docs/examples/1.8.x/client-web/examples/teams/create-membership.md +++ b/docs/examples/1.8.x/client-web/examples/teams/create-membership.md @@ -1,5 +1,5 @@ ```javascript -import { Client, Teams, Roles } from "appwrite"; +import { Client, Teams } from "appwrite"; const client = new Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -9,7 +9,7 @@ const teams = new Teams(client); const result = await teams.createMembership({ teamId: '', - roles: [Roles.Admin], + roles: [], email: 'email@example.com', // optional userId: '', // optional phone: '+12065550100', // optional diff --git a/docs/examples/1.8.x/client-web/examples/teams/update-membership.md b/docs/examples/1.8.x/client-web/examples/teams/update-membership.md index 78e5fd00ab..ecfd1bc89d 100644 --- a/docs/examples/1.8.x/client-web/examples/teams/update-membership.md +++ b/docs/examples/1.8.x/client-web/examples/teams/update-membership.md @@ -1,5 +1,5 @@ ```javascript -import { Client, Teams, Roles } from "appwrite"; +import { Client, Teams } from "appwrite"; const client = new Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -10,7 +10,7 @@ const teams = new Teams(client); const result = await teams.updateMembership({ teamId: '', membershipId: '', - roles: [Roles.Admin] + roles: [] }); console.log(result); diff --git a/docs/examples/1.8.x/console-web/examples/projects/create-key.md b/docs/examples/1.8.x/console-web/examples/projects/create-key.md index 605c390306..4628673023 100644 --- a/docs/examples/1.8.x/console-web/examples/projects/create-key.md +++ b/docs/examples/1.8.x/console-web/examples/projects/create-key.md @@ -11,6 +11,7 @@ const result = await projects.createKey({ projectId: '', name: '', scopes: [Scopes.SessionsWrite], + keyId: '', // optional expire: '' // optional }); diff --git a/docs/examples/1.8.x/console-web/examples/projects/list-keys.md b/docs/examples/1.8.x/console-web/examples/projects/list-keys.md index 8f62a043bf..32bfbc3e89 100644 --- a/docs/examples/1.8.x/console-web/examples/projects/list-keys.md +++ b/docs/examples/1.8.x/console-web/examples/projects/list-keys.md @@ -9,6 +9,7 @@ const projects = new Projects(client); const result = await projects.listKeys({ projectId: '', + queries: [], // optional total: false // optional }); diff --git a/docs/examples/1.8.x/console-web/examples/teams/create-membership.md b/docs/examples/1.8.x/console-web/examples/teams/create-membership.md index f4132ccdae..f7c832133a 100644 --- a/docs/examples/1.8.x/console-web/examples/teams/create-membership.md +++ b/docs/examples/1.8.x/console-web/examples/teams/create-membership.md @@ -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://.cloud.appwrite.io/v1') // Your API Endpoint @@ -9,7 +9,7 @@ const teams = new Teams(client); const result = await teams.createMembership({ teamId: '', - roles: [Roles.Admin], + roles: [], email: 'email@example.com', // optional userId: '', // optional phone: '+12065550100', // optional diff --git a/docs/examples/1.8.x/console-web/examples/teams/update-membership.md b/docs/examples/1.8.x/console-web/examples/teams/update-membership.md index 69ab78c8f0..a7ac4a745a 100644 --- a/docs/examples/1.8.x/console-web/examples/teams/update-membership.md +++ b/docs/examples/1.8.x/console-web/examples/teams/update-membership.md @@ -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://.cloud.appwrite.io/v1') // Your API Endpoint @@ -10,7 +10,7 @@ const teams = new Teams(client); const result = await teams.updateMembership({ teamId: '', membershipId: '', - roles: [Roles.Admin] + roles: [] }); console.log(result); diff --git a/docs/examples/1.8.x/server-dart/examples/teams/create-membership.md b/docs/examples/1.8.x/server-dart/examples/teams/create-membership.md index 967a39addc..8f95362a74 100644 --- a/docs/examples/1.8.x/server-dart/examples/teams/create-membership.md +++ b/docs/examples/1.8.x/server-dart/examples/teams/create-membership.md @@ -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://.cloud.appwrite.io/v1') // Your API Endpoint @@ -11,7 +10,7 @@ Teams teams = Teams(client); Membership result = await teams.createMembership( teamId: '', - roles: [enums.Roles.admin], + roles: [], email: 'email@example.com', // (optional) userId: '', // (optional) phone: '+12065550100', // (optional) diff --git a/docs/examples/1.8.x/server-dart/examples/teams/update-membership.md b/docs/examples/1.8.x/server-dart/examples/teams/update-membership.md index 536c04f8e5..961def9835 100644 --- a/docs/examples/1.8.x/server-dart/examples/teams/update-membership.md +++ b/docs/examples/1.8.x/server-dart/examples/teams/update-membership.md @@ -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://.cloud.appwrite.io/v1') // Your API Endpoint @@ -12,6 +11,6 @@ Teams teams = Teams(client); Membership result = await teams.updateMembership( teamId: '', membershipId: '', - roles: [enums.Roles.admin], + roles: [], ); ``` diff --git a/docs/examples/1.8.x/server-dotnet/examples/teams/create-membership.md b/docs/examples/1.8.x/server-dotnet/examples/teams/create-membership.md index 4cf6babac3..f107bbc5d6 100644 --- a/docs/examples/1.8.x/server-dotnet/examples/teams/create-membership.md +++ b/docs/examples/1.8.x/server-dotnet/examples/teams/create-membership.md @@ -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: "", - roles: new List<Roles> { Roles.Admin }, + roles: new List(), email: "email@example.com", // optional userId: "", // optional phone: "+12065550100", // optional diff --git a/docs/examples/1.8.x/server-dotnet/examples/teams/update-membership.md b/docs/examples/1.8.x/server-dotnet/examples/teams/update-membership.md index e6f09e9c58..6aef545fe3 100644 --- a/docs/examples/1.8.x/server-dotnet/examples/teams/update-membership.md +++ b/docs/examples/1.8.x/server-dotnet/examples/teams/update-membership.md @@ -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: "", membershipId: "", - roles: new List<Roles> { Roles.Admin } + roles: new List() );``` diff --git a/docs/examples/1.8.x/server-graphql/examples/databases/create-collection.md b/docs/examples/1.8.x/server-graphql/examples/databases/create-collection.md index ef34307975..d63c4cb881 100644 --- a/docs/examples/1.8.x/server-graphql/examples/databases/create-collection.md +++ b/docs/examples/1.8.x/server-graphql/examples/databases/create-collection.md @@ -31,6 +31,8 @@ mutation { lengths orders } + bytesMax + bytesUsed } } ``` diff --git a/docs/examples/1.8.x/server-graphql/examples/databases/update-collection.md b/docs/examples/1.8.x/server-graphql/examples/databases/update-collection.md index aee04931c7..7835df4002 100644 --- a/docs/examples/1.8.x/server-graphql/examples/databases/update-collection.md +++ b/docs/examples/1.8.x/server-graphql/examples/databases/update-collection.md @@ -29,6 +29,8 @@ mutation { lengths orders } + bytesMax + bytesUsed } } ``` diff --git a/docs/examples/1.8.x/server-graphql/examples/tablesdb/create-table.md b/docs/examples/1.8.x/server-graphql/examples/tablesdb/create-table.md index 382d3ff024..a4cf28445e 100644 --- a/docs/examples/1.8.x/server-graphql/examples/tablesdb/create-table.md +++ b/docs/examples/1.8.x/server-graphql/examples/tablesdb/create-table.md @@ -31,6 +31,8 @@ mutation { lengths orders } + bytesMax + bytesUsed } } ``` diff --git a/docs/examples/1.8.x/server-graphql/examples/tablesdb/update-table.md b/docs/examples/1.8.x/server-graphql/examples/tablesdb/update-table.md index 5fad43ef31..111d389500 100644 --- a/docs/examples/1.8.x/server-graphql/examples/tablesdb/update-table.md +++ b/docs/examples/1.8.x/server-graphql/examples/tablesdb/update-table.md @@ -29,6 +29,8 @@ mutation { lengths orders } + bytesMax + bytesUsed } } ``` diff --git a/docs/examples/1.8.x/server-kotlin/java/teams/create-membership.md b/docs/examples/1.8.x/server-kotlin/java/teams/create-membership.md index b195be5a44..52cf1043de 100644 --- a/docs/examples/1.8.x/server-kotlin/java/teams/create-membership.md +++ b/docs/examples/1.8.x/server-kotlin/java/teams/create-membership.md @@ -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://.cloud.appwrite.io/v1") // Your API Endpoint @@ -13,7 +12,7 @@ Teams teams = new Teams(client); teams.createMembership( "", // teamId - List.of(Roles.ADMIN), // roles + List.of(), // roles "email@example.com", // email (optional) "", // userId (optional) "+12065550100", // phone (optional) diff --git a/docs/examples/1.8.x/server-kotlin/java/teams/update-membership.md b/docs/examples/1.8.x/server-kotlin/java/teams/update-membership.md index a9fee5788d..97034ae32b 100644 --- a/docs/examples/1.8.x/server-kotlin/java/teams/update-membership.md +++ b/docs/examples/1.8.x/server-kotlin/java/teams/update-membership.md @@ -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://.cloud.appwrite.io/v1") // Your API Endpoint @@ -14,7 +13,7 @@ Teams teams = new Teams(client); teams.updateMembership( "", // teamId "", // membershipId - List.of(Roles.ADMIN), // roles + List.of(), // roles new CoroutineCallback<>((result, error) -> { if (error != null) { error.printStackTrace(); diff --git a/docs/examples/1.8.x/server-kotlin/kotlin/teams/create-membership.md b/docs/examples/1.8.x/server-kotlin/kotlin/teams/create-membership.md index fca5b5e5f4..8a27e6ea2c 100644 --- a/docs/examples/1.8.x/server-kotlin/kotlin/teams/create-membership.md +++ b/docs/examples/1.8.x/server-kotlin/kotlin/teams/create-membership.md @@ -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://.cloud.appwrite.io/v1") // Your API Endpoint @@ -13,7 +12,7 @@ val teams = Teams(client) val response = teams.createMembership( teamId = "", - roles = listOf(Roles.ADMIN), + roles = listOf(), email = "email@example.com", // optional userId = "", // optional phone = "+12065550100", // optional diff --git a/docs/examples/1.8.x/server-kotlin/kotlin/teams/update-membership.md b/docs/examples/1.8.x/server-kotlin/kotlin/teams/update-membership.md index 3f6122ea20..51e01d69c6 100644 --- a/docs/examples/1.8.x/server-kotlin/kotlin/teams/update-membership.md +++ b/docs/examples/1.8.x/server-kotlin/kotlin/teams/update-membership.md @@ -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://.cloud.appwrite.io/v1") // Your API Endpoint @@ -14,6 +13,6 @@ val teams = Teams(client) val response = teams.updateMembership( teamId = "", membershipId = "", - roles = listOf(Roles.ADMIN) + roles = listOf() ) ``` diff --git a/docs/examples/1.8.x/server-nodejs/examples/teams/create-membership.md b/docs/examples/1.8.x/server-nodejs/examples/teams/create-membership.md index 96ed50b86b..910bb757e1 100644 --- a/docs/examples/1.8.x/server-nodejs/examples/teams/create-membership.md +++ b/docs/examples/1.8.x/server-nodejs/examples/teams/create-membership.md @@ -10,7 +10,7 @@ const teams = new sdk.Teams(client); const result = await teams.createMembership({ teamId: '', - roles: [sdk.Roles.Admin], + roles: [], email: 'email@example.com', // optional userId: '', // optional phone: '+12065550100', // optional diff --git a/docs/examples/1.8.x/server-nodejs/examples/teams/update-membership.md b/docs/examples/1.8.x/server-nodejs/examples/teams/update-membership.md index b60ad62f5b..95a5c375e1 100644 --- a/docs/examples/1.8.x/server-nodejs/examples/teams/update-membership.md +++ b/docs/examples/1.8.x/server-nodejs/examples/teams/update-membership.md @@ -11,6 +11,6 @@ const teams = new sdk.Teams(client); const result = await teams.updateMembership({ teamId: '', membershipId: '', - roles: [sdk.Roles.Admin] + roles: [] }); ``` diff --git a/docs/examples/1.8.x/server-php/examples/teams/create-membership.md b/docs/examples/1.8.x/server-php/examples/teams/create-membership.md index 349ce63f88..ddbddc38f2 100644 --- a/docs/examples/1.8.x/server-php/examples/teams/create-membership.md +++ b/docs/examples/1.8.x/server-php/examples/teams/create-membership.md @@ -3,7 +3,6 @@ use Appwrite\Client; use Appwrite\Services\Teams; -use Appwrite\Enums\Roles; $client = (new Client()) ->setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -14,7 +13,7 @@ $teams = new Teams($client); $result = $teams->createMembership( teamId: '', - roles: [Roles::ADMIN()], + roles: [], email: 'email@example.com', // optional userId: '', // optional phone: '+12065550100', // optional diff --git a/docs/examples/1.8.x/server-php/examples/teams/update-membership.md b/docs/examples/1.8.x/server-php/examples/teams/update-membership.md index 21afebc87d..0a2518900f 100644 --- a/docs/examples/1.8.x/server-php/examples/teams/update-membership.md +++ b/docs/examples/1.8.x/server-php/examples/teams/update-membership.md @@ -3,7 +3,6 @@ use Appwrite\Client; use Appwrite\Services\Teams; -use Appwrite\Enums\Roles; $client = (new Client()) ->setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -15,5 +14,5 @@ $teams = new Teams($client); $result = $teams->updateMembership( teamId: '', membershipId: '', - roles: [Roles::ADMIN()] + roles: [] );``` diff --git a/docs/examples/1.8.x/server-python/examples/teams/create-membership.md b/docs/examples/1.8.x/server-python/examples/teams/create-membership.md index 440fbfab00..71442d4f0a 100644 --- a/docs/examples/1.8.x/server-python/examples/teams/create-membership.md +++ b/docs/examples/1.8.x/server-python/examples/teams/create-membership.md @@ -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://.cloud.appwrite.io/v1') # Your API Endpoint @@ -12,7 +11,7 @@ teams = Teams(client) result = teams.create_membership( team_id = '', - roles = [Roles.ADMIN], + roles = [], email = 'email@example.com', # optional user_id = '', # optional phone = '+12065550100', # optional diff --git a/docs/examples/1.8.x/server-python/examples/teams/update-membership.md b/docs/examples/1.8.x/server-python/examples/teams/update-membership.md index 542f34cfeb..bb10886f2a 100644 --- a/docs/examples/1.8.x/server-python/examples/teams/update-membership.md +++ b/docs/examples/1.8.x/server-python/examples/teams/update-membership.md @@ -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://.cloud.appwrite.io/v1') # Your API Endpoint @@ -13,6 +12,6 @@ teams = Teams(client) result = teams.update_membership( team_id = '', membership_id = '', - roles = [Roles.ADMIN] + roles = [] ) ``` diff --git a/docs/examples/1.8.x/server-ruby/examples/teams/create-membership.md b/docs/examples/1.8.x/server-ruby/examples/teams/create-membership.md index 6d608c607e..7df704e71c 100644 --- a/docs/examples/1.8.x/server-ruby/examples/teams/create-membership.md +++ b/docs/examples/1.8.x/server-ruby/examples/teams/create-membership.md @@ -2,7 +2,6 @@ require 'appwrite' include Appwrite -include Appwrite::Enums client = Client.new .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint @@ -13,7 +12,7 @@ teams = Teams.new(client) result = teams.create_membership( team_id: '', - roles: [Roles::ADMIN], + roles: [], email: 'email@example.com', # optional user_id: '', # optional phone: '+12065550100', # optional diff --git a/docs/examples/1.8.x/server-ruby/examples/teams/update-membership.md b/docs/examples/1.8.x/server-ruby/examples/teams/update-membership.md index 0970fbaec9..f94e3879e1 100644 --- a/docs/examples/1.8.x/server-ruby/examples/teams/update-membership.md +++ b/docs/examples/1.8.x/server-ruby/examples/teams/update-membership.md @@ -2,7 +2,6 @@ require 'appwrite' include Appwrite -include Appwrite::Enums client = Client.new .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint @@ -14,6 +13,6 @@ teams = Teams.new(client) result = teams.update_membership( team_id: '', membership_id: '', - roles: [Roles::ADMIN] + roles: [] ) ``` diff --git a/docs/examples/1.8.x/server-swift/examples/teams/create-membership.md b/docs/examples/1.8.x/server-swift/examples/teams/create-membership.md index b0c38af22b..bed0624bc4 100644 --- a/docs/examples/1.8.x/server-swift/examples/teams/create-membership.md +++ b/docs/examples/1.8.x/server-swift/examples/teams/create-membership.md @@ -1,6 +1,5 @@ ```swift import Appwrite -import AppwriteEnums let client = Client() .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint @@ -11,7 +10,7 @@ let teams = Teams(client) let membership = try await teams.createMembership( teamId: "", - roles: [.admin], + roles: [], email: "email@example.com", // optional userId: "", // optional phone: "+12065550100", // optional diff --git a/docs/examples/1.8.x/server-swift/examples/teams/update-membership.md b/docs/examples/1.8.x/server-swift/examples/teams/update-membership.md index a35661c381..b2cce9df70 100644 --- a/docs/examples/1.8.x/server-swift/examples/teams/update-membership.md +++ b/docs/examples/1.8.x/server-swift/examples/teams/update-membership.md @@ -1,6 +1,5 @@ ```swift import Appwrite -import AppwriteEnums let client = Client() .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint @@ -12,7 +11,7 @@ let teams = Teams(client) let membership = try await teams.updateMembership( teamId: "", membershipId: "", - roles: [.admin] + roles: [] ) ``` diff --git a/docs/sdks/agent-skills/CHANGELOG.md b/docs/sdks/agent-skills/CHANGELOG.md new file mode 100644 index 0000000000..ddf5b0096f --- /dev/null +++ b/docs/sdks/agent-skills/CHANGELOG.md @@ -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 \ No newline at end of file diff --git a/docs/sdks/agent-skills/GETTING_STARTED.md b/docs/sdks/agent-skills/GETTING_STARTED.md new file mode 100644 index 0000000000..4dcfd9447e --- /dev/null +++ b/docs/sdks/agent-skills/GETTING_STARTED.md @@ -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. +``` diff --git a/docs/sdks/android/CHANGELOG.md b/docs/sdks/android/CHANGELOG.md index d3fbbdc7fe..8b3298ebca 100644 --- a/docs/sdks/android/CHANGELOG.md +++ b/docs/sdks/android/CHANGELOG.md @@ -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` + ## 12.0.0 * Add array-based enum parameters (e.g., `permissions: List`). diff --git a/docs/sdks/apple/CHANGELOG.md b/docs/sdks/apple/CHANGELOG.md index 470d1d14f5..13779f095e 100644 --- a/docs/sdks/apple/CHANGELOG.md +++ b/docs/sdks/apple/CHANGELOG.md @@ -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]`). diff --git a/docs/sdks/cli/CHANGELOG.md b/docs/sdks/cli/CHANGELOG.md index fb78f638c0..5aa8ee4cdc 100644 --- a/docs/sdks/cli/CHANGELOG.md +++ b/docs/sdks/cli/CHANGELOG.md @@ -1,5 +1,24 @@ # 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 +- Export config zod schemas + +## 13.3.1 + +- Fix generated TS imports to auto-detect ESM vs non-ESM + +## 13.3.0 + +- Support type generation for text/varchar/mediumtext/longtext attributes +- Improve CLI session switch and logout UX + ## 13.2.1 - Fix site domain construction diff --git a/docs/sdks/dart/CHANGELOG.md b/docs/sdks/dart/CHANGELOG.md index db028b042d..190f51b600 100644 --- a/docs/sdks/dart/CHANGELOG.md +++ b/docs/sdks/dart/CHANGELOG.md @@ -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`). diff --git a/docs/sdks/dotnet/CHANGELOG.md b/docs/sdks/dotnet/CHANGELOG.md index b6a07e12cd..12fe1c3fe8 100644 --- a/docs/sdks/dotnet/CHANGELOG.md +++ b/docs/sdks/dotnet/CHANGELOG.md @@ -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` + ## 0.25.0 * Add array-based enum parameters (e.g., `permissions: IReadOnlyList`). diff --git a/docs/sdks/flutter/CHANGELOG.md b/docs/sdks/flutter/CHANGELOG.md index 9d0f2fa82f..d6b62f2453 100644 --- a/docs/sdks/flutter/CHANGELOG.md +++ b/docs/sdks/flutter/CHANGELOG.md @@ -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` +* Fix doc examples with proper formatting and syntax highlighting + ## 21.0.0 * Add array-based enum parameters (e.g., `permissions: List`). diff --git a/docs/sdks/go/CHANGELOG.md b/docs/sdks/go/CHANGELOG.md index 3fc4483ca4..87aeab73ea 100644 --- a/docs/sdks/go/CHANGELOG.md +++ b/docs/sdks/go/CHANGELOG.md @@ -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 diff --git a/docs/sdks/kotlin/CHANGELOG.md b/docs/sdks/kotlin/CHANGELOG.md index 6bfce74f1b..3a4ac8dbb4 100644 --- a/docs/sdks/kotlin/CHANGELOG.md +++ b/docs/sdks/kotlin/CHANGELOG.md @@ -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`). diff --git a/docs/sdks/markdown/CHANGELOG.md b/docs/sdks/markdown/CHANGELOG.md index d1457764af..26fcb5bbce 100644 --- a/docs/sdks/markdown/CHANGELOG.md +++ b/docs/sdks/markdown/CHANGELOG.md @@ -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[]`). diff --git a/docs/sdks/nodejs/CHANGELOG.md b/docs/sdks/nodejs/CHANGELOG.md index a6755c3f89..01a79ab9cf 100644 --- a/docs/sdks/nodejs/CHANGELOG.md +++ b/docs/sdks/nodejs/CHANGELOG.md @@ -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[]`). diff --git a/docs/sdks/php/CHANGELOG.md b/docs/sdks/php/CHANGELOG.md index e7443565bf..6538fa5008 100644 --- a/docs/sdks/php/CHANGELOG.md +++ b/docs/sdks/php/CHANGELOG.md @@ -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`). diff --git a/docs/sdks/python/CHANGELOG.md b/docs/sdks/python/CHANGELOG.md index f662f5f217..f87a06032c 100644 --- a/docs/sdks/python/CHANGELOG.md +++ b/docs/sdks/python/CHANGELOG.md @@ -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]`). diff --git a/docs/sdks/react-native/CHANGELOG.md b/docs/sdks/react-native/CHANGELOG.md index 737ef947cd..d111ee5a20 100644 --- a/docs/sdks/react-native/CHANGELOG.md +++ b/docs/sdks/react-native/CHANGELOG.md @@ -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[]`). diff --git a/docs/sdks/ruby/CHANGELOG.md b/docs/sdks/ruby/CHANGELOG.md index 58a3cbac04..d6f526f772 100644 --- a/docs/sdks/ruby/CHANGELOG.md +++ b/docs/sdks/ruby/CHANGELOG.md @@ -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`). diff --git a/docs/sdks/swift/CHANGELOG.md b/docs/sdks/swift/CHANGELOG.md index 458f5f8817..76f0e2bb06 100644 --- a/docs/sdks/swift/CHANGELOG.md +++ b/docs/sdks/swift/CHANGELOG.md @@ -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]`). diff --git a/docs/sdks/web/CHANGELOG.md b/docs/sdks/web/CHANGELOG.md index 5f70fe5574..7f24cb7c38 100644 --- a/docs/sdks/web/CHANGELOG.md +++ b/docs/sdks/web/CHANGELOG.md @@ -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[]`). diff --git a/src/Appwrite/Certificates/LetsEncrypt.php b/src/Appwrite/Certificates/LetsEncrypt.php index 1116336399..001d04941e 100644 --- a/src/Appwrite/Certificates/LetsEncrypt.php +++ b/src/Appwrite/Certificates/LetsEncrypt.php @@ -4,9 +4,9 @@ namespace Appwrite\Certificates; use Appwrite\Certificates\Exception\CertificateStatus as CertificateStatusException; use Exception; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\DateTime; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Logger\Log; class LetsEncrypt implements Adapter diff --git a/src/Appwrite/Event/Event.php b/src/Appwrite/Event/Event.php index 6db001398f..6f00d0cd0e 100644 --- a/src/Appwrite/Event/Event.php +++ b/src/Appwrite/Event/Event.php @@ -46,6 +46,9 @@ class Event public const MESSAGING_QUEUE_NAME = 'v1-messaging'; public const MESSAGING_CLASS_NAME = 'MessagingV1'; + public const EXECUTIONS_QUEUE_NAME = 'v1-executions'; + public const EXECUTIONS_CLASS_NAME = 'ExecutionsV1'; + public const MIGRATIONS_QUEUE_NAME = 'v1-migrations'; public const MIGRATIONS_CLASS_NAME = 'MigrationsV1'; diff --git a/src/Appwrite/Event/Execution.php b/src/Appwrite/Event/Execution.php new file mode 100644 index 0000000000..398025565c --- /dev/null +++ b/src/Appwrite/Event/Execution.php @@ -0,0 +1,56 @@ +setQueue(Event::EXECUTIONS_QUEUE_NAME) + ->setClass(Event::EXECUTIONS_CLASS_NAME); + } + + /** + * Sets execution document for the execution event. + * + * @param Document $execution + * @return self + */ + public function setExecution(Document $execution): self + { + $this->execution = $execution; + + return $this; + } + + /** + * Returns set execution document for the execution event. + * + * @return null|Document + */ + public function getExecution(): ?Document + { + return $this->execution; + } + + /** + * Prepare payload for the execution event. + * + * @return array + */ + protected function preparePayload(): array + { + return [ + 'project' => $this->project, + 'execution' => $this->execution, + ]; + } +} diff --git a/src/Appwrite/Event/Func.php b/src/Appwrite/Event/Func.php index 2f7f8e3c5c..7790437e1c 100644 --- a/src/Appwrite/Event/Func.php +++ b/src/Appwrite/Event/Func.php @@ -9,8 +9,6 @@ use Utopia\System\System; class Func extends Event { - public const TYPE_ASYNC_WRITE = 'async_write'; - protected string $jwt = ''; protected string $type = ''; protected string $body = ''; diff --git a/src/Appwrite/Event/StatsUsage.php b/src/Appwrite/Event/StatsUsage.php index 47ba5a3ea0..a944d70c94 100644 --- a/src/Appwrite/Event/StatsUsage.php +++ b/src/Appwrite/Event/StatsUsage.php @@ -86,4 +86,11 @@ class StatsUsage extends Event }), ]; } + + public function reset(): Event + { + $this->metrics = []; + parent::reset(); + return $this; + } } diff --git a/src/Appwrite/Extend/Exception.php b/src/Appwrite/Extend/Exception.php index 2bc7021b31..d02f3902a3 100644 --- a/src/Appwrite/Extend/Exception.php +++ b/src/Appwrite/Extend/Exception.php @@ -318,6 +318,7 @@ class Exception extends \Exception /** Keys */ public const string KEY_NOT_FOUND = 'key_not_found'; + public const string KEY_ALREADY_EXISTS = 'key_already_exists'; /** Variables */ public const string VARIABLE_NOT_FOUND = 'variable_not_found'; diff --git a/src/Appwrite/GraphQL/Resolvers.php b/src/Appwrite/GraphQL/Resolvers.php index 4de9661499..484cafb0ab 100644 --- a/src/Appwrite/GraphQL/Resolvers.php +++ b/src/Appwrite/GraphQL/Resolvers.php @@ -6,9 +6,9 @@ use Appwrite\GraphQL\Exception as GQLException; use Appwrite\Promises\Swoole; use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; -use Utopia\Exception; -use Utopia\Http; -use Utopia\Route; +use Utopia\Http\Exception; +use Utopia\Http\Http; +use Utopia\Http\Route; use Utopia\System\System; class Resolvers diff --git a/src/Appwrite/GraphQL/Schema.php b/src/Appwrite/GraphQL/Schema.php index d6bf54f744..57115ff027 100644 --- a/src/Appwrite/GraphQL/Schema.php +++ b/src/Appwrite/GraphQL/Schema.php @@ -6,9 +6,9 @@ use Appwrite\GraphQL\Types\Mapper; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\Type; use GraphQL\Type\Schema as GQLSchema; -use Utopia\Exception; -use Utopia\Http; -use Utopia\Route; +use Utopia\Http\Exception; +use Utopia\Http\Http; +use Utopia\Http\Route; class Schema { diff --git a/src/Appwrite/GraphQL/Types/Mapper.php b/src/Appwrite/GraphQL/Types/Mapper.php index 467a5a9c0e..fbe7a2f43d 100644 --- a/src/Appwrite/GraphQL/Types/Mapper.php +++ b/src/Appwrite/GraphQL/Types/Mapper.php @@ -9,8 +9,8 @@ use Exception; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\Type; use GraphQL\Type\Definition\UnionType; -use Utopia\Http; -use Utopia\Route; +use Utopia\Http\Http; +use Utopia\Http\Route; use Utopia\Validator; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Messaging/Adapter/Realtime.php b/src/Appwrite/Messaging/Adapter/Realtime.php index 32329bda54..e61cfdc116 100644 --- a/src/Appwrite/Messaging/Adapter/Realtime.php +++ b/src/Appwrite/Messaging/Adapter/Realtime.php @@ -31,9 +31,9 @@ class Realtime extends MessagingAdapter * [ROLE_X] -> * [CHANNEL_NAME_X] -> * [CONNECTION_ID] -> - * [SUB_ID] -> ['strings' => [...], 'parsed' => [...]] + * [SUB_ID] -> ['strings' => [...], 'compiled' => [...]] * - * Each subscription ID maps to query strings (for metadata) and pre-parsed Query objects (for filtering). + * Each subscription ID maps to query strings (for metadata) and pre-compiled query filters. * Within a subscription: AND logic (all queries must match) * Across subscriptions: OR logic (any subscription matching = send event) */ @@ -73,25 +73,18 @@ class Realtime extends MessagingAdapter $this->subscriptions[$projectId] = []; } - // Convert Query objects to strings and store both for this subscription - $queryStrings = []; - $parsedQueries = []; + $strings = []; if (empty($queryGroup)) { - // No queries means "listen to all events" - use select("*") - $selectAll = Query::select(['*']); - $queryStrings[] = $selectAll->toString(); - $parsedQueries[] = $selectAll; + $strings[] = Query::select(['*'])->toString(); } else { foreach ($queryGroup as $query) { - /** @var Query $query */ - $queryStrings[] = $query->toString(); - $parsedQueries[] = $query; + $strings[] = $query->toString(); } } - $subscriptionData = [ - 'strings' => $queryStrings, - 'parsed' => $parsedQueries, + $data = [ + 'strings' => $strings, + 'compiled' => RuntimeQuery::compile($queryGroup), ]; foreach ($roles as $role) { @@ -106,7 +99,7 @@ class Realtime extends MessagingAdapter if (!isset($this->subscriptions[$projectId][$role][$channel][$identifier])) { $this->subscriptions[$projectId][$role][$channel][$identifier] = []; } - $this->subscriptions[$projectId][$role][$channel][$identifier][$subscriptionId] = $subscriptionData; + $this->subscriptions[$projectId][$role][$channel][$identifier][$subscriptionId] = $data; } } @@ -148,15 +141,15 @@ class Realtime extends MessagingAdapter continue; } - foreach ($this->subscriptions[$projectId][$role][$channel][$connection] as $subId => $subscriptionData) { - if (!isset($subscriptions[$subId])) { - $subscriptions[$subId] = [ + foreach ($this->subscriptions[$projectId][$role][$channel][$connection] as $subscriptionId => $data) { + if (!isset($subscriptions[$subscriptionId])) { + $subscriptions[$subscriptionId] = [ 'channels' => [], - 'queries' => $subscriptionData['strings'] ?? [] + 'queries' => $data['strings'] ?? [] ]; } - if (!\in_array($channel, $subscriptions[$subId]['channels'])) { - $subscriptions[$subId]['channels'][] = $channel; + if (!\in_array($channel, $subscriptions[$subscriptionId]['channels'])) { + $subscriptions[$subscriptionId]['channels'][] = $channel; } } } @@ -259,12 +252,10 @@ class Realtime extends MessagingAdapter * Identifies the receivers of all subscriptions, based on the permissions and event. * * Example of performance with an event with user:XXX permissions and with X users spread across 10 different channels: - * - 0.014 ms (±6.88%) | 10 Connections / 100 Subscriptions - * - 0.070 ms (±3.71%) | 100 Connections / 1,000 Subscriptions - * - 0.846 ms (±2.74%) | 1,000 Connections / 10,000 Subscriptions - * - 10.866 ms (±1.01%) | 10,000 Connections / 100,000 Subscriptions - * - 110.201 ms (±2.32%) | 100,000 Connections / 1,000,000 Subscriptions - * - 1,121.328 ms (±0.84%) | 1,000,000 Connections / 10,000,000 Subscriptions + * - 0.013 ms | 10 Connections / 100 Subscriptions + * - 0.14 ms | 100 Connections / 1,000 Subscriptions + * - 1.5 ms | 1,000 Connections / 10,000 Subscriptions + * - 15 ms | 10,000 Connections / 100,000 Subscriptions * * @param array $event * @return array Map of connection IDs to matched query groups @@ -272,55 +263,39 @@ class Realtime extends MessagingAdapter public function getSubscribers(array $event): array { $receivers = []; - /** - * Check if project has subscriber. - */ - if (isset($this->subscriptions[$event['project']])) { - /** - * Iterate through each role. - */ - foreach ($this->subscriptions[$event['project']] as $role => $subscription) { - /** - * Iterate through each channel. - */ - foreach ($event['data']['channels'] as $channel) { - /** - * Check if channel has subscriber. Also taking care of the role in the event and the wildcard role. - */ - if ( - \array_key_exists($channel, $this->subscriptions[$event['project']][$role]) - && (\in_array($role, $event['roles']) || \in_array(Role::any()->toString(), $event['roles'])) - ) { - /** - * Saving all connections that are allowed to receive this event. - */ - $payload = $event['data']['payload'] ?? []; - foreach ($this->subscriptions[$event['project']][$role][$channel] as $id => $subscriptions) { - $matchedSubscriptions = []; - // Process each subscription (OR logic across subscriptions) - foreach ($subscriptions as $subId => $subscriptionData) { - // Use pre-parsed queries instead of re-parsing on every event - $parsedQueries = $subscriptionData['parsed'] ?? []; - $queryStrings = $subscriptionData['strings'] ?? []; + if (!isset($this->subscriptions[$event['project']])) { + return $receivers; + } - // Check if this subscription matches (AND logic within subscription) - // Or if empty payload and select all as filter will return empty payload out of it even if it passed - $isEmptyPayloadAndSelectAll = !empty($parsedQueries) && RuntimeQuery::isSelectAll($parsedQueries[0]) && empty($payload); - if ($isEmptyPayloadAndSelectAll || !empty(RuntimeQuery::filter($parsedQueries, $payload))) { - $matchedSubscriptions[$subId] = $queryStrings; - } - } + $payload = $event['data']['payload'] ?? []; - // Only add connection to receivers if at least one subscription matched - if (!empty($matchedSubscriptions)) { - if (!isset($receivers[$id])) { - $receivers[$id] = []; - } - $receivers[$id] += $matchedSubscriptions; - } + foreach ($this->subscriptions[$event['project']] as $role => $subscriptionsByChannel) { + foreach ($event['data']['channels'] as $channel) { + if ( + !\array_key_exists($channel, $subscriptionsByChannel) + || (!\in_array($role, $event['roles']) && !\in_array(Role::any()->toString(), $event['roles'])) + ) { + continue; + } + + foreach ($subscriptionsByChannel[$channel] as $id => $subscriptions) { + $matched = []; + + foreach ($subscriptions as $subscriptionId => $data) { + $compiled = $data['compiled'] ?? ['type' => 'selectAll']; + $strings = $data['strings'] ?? []; + + if (RuntimeQuery::filter($compiled, $payload) !== null) { + $matched[$subscriptionId] = $strings; } - break; + } + + if (!empty($matched)) { + if (!isset($receivers[$id])) { + $receivers[$id] = []; + } + $receivers[$id] += $matched; } } } @@ -360,65 +335,73 @@ class Realtime extends MessagingAdapter /** * Constructs subscriptions from query parameters. * - * Reconstructs subscription structure from query params where subscription indices can span multiple channels. - * Format: {channel}[subscriptionIndex][]=query1&{channel}[subscriptionIndex][]=query2 - * - * Example: - * - tests[0][]=select(*) → subscription 0: channels=["tests"] - * - tests[1][]=equal(...) & prod[1][]=equal(...) → subscription 1: channels=["tests", "prod"] - * - * @param array $channelNames Array of channel names - * @param callable $getQueryParam Callable that takes a channel name and returns its query param value (null if not present) - * @return array Array indexed by subscription index: [index => ['channels' => string[], 'queries' => Query[]]] + * @param array $channelNames + * @param callable $getQueryParam + * @return array [index => ['channels' => string[], 'queries' => Query[]]] * @throws QueryException */ public static function constructSubscriptions(array $channelNames, callable $getQueryParam): array { - $subscriptionsByIndex = []; + $subscriptions = []; + + /** + * Reserved channel params with expected type + * If matched the expected type then skip the query parsing like in project + */ + $reservedParamExpectedTypes = [ + 'project' => 'string', + ]; foreach ($channelNames as $channel) { - $channelSubscriptions = $getQueryParam($channel); + $paramKey = \str_replace('.', '_', $channel); + $params = $getQueryParam($paramKey); - // Backward compatibility: if no channel-specific query params, treat as subscription 0 with select("*") - if ($channelSubscriptions === null) { - if (!isset($subscriptionsByIndex[0])) { - $subscriptionsByIndex[0] = [ - 'channels' => [], - 'queries' => [] - ]; + if (\array_key_exists($paramKey, $reservedParamExpectedTypes) && $params !== null) { + $expectedType = $reservedParamExpectedTypes[$paramKey]; + $isExpectedType = match ($expectedType) { + 'array' => \is_array($params), + 'string' => \is_string($params), + default => false, + }; + + // If the value matches the expected type dont use it the queries + if ($isExpectedType) { + $params = null; } - $subscriptionsByIndex[0]['channels'][] = $channel; - if (empty($subscriptionsByIndex[0]['queries'])) { - $subscriptionsByIndex[0]['queries'] = [Query::select(['*'])]; + } + + if ($params === null) { + if (!isset($subscriptions[0])) { + $subscriptions[0] = ['channels' => [], 'queries' => []]; + } + $subscriptions[0]['channels'][] = $channel; + if (empty($subscriptions[0]['queries'])) { + $subscriptions[0]['queries'] = [Query::select(['*'])]; } continue; } - if (!is_array($channelSubscriptions)) { - $channelSubscriptions = [$channelSubscriptions]; + if (!\is_array($params)) { + $params = [$params]; } - foreach ($channelSubscriptions as $subscriptionIndex => $subscription) { - if (!isset($subscriptionsByIndex[$subscriptionIndex])) { - $subscriptionsByIndex[$subscriptionIndex] = [ - 'channels' => [], - 'queries' => [] - ]; + foreach ($params as $index => $slot) { + if (!isset($subscriptions[$index])) { + $subscriptions[$index] = ['channels' => [], 'queries' => []]; } - if (!in_array($channel, $subscriptionsByIndex[$subscriptionIndex]['channels'])) { - $subscriptionsByIndex[$subscriptionIndex]['channels'][] = $channel; + if (!\in_array($channel, $subscriptions[$index]['channels'], true)) { + $subscriptions[$index]['channels'][] = $channel; } - if (empty($subscriptionsByIndex[$subscriptionIndex]['queries'])) { - $queriesToParse = is_array($subscription) ? $subscription : [$subscription]; - $parsedQueries = self::convertQueries($queriesToParse); - $subscriptionsByIndex[$subscriptionIndex]['queries'] = $parsedQueries; + if (empty($subscriptions[$index]['queries'])) { + $raw = \is_array($slot) ? $slot : [$slot]; + $subscriptions[$index]['queries'] = self::convertQueries($raw); } } } - return $subscriptionsByIndex; + return $subscriptions; } /** @@ -431,19 +414,18 @@ class Realtime extends MessagingAdapter { $queries = Query::parseQueries($queries); $stack = $queries; - $allowedMethods = implode(', ', RuntimeQuery::ALLOWED_QUERIES); + $allowed = implode(', ', RuntimeQuery::ALLOWED_QUERIES); + while (!empty($stack)) { - /** @var Query $query */ $query = array_pop($stack); $method = $query->getMethod(); + if (!in_array($method, RuntimeQuery::ALLOWED_QUERIES, true)) { - $unsupportedMethod = $method; throw new QueryException( - "Query method '{$unsupportedMethod}' is not supported in Realtime queries. Allowed query methods are: {$allowedMethods}" + "Query method '{$method}' is not supported in Realtime queries. Allowed: {$allowed}" ); } - // Validate select queries - only select("*") is allowed if ($method === Query::TYPE_SELECT) { RuntimeQuery::validateSelectQuery($query); } diff --git a/src/Appwrite/Migration/Migration.php b/src/Appwrite/Migration/Migration.php index 749c64d08c..519f05de2c 100644 --- a/src/Appwrite/Migration/Migration.php +++ b/src/Appwrite/Migration/Migration.php @@ -3,8 +3,8 @@ namespace Appwrite\Migration; use Exception; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception\Conflict; diff --git a/src/Appwrite/Migration/Version/V15.php b/src/Appwrite/Migration/Version/V15.php index 15331e9a37..66037660c0 100644 --- a/src/Appwrite/Migration/Version/V15.php +++ b/src/Appwrite/Migration/Version/V15.php @@ -4,8 +4,8 @@ namespace Appwrite\Migration\Version; use Appwrite\Migration\Migration; use Appwrite\OpenSSL\OpenSSL; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Helpers\ID; diff --git a/src/Appwrite/Migration/Version/V16.php b/src/Appwrite/Migration/Version/V16.php index 061ace31d7..efb731e176 100644 --- a/src/Appwrite/Migration/Version/V16.php +++ b/src/Appwrite/Migration/Version/V16.php @@ -3,8 +3,8 @@ namespace Appwrite\Migration\Version; use Appwrite\Migration\Migration; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; diff --git a/src/Appwrite/Migration/Version/V17.php b/src/Appwrite/Migration/Version/V17.php index 79e2a8377d..3297206ccd 100644 --- a/src/Appwrite/Migration/Version/V17.php +++ b/src/Appwrite/Migration/Version/V17.php @@ -4,7 +4,7 @@ namespace Appwrite\Migration\Version; use Appwrite\Migration\Migration; use Utopia\Auth\Proofs\Password; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; diff --git a/src/Appwrite/Migration/Version/V18.php b/src/Appwrite/Migration/Version/V18.php index aa2ad35cca..2acbc5ec04 100644 --- a/src/Appwrite/Migration/Version/V18.php +++ b/src/Appwrite/Migration/Version/V18.php @@ -3,7 +3,7 @@ namespace Appwrite\Migration\Version; use Appwrite\Migration\Migration; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Helpers\Permission; diff --git a/src/Appwrite/Migration/Version/V19.php b/src/Appwrite/Migration/Version/V19.php index f5cf84c95e..2526d03009 100644 --- a/src/Appwrite/Migration/Version/V19.php +++ b/src/Appwrite/Migration/Version/V19.php @@ -3,8 +3,8 @@ namespace Appwrite\Migration\Version; use Appwrite\Migration\Migration; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; diff --git a/src/Appwrite/Migration/Version/V20.php b/src/Appwrite/Migration/Version/V20.php index 10e2706d0e..3c13815949 100644 --- a/src/Appwrite/Migration/Version/V20.php +++ b/src/Appwrite/Migration/Version/V20.php @@ -6,7 +6,7 @@ use Appwrite\Migration\Migration; use Exception; use PDOException; use Throwable; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; diff --git a/src/Appwrite/Migration/Version/V21.php b/src/Appwrite/Migration/Version/V21.php index 891d2a92fe..0c9d824874 100644 --- a/src/Appwrite/Migration/Version/V21.php +++ b/src/Appwrite/Migration/Version/V21.php @@ -5,7 +5,7 @@ namespace Appwrite\Migration\Version; use Appwrite\Migration\Migration; use Exception; use Throwable; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; diff --git a/src/Appwrite/Migration/Version/V22.php b/src/Appwrite/Migration/Version/V22.php index ba9c9dc126..6202a4f3d5 100644 --- a/src/Appwrite/Migration/Version/V22.php +++ b/src/Appwrite/Migration/Version/V22.php @@ -5,7 +5,7 @@ namespace Appwrite\Migration\Version; use Appwrite\Migration\Migration; use Exception; use Throwable; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception\Conflict; diff --git a/src/Appwrite/Migration/Version/V23.php b/src/Appwrite/Migration/Version/V23.php index 64a45fc9b2..acf20ba71c 100644 --- a/src/Appwrite/Migration/Version/V23.php +++ b/src/Appwrite/Migration/Version/V23.php @@ -5,8 +5,8 @@ namespace Appwrite\Migration\Version; use Appwrite\Migration\Migration; use Exception; use Throwable; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception\Conflict; diff --git a/src/Appwrite/Network/Validator/Origin.php b/src/Appwrite/Network/Validator/Origin.php index 02d5d8e83d..8b9974e990 100644 --- a/src/Appwrite/Network/Validator/Origin.php +++ b/src/Appwrite/Network/Validator/Origin.php @@ -22,6 +22,27 @@ class Origin extends Validator { } + public function setAllowedHostnames(array $allowedHostnames): self + { + $this->allowedHostnames = $allowedHostnames; + return $this; + } + + public function setAllowedSchemes(array $allowedSchemes): self + { + $this->allowedSchemes = $allowedSchemes; + return $this; + } + + public function getAllowedHostnames(): array + { + return $this->allowedHostnames; + } + + public function getAllowedSchemes(): array + { + return $this->allowedSchemes; + } /** * Check if Origin is valid. @@ -30,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) ?? ''); diff --git a/src/Appwrite/Platform/Action.php b/src/Appwrite/Platform/Action.php index b9f8a8186a..01ac92a45c 100644 --- a/src/Appwrite/Platform/Action.php +++ b/src/Appwrite/Platform/Action.php @@ -3,7 +3,7 @@ namespace Appwrite\Platform; use Swoole\Coroutine as Co; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; diff --git a/src/Appwrite/Platform/Appwrite.php b/src/Appwrite/Platform/Appwrite.php index 35347b4023..9982b0bf1e 100644 --- a/src/Appwrite/Platform/Appwrite.php +++ b/src/Appwrite/Platform/Appwrite.php @@ -14,6 +14,7 @@ use Appwrite\Platform\Modules\Proxy; use Appwrite\Platform\Modules\Sites; use Appwrite\Platform\Modules\Storage; use Appwrite\Platform\Modules\Tokens; +use Appwrite\Platform\Modules\VCS; use Utopia\Platform\Platform; class Appwrite extends Platform @@ -32,5 +33,6 @@ class Appwrite extends Platform $this->addModule(new Proxy\Module()); $this->addModule(new Tokens\Module()); $this->addModule(new Storage\Module()); + $this->addModule(new VCS\Module()); } } diff --git a/src/Appwrite/Platform/Modules/Compute/Base.php b/src/Appwrite/Platform/Modules/Compute/Base.php index 8435159541..7c0aa58830 100644 --- a/src/Appwrite/Platform/Modules/Compute/Base.php +++ b/src/Appwrite/Platform/Modules/Compute/Base.php @@ -17,13 +17,31 @@ use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; -use Utopia\Swoole\Request; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\System\System; use Utopia\VCS\Adapter\Git\GitHub; use Utopia\VCS\Exception\RepositoryNotFound; class Base extends Action { + /** + * Permissions for resources in this project. + * + * @param string $teamId + * @param string $projectId + * @return string[] + */ + protected function getPermissions(string $teamId, string $projectId): array + { + return [ + Permission::read(Role::team(ID::custom($teamId))), + Permission::update(Role::team(ID::custom($teamId), 'owner')), + Permission::update(Role::team(ID::custom($teamId), 'developer')), + Permission::delete(Role::team(ID::custom($teamId), 'owner')), + Permission::delete(Role::team(ID::custom($teamId), 'developer')), + ]; + } + /** * Get default specification based on plan and available specifications. * @@ -93,6 +111,12 @@ class Base extends Action } catch (\Throwable $error) { // Ignore; deployment can continue } + } else { + // Fallback till we have tag support here + // Goal is to set providerBranch, so build worker knows what to clone as base + // Without this, clone command would be cloning empty branch, and failing + $providerBranch = $function->getAttribute('providerBranch', 'main'); + $branchUrl = "https://github.com/$owner/$repositoryName/tree/$providerBranch"; } $repositoryUrl = "https://github.com/$owner/$repositoryName"; @@ -183,6 +207,12 @@ class Base extends Action } catch (\Throwable $error) { // Ignore; deployment can continue } + } else { + // Fallback till we have tag support here + // Goal is to set providerBranch, so build worker knows what to clone as base + // Without this, clone command would be cloning empty branch, and failing + $providerBranch = $site->getAttribute('providerBranch', 'main'); + $branchUrl = "https://github.com/$owner/$repositoryName/tree/$providerBranch"; } $repositoryUrl = "https://github.com/$owner/$repositoryName"; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Action.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Action.php index a148e23845..f49d07ec4c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Action.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Action.php @@ -3,6 +3,8 @@ namespace Appwrite\Platform\Modules\Databases\Http\Databases\Collections; use Appwrite\Extend\Exception; +use Utopia\Database\Database; +use Utopia\Database\Document; use Utopia\Platform\Action as UtopiaAction; use Utopia\Platform\Scope\HTTP; @@ -165,4 +167,15 @@ abstract class Action extends UtopiaAction ? Exception::ATTRIBUTE_TYPE_INVALID : Exception::COLUMN_TYPE_INVALID; } + + /** + * Add row bytes information to a collection/table document. + */ + protected function addRowBytesInfo(Document $document, Database $dbForProject): Document + { + $adapter = $dbForProject->getAdapter(); + $document->setAttribute('bytesMax', $adapter->getDocumentSizeLimit()); + $document->setAttribute('bytesUsed', $adapter->getAttributeWidth($document)); + return $document; + } } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Action.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Action.php index 3709fb2814..a06fd23ea9 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Action.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Action.php @@ -19,8 +19,8 @@ use Utopia\Database\Exception\Truncate as TruncateException; use Utopia\Database\Helpers\ID; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Structure; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Platform\Action as UtopiaAction; -use Utopia\Swoole\Response as SwooleResponse; use Utopia\Validator\Range; abstract class Action extends UtopiaAction diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Boolean/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Boolean/Create.php index 442461fdd3..337f81b6d0 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Boolean/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Boolean/Create.php @@ -15,7 +15,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Boolean/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Boolean/Update.php index 92324aae70..f8a62e7d13 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Boolean/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Boolean/Update.php @@ -14,7 +14,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Datetime/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Datetime/Create.php index bd3108a871..f0201eb9e5 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Datetime/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Datetime/Create.php @@ -16,7 +16,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Datetime as DatetimeValidator; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Datetime/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Datetime/Update.php index 2518875424..b504a83747 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Datetime/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Datetime/Update.php @@ -15,7 +15,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Datetime as DatetimeValidator; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Delete.php index 37ae2a7bfe..f0b08ecd7c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Delete.php @@ -16,7 +16,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\IndexDependency as IndexDependencyValidator; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Delete extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Email/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Email/Create.php index a36e264e50..f690497719 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Email/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Email/Create.php @@ -16,7 +16,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Email/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Email/Update.php index 609a337625..996091d0fb 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Email/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Email/Update.php @@ -15,7 +15,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Enum/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Enum/Create.php index 3c47d1fdfe..502d8b1e3b 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Enum/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Enum/Create.php @@ -16,7 +16,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Enum/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Enum/Update.php index 5bea5230c0..42e6ffe8e7 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Enum/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Enum/Update.php @@ -14,7 +14,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Float/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Float/Create.php index 0dc11bd76c..8806a749fc 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Float/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Float/Create.php @@ -16,7 +16,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\FloatValidator; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Float/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Float/Update.php index 20b5c0767d..4ea463419f 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Float/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Float/Update.php @@ -14,7 +14,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\FloatValidator; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Get.php index 436b22c6c9..04dd0f0a1d 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Get.php @@ -12,7 +12,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Get extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/IP/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/IP/Create.php index 2adf3977f4..48e33a4bbb 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/IP/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/IP/Create.php @@ -15,7 +15,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\IP; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/IP/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/IP/Update.php index eccf18b005..ae58b06c9f 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/IP/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/IP/Update.php @@ -14,7 +14,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\IP; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Integer/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Integer/Create.php index 0989bb2904..d795bee2f4 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Integer/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Integer/Create.php @@ -16,7 +16,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Integer; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Integer/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Integer/Update.php index 57797d3e03..af3c90fb14 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Integer/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Integer/Update.php @@ -14,7 +14,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Integer; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Line/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Line/Create.php index fc846957b0..75d83822d0 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Line/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Line/Create.php @@ -16,7 +16,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\Spatial; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Line/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Line/Update.php index 8fff545921..ec24e399c3 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Line/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Line/Update.php @@ -15,7 +15,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\Spatial; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Longtext/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Longtext/Create.php index d43014f001..7ec249de28 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Longtext/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Longtext/Create.php @@ -14,7 +14,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Longtext/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Longtext/Update.php index fee62a4e00..26e3f0ef8f 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Longtext/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Longtext/Update.php @@ -13,7 +13,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Mediumtext/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Mediumtext/Create.php index d3405670c1..918379d2a0 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Mediumtext/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Mediumtext/Create.php @@ -14,7 +14,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Mediumtext/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Mediumtext/Update.php index a9792f29f7..45feb7aa9a 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Mediumtext/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Mediumtext/Update.php @@ -13,7 +13,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Point/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Point/Create.php index a89c21581d..9e9cb8f64c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Point/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Point/Create.php @@ -16,7 +16,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\Spatial; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Point/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Point/Update.php index 9561fe6b96..3cd05de283 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Point/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Point/Update.php @@ -15,7 +15,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\Spatial; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Polygon/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Polygon/Create.php index 54da3ac604..cfe15b4197 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Polygon/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Polygon/Create.php @@ -16,7 +16,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\Spatial; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Polygon/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Polygon/Update.php index b82a3d4be0..da6fcbfec6 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Polygon/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Polygon/Update.php @@ -15,7 +15,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\Spatial; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Create.php index 615e64dfd7..4e34c1abfd 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Create.php @@ -16,7 +16,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\WhiteList; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Update.php index d180131a44..2eb28e2e7b 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Relationship/Update.php @@ -14,7 +14,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Nullable; use Utopia\Validator\WhiteList; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/String/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/String/Create.php index 1d513e4471..7626f6f9f1 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/String/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/String/Create.php @@ -16,8 +16,8 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Http; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; +use Utopia\Http\Http; use Utopia\Validator; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/String/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/String/Update.php index 37547f3da8..43cbee5be6 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/String/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/String/Update.php @@ -14,7 +14,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Text/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Text/Create.php index ce89f9e70d..bc9b853d0f 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Text/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Text/Create.php @@ -14,7 +14,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Text/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Text/Update.php index e0a82d196d..ec9b2979f7 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Text/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Text/Update.php @@ -13,7 +13,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/URL/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/URL/Create.php index ed1a23acf5..0e72d4adda 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/URL/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/URL/Create.php @@ -15,7 +15,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\URL; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/URL/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/URL/Update.php index 08f7a26fd9..428c3ec158 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/URL/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/URL/Update.php @@ -14,7 +14,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\URL; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Varchar/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Varchar/Create.php index 543d54aef1..c35ad518ab 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Varchar/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Varchar/Create.php @@ -15,7 +15,7 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Varchar/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Varchar/Update.php index e8388e11b2..0ce20abd2d 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Varchar/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/Varchar/Update.php @@ -13,7 +13,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/XList.php index 61c5b295cf..b5fa62b577 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Attributes/XList.php @@ -17,7 +17,7 @@ use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Query\Cursor; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; class XList extends Action diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Create.php index d0e9539ad4..c7b69ea684 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Create.php @@ -25,7 +25,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Index as IndexValidator; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; use Utopia\Validator\JSON; @@ -248,6 +248,8 @@ class Create extends Action ->setParam('databaseId', $databaseId) ->setParam($this->getEventsParamKey(), $collection->getId()); + $this->addRowBytesInfo($collection, $dbForProject); + $response ->setStatusCode(SwooleResponse::STATUS_CODE_CREATED) ->dynamic($collection, $this->getResponseModel()); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Delete.php index fd2c419954..84022c4491 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Delete.php @@ -14,7 +14,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Delete extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Decrement.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Decrement.php index 16b7bd1b25..8fd9b7ae6f 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Decrement.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Decrement.php @@ -24,7 +24,7 @@ use Utopia\Database\Helpers\ID; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Nullable; use Utopia\Validator\Numeric; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Increment.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Increment.php index 7adae7633b..057af54e77 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Increment.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Attribute/Increment.php @@ -24,7 +24,7 @@ use Utopia\Database\Helpers\ID; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Nullable; use Utopia\Validator\Numeric; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Delete.php index a3d3535065..7a26a84fd6 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Delete.php @@ -21,7 +21,7 @@ use Utopia\Database\Exception\Restricted as RestrictedException; use Utopia\Database\Helpers\ID; use Utopia\Database\Query; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Update.php index fdc49b1901..5221ec36a3 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Update.php @@ -23,7 +23,7 @@ use Utopia\Database\Helpers\ID; use Utopia\Database\Query; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\JSON; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Upsert.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Upsert.php index 00e4663171..1a584591ae 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Upsert.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Bulk/Upsert.php @@ -21,7 +21,7 @@ use Utopia\Database\Exception\Relationship as RelationshipException; use Utopia\Database\Exception\Structure as StructureException; use Utopia\Database\Helpers\ID; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\JSON; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Create.php index 624d3c48ff..7134f7bae6 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Create.php @@ -28,7 +28,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Authorization\Input; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\JSON; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Delete.php index 7acf8e386e..0be22d00a5 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Delete.php @@ -20,7 +20,7 @@ use Utopia\Database\Exception\Restricted as RestrictedException; use Utopia\Database\Helpers\ID; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Nullable; class Delete extends Action diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Get.php index cb8b0dd42e..eaca51d88a 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Get.php @@ -17,7 +17,7 @@ use Utopia\Database\Exception\Query as QueryException; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php index 2f5579f0ca..97b018c460 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Logs/XList.php @@ -22,8 +22,8 @@ use Utopia\Database\Validator\Queries; use Utopia\Database\Validator\Query\Limit; use Utopia\Database\Validator\Query\Offset; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Locale\Locale; -use Utopia\Swoole\Response as SwooleResponse; class XList extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Update.php index ff3ab6e23c..9b52f875a0 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Update.php @@ -25,7 +25,7 @@ use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\JSON; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Upsert.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Upsert.php index d0536b65ef..cf71daa897 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Upsert.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/Upsert.php @@ -26,7 +26,7 @@ use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\JSON; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/XList.php index ff94e67b02..ec73292be2 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Documents/XList.php @@ -20,7 +20,7 @@ use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Query\Cursor; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; @@ -99,16 +99,10 @@ class XList extends Action throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - + $cursor = Query::getCursorQueries($queries, false); $cursor = \reset($cursor); - if ($cursor) { + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Get.php index d8df8f1f8c..141da5d625 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Get.php @@ -12,7 +12,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Get extends Action { @@ -75,6 +75,8 @@ class Get extends Action throw new Exception($this->getNotFoundException(), params: [$collectionId]); } + $this->addRowBytesInfo($collection, $dbForProject); + $response->dynamic($collection, $this->getResponseModel()); } } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Create.php index 7995c19af7..3560506cfc 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Create.php @@ -20,7 +20,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Index as IndexValidator; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Integer; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Delete.php index d9f9f66504..57dd878456 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Delete.php @@ -15,7 +15,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Delete extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Get.php index 661f259910..6c5846b1bd 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/Get.php @@ -13,7 +13,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Get extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/XList.php index 90826ffbe3..c1b338b2b4 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Indexes/XList.php @@ -18,7 +18,7 @@ use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Query\Cursor; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; class XList extends Action @@ -98,15 +98,10 @@ class XList extends Action Query::equal('collectionId', [$collectionId]), ); - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); - if ($cursor) { + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php index 0b6e47a798..64225f1687 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Logs/XList.php @@ -22,8 +22,8 @@ use Utopia\Database\Validator\Queries; use Utopia\Database\Validator\Query\Limit; use Utopia\Database\Validator\Query\Offset; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Locale\Locale; -use Utopia\Swoole\Response as SwooleResponse; class XList extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Update.php index a2d696813b..db3df09b7f 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Update.php @@ -15,7 +15,7 @@ use Utopia\Database\Helpers\Permission; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; @@ -117,6 +117,8 @@ class Update extends Action ->setParam('databaseId', $databaseId) ->setParam($this->getEventsParamKey(), $collection->getId()); + $this->addRowBytesInfo($collection, $dbForProject); + $response->dynamic($collection, $this->getResponseModel()); } } diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Usage/Get.php index 0552a31509..a75094f119 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/Usage/Get.php @@ -16,7 +16,7 @@ use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\WhiteList; class Get extends Action diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/XList.php index c23286f3cd..83acc9f143 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Collections/XList.php @@ -18,7 +18,7 @@ use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Query\Cursor; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Text; @@ -89,15 +89,10 @@ class XList extends Action $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); - if ($cursor) { + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); @@ -122,6 +117,10 @@ class XList extends Action throw new Exception(Exception::GENERAL_QUERY_INVALID); } + foreach ($collections as $collection) { + $this->addRowBytesInfo($collection, $dbForProject); + } + $response->dynamic(new Document([ 'total' => $total, $this->getSDKGroup() => $collections, diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Create.php index 790bea2e1a..6d991c5eb8 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Create.php @@ -19,7 +19,7 @@ use Utopia\Database\Exception\Index as IndexException; use Utopia\Database\Exception\Limit as LimitException; use Utopia\Database\Exception\Structure as StructureException; use Utopia\Database\Helpers\ID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Delete.php index 440f86cfd8..10f579f2e1 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Delete.php @@ -13,8 +13,8 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Platform\Action; -use Utopia\Swoole\Response as SwooleResponse; class Delete extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Get.php index 93cea53420..e2c653c649 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Get.php @@ -11,8 +11,8 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Platform\Action; -use Utopia\Swoole\Response as SwooleResponse; class Get extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php index 319f07db1c..3c0d81b10a 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Logs/XList.php @@ -21,9 +21,9 @@ use Utopia\Database\Validator\Queries; use Utopia\Database\Validator\Query\Limit; use Utopia\Database\Validator\Query\Offset; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Locale\Locale; use Utopia\Platform\Action; -use Utopia\Swoole\Response as SwooleResponse; class XList extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Create.php index 4ca20f8414..f2b351fa6a 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Create.php @@ -13,7 +13,7 @@ use Utopia\Database\Document; use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Permission; use Utopia\Database\Validator\Authorization; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Range; class Create extends Action diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Delete.php index e52c598eea..0d0ea98e3e 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Delete.php @@ -11,7 +11,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Delete extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Get.php index bc51b598ac..265da6a172 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Get.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Get extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Operations/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Operations/Create.php index f09ed2bc27..da36a5d4d8 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Operations/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Operations/Create.php @@ -20,7 +20,7 @@ use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Authorization\Input; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; class Create extends Action diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Update.php index eca92da313..c685eb9f40 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/Update.php @@ -26,7 +26,7 @@ use Utopia\Database\Exception\Transaction as TransactionException; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; class Update extends Action @@ -104,7 +104,7 @@ class Update extends Action * @throws \Utopia\Database\Exception * @throws Authorization * @throws Structure - * @throws \Utopia\Exception + * @throws \Utopia\Http\Exception */ public function action(string $transactionId, bool $commit, bool $rollback, UtopiaResponse $response, Database $dbForProject, Document $user, TransactionState $transactionState, Delete $queueForDeletes, Event $queueForEvents, StatsUsage $queueForStatsUsage, Event $queueForRealtime, Event $queueForFunctions, Event $queueForWebhooks, Authorization $authorization, EventProcessor $eventProcessor): void { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/XList.php index 4b1b45eab0..b10972ad64 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Transactions/XList.php @@ -13,7 +13,7 @@ use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception\Query as QueryException; use Utopia\Database\Query; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class XList extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Update.php index 3a073079e0..af129bd614 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Update.php @@ -12,8 +12,8 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Platform\Action; -use Utopia\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/Get.php index a1aa7a70b8..d2515574b2 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/Get.php @@ -15,8 +15,8 @@ use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Platform\Action; -use Utopia\Swoole\Response as SwooleResponse; use Utopia\Validator\WhiteList; class Get extends Action diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/XList.php index 757f845c68..db5ad21358 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/Usage/XList.php @@ -13,8 +13,8 @@ use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Platform\Action; -use Utopia\Swoole\Response as SwooleResponse; use Utopia\Validator\WhiteList; class XList extends Action diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Databases/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/Databases/XList.php index e3dd46839a..8627fa49c5 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Databases/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Databases/XList.php @@ -16,8 +16,8 @@ use Utopia\Database\Exception\Order as OrderException; use Utopia\Database\Exception\Query as QueryException; use Utopia\Database\Query; use Utopia\Database\Validator\Query\Cursor; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Platform\Action; -use Utopia\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Text; @@ -73,16 +73,10 @@ class XList extends Action $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Databases/Http/Init/Timeout.php b/src/Appwrite/Platform/Modules/Databases/Http/Init/Timeout.php index 72c7d0521d..87f6e3ee8d 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/Init/Timeout.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/Init/Timeout.php @@ -4,7 +4,7 @@ namespace Appwrite\Platform\Modules\Databases\Http\Init; use Appwrite\Utopia\Request; use Utopia\Database\Database; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Platform\Action; /** diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Create.php index d842210c92..ea30ee80d5 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Create.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\CustomId; use Appwrite\Utopia\Response as UtopiaResponse; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Delete.php index dc26072178..2e8bd4a68a 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Delete.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Delete extends DatabaseDelete { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Get.php index 6364f2dc0a..2767d5d790 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Get.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Get extends DatabaseGet { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php index 88745555d9..d4f46ac990 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Logs/XList.php @@ -20,9 +20,9 @@ use Utopia\Database\Validator\Queries; use Utopia\Database\Validator\Query\Limit; use Utopia\Database\Validator\Query\Offset; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Locale\Locale; use Utopia\Platform\Action; -use Utopia\Swoole\Response as SwooleResponse; class XList extends Action { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Boolean/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Boolean/Create.php index eede1b221b..56aea51302 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Boolean/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Boolean/Create.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Boolean/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Boolean/Update.php index cd8d392cfc..2aa3f4576f 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Boolean/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Boolean/Update.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Datetime/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Datetime/Create.php index 79722efee1..b66ad46c39 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Datetime/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Datetime/Create.php @@ -11,7 +11,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Datetime as DatetimeValidator; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Datetime/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Datetime/Update.php index c39681a743..4df532bb46 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Datetime/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Datetime/Update.php @@ -12,7 +12,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Datetime as DatetimeValidator; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Delete.php index da63b0cef7..6a4fdb3eae 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Delete.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Delete extends AttributesDelete { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Email/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Email/Create.php index 51e7f295a1..273b3fe634 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Email/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Email/Create.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Email/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Email/Update.php index daca13d587..0477ebf708 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Email/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Email/Update.php @@ -11,7 +11,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Enum/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Enum/Create.php index 4d5881c81e..2e19183241 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Enum/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Enum/Create.php @@ -10,7 +10,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Enum/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Enum/Update.php index 122671adc5..9f9ca15104 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Enum/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Enum/Update.php @@ -11,7 +11,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Float/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Float/Create.php index cd898fa0bf..42dbc5a8e5 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Float/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Float/Create.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\FloatValidator; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Float/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Float/Update.php index ee9c5f6cb1..c0d458d21e 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Float/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Float/Update.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\FloatValidator; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Get.php index 39dafbd1a6..7aa09a9cec 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Get.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Get extends AttributesGet { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/IP/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/IP/Create.php index 80c764b4c5..5d6c0de006 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/IP/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/IP/Create.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\IP; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/IP/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/IP/Update.php index 54ed029c71..304abb3ab9 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/IP/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/IP/Update.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\IP; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Integer/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Integer/Create.php index f590e8bdbb..52c6d22621 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Integer/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Integer/Create.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Integer; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Integer/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Integer/Update.php index 83b6f1bfc6..fc186a2388 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Integer/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Integer/Update.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Integer; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Line/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Line/Create.php index 227fece7de..8c45a8ff8a 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Line/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Line/Create.php @@ -11,7 +11,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\Spatial; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Line/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Line/Update.php index b0e433da5f..6d4b166524 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Line/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Line/Update.php @@ -12,7 +12,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\Spatial; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Longtext/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Longtext/Create.php index 81a72f8d9e..fa06fb3ab3 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Longtext/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Longtext/Create.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Longtext/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Longtext/Update.php index 92533dbe0a..fe93530cfb 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Longtext/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Longtext/Update.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Mediumtext/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Mediumtext/Create.php index 9893424713..6b5eba648e 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Mediumtext/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Mediumtext/Create.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Mediumtext/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Mediumtext/Update.php index 15164343ca..733159d1d4 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Mediumtext/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Mediumtext/Update.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Point/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Point/Create.php index 3fc5865905..837574c102 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Point/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Point/Create.php @@ -11,7 +11,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\Spatial; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Point/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Point/Update.php index 040b8171d7..5fb92495ed 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Point/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Point/Update.php @@ -12,7 +12,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\Spatial; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Polygon/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Polygon/Create.php index 630340ba7b..17bdee7e8e 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Polygon/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Polygon/Create.php @@ -11,7 +11,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\Spatial; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Polygon/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Polygon/Update.php index 43b4a4e6a4..c473bcadab 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Polygon/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Polygon/Update.php @@ -12,7 +12,7 @@ use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\Spatial; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Create.php index 7f28a3cdb7..d7dac40de8 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Create.php @@ -10,7 +10,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\WhiteList; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Update.php index fd7fdab8de..ff95986e64 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Relationship/Update.php @@ -11,7 +11,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Nullable; use Utopia\Validator\WhiteList; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/String/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/String/Create.php index 517288b297..1268a279bd 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/String/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/String/Create.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/String/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/String/Update.php index 05894aaa94..8b3c7a5f49 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/String/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/String/Update.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Text/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Text/Create.php index 704f74060e..4024537c2d 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Text/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Text/Create.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Text/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Text/Update.php index ce6b7c64a1..599c93988d 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Text/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Text/Update.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/URL/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/URL/Create.php index b19d6e80a2..007b99d055 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/URL/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/URL/Create.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\URL; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/URL/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/URL/Update.php index dce11964e8..9f08145a04 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/URL/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/URL/Update.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\URL; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Varchar/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Varchar/Create.php index 89e00c0d6b..fada172d2a 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Varchar/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Varchar/Create.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Varchar/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Varchar/Update.php index a1be057484..2b8eb9fbd7 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Varchar/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/Varchar/Update.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/XList.php index 13ebe14682..9750e87088 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Columns/XList.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\Queries\Columns; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; class XList extends AttributesXList diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Create.php index bd08ad5617..7d6bacb81c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Create.php @@ -11,7 +11,7 @@ use Appwrite\Utopia\Database\Validator\CustomId; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; use Utopia\Validator\JSON; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Delete.php index 925a7b2494..14a9bcbb5c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Delete.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Delete extends CollectionDelete { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Get.php index ad83291815..970e5e78a7 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Get.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Get extends CollectionGet { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Create.php index 09720f4d71..2b81036a2c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Create.php @@ -11,7 +11,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Integer; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Delete.php index 7fa8073d1e..ac53b86d3c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Delete.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Delete extends IndexDelete { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Get.php index 246d569825..944466af19 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/Get.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Get extends IndexGet { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/XList.php index 1dc2d3ea43..42dc7422dd 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Indexes/XList.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\Queries\Indexes; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; class XList extends IndexXList diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Logs/XList.php index 79691436e4..0f03783095 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Logs/XList.php @@ -11,7 +11,7 @@ use Utopia\Database\Validator\Queries; use Utopia\Database\Validator\Query\Limit; use Utopia\Database\Validator\Query\Offset; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class XList extends CollectionLogXList { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Bulk/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Bulk/Delete.php index 45e5b84774..1d1767dbff 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Bulk/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Bulk/Delete.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Bulk/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Bulk/Update.php index 3062186624..025604e9f9 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Bulk/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Bulk/Update.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\JSON; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Bulk/Upsert.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Bulk/Upsert.php index 3f837917c8..edc6d7018a 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Bulk/Upsert.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Bulk/Upsert.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\JSON; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Column/Decrement.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Column/Decrement.php index a660b008e1..62ac111543 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Column/Decrement.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Column/Decrement.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Nullable; use Utopia\Validator\Numeric; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Column/Increment.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Column/Increment.php index c2b69429ce..f966b2e106 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Column/Increment.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Column/Increment.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Key; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Nullable; use Utopia\Validator\Numeric; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Create.php index 0f28a561ed..45a713eada 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Create.php @@ -13,7 +13,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\JSON; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Delete.php index 1763491c19..320d4626b0 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Delete.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Nullable; class Delete extends DocumentDelete diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Get.php index bb24e93de0..ef05336aef 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Get.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Logs/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Logs/XList.php index 86bfcfec85..12bbeaf741 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Logs/XList.php @@ -11,7 +11,7 @@ use Utopia\Database\Validator\Queries; use Utopia\Database\Validator\Query\Limit; use Utopia\Database\Validator\Query\Offset; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class XList extends DocumentLogXList { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Update.php index 0879055a78..656548e176 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Update.php @@ -11,7 +11,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\JSON; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Upsert.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Upsert.php index 99e0487c93..bf281b623f 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Upsert.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/Upsert.php @@ -11,7 +11,7 @@ use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Database; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\JSON; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/XList.php index 230d391110..35163b536c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Rows/XList.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Update.php index 32376eaea1..df411d7443 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Update.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Usage/Get.php index b8be7edd56..17a3f41957 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/Usage/Get.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\WhiteList; class Get extends CollectionUsageGet diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/XList.php index 5532203d0a..c20c368190 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Tables/XList.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\Queries\Tables; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Create.php index e7e5f0132f..6876cf6a8f 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Create.php @@ -8,7 +8,7 @@ use Appwrite\SDK\ContentType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Range; class Create extends TransactionsCreate diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Delete.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Delete.php index 4838ea94db..143f609363 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Delete.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Delete.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Delete extends TransactionsDelete { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Get.php index 5182972513..2732b5b274 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Get.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class Get extends TransactionsGet { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Operations/Create.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Operations/Create.php index 1228c83e30..4ad9c13b05 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Operations/Create.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Operations/Create.php @@ -10,7 +10,7 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\Operation; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\ArrayList; class Create extends OperationsCreate diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Update.php index 807e96800e..78c7d9985c 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/Update.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; class Update extends TransactionsUpdate diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/XList.php index 4f073d5714..f06ef13af8 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Transactions/XList.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\Queries\Transactions; use Appwrite\Utopia\Response as UtopiaResponse; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; class XList extends TransactionsList { diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Update.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Update.php index 81cb9c781c..14a49c8166 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Update.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Update.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/Get.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/Get.php index 87be8a9eab..fe91ee0bfd 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/Get.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/Get.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; use Utopia\Database\Validator\UID; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\WhiteList; class Get extends DatabaseUsageGet diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/XList.php index 2cde337f5f..a479693206 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/Usage/XList.php @@ -8,7 +8,7 @@ use Appwrite\SDK\ContentType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response as UtopiaResponse; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\WhiteList; class XList extends DatabaseUsageXList diff --git a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/XList.php b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/XList.php index 4299e7c862..80a9bd3686 100644 --- a/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/XList.php +++ b/src/Appwrite/Platform/Modules/Databases/Http/TablesDB/XList.php @@ -9,7 +9,7 @@ use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\Queries\Databases; use Appwrite\Utopia\Response as UtopiaResponse; -use Utopia\Swoole\Response as SwooleResponse; +use Utopia\Http\Adapter\Swoole\Response as SwooleResponse; use Utopia\Validator\Boolean; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Databases/Workers/Databases.php b/src/Appwrite/Platform/Modules/Databases/Workers/Databases.php index c7cf7c8695..af2d4c9079 100644 --- a/src/Appwrite/Platform/Modules/Databases/Workers/Databases.php +++ b/src/Appwrite/Platform/Modules/Databases/Workers/Databases.php @@ -4,7 +4,7 @@ namespace Appwrite\Platform\Modules\Databases\Workers; use Appwrite\Event\Realtime; use Exception; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception as DatabaseException; diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Create.php index 97c669b9fb..41d4370fe8 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Create.php @@ -19,6 +19,7 @@ use Utopia\Database\Helpers\Role; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Device; @@ -26,7 +27,6 @@ use Utopia\Storage\Validator\File; use Utopia\Storage\Validator\FileExt; use Utopia\Storage\Validator\FileSize; use Utopia\Storage\Validator\Upload; -use Utopia\Swoole\Request; use Utopia\System\System; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Download/Get.php b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Download/Get.php index 5487affae9..8c48045d7c 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Download/Get.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Download/Get.php @@ -11,10 +11,10 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Database\Database; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Device; -use Utopia\Swoole\Request; use Utopia\Validator\WhiteList; class Get extends Action diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Template/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Template/Create.php index d4bf7446fb..666d20bd7f 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Template/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Template/Create.php @@ -17,9 +17,9 @@ use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; -use Utopia\Swoole\Request; use Utopia\Validator\Boolean; use Utopia\Validator\Text; use Utopia\Validator\WhiteList; diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Vcs/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Vcs/Create.php index 25dce63b38..8b2596f908 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Vcs/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/Vcs/Create.php @@ -13,9 +13,9 @@ use Appwrite\Utopia\Response; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; -use Utopia\Swoole\Request; use Utopia\Validator\Boolean; use Utopia\Validator\Text; use Utopia\Validator\WhiteList; diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/XList.php b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/XList.php index 55711495e9..ea31af8580 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Deployments/XList.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Deployments/XList.php @@ -95,16 +95,10 @@ class XList extends Base $queries[] = Query::equal('resourceInternalId', [$function->getSequence()]); $queries[] = Query::equal('resourceType', ['functions']); - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php index 6d2048b233..4f1c7822ec 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php @@ -21,8 +21,8 @@ use Executor\Executor; use MaxMind\Db\Reader; use Utopia\Auth\Proofs\Token; use Utopia\Auth\Store; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; @@ -33,9 +33,9 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Authorization\Input; use Utopia\Database\Validator\Datetime as DatetimeValidator; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; -use Utopia\Swoole\Request; use Utopia\System\System; use Utopia\Validator\AnyOf; use Utopia\Validator\Assoc; @@ -301,7 +301,9 @@ class Create extends Base if ($async) { if (is_null($scheduledAt)) { - $execution = $authorization->skip(fn () => $dbForProject->createDocument('executions', $execution)); + if ($project->getId() != '6862e6a6000cce69f9da') { + $execution = $authorization->skip(fn () => $dbForProject->createDocument('executions', $execution)); + } $queueForFunctions ->setType('http') ->setExecution($execution) @@ -342,7 +344,9 @@ class Create extends Base ->setAttribute('scheduleInternalId', $schedule->getSequence()) ->setAttribute('scheduledAt', $scheduledAt); - $execution = $authorization->skip(fn () => $dbForProject->createDocument('executions', $execution)); + if ($project->getId() != '6862e6a6000cce69f9da') { + $execution = $authorization->skip(fn () => $dbForProject->createDocument('executions', $execution)); + } } $this->enqueueDeletes( @@ -501,7 +505,9 @@ 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))) ; - $execution = $authorization->skip(fn () => $dbForProject->createDocument('executions', $execution)); + if ($project->getId() != '6862e6a6000cce69f9da') { + $execution = $authorization->skip(fn () => $dbForProject->createDocument('executions', $execution)); + } } $executionResponse['headers']['x-appwrite-execution-id'] = $execution->getId(); diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Executions/XList.php b/src/Appwrite/Platform/Modules/Functions/Http/Executions/XList.php index ff381e1f3d..f82207eaee 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Executions/XList.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Executions/XList.php @@ -91,16 +91,10 @@ class XList extends Base $queries[] = Query::equal('resourceInternalId', [$function->getSequence()]); $queries[] = Query::equal('resourceType', ['functions']); - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php index 581cfb5716..82528debec 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Create.php @@ -29,9 +29,9 @@ use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Roles; +use Utopia\Http\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; -use Utopia\Request; use Utopia\System\System; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; @@ -267,13 +267,7 @@ class Create extends Base $repository = $dbForPlatform->createDocument('repositories', new Document([ '$id' => ID::unique(), - '$permissions' => [ - Permission::read(Role::team(ID::custom($teamId))), - Permission::update(Role::team(ID::custom($teamId), 'owner')), - Permission::update(Role::team(ID::custom($teamId), 'developer')), - Permission::delete(Role::team(ID::custom($teamId), 'owner')), - Permission::delete(Role::team(ID::custom($teamId), 'developer')), - ], + '$permissions' => $this->getPermissions($teamId, $project->getId()), 'installationId' => $installation->getId(), 'installationInternalId' => $installation->getSequence(), 'projectId' => $project->getId(), diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php index e5ff11864a..d72e365fbd 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/Update.php @@ -19,15 +19,13 @@ use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Database\Helpers\ID; -use Utopia\Database\Helpers\Permission; -use Utopia\Database\Helpers\Role; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Roles; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; -use Utopia\Swoole\Request; use Utopia\System\System; use Utopia\Validator\ArrayList; use Utopia\Validator\Boolean; @@ -202,13 +200,7 @@ class Update extends Base $repository = $dbForPlatform->createDocument('repositories', new Document([ '$id' => ID::unique(), - '$permissions' => [ - Permission::read(Role::team(ID::custom($teamId))), - Permission::update(Role::team(ID::custom($teamId), 'owner')), - Permission::update(Role::team(ID::custom($teamId), 'developer')), - Permission::delete(Role::team(ID::custom($teamId), 'owner')), - Permission::delete(Role::team(ID::custom($teamId), 'developer')), - ], + '$permissions' => $this->getPermissions($teamId, $project->getId()), 'installationId' => $installation->getId(), 'installationInternalId' => $installation->getSequence(), 'projectId' => $project->getId(), diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Functions/XList.php b/src/Appwrite/Platform/Modules/Functions/Http/Functions/XList.php index aaf288bee7..8e71258501 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Functions/XList.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Functions/XList.php @@ -78,16 +78,10 @@ class XList extends Base $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Functions/Http/Variables/Create.php b/src/Appwrite/Platform/Modules/Functions/Http/Variables/Create.php index 5438479d40..99d9f49a66 100644 --- a/src/Appwrite/Platform/Modules/Functions/Http/Variables/Create.php +++ b/src/Appwrite/Platform/Modules/Functions/Http/Variables/Create.php @@ -13,8 +13,6 @@ use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate as DuplicateException; use Utopia\Database\Helpers\ID; -use Utopia\Database\Helpers\Permission; -use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; use Utopia\Platform\Action; @@ -91,13 +89,7 @@ class Create extends Base $teamId = $project->getAttribute('teamId', ''); $variable = new Document([ '$id' => $variableId, - '$permissions' => [ - Permission::read(Role::team(ID::custom($teamId))), - Permission::update(Role::team(ID::custom($teamId), 'owner')), - Permission::update(Role::team(ID::custom($teamId), 'developer')), - Permission::delete(Role::team(ID::custom($teamId), 'owner')), - Permission::delete(Role::team(ID::custom($teamId), 'developer')), - ], + '$permissions' => $this->getPermissions($teamId, $project->getId()), 'resourceInternalId' => $function->getSequence(), 'resourceId' => $function->getId(), 'resourceType' => 'function', diff --git a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php index 06234496e5..d2d5a3c6ec 100644 --- a/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php +++ b/src/Appwrite/Platform/Modules/Functions/Workers/Builds.php @@ -17,8 +17,8 @@ use Exception; use Executor\Executor; use Swoole\Coroutine as Co; use Utopia\Cache\Cache; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; diff --git a/src/Appwrite/Platform/Modules/Functions/Workers/Screenshots.php b/src/Appwrite/Platform/Modules/Functions/Workers/Screenshots.php index ca89532307..f5f7a7974b 100644 --- a/src/Appwrite/Platform/Modules/Functions/Workers/Screenshots.php +++ b/src/Appwrite/Platform/Modules/Functions/Workers/Screenshots.php @@ -7,8 +7,8 @@ use Appwrite\Event\Realtime; use Appwrite\Permission; use Appwrite\Role; use Exception; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Helpers\ID; @@ -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' ], ]; diff --git a/src/Appwrite/Platform/Modules/Projects/Http/Projects/Action.php b/src/Appwrite/Platform/Modules/Projects/Http/Projects/Action.php new file mode 100644 index 0000000000..1a3be1e783 --- /dev/null +++ b/src/Appwrite/Platform/Modules/Projects/Http/Projects/Action.php @@ -0,0 +1,22 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_POST) + ->setHttpPath('/v1/projects') + ->desc('Create project') + ->groups(['api', 'projects']) + ->label('audits.event', 'projects.create') + ->label('audits.resource', 'project/{response.$id}') + ->label('scope', 'projects.write') + ->label('sdk', new Method( + namespace: 'projects', + group: 'projects', + name: 'create', + description: '/docs/references/projects/create.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_CREATED, + model: Response::MODEL_PROJECT, + ) + ] + )) + ->param('projectId', '', new ProjectId(), 'Unique Id. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, and hyphen. Can\'t start with a special char. Max length is 36 chars.') + ->param('name', null, new Text(128), 'Project name. Max length: 128 chars.') + ->param('teamId', '', new UID(), 'Team unique ID.') + ->param('region', System::getEnv('_APP_REGION', 'default'), new WhiteList(array_keys(array_filter(Config::getParam('regions'), fn ($config) => !$config['disabled']))), 'Project Region.', true) + ->param('description', '', new Text(256), 'Project description. Max length: 256 chars.', true) + ->param('logo', '', new Text(1024), 'Project logo.', true) + ->param('url', '', new URL(), 'Project URL.', true) + ->param('legalName', '', new Text(256), 'Project legal Name. Max length: 256 chars.', true) + ->param('legalCountry', '', new Text(256), 'Project legal Country. Max length: 256 chars.', true) + ->param('legalState', '', new Text(256), 'Project legal State. Max length: 256 chars.', true) + ->param('legalCity', '', new Text(256), 'Project legal City. Max length: 256 chars.', true) + ->param('legalAddress', '', new Text(256), 'Project legal Address. Max length: 256 chars.', true) + ->param('legalTaxId', '', new Text(256), 'Project legal Tax ID. Max length: 256 chars.', true) + ->inject('request') + ->inject('response') + ->inject('dbForPlatform') + ->inject('cache') + ->inject('pools') + ->inject('hooks') + ->callback($this->action(...)); + } + + public function action(string $projectId, string $name, string $teamId, string $region, string $description, string $logo, string $url, string $legalName, string $legalCountry, string $legalState, string $legalCity, string $legalAddress, string $legalTaxId, Request $request, Response $response, Database $dbForPlatform, Cache $cache, Group $pools, Hooks $hooks) + { + $team = $dbForPlatform->getDocument('teams', $teamId); + + if ($team->isEmpty()) { + throw new Exception(Exception::TEAM_NOT_FOUND); + } + + $allowList = \array_filter(\explode(',', System::getEnv('_APP_PROJECT_REGIONS', ''))); + + if (!empty($allowList) && !\in_array($region, $allowList)) { + throw new Exception(Exception::PROJECT_REGION_UNSUPPORTED, 'Region "' . $region . '" is not supported'); + } + + $auth = Config::getParam('auth', []); + $auths = [ + 'limit' => 0, + 'maxSessions' => APP_LIMIT_USER_SESSIONS_DEFAULT, + 'passwordHistory' => 0, + 'passwordDictionary' => false, + 'duration' => TOKEN_EXPIRATION_LOGIN_LONG, + 'personalDataCheck' => false, + 'mockNumbers' => [], + 'sessionAlerts' => false, + 'membershipsUserName' => false, + 'membershipsUserEmail' => false, + 'membershipsMfa' => false, + 'invalidateSessions' => true + ]; + + foreach ($auth as $method) { + $auths[$method['key'] ?? ''] = true; + } + + $projectId = ($projectId == 'unique()') ? ID::unique() : $projectId; + + if ($projectId === 'console') { + throw new Exception(Exception::PROJECT_RESERVED_PROJECT, "'console' is a reserved project."); + } + + $databases = Config::getParam('pools-database', []); + + if ($region !== 'default') { + $databaseKeys = System::getEnv('_APP_DATABASE_KEYS', ''); + $keys = explode(',', $databaseKeys); + $databases = array_filter($keys, function ($value) use ($region) { + return str_contains($value, $region); + }); + } + + $databaseOverride = System::getEnv('_APP_DATABASE_OVERRIDE'); + $index = \array_search($databaseOverride, $databases); + if ($index !== false) { + $dsn = $databases[$index]; + } else { + $dsn = $databases[array_rand($databases)]; + } + + // TODO: Temporary until all projects are using shared tables. + $sharedTables = \explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', '')); + + if (\in_array($dsn, $sharedTables)) { + $schema = 'appwrite'; + $database = 'appwrite'; + $namespace = System::getEnv('_APP_DATABASE_SHARED_NAMESPACE', ''); + $dsn = $schema . '://' . $dsn . '?database=' . $database; + + if (!empty($namespace)) { + $dsn .= '&namespace=' . $namespace; + } + } + + try { + $project = $dbForPlatform->createDocument('projects', new Document([ + '$id' => $projectId, + '$permissions' => $this->getPermissions($teamId, $projectId), + 'name' => $name, + 'teamInternalId' => $team->getSequence(), + 'teamId' => $team->getId(), + 'region' => $region, + 'description' => $description, + 'logo' => $logo, + 'url' => $url, + 'version' => APP_VERSION_STABLE, + 'legalName' => $legalName, + 'legalCountry' => $legalCountry, + 'legalState' => $legalState, + 'legalCity' => $legalCity, + 'legalAddress' => $legalAddress, + 'legalTaxId' => ID::custom($legalTaxId), + 'services' => new \stdClass(), + 'platforms' => null, + 'oAuthProviders' => [], + 'webhooks' => null, + 'keys' => null, + 'auths' => $auths, + 'accessedAt' => DateTime::now(), + 'search' => implode(' ', [$projectId, $name]), + 'database' => $dsn, + 'labels' => [], + 'status' => PROJECT_STATUS_ACTIVE, + ])); + } catch (Duplicate) { + throw new Exception(Exception::PROJECT_ALREADY_EXISTS); + } + + try { + $dsn = new DSN($dsn); + } catch (\InvalidArgumentException) { + // TODO: Temporary until all projects are using shared tables + $dsn = new DSN('mysql://' . $dsn); + } + + $sharedTables = \explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', '')); + $sharedTablesV1 = \explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES_V1', '')); + $projectTables = !\in_array($dsn->getHost(), $sharedTables); + $sharedTablesV1 = \in_array($dsn->getHost(), $sharedTablesV1); + $sharedTablesV2 = !$projectTables && !$sharedTablesV1; + $sharedTables = $sharedTablesV1 || $sharedTablesV2; + + if (!$sharedTablesV2) { + $adapter = new DatabasePool($pools->get($dsn->getHost())); + $dbForProject = new Database($adapter, $cache); + $dbForProject->setDatabase(APP_DATABASE); + + if ($sharedTables) { + $dbForProject + ->setSharedTables(true) + ->setTenant($sharedTablesV1 ? (int)$project->getSequence() : null) + ->setNamespace($dsn->getParam('namespace')); + } else { + $dbForProject + ->setSharedTables(false) + ->setTenant(null) + ->setNamespace('_' . $project->getSequence()); + } + + $create = true; + + try { + $dbForProject->create(); + } catch (Duplicate) { + $create = false; + } + + if ($create || $projectTables) { + $adapter = new AdapterDatabase($dbForProject); + $audit = new Audit($adapter); + $audit->setup(); + } + + if (!$create && $sharedTablesV1) { + $adapter = new AdapterDatabase($dbForProject); + $attributes = $adapter->getAttributeDocuments(); + $indexes = $adapter->getIndexDocuments(); + $dbForProject->createDocument(Database::METADATA, new Document([ + '$id' => ID::custom('audit'), + '$permissions' => [Permission::create(Role::any())], + 'name' => 'audit', + 'attributes' => $attributes, + 'indexes' => $indexes, + 'documentSecurity' => true + ])); + } + + if ($create || $sharedTablesV1) { + /** @var array $collections */ + $collections = Config::getParam('collections', [])['projects'] ?? []; + + foreach ($collections as $key => $collection) { + if (($collection['$collection'] ?? '') !== Database::METADATA) { + continue; + } + + $attributes = \array_map(fn ($attribute) => new Document($attribute), $collection['attributes']); + $indexes = \array_map(fn (array $index) => new Document($index), $collection['indexes']); + + try { + $dbForProject->createCollection($key, $attributes, $indexes); + } catch (Duplicate) { + $dbForProject->createDocument(Database::METADATA, new Document([ + '$id' => ID::custom($key), + '$permissions' => [Permission::create(Role::any())], + 'name' => $key, + 'attributes' => $attributes, + 'indexes' => $indexes, + 'documentSecurity' => true + ])); + } + } + } + } + + // Hook allowing instant project mirroring during migration + // Outside of migration, hook is not registered and has no effect + $hooks->trigger('afterProjectCreation', [$project, $pools, $cache]); + + $response + ->setStatusCode(Response::STATUS_CODE_CREATED) + ->dynamic($project, Response::MODEL_PROJECT); + } +} diff --git a/src/Appwrite/Platform/Modules/Projects/Http/Projects/Team/Update.php b/src/Appwrite/Platform/Modules/Projects/Http/Projects/Team/Update.php new file mode 100644 index 0000000000..df5b2b6245 --- /dev/null +++ b/src/Appwrite/Platform/Modules/Projects/Http/Projects/Team/Update.php @@ -0,0 +1,107 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_PATCH) + ->setHttpPath('/v1/projects/:projectId/team') + ->desc('Update project team') + ->groups(['api', 'projects']) + ->label('scope', 'projects.write') + ->label('sdk', new Method( + namespace: 'projects', + group: 'projects', + name: 'updateTeam', + description: '/docs/references/projects/update-team.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_PROJECT, + ) + ] + )) + ->param('projectId', '', new UID(), 'Project unique ID.') + ->param('teamId', '', new UID(), 'Team ID of the team to transfer project to.') + ->inject('response') + ->inject('dbForPlatform') + ->callback($this->action(...)); + } + + public function action(string $projectId, string $teamId, Response $response, Database $dbForPlatform) + { + $project = $dbForPlatform->getDocument('projects', $projectId); + $team = $dbForPlatform->getDocument('teams', $teamId); + + if ($project->isEmpty()) { + throw new Exception(Exception::PROJECT_NOT_FOUND); + } + + if ($team->isEmpty()) { + throw new Exception(Exception::TEAM_NOT_FOUND); + } + + $permissions = $this->getPermissions($teamId, $projectId); + + $project + ->setAttribute('teamId', $teamId) + ->setAttribute('teamInternalId', $team->getSequence()) + ->setAttribute('$permissions', $permissions); + $project = $dbForPlatform->updateDocument('projects', $project->getId(), $project); + + $installations = $dbForPlatform->find('installations', [ + Query::equal('projectInternalId', [$project->getSequence()]), + ]); + foreach ($installations as $installation) { + $installation->setAttribute('$permissions', $permissions); + $dbForPlatform->updateDocument('installations', $installation->getId(), $installation); + } + + $repositories = $dbForPlatform->find('repositories', [ + Query::equal('projectInternalId', [$project->getSequence()]), + ]); + foreach ($repositories as $repository) { + $repository->setAttribute('$permissions', $permissions); + $dbForPlatform->updateDocument('repositories', $repository->getId(), $repository); + } + + $vcsComments = $dbForPlatform->find('vcsComments', [ + Query::equal('projectInternalId', [$project->getSequence()]), + ]); + foreach ($vcsComments as $vcsComment) { + $vcsComment->setAttribute('$permissions', $permissions); + $dbForPlatform->updateDocument('vcsComments', $vcsComment->getId(), $vcsComment); + } + + $response->dynamic($project, Response::MODEL_PROJECT); + } +} diff --git a/src/Appwrite/Platform/Modules/Projects/Http/Projects/Update.php b/src/Appwrite/Platform/Modules/Projects/Http/Projects/Update.php new file mode 100644 index 0000000000..29c26b33ea --- /dev/null +++ b/src/Appwrite/Platform/Modules/Projects/Http/Projects/Update.php @@ -0,0 +1,94 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_PATCH) + ->setHttpPath('/v1/projects/:projectId') + ->desc('Update project') + ->groups(['api', 'projects']) + ->label('scope', 'projects.write') + ->label('audits.event', 'projects.update') + ->label('audits.resource', 'project/{request.projectId}') + ->label('sdk', new Method( + namespace: 'projects', + group: 'projects', + name: 'update', + description: '/docs/references/projects/update.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_PROJECT, + ) + ] + )) + ->param('projectId', '', new UID(), 'Project unique ID.') + ->param('name', null, new Text(128), 'Project name. Max length: 128 chars.') + ->param('description', '', new Text(256), 'Project description. Max length: 256 chars.', true) + ->param('logo', '', new Text(1024), 'Project logo.', true) + ->param('url', '', new URL(), 'Project URL.', true) + ->param('legalName', '', new Text(256), 'Project legal name. Max length: 256 chars.', true) + ->param('legalCountry', '', new Text(256), 'Project legal country. Max length: 256 chars.', true) + ->param('legalState', '', new Text(256), 'Project legal state. Max length: 256 chars.', true) + ->param('legalCity', '', new Text(256), 'Project legal city. Max length: 256 chars.', true) + ->param('legalAddress', '', new Text(256), 'Project legal address. Max length: 256 chars.', true) + ->param('legalTaxId', '', new Text(256), 'Project legal tax ID. Max length: 256 chars.', true) + ->inject('response') + ->inject('dbForPlatform') + ->callback($this->action(...)); + } + + public function action(string $projectId, string $name, string $description, string $logo, string $url, string $legalName, string $legalCountry, string $legalState, string $legalCity, string $legalAddress, string $legalTaxId, Response $response, Database $dbForPlatform) + { + $project = $dbForPlatform->getDocument('projects', $projectId); + + if ($project->isEmpty()) { + throw new Exception(Exception::PROJECT_NOT_FOUND); + } + + $project = $dbForPlatform->updateDocument('projects', $project->getId(), $project + ->setAttribute('name', $name) + ->setAttribute('description', $description) + ->setAttribute('logo', $logo) + ->setAttribute('url', $url) + ->setAttribute('legalName', $legalName) + ->setAttribute('legalCountry', $legalCountry) + ->setAttribute('legalState', $legalState) + ->setAttribute('legalCity', $legalCity) + ->setAttribute('legalAddress', $legalAddress) + ->setAttribute('legalTaxId', $legalTaxId) + ->setAttribute('search', implode(' ', [$projectId, $name]))); + + $response->dynamic($project, Response::MODEL_PROJECT); + } +} diff --git a/src/Appwrite/Platform/Modules/Projects/Http/Projects/XList.php b/src/Appwrite/Platform/Modules/Projects/Http/Projects/XList.php index 7269582a15..8e420e87f2 100644 --- a/src/Appwrite/Platform/Modules/Projects/Http/Projects/XList.php +++ b/src/Appwrite/Platform/Modules/Projects/Http/Projects/XList.php @@ -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,16 +85,14 @@ class XList extends Action $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + if (!$team->isEmpty()) { + $queries[] = Query::equal('teamInternalId', [$team->getSequence()]); + } + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Projects/Services/Http.php b/src/Appwrite/Platform/Modules/Projects/Services/Http.php index cce05a9570..587f101d61 100644 --- a/src/Appwrite/Platform/Modules/Projects/Services/Http.php +++ b/src/Appwrite/Platform/Modules/Projects/Services/Http.php @@ -7,7 +7,10 @@ use Appwrite\Platform\Modules\Projects\Http\DevKeys\Delete as DeleteDevKey; use Appwrite\Platform\Modules\Projects\Http\DevKeys\Get as GetDevKey; use Appwrite\Platform\Modules\Projects\Http\DevKeys\Update as UpdateDevKey; use Appwrite\Platform\Modules\Projects\Http\DevKeys\XList as ListDevKeys; +use Appwrite\Platform\Modules\Projects\Http\Projects\Create as CreateProject; use Appwrite\Platform\Modules\Projects\Http\Projects\Labels\Update as UpdateProjectLabels; +use Appwrite\Platform\Modules\Projects\Http\Projects\Team\Update as UpdateProjectTeam; +use Appwrite\Platform\Modules\Projects\Http\Projects\Update as UpdateProject; use Appwrite\Platform\Modules\Projects\Http\Projects\XList as ListProjects; use Utopia\Platform\Service; @@ -22,7 +25,10 @@ class Http extends Service $this->addAction(ListDevKeys::getName(), new ListDevKeys()); $this->addAction(DeleteDevKey::getName(), new DeleteDevKey()); + $this->addAction(CreateProject::getName(), new CreateProject()); + $this->addAction(UpdateProject::getName(), new UpdateProject()); $this->addAction(ListProjects::getName(), new ListProjects()); $this->addAction(UpdateProjectLabels::getName(), new UpdateProjectLabels()); + $this->addAction(UpdateProjectTeam::getName(), new UpdateProjectTeam()); } } diff --git a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/XList.php b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/XList.php index e160b71060..19daf8c8d2 100644 --- a/src/Appwrite/Platform/Modules/Proxy/Http/Rules/XList.php +++ b/src/Appwrite/Platform/Modules/Proxy/Http/Rules/XList.php @@ -81,16 +81,10 @@ class XList extends Action $queries[] = Query::equal('projectInternalId', [$project->getSequence()]); - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Create.php index 6d6b599ed7..a4d0c5796c 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Create.php @@ -19,6 +19,7 @@ use Utopia\Database\Helpers\Role; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Device; @@ -26,7 +27,6 @@ use Utopia\Storage\Validator\File; use Utopia\Storage\Validator\FileExt; use Utopia\Storage\Validator\FileSize; use Utopia\Storage\Validator\Upload; -use Utopia\Swoole\Request; use Utopia\System\System; use Utopia\Validator\Boolean; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Download/Get.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Download/Get.php index 50f2ec952d..c7982d9834 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Download/Get.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Download/Get.php @@ -11,10 +11,10 @@ use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Response; use Utopia\Database\Database; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Device; -use Utopia\Swoole\Request; use Utopia\Validator\WhiteList; class Get extends Action diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Duplicate/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Duplicate/Create.php index 1d60c6776c..23bbe65f94 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Duplicate/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Duplicate/Create.php @@ -14,10 +14,10 @@ use Utopia\Database\Document; use Utopia\Database\Helpers\ID; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Device; -use Utopia\Swoole\Request; use Utopia\System\System; class Create extends Action diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Template/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Template/Create.php index e36bed94bc..cb95f8840f 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Template/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Template/Create.php @@ -17,9 +17,9 @@ use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; -use Utopia\Swoole\Request; use Utopia\System\System; use Utopia\Validator\Boolean; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Vcs/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Vcs/Create.php index ea883aca23..c22038dbf4 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Vcs/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/Vcs/Create.php @@ -14,9 +14,9 @@ use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; -use Utopia\Swoole\Request; use Utopia\Validator\Boolean; use Utopia\Validator\Text; use Utopia\Validator\WhiteList; diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/XList.php b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/XList.php index 73e5ea4d77..a01f54a6ff 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Deployments/XList.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Deployments/XList.php @@ -95,16 +95,10 @@ class XList extends Base $queries[] = Query::equal('resourceInternalId', [$site->getSequence()]); $queries[] = Query::equal('resourceType', ['sites']); - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Logs/XList.php b/src/Appwrite/Platform/Modules/Sites/Http/Logs/XList.php index e933a8d12b..38c6d4b29a 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Logs/XList.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Logs/XList.php @@ -80,16 +80,10 @@ class XList extends Base $queries[] = Query::equal('resourceInternalId', [$site->getSequence()]); $queries[] = Query::equal('resourceType', ['sites']); - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php index b48cfeb73f..dd2c30625f 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Create.php @@ -15,8 +15,6 @@ use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Helpers\ID; -use Utopia\Database\Helpers\Permission; -use Utopia\Database\Helpers\Role; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; use Utopia\System\System; @@ -176,13 +174,7 @@ class Create extends Base $repository = $dbForPlatform->createDocument('repositories', new Document([ '$id' => ID::unique(), - '$permissions' => [ - Permission::read(Role::team(ID::custom($teamId))), - Permission::update(Role::team(ID::custom($teamId), 'owner')), - Permission::update(Role::team(ID::custom($teamId), 'developer')), - Permission::delete(Role::team(ID::custom($teamId), 'owner')), - Permission::delete(Role::team(ID::custom($teamId), 'developer')), - ], + '$permissions' => $this->getPermissions($teamId, $project->getId()), 'installationId' => $installation->getId(), 'installationInternalId' => $installation->getSequence(), 'projectId' => $project->getId(), diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php index b4b720537d..a071ab8bbe 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/Update.php @@ -16,13 +16,11 @@ use Utopia\Config\Config; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Helpers\ID; -use Utopia\Database\Helpers\Permission; -use Utopia\Database\Helpers\Role; use Utopia\Database\Query; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; -use Utopia\Swoole\Request; use Utopia\System\System; use Utopia\Validator\Boolean; use Utopia\Validator\Range; @@ -198,13 +196,7 @@ class Update extends Base $repository = $dbForPlatform->createDocument('repositories', new Document([ '$id' => ID::unique(), - '$permissions' => [ - Permission::read(Role::team(ID::custom($teamId))), - Permission::update(Role::team(ID::custom($teamId), 'owner')), - Permission::update(Role::team(ID::custom($teamId), 'developer')), - Permission::delete(Role::team(ID::custom($teamId), 'owner')), - Permission::delete(Role::team(ID::custom($teamId), 'developer')), - ], + '$permissions' => $this->getPermissions($teamId, $project->getId()), 'installationId' => $installation->getId(), 'installationInternalId' => $installation->getSequence(), 'projectId' => $project->getId(), diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Sites/XList.php b/src/Appwrite/Platform/Modules/Sites/Http/Sites/XList.php index 8daf3eb063..2571043363 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Sites/XList.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Sites/XList.php @@ -73,16 +73,10 @@ class XList extends Base $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Sites/Http/Variables/Create.php b/src/Appwrite/Platform/Modules/Sites/Http/Variables/Create.php index c674aa06a2..fe4fe35626 100644 --- a/src/Appwrite/Platform/Modules/Sites/Http/Variables/Create.php +++ b/src/Appwrite/Platform/Modules/Sites/Http/Variables/Create.php @@ -12,8 +12,6 @@ use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception\Duplicate as DuplicateException; use Utopia\Database\Helpers\ID; -use Utopia\Database\Helpers\Permission; -use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\UID; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; @@ -78,13 +76,7 @@ class Create extends Base $teamId = $project->getAttribute('teamId', ''); $variable = new Document([ '$id' => $variableId, - '$permissions' => [ - Permission::read(Role::team(ID::custom($teamId))), - Permission::update(Role::team(ID::custom($teamId), 'owner')), - Permission::update(Role::team(ID::custom($teamId), 'developer')), - Permission::delete(Role::team(ID::custom($teamId), 'owner')), - Permission::delete(Role::team(ID::custom($teamId), 'developer')), - ], + '$permissions' => $this->getPermissions($teamId, $project->getId()), 'resourceInternalId' => $site->getSequence(), 'resourceId' => $site->getId(), 'resourceType' => 'site', diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php index 4757461a98..6473f1058a 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php @@ -25,6 +25,7 @@ use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Authorization\Input; use Utopia\Database\Validator\Permissions; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Compression\Algorithms\GZIP; @@ -36,7 +37,6 @@ use Utopia\Storage\Validator\File; use Utopia\Storage\Validator\FileExt; use Utopia\Storage\Validator\FileSize; use Utopia\Storage\Validator\Upload; -use Utopia\Swoole\Request; use Utopia\System\System; use Utopia\Validator\Nullable; @@ -256,6 +256,12 @@ class Create extends Action if ($uploaded === $chunks) { throw new Exception(Exception::STORAGE_FILE_ALREADY_EXISTS); } + } else { + // Guard against manually setting range header for single chunk upload + if ($chunks === -1) { + $chunks = 1; + $chunk = 1; + } } $chunksUploaded = $deviceForFiles->upload($fileTmpName, $path, $chunk, $chunks, $metadata); diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Download/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Download/Get.php index bbceff51ec..4a52c87238 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Download/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Download/Get.php @@ -16,13 +16,13 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Authorization\Input; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Compression\Algorithms\GZIP; use Utopia\Storage\Compression\Algorithms\Zstd; use Utopia\Storage\Compression\Compression; use Utopia\Storage\Device; -use Utopia\Swoole\Request; use Utopia\System\System; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php index 7ab3e713bc..a53cbb3a52 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Preview/Get.php @@ -11,14 +11,15 @@ use Appwrite\SDK\MethodType; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Documents\User; use Appwrite\Utopia\Response; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Authorization\Input; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Image\Image; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; @@ -26,7 +27,6 @@ use Utopia\Storage\Compression\Algorithms\GZIP; use Utopia\Storage\Compression\Algorithms\Zstd; use Utopia\Storage\Compression\Compression; use Utopia\Storage\Device; -use Utopia\Swoole\Request; use Utopia\System\System; use Utopia\Validator\HexColor; use Utopia\Validator\Range; diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php index 516343e23f..60846cb546 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Push/Get.php @@ -13,13 +13,13 @@ use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Compression\Algorithms\GZIP; use Utopia\Storage\Compression\Algorithms\Zstd; use Utopia\Storage\Compression\Compression; use Utopia\Storage\Device; -use Utopia\Swoole\Request; use Utopia\System\System; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/View/Get.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/View/Get.php index 3874fedacf..73e7e58421 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/View/Get.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/View/Get.php @@ -17,13 +17,13 @@ use Utopia\Database\Document; use Utopia\Database\Validator\Authorization; use Utopia\Database\Validator\Authorization\Input; use Utopia\Database\Validator\UID; +use Utopia\Http\Adapter\Swoole\Request; use Utopia\Platform\Action; use Utopia\Platform\Scope\HTTP; use Utopia\Storage\Compression\Algorithms\GZIP; use Utopia\Storage\Compression\Algorithms\Zstd; use Utopia\Storage\Compression\Compression; use Utopia\Storage\Device; -use Utopia\Swoole\Request; use Utopia\System\System; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php index 3663b56fab..6de360ae0e 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/XList.php @@ -101,16 +101,10 @@ class XList extends Action $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/XList.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/XList.php index 601d9b5321..8f2cd9bbac 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/XList.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/XList.php @@ -82,16 +82,10 @@ class XList extends Action $queries[] = Query::search('search', $search); } - /** - * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries - */ - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + if ($cursor !== false) { $validator = new Cursor(); if (!$validator->isValid($cursor)) { throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); diff --git a/src/Appwrite/Platform/Modules/Tokens/Http/Tokens/Buckets/Files/XList.php b/src/Appwrite/Platform/Modules/Tokens/Http/Tokens/Buckets/Files/XList.php index 13da92cbc6..579c6e7100 100644 --- a/src/Appwrite/Platform/Modules/Tokens/Http/Tokens/Buckets/Files/XList.php +++ b/src/Appwrite/Platform/Modules/Tokens/Http/Tokens/Buckets/Files/XList.php @@ -2,18 +2,18 @@ namespace Appwrite\Platform\Modules\Tokens\Http\Tokens\Buckets\Files; -use Appwrite\Extend\Exception as ExtendException; +use Appwrite\Extend\Exception; use Appwrite\SDK\AuthType; use Appwrite\SDK\ContentType; use Appwrite\SDK\Method; use Appwrite\SDK\Response as SDKResponse; use Appwrite\Utopia\Database\Validator\Queries\FileTokens; use Appwrite\Utopia\Response; -use Exception; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Query; use Utopia\Database\Validator\Authorization; +use Utopia\Database\Validator\Query\Cursor; use Utopia\Database\Validator\UID; use Utopia\Platform\Scope\HTTP; use Utopia\Validator\Boolean; @@ -69,18 +69,21 @@ class XList extends Action $queries = Query::parseQueries($queries); $queries[] = Query::equal('resourceType', [TOKENS_RESOURCE_TYPE_FILES]); $queries[] = Query::equal('resourceInternalId', [$bucket->getSequence() . ':' . $file->getSequence()]); - // Get cursor document if there was a cursor query - $cursor = \array_filter($queries, function ($query) { - return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); - }); - $cursor = reset($cursor); - if ($cursor) { - /** @var Query $cursor */ + + $cursor = Query::getCursorQueries($queries, false); + $cursor = \reset($cursor); + + if ($cursor !== false) { + $validator = new Cursor(); + if (!$validator->isValid($cursor)) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); + } + $tokenId = $cursor->getValue(); $cursorDocument = $dbForProject->getDocument('resourceTokens', $tokenId); if ($cursorDocument->isEmpty()) { - throw new Exception(ExtendException::GENERAL_CURSOR_NOT_FOUND, "File token '{$tokenId}' for the 'cursor' value not found."); + throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "File token '{$tokenId}' for the 'cursor' value not found."); } $cursor->setValue($cursorDocument); diff --git a/src/Appwrite/Platform/Modules/VCS/Http/GitHub/Authorize/Get.php b/src/Appwrite/Platform/Modules/VCS/Http/GitHub/Authorize/Get.php new file mode 100644 index 0000000000..6188c14b5d --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Http/GitHub/Authorize/Get.php @@ -0,0 +1,90 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/vcs/github/authorize') + ->desc('Create GitHub app installation') + ->groups(['api', 'vcs']) + ->label('scope', 'vcs.read') + ->label('error', APP_VIEWS_DIR . '/general/error.phtml') + ->label('sdk', new Method( + namespace: 'vcs', + group: 'installations', + name: 'createGitHubInstallation', + description: '/docs/references/vcs/create-github-installation.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_MOVED_PERMANENTLY, + model: Response::MODEL_NONE, + ) + ], + contentType: ContentType::HTML, + type: MethodType::WEBAUTH, + hide: true, + )) + ->param('success', '', fn ($redirectValidator) => $redirectValidator, 'URL to redirect back to console after a successful installation attempt.', true, ['redirectValidator']) + ->param('failure', '', fn ($redirectValidator) => $redirectValidator, 'URL to redirect back to console after a failed installation attempt.', true, ['redirectValidator']) + ->inject('response') + ->inject('project') + ->inject('platform') + ->callback($this->action(...)); + } + + public function action( + string $success, + string $failure, + Response $response, + Document $project, + array $platform + ) { + $state = \json_encode([ + 'projectId' => $project->getId(), + 'success' => $success, + 'failure' => $failure, + ]); + + $appName = System::getEnv('_APP_VCS_GITHUB_APP_NAME'); + $protocol = System::getEnv('_APP_OPTIONS_FORCE_HTTPS') === 'disabled' ? 'http' : 'https'; + $hostname = $platform['consoleHostname'] ?? ''; + + if (empty($appName)) { + throw new Exception(Exception::GENERAL_SERVER_ERROR, 'GitHub App name is not configured. Please configure VCS (Version Control System) variables in .env file.'); + } + + $url = "https://github.com/apps/$appName/installations/new?" . \http_build_query([ + 'state' => $state, + 'redirect_uri' => $protocol . '://' . $hostname . "/v1/vcs/github/callback" + ]); + + $response + ->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') + ->addHeader('Pragma', 'no-cache') + ->redirect($url); + } +} diff --git a/src/Appwrite/Platform/Modules/VCS/Http/GitHub/Callback/Get.php b/src/Appwrite/Platform/Modules/VCS/Http/GitHub/Callback/Get.php new file mode 100644 index 0000000000..1212c06a72 --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Http/GitHub/Callback/Get.php @@ -0,0 +1,182 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/vcs/github/callback') + ->desc('Get installation and authorization from GitHub app') + ->groups(['api', 'vcs']) + ->label('scope', 'public') + ->label('error', APP_VIEWS_DIR . '/general/error.phtml') + ->param('installation_id', '', new Text(256, 0), 'GitHub installation ID', true) + ->param('setup_action', '', new Text(256, 0), 'GitHub setup action type', true) + ->param('state', '', new Text(2048), 'GitHub state. Contains info sent when starting authorization flow.', true) + ->param('code', '', new Text(2048, 0), 'OAuth2 code. This is a temporary code that the will be later exchanged for an access token.', true) + ->inject('gitHub') + ->inject('project') + ->inject('response') + ->inject('dbForPlatform') + ->inject('platform') + ->callback($this->action(...)); + } + + public function action( + string $providerInstallationId, + string $setupAction, + string $state, + string $code, + GitHub $github, + Document $project, + Response $response, + Database $dbForPlatform, + array $platform + ) { + if (empty($state)) { + $error = 'Installation requests from organisation members for the Appwrite GitHub App are currently unsupported. To proceed with the installation, login to the Appwrite Console and install the GitHub App.'; + throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, $error); + } + + $state = \json_decode($state, true); + $projectId = $state['projectId'] ?? ''; + + $project = $dbForPlatform->getDocument('projects', $projectId); + + if ($project->isEmpty()) { + $error = 'Project with the ID from state could not be found.'; + + if (!empty($redirectFailure)) { + $separator = \str_contains($redirectFailure, '?') ? '&' : ':'; + return $response + ->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') + ->addHeader('Pragma', 'no-cache') + ->redirect($redirectFailure . $separator . \http_build_query(['error' => $error])); + } + + throw new Exception(Exception::PROJECT_NOT_FOUND, $error); + } + + $region = $project->getAttribute('region', 'default'); + $protocol = System::getEnv('_APP_OPTIONS_FORCE_HTTPS') === 'disabled' ? 'http' : 'https'; + $hostname = $platform['consoleHostname'] ?? ''; + + $defaultState = [ + 'success' => $protocol . '://' . $hostname . "/console/project-$region-$projectId/settings/git-installations", + 'failure' => $protocol . '://' . $hostname . "/console/project-$region-$projectId/settings/git-installations", + ]; + + $state = \array_merge($defaultState, $state ?? []); + + $redirectSuccess = $state['success'] ?? ''; + $redirectFailure = $state['failure'] ?? ''; + + // Create / Update installation + if (!empty($providerInstallationId)) { + $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); + $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); + $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); + $owner = $github->getOwnerName($providerInstallationId) ?? ''; + + $projectInternalId = $project->getSequence(); + + $installation = $dbForPlatform->findOne('installations', [ + Query::equal('providerInstallationId', [$providerInstallationId]), + Query::equal('projectInternalId', [$projectInternalId]) + ]); + + $personal = false; + $refreshToken = null; + $accessToken = null; + $accessTokenExpiry = null; + + if (!empty($code)) { + $oauth2 = new OAuth2Github(System::getEnv('_APP_VCS_GITHUB_CLIENT_ID', ''), System::getEnv('_APP_VCS_GITHUB_CLIENT_SECRET', ''), ""); + + $accessToken = $oauth2->getAccessToken($code) ?? ''; + $refreshToken = $oauth2->getRefreshToken($code) ?? ''; + $accessTokenExpiry = DateTime::addSeconds(new \DateTime(), \intval($oauth2->getAccessTokenExpiry($code))); + + $personalSlug = $oauth2->getUserSlug($accessToken) ?? ''; + $personal = $personalSlug === $owner; + } + + if ($installation->isEmpty()) { + $teamId = $project->getAttribute('teamId', ''); + + $installation = new Document([ + '$id' => ID::unique(), + '$permissions' => [ + Permission::read(Role::team(ID::custom($teamId))), + Permission::update(Role::team(ID::custom($teamId), 'owner')), + Permission::update(Role::team(ID::custom($teamId), 'developer')), + Permission::delete(Role::team(ID::custom($teamId), 'owner')), + Permission::delete(Role::team(ID::custom($teamId), 'developer')), + ], + 'providerInstallationId' => $providerInstallationId, + 'projectId' => $projectId, + 'projectInternalId' => $projectInternalId, + 'provider' => 'github', + 'organization' => $owner, + 'personal' => $personal, + 'personalRefreshToken' => $refreshToken, + 'personalAccessToken' => $accessToken, + 'personalAccessTokenExpiry' => $accessTokenExpiry, + ]); + + $installation = $dbForPlatform->createDocument('installations', $installation); + } else { + $installation = $installation + ->setAttribute('organization', $owner) + ->setAttribute('personal', $personal) + ->setAttribute('personalRefreshToken', $refreshToken) + ->setAttribute('personalAccessToken', $accessToken) + ->setAttribute('personalAccessTokenExpiry', $accessTokenExpiry); + $installation = $dbForPlatform->updateDocument('installations', $installation->getId(), $installation); + } + } else { + $error = 'Installation of the Appwrite GitHub App on organization accounts is restricted to organization owners. As a member of the organization, you do not have the necessary permissions to install this GitHub App. Please contact the organization owner to create the installation from the Appwrite console.'; + + if (!empty($redirectFailure)) { + $separator = \str_contains($redirectFailure, '?') ? '&' : ':'; + return $response + ->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') + ->addHeader('Pragma', 'no-cache') + ->redirect($redirectFailure . $separator . \http_build_query(['error' => $error])); + } + + throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, $error); + } + + $response + ->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') + ->addHeader('Pragma', 'no-cache') + ->redirect($redirectSuccess); + } +} diff --git a/src/Appwrite/Platform/Modules/VCS/Http/Installations/Delete.php b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Delete.php new file mode 100644 index 0000000000..26a9476941 --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Delete.php @@ -0,0 +1,78 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_DELETE) + ->setHttpPath('/v1/vcs/installations/:installationId') + ->desc('Delete installation') + ->groups(['api', 'vcs']) + ->label('scope', 'vcs.write') + ->label('resourceType', RESOURCE_TYPE_VCS) + ->label('sdk', new Method( + namespace: 'vcs', + group: 'installations', + name: 'deleteInstallation', + description: '/docs/references/vcs/delete-installation.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_NOCONTENT, + model: Response::MODEL_NONE, + ) + ], + contentType: ContentType::NONE + )) + ->param('installationId', '', new Text(256), 'Installation Id') + ->inject('response') + ->inject('dbForPlatform') + ->inject('queueForDeletes') + ->callback($this->action(...)); + } + + public function action( + string $installationId, + Response $response, + Database $dbForPlatform, + DeleteEvent $queueForDeletes + ) { + $installation = $dbForPlatform->getDocument('installations', $installationId); + + if ($installation->isEmpty()) { + throw new Exception(Exception::INSTALLATION_NOT_FOUND); + } + + if (!$dbForPlatform->deleteDocument('installations', $installation->getId())) { + throw new Exception(Exception::GENERAL_SERVER_ERROR, 'Failed to remove installation from DB'); + } + + $queueForDeletes + ->setType(DELETE_TYPE_DOCUMENT) + ->setDocument($installation); + + $response->noContent(); + } +} diff --git a/src/Appwrite/Platform/Modules/VCS/Http/Installations/Get.php b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Get.php new file mode 100644 index 0000000000..7bb2dedaf5 --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Get.php @@ -0,0 +1,72 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/vcs/installations/:installationId') + ->desc('Get installation') + ->groups(['api', 'vcs']) + ->label('scope', 'vcs.read') + ->label('resourceType', RESOURCE_TYPE_VCS) + ->label('sdk', new Method( + namespace: 'vcs', + group: 'installations', + name: 'getInstallation', + description: '/docs/references/vcs/get-installation.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_INSTALLATION, + ) + ] + )) + ->param('installationId', '', new Text(256), 'Installation Id') + ->inject('response') + ->inject('project') + ->inject('dbForPlatform') + ->callback($this->action(...)); + } + + public function action( + string $installationId, + Response $response, + Document $project, + Database $dbForPlatform + ) { + $installation = $dbForPlatform->getDocument('installations', $installationId); + + if ($installation === false || $installation->isEmpty()) { + throw new Exception(Exception::INSTALLATION_NOT_FOUND); + } + + if ($installation->getAttribute('projectInternalId') !== $project->getSequence()) { + throw new Exception(Exception::INSTALLATION_NOT_FOUND); + } + + $response->dynamic($installation, Response::MODEL_INSTALLATION); + } +} diff --git a/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Branches/XList.php b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Branches/XList.php new file mode 100644 index 0000000000..4ed4241d25 --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Branches/XList.php @@ -0,0 +1,95 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/vcs/github/installations/:installationId/providerRepositories/:providerRepositoryId/branches') + ->desc('List repository branches') + ->groups(['api', 'vcs']) + ->label('scope', 'vcs.read') + ->label('resourceType', RESOURCE_TYPE_VCS) + ->label('sdk', new Method( + namespace: 'vcs', + group: 'repositories', + name: 'listRepositoryBranches', + description: '/docs/references/vcs/list-repository-branches.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_BRANCH_LIST, + ) + ] + )) + ->param('installationId', '', new Text(256), 'Installation Id') + ->param('providerRepositoryId', '', new Text(256), 'Repository Id') + ->inject('gitHub') + ->inject('response') + ->inject('dbForPlatform') + ->callback($this->action(...)); + } + + public function action( + string $installationId, + string $providerRepositoryId, + GitHub $github, + Response $response, + Database $dbForPlatform + ) { + $installation = $dbForPlatform->getDocument('installations', $installationId); + + if ($installation->isEmpty()) { + throw new Exception(Exception::INSTALLATION_NOT_FOUND); + } + + $providerInstallationId = $installation->getAttribute('providerInstallationId'); + $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); + $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); + $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); + + $owner = $github->getOwnerName($providerInstallationId) ?? ''; + try { + $repositoryName = $github->getRepositoryName($providerRepositoryId) ?? ''; + if (empty($repositoryName)) { + throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); + } + } catch (RepositoryNotFound $e) { + throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); + } + + $branches = $github->listBranches($owner, $repositoryName) ?? []; + + $response->dynamic(new Document([ + 'branches' => \array_map(function ($branch) { + return new Document(['name' => $branch]); + }, $branches), + 'total' => \count($branches), + ]), Response::MODEL_BRANCH_LIST); + } +} diff --git a/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Contents/Get.php b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Contents/Get.php new file mode 100644 index 0000000000..a0dcec8590 --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Contents/Get.php @@ -0,0 +1,110 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/vcs/github/installations/:installationId/providerRepositories/:providerRepositoryId/contents') + ->desc('Get files and directories of a VCS repository') + ->groups(['api', 'vcs']) + ->label('scope', 'vcs.read') + ->label('resourceType', RESOURCE_TYPE_VCS) + ->label('sdk', new Method( + namespace: 'vcs', + group: 'repositories', + name: 'getRepositoryContents', + description: '/docs/references/vcs/get-repository-contents.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_VCS_CONTENT_LIST, + ) + ] + )) + ->param('installationId', '', new Text(256), 'Installation Id') + ->param('providerRepositoryId', '', new Text(256), 'Repository Id') + ->param('providerRootDirectory', '', new Text(256, 0), 'Path to get contents of nested directory', true) + ->param('providerReference', '', new Text(256, 0), 'Git reference (branch, tag, commit) to get contents from', true) + ->inject('gitHub') + ->inject('response') + ->inject('dbForPlatform') + ->callback($this->action(...)); + } + + public function action( + string $installationId, + string $providerRepositoryId, + string $providerRootDirectory, + string $providerReference, + GitHub $github, + Response $response, + Database $dbForPlatform + ) { + $installation = $dbForPlatform->getDocument('installations', $installationId); + + if ($installation->isEmpty()) { + throw new Exception(Exception::INSTALLATION_NOT_FOUND); + } + + $providerInstallationId = $installation->getAttribute('providerInstallationId'); + $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); + $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); + $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); + + $owner = $github->getOwnerName($providerInstallationId); + try { + $repositoryName = $github->getRepositoryName($providerRepositoryId) ?? ''; + if (empty($repositoryName)) { + throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); + } + } catch (RepositoryNotFound $e) { + throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); + } + + $contents = $github->listRepositoryContents($owner, $repositoryName, $providerRootDirectory, $providerReference); + + $vcsContents = []; + foreach ($contents as $content) { + $isDirectory = false; + if ($content['type'] === GitHub::CONTENTS_DIRECTORY) { + $isDirectory = true; + } + + $vcsContents[] = new Document([ + 'isDirectory' => $isDirectory, + 'name' => $content['name'] ?? '', + 'size' => $content['size'] ?? 0 + ]); + } + + $response->dynamic(new Document([ + 'contents' => $vcsContents + ]), Response::MODEL_VCS_CONTENT_LIST); + } +} diff --git a/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Create.php b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Create.php new file mode 100644 index 0000000000..e357d1d5fa --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Create.php @@ -0,0 +1,158 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_POST) + ->setHttpPath('/v1/vcs/github/installations/:installationId/providerRepositories') + ->desc('Create repository') + ->groups(['api', 'vcs']) + ->label('scope', 'vcs.write') + ->label('resourceType', RESOURCE_TYPE_VCS) + ->label('sdk', new Method( + namespace: 'vcs', + group: 'repositories', + name: 'createRepository', + description: '/docs/references/vcs/create-repository.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_PROVIDER_REPOSITORY, + ) + ] + )) + ->param('installationId', '', new Text(256), 'Installation Id') + ->param('name', '', new Text(256), 'Repository name (slug)') + ->param('private', '', new Boolean(false), 'Mark repository public or private') + ->inject('gitHub') + ->inject('user') + ->inject('response') + ->inject('dbForPlatform') + ->callback($this->action(...)); + } + + public function action( + string $installationId, + string $name, + bool $private, + GitHub $github, + Document $user, + Response $response, + Database $dbForPlatform + ) { + $installation = $dbForPlatform->getDocument('installations', $installationId); + + if ($installation->isEmpty()) { + throw new Exception(Exception::INSTALLATION_NOT_FOUND); + } + + if ($installation->getAttribute('personal', false) === true) { + $oauth2 = new OAuth2Github(System::getEnv('_APP_VCS_GITHUB_CLIENT_ID', ''), System::getEnv('_APP_VCS_GITHUB_CLIENT_SECRET', ''), ""); + + $accessToken = $installation->getAttribute('personalAccessToken'); + $refreshToken = $installation->getAttribute('personalRefreshToken'); + $accessTokenExpiry = $installation->getAttribute('personalAccessTokenExpiry'); + + if (empty($accessToken) || empty($refreshToken) || empty($accessTokenExpiry)) { + $identity = $dbForPlatform->findOne('identities', [ + Query::equal('provider', ['github']), + Query::equal('userInternalId', [$user->getSequence()]), + ]); + if ($identity->isEmpty()) { + throw new Exception(Exception::USER_IDENTITY_NOT_FOUND); + } + + $accessToken = $accessToken ?? $identity->getAttribute('providerAccessToken'); + $refreshToken = $refreshToken ?? $identity->getAttribute('providerRefreshToken'); + $accessTokenExpiry = $accessTokenExpiry ?? $identity->getAttribute('providerAccessTokenExpiry'); + } + + $isExpired = new \DateTime($accessTokenExpiry) < new \DateTime('now'); + if ($isExpired) { + $oauth2->refreshTokens($refreshToken); + + $accessToken = $oauth2->getAccessToken(''); + $refreshToken = $oauth2->getRefreshToken(''); + + $verificationId = $oauth2->getUserID($accessToken); + + if (empty($verificationId)) { + throw new Exception(Exception::GENERAL_RATE_LIMIT_EXCEEDED, "Another request is currently refreshing OAuth token. Please try again."); + } + + $installation = $installation + ->setAttribute('personalAccessToken', $accessToken) + ->setAttribute('personalRefreshToken', $refreshToken) + ->setAttribute('personalAccessTokenExpiry', DateTime::addSeconds(new \DateTime(), (int)$oauth2->getAccessTokenExpiry(''))); + + $dbForPlatform->updateDocument('installations', $installation->getId(), $installation); + } + + try { + $repository = $oauth2->createRepository($accessToken, $name, $private); + } catch (Exception $exception) { + throw new Exception(Exception::GENERAL_PROVIDER_FAILURE, "GitHub failed to process the request: " . $exception->getMessage()); + } + } else { + $providerInstallationId = $installation->getAttribute('providerInstallationId'); + $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); + $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); + $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); + $owner = $github->getOwnerName($providerInstallationId); + + try { + $repository = $github->createRepository($owner, $name, $private); + } catch (Exception $exception) { + throw new Exception(Exception::GENERAL_PROVIDER_FAILURE, "GitHub failed to process the request: " . $exception->getMessage()); + } + } + + if (isset($repository['errors'])) { + $message = $repository['message'] ?? 'Unknown error.'; + if (isset($repository['errors'][0])) { + $message .= ' ' . $repository['errors'][0]['message']; + } + throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, 'Provider Error: ' . $message); + } + + if (isset($repository['message'])) { + throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, 'Provider Error: ' . $repository['message']); + } + + $repository['id'] = \strval($repository['id']) ?? ''; + $repository['pushedAt'] = $repository['pushed_at'] ?? ''; + $repository['organization'] = $installation->getAttribute('organization', ''); + $repository['provider'] = $installation->getAttribute('provider', ''); + + $response->dynamic(new Document($repository), Response::MODEL_PROVIDER_REPOSITORY); + } +} diff --git a/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Detections/Create.php b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Detections/Create.php new file mode 100644 index 0000000000..bada6d98bb --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Detections/Create.php @@ -0,0 +1,315 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_POST) + ->setHttpPath('/v1/vcs/github/installations/:installationId/detections') + ->httpAlias('/v1/vcs/github/installations/:installationId/providerRepositories/:providerRepositoryId/detection') + ->desc('Create repository detection') + ->groups(['api', 'vcs']) + ->label('scope', 'vcs.write') + ->label('resourceType', RESOURCE_TYPE_VCS) + ->label('sdk', new Method( + namespace: 'vcs', + group: 'repositories', + name: 'createRepositoryDetection', + description: '/docs/references/vcs/create-repository-detection.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_DETECTION_RUNTIME, + ), + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_DETECTION_FRAMEWORK, + ) + ] + )) + ->param('installationId', '', new Text(256), 'Installation Id') + ->param('providerRepositoryId', '', new Text(256), 'Repository Id') + ->param('type', '', new WhiteList(['runtime', 'framework']), 'Detector type. Must be one of the following: runtime, framework') + ->param('providerRootDirectory', '', new Text(256, 0), 'Path to Root Directory', true) + ->inject('gitHub') + ->inject('response') + ->inject('dbForPlatform') + ->callback($this->action(...)); + } + + public function action( + string $installationId, + string $providerRepositoryId, + string $type, + string $providerRootDirectory, + GitHub $github, + Response $response, + Database $dbForPlatform + ) { + $installation = $dbForPlatform->getDocument('installations', $installationId); + + if ($installation->isEmpty()) { + throw new Exception(Exception::INSTALLATION_NOT_FOUND); + } + + $providerInstallationId = $installation->getAttribute('providerInstallationId'); + $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); + $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); + $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); + + $owner = $github->getOwnerName($providerInstallationId); + try { + $repositoryName = $github->getRepositoryName($providerRepositoryId) ?? ''; + if (empty($repositoryName)) { + throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); + } + } catch (RepositoryNotFound $e) { + throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); + } + + $files = $github->listRepositoryContents($owner, $repositoryName, $providerRootDirectory); + $files = \array_column($files, 'name'); + $languages = $github->listRepositoryLanguages($owner, $repositoryName); + + $detector = new Packager(); + foreach ($files as $file) { + $detector->addInput($file); + } + $detector + ->addOption(new Yarn()) + ->addOption(new PNPM()) + ->addOption(new NPM()); + $detection = $detector->detect(); + + $packager = !\is_null($detection) ? $detection->getName() : 'npm'; + + if ($type === 'framework') { + $packages = ''; + try { + $contentResponse = $github->getRepositoryContent($owner, $repositoryName, \rtrim($providerRootDirectory, '/') . '/package.json'); + $packages = $contentResponse['content'] ?? ''; + } catch (FileNotFound $e) { + // Continue detection without package.json + } + + $output = new Document([ + 'framework' => '', + 'installCommand' => '', + 'buildCommand' => '', + 'outputDirectory' => '', + ]); + + $detector = new Framework($packager); + $detector->addInput($packages, Framework::INPUT_PACKAGES); + foreach ($files as $file) { + $detector->addInput($file, Framework::INPUT_FILE); + } + + $detector + ->addOption(new Analog()) + ->addOption(new Angular()) + ->addOption(new Astro()) + ->addOption(new Flutter()) + ->addOption(new Lynx()) + ->addOption(new NextJs()) + ->addOption(new Nuxt()) + ->addOption(new React()) + ->addOption(new ReactNative()) + ->addOption(new Remix()) + ->addOption(new Svelte()) + ->addOption(new SvelteKit()) + ->addOption(new TanStackStart()) + ->addOption(new Vue()); + + $framework = $detector->detect(); + + if (!\is_null($framework)) { + $output->setAttribute('installCommand', $framework->getInstallCommand()); + $output->setAttribute('buildCommand', $framework->getBuildCommand()); + $output->setAttribute('outputDirectory', $framework->getOutputDirectory()); + $framework = $framework->getName(); + } else { + $framework = 'other'; + $output->setAttribute('installCommand', ''); + $output->setAttribute('buildCommand', ''); + $output->setAttribute('outputDirectory', ''); + } + + $frameworks = Config::getParam('frameworks'); + if (!\in_array($framework, \array_keys($frameworks), true)) { + $framework = 'other'; + } + $output->setAttribute('framework', $framework); + } else { + $output = new Document([ + 'runtime' => '', + 'commands' => '', + 'entrypoint' => '', + ]); + + $strategies = [ + new Strategy(Strategy::FILEMATCH), + new Strategy(Strategy::LANGUAGES), + new Strategy(Strategy::EXTENSION), + ]; + + foreach ($strategies as $strategy) { + $detector = new Runtime($strategy, $packager); + + if ($strategy->getValue() === Strategy::LANGUAGES) { + foreach ($languages as $language) { + $detector->addInput($language); + } + } else { + foreach ($files as $file) { + $detector->addInput($file); + } + } + + $detector + ->addOption(new Node()) + ->addOption(new Bun()) + ->addOption(new Deno()) + ->addOption(new PHP()) + ->addOption(new Python()) + ->addOption(new Dart()) + ->addOption(new Swift()) + ->addOption(new Ruby()) + ->addOption(new Java()) + ->addOption(new CPP()) + ->addOption(new Dotnet()); + + $runtime = $detector->detect(); + + if (!\is_null($runtime)) { + $output->setAttribute('commands', $runtime->getCommands()); + $output->setAttribute('entrypoint', $runtime->getEntrypoint()); + $runtime = $runtime->getName(); + break; + } + } + + if (!empty($runtime)) { + $runtimes = Config::getParam('runtimes'); + $runtimeWithVersion = ''; + foreach ($runtimes as $runtimeKey => $runtimeConfig) { + if ($runtimeConfig['key'] === $runtime) { + $runtimeWithVersion = $runtimeKey; + } + } + + if (empty($runtimeWithVersion)) { + throw new Exception(Exception::FUNCTION_RUNTIME_NOT_DETECTED); + } + + $output->setAttribute('runtime', $runtimeWithVersion); + } else { + throw new Exception(Exception::FUNCTION_RUNTIME_NOT_DETECTED); + } + } + + $wg = new WaitGroup(); + $envs = []; + foreach ($files as $file) { + if (!(\str_starts_with($file, '.env'))) { + continue; + } + + $wg->add(); + go(function () use ($github, $owner, $repositoryName, $providerRootDirectory, $file, $wg, &$envs) { + try { + $contentResponse = $github->getRepositoryContent($owner, $repositoryName, \rtrim($providerRootDirectory, '/') . '/' . $file); + $envFile = $contentResponse['content'] ?? ''; + + $configAdapter = new ConfigDotenv(); + try { + $envObject = $configAdapter->parse($envFile); + foreach ($envObject as $envName => $envValue) { + $envs[$envName] = $envValue; + } + } catch (Parse $err) { + // Silence error, so rest of endpoint can return + } + } finally { + $wg->done(); + } + }); + } + $wg->wait(); + + $variables = []; + foreach ($envs as $key => $value) { + $variables[] = [ + 'name' => $key, + 'value' => $value, + ]; + } + + $output->setAttribute('variables', $variables); + + $response->dynamic($output, $type === 'framework' ? Response::MODEL_DETECTION_FRAMEWORK : Response::MODEL_DETECTION_RUNTIME); + } +} diff --git a/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Get.php b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Get.php new file mode 100644 index 0000000000..4dee84752b --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/Get.php @@ -0,0 +1,96 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/vcs/github/installations/:installationId/providerRepositories/:providerRepositoryId') + ->desc('Get repository') + ->groups(['api', 'vcs']) + ->label('scope', 'vcs.read') + ->label('resourceType', RESOURCE_TYPE_VCS) + ->label('sdk', new Method( + namespace: 'vcs', + group: 'repositories', + name: 'getRepository', + description: '/docs/references/vcs/get-repository.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_PROVIDER_REPOSITORY, + ) + ] + )) + ->param('installationId', '', new Text(256), 'Installation Id') + ->param('providerRepositoryId', '', new Text(256), 'Repository Id') + ->inject('gitHub') + ->inject('response') + ->inject('dbForPlatform') + ->callback($this->action(...)); + } + + public function action( + string $installationId, + string $providerRepositoryId, + GitHub $github, + Response $response, + Database $dbForPlatform + ) { + $installation = $dbForPlatform->getDocument('installations', $installationId); + + if ($installation->isEmpty()) { + throw new Exception(Exception::INSTALLATION_NOT_FOUND); + } + + $providerInstallationId = $installation->getAttribute('providerInstallationId'); + $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); + $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); + $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); + + $owner = $github->getOwnerName($providerInstallationId) ?? ''; + try { + $repositoryName = $github->getRepositoryName($providerRepositoryId) ?? ''; + if (empty($repositoryName)) { + throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); + } + } catch (RepositoryNotFound $e) { + throw new Exception(Exception::PROVIDER_REPOSITORY_NOT_FOUND); + } + + $repository = $github->getRepository($owner, $repositoryName); + + $repository['id'] = \strval($repository['id']) ?? ''; + $repository['pushedAt'] = $repository['pushed_at'] ?? ''; + $repository['organization'] = $installation->getAttribute('organization', ''); + $repository['provider'] = $installation->getAttribute('provider', ''); + $repository['defaultBranch'] = $repository['default_branch'] ?? ''; + + $response->dynamic(new Document($repository), Response::MODEL_PROVIDER_REPOSITORY); + } +} diff --git a/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/XList.php b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/XList.php new file mode 100644 index 0000000000..9acc77e1f2 --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Http/Installations/Repositories/XList.php @@ -0,0 +1,319 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/vcs/github/installations/:installationId/providerRepositories') + ->desc('List repositories') + ->groups(['api', 'vcs']) + ->label('scope', 'vcs.read') + ->label('resourceType', RESOURCE_TYPE_VCS) + ->label('sdk', new Method( + namespace: 'vcs', + group: 'repositories', + name: 'listRepositories', + description: '/docs/references/vcs/list-repositories.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_PROVIDER_REPOSITORY_RUNTIME_LIST, + ), + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_PROVIDER_REPOSITORY_FRAMEWORK_LIST, + ) + ] + )) + ->param('installationId', '', new Text(256), 'Installation Id') + ->param('type', '', new WhiteList(['runtime', 'framework']), 'Detector type. Must be one of the following: runtime, framework') + ->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true) + ->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true) + ->inject('gitHub') + ->inject('response') + ->inject('dbForPlatform') + ->callback($this->action(...)); + } + + public function action( + string $installationId, + string $type, + string $search, + array $queries, + GitHub $github, + Response $response, + Database $dbForPlatform + ) { + if (empty($search)) { + $search = ""; + } + + $installation = $dbForPlatform->getDocument('installations', $installationId); + + if ($installation->isEmpty()) { + throw new Exception(Exception::INSTALLATION_NOT_FOUND); + } + + $providerInstallationId = $installation->getAttribute('providerInstallationId'); + $privateKey = System::getEnv('_APP_VCS_GITHUB_PRIVATE_KEY'); + $githubAppId = System::getEnv('_APP_VCS_GITHUB_APP_ID'); + $github->initializeVariables($providerInstallationId, $privateKey, $githubAppId); + + $queries = Query::parseQueries($queries); + $limitQuery = current(array_filter($queries, fn ($query) => $query->getMethod() === Query::TYPE_LIMIT)); + $offsetQuery = current(array_filter($queries, fn ($query) => $query->getMethod() === Query::TYPE_OFFSET)); + + $limit = !empty($limitQuery) ? $limitQuery->getValue() : 4; + $offset = !empty($offsetQuery) ? $offsetQuery->getValue() : 0; + + if ($offset % $limit !== 0) { + throw new Exception(Exception::GENERAL_ARGUMENT_INVALID, 'offset must be a multiple of the limit'); + } + + $page = ($offset / $limit) + 1; + $owner = $github->getOwnerName($providerInstallationId); + ['items' => $repos, 'total' => $total] = $github->searchRepositories($owner, $page, $limit, $search); + + $repos = \array_map(function ($repo) use ($installation) { + $repo['id'] = \strval($repo['id'] ?? ''); + $repo['pushedAt'] = $repo['pushed_at'] ?? null; + $repo['provider'] = $installation->getAttribute('provider', '') ?? ''; + $repo['organization'] = $installation->getAttribute('organization', '') ?? ''; + return $repo; + }, $repos); + + $repos = batch(\array_map(function ($repo) use ($type, $github) { + return function () use ($repo, $type, $github) { + $files = $github->listRepositoryContents($repo['organization'], $repo['name'], ''); + $files = \array_column($files, 'name'); + + $detector = new Packager(); + foreach ($files as $file) { + $detector->addInput($file); + } + $detector + ->addOption(new Yarn()) + ->addOption(new PNPM()) + ->addOption(new NPM()); + $detection = $detector->detect(); + + $packager = !\is_null($detection) ? $detection->getName() : 'npm'; + + if ($type === 'framework') { + $packages = ''; + try { + $contentResponse = $github->getRepositoryContent($repo['organization'], $repo['name'], 'package.json'); + $packages = $contentResponse['content'] ?? ''; + } catch (FileNotFound $e) { + // Continue detection without package.json + } + + $frameworkDetector = new Framework($packager); + $frameworkDetector->addInput($packages, Framework::INPUT_PACKAGES); + foreach ($files as $file) { + $frameworkDetector->addInput($file, Framework::INPUT_FILE); + } + + $frameworkDetector + ->addOption(new Analog()) + ->addOption(new Angular()) + ->addOption(new Astro()) + ->addOption(new Flutter()) + ->addOption(new Lynx()) + ->addOption(new NextJs()) + ->addOption(new Nuxt()) + ->addOption(new React()) + ->addOption(new ReactNative()) + ->addOption(new Remix()) + ->addOption(new Svelte()) + ->addOption(new SvelteKit()) + ->addOption(new TanStackStart()) + ->addOption(new Vue()); + + $detectedFramework = $frameworkDetector->detect(); + + if (!\is_null($detectedFramework)) { + $framework = $detectedFramework->getName(); + } else { + $framework = 'other'; + } + + $frameworks = Config::getParam('frameworks'); + if (!\in_array($framework, \array_keys($frameworks), true)) { + $framework = 'other'; + } + $repo['framework'] = $framework; + } else { + $languages = $github->listRepositoryLanguages($repo['organization'], $repo['name']); + + $strategies = [ + new Strategy(Strategy::FILEMATCH), + new Strategy(Strategy::LANGUAGES), + new Strategy(Strategy::EXTENSION), + ]; + + foreach ($strategies as $strategy) { + $detector = new Runtime($strategy, $packager); + if ($strategy->getValue() === Strategy::LANGUAGES) { + foreach ($languages as $language) { + $detector->addInput($language); + } + } else { + foreach ($files as $file) { + $detector->addInput($file); + } + } + $detector + ->addOption(new Node()) + ->addOption(new Bun()) + ->addOption(new Deno()) + ->addOption(new PHP()) + ->addOption(new Python()) + ->addOption(new Dart()) + ->addOption(new Swift()) + ->addOption(new Ruby()) + ->addOption(new Java()) + ->addOption(new CPP()) + ->addOption(new Dotnet()); + + $runtime = $detector->detect(); + + if (!\is_null($runtime)) { + $runtime = $runtime->getName(); + break; + } + } + + if (!empty($runtime)) { + $runtimes = Config::getParam('runtimes'); + $runtimeWithVersion = ''; + foreach ($runtimes as $runtimeKey => $runtimeConfig) { + if ($runtimeConfig['key'] === $runtime) { + $runtimeWithVersion = $runtimeKey; + } + } + + $repo['runtime'] = $runtimeWithVersion ?? ''; + } + } + + $wg = new WaitGroup(); + $envs = []; + foreach ($files as $file) { + if (!(\str_starts_with($file, '.env'))) { + continue; + } + + $wg->add(); + go(function () use ($github, $repo, $file, $wg, &$envs) { + try { + $contentResponse = $github->getRepositoryContent($repo['organization'], $repo['name'], $file); + $envFile = $contentResponse['content'] ?? ''; + + $configAdapter = new ConfigDotenv(); + try { + $envObject = $configAdapter->parse($envFile); + foreach ($envObject as $envName => $envValue) { + $envs[$envName] = $envValue; + } + } catch (Parse) { + // Silence error, so rest of endpoint can return + } + } finally { + $wg->done(); + } + }); + } + $wg->wait(); + + $repo['variables'] = []; + foreach ($envs as $key => $value) { + $repo['variables'][] = [ + 'name' => $key, + 'value' => $value, + ]; + } + + return $repo; + }; + }, $repos)); + + $repos = \array_map(function ($repo) { + return new Document($repo); + }, $repos); + + $response->dynamic(new Document([ + $type === 'framework' ? 'frameworkProviderRepositories' : 'runtimeProviderRepositories' => $repos, + 'total' => $total, + ]), ($type === 'framework') ? Response::MODEL_PROVIDER_REPOSITORY_FRAMEWORK_LIST : Response::MODEL_PROVIDER_REPOSITORY_RUNTIME_LIST); + } +} diff --git a/src/Appwrite/Platform/Modules/VCS/Http/Installations/XList.php b/src/Appwrite/Platform/Modules/VCS/Http/Installations/XList.php new file mode 100644 index 0000000000..628459fb27 --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Http/Installations/XList.php @@ -0,0 +1,120 @@ +setHttpMethod(Action::HTTP_REQUEST_METHOD_GET) + ->setHttpPath('/v1/vcs/installations') + ->desc('List installations') + ->groups(['api', 'vcs']) + ->label('scope', 'vcs.read') + ->label('resourceType', RESOURCE_TYPE_VCS) + ->label('sdk', new Method( + namespace: 'vcs', + group: 'installations', + name: 'listInstallations', + description: '/docs/references/vcs/list-installations.md', + auth: [AuthType::ADMIN], + responses: [ + new SDKResponse( + code: Response::STATUS_CODE_OK, + model: Response::MODEL_INSTALLATION_LIST, + ) + ] + )) + ->param('queries', [], new Installations(), '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(', ', Installations::ALLOWED_ATTRIBUTES), true) + ->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true) + ->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true) + ->inject('response') + ->inject('project') + ->inject('dbForPlatform') + ->callback($this->action(...)); + } + + public function action( + array $queries, + string $search, + bool $includeTotal, + Response $response, + Document $project, + Database $dbForPlatform + ) { + try { + $queries = Query::parseQueries($queries); + } catch (QueryException $e) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage()); + } + + $queries[] = Query::equal('projectInternalId', [$project->getSequence()]); + + if (!empty($search)) { + $queries[] = Query::search('search', $search); + } + + /** + * Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries + */ + $cursor = \array_filter($queries, function ($query) { + return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]); + }); + $cursor = reset($cursor); + if ($cursor) { + /** @var Query $cursor */ + + $validator = new Cursor(); + if (!$validator->isValid($cursor)) { + throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription()); + } + + $installationId = $cursor->getValue(); + $cursorDocument = $dbForPlatform->getDocument('installations', $installationId); + + if ($cursorDocument->isEmpty()) { + throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "Installation '{$installationId}' for the 'cursor' value not found."); + } + + $cursor->setValue($cursorDocument); + } + + $filterQueries = Query::groupByType($queries)['filters']; + try { + $results = $dbForPlatform->find('installations', $queries); + $total = $includeTotal ? $dbForPlatform->count('installations', $filterQueries, APP_LIMIT_COUNT) : 0; + } catch (OrderException $e) { + throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null."); + } + + $response->dynamic(new Document([ + 'installations' => $results, + 'total' => $total, + ]), Response::MODEL_INSTALLATION_LIST); + } +} diff --git a/src/Appwrite/Platform/Modules/VCS/Module.php b/src/Appwrite/Platform/Modules/VCS/Module.php new file mode 100644 index 0000000000..9f43a83da9 --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Module.php @@ -0,0 +1,14 @@ +addService('http', new Http()); + } +} diff --git a/src/Appwrite/Platform/Modules/VCS/Services/Http.php b/src/Appwrite/Platform/Modules/VCS/Services/Http.php new file mode 100644 index 0000000000..8bd2314f9e --- /dev/null +++ b/src/Appwrite/Platform/Modules/VCS/Services/Http.php @@ -0,0 +1,41 @@ +type = Service::TYPE_HTTP; + + // GitHub Authorization & Callback + $this->addAction(GetGitHubAuthorize::getName(), new GetGitHubAuthorize()); + $this->addAction(GetGitHubCallback::getName(), new GetGitHubCallback()); + + // Installations + $this->addAction(GetInstallation::getName(), new GetInstallation()); + $this->addAction(ListInstallations::getName(), new ListInstallations()); + $this->addAction(DeleteInstallation::getName(), new DeleteInstallation()); + + // Repositories + $this->addAction(CreateRepository::getName(), new CreateRepository()); + $this->addAction(GetRepository::getName(), new GetRepository()); + $this->addAction(ListRepositories::getName(), new ListRepositories()); + $this->addAction(ListRepositoryBranches::getName(), new ListRepositoryBranches()); + $this->addAction(GetRepositoryContents::getName(), new GetRepositoryContents()); + $this->addAction(CreateRepositoryDetections::getName(), new CreateRepositoryDetections()); + } +} diff --git a/src/Appwrite/Platform/Services/Workers.php b/src/Appwrite/Platform/Services/Workers.php index f2cbeb390a..fa77725f7a 100644 --- a/src/Appwrite/Platform/Services/Workers.php +++ b/src/Appwrite/Platform/Services/Workers.php @@ -5,6 +5,7 @@ namespace Appwrite\Platform\Services; use Appwrite\Platform\Workers\Audits; use Appwrite\Platform\Workers\Certificates; use Appwrite\Platform\Workers\Deletes; +use Appwrite\Platform\Workers\Executions; use Appwrite\Platform\Workers\Functions; use Appwrite\Platform\Workers\Mails; use Appwrite\Platform\Workers\Messaging; @@ -23,6 +24,7 @@ class Workers extends Service ->addAction(Audits::getName(), new Audits()) ->addAction(Certificates::getName(), new Certificates()) ->addAction(Deletes::getName(), new Deletes()) + ->addAction(Executions::getName(), new Executions()) ->addAction(Functions::getName(), new Functions()) ->addAction(Mails::getName(), new Mails()) ->addAction(Messaging::getName(), new Messaging()) diff --git a/src/Appwrite/Platform/Tasks/Doctor.php b/src/Appwrite/Platform/Tasks/Doctor.php index 02eadd903b..8ac1e1121b 100644 --- a/src/Appwrite/Platform/Tasks/Doctor.php +++ b/src/Appwrite/Platform/Tasks/Doctor.php @@ -6,12 +6,12 @@ use Appwrite\ClamAV\Network; use Appwrite\PubSub\Adapter\Pool as PubSubPool; use PHPMailer\PHPMailer\PHPMailer; use Utopia\Cache\Adapter\Pool as CachePool; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Adapter\Pool as DatabasePool; use Utopia\Domains\Domain; use Utopia\DSN\DSN; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Logger\Logger; use Utopia\Platform\Action; use Utopia\Pools\Group; diff --git a/src/Appwrite/Platform/Tasks/Install.php b/src/Appwrite/Platform/Tasks/Install.php index e51ea3188a..5f584ef972 100644 --- a/src/Appwrite/Platform/Tasks/Install.php +++ b/src/Appwrite/Platform/Tasks/Install.php @@ -7,8 +7,8 @@ use Appwrite\Docker\Env; use Appwrite\Utopia\View; use Utopia\Auth\Proofs\Password; use Utopia\Auth\Proofs\Token; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Platform\Action; use Utopia\Validator\Boolean; use Utopia\Validator\Text; @@ -32,10 +32,11 @@ class Install extends Action ->param('image', 'appwrite', new Text(0), 'Main appwrite docker image', true) ->param('interactive', 'Y', new Text(1), 'Run an interactive session', true) ->param('no-start', false, new Boolean(true), 'Run an interactive session', true) + ->param('database', 'mariadb', new Text(0), 'Database to use (mariadb|postgresql)', true) ->callback($this->action(...)); } - public function action(string $httpPort, string $httpsPort, string $organization, string $image, string $interactive, bool $noStart): void + public function action(string $httpPort, string $httpsPort, string $organization, string $image, string $interactive, bool $noStart, string $database): void { $config = Config::getParam('variables'); $defaultHTTPPort = '80'; @@ -138,6 +139,7 @@ class Install extends Action } } + if (empty($httpPort)) { $httpPort = Console::confirm('Choose your server HTTP port: (default: ' . $defaultHTTPPort . ')'); $httpPort = ($httpPort) ? $httpPort : $defaultHTTPPort; @@ -226,6 +228,11 @@ class Install extends Action continue; } + if ($var['name'] === '_APP_DB_ADAPTER' && $data !== false) { + $input[$var['name']] = $database; + continue; + } + $input[$var['name']] = Console::confirm($var['question'] . ' (default: \'' . $var['default'] . '\')'); if (empty($input[$var['name']])) { @@ -242,17 +249,25 @@ class Install extends Action } } } + $database = $input['_APP_DB_ADAPTER']; + if ($database === 'postgresql') { + $input['_APP_DB_HOST'] = 'postgresql'; + $input['_APP_DB_PORT'] = 5432; + } elseif ($database === 'mariadb') { + $input['_APP_DB_HOST'] = 'mariadb'; + $input['_APP_DB_PORT'] = 3306; + } $templateForCompose = new View(__DIR__ . '/../../../../app/views/install/compose.phtml'); $templateForEnv = new View(__DIR__ . '/../../../../app/views/install/env.phtml'); - $templateForCompose ->setParam('httpPort', $httpPort) ->setParam('httpsPort', $httpsPort) ->setParam('version', APP_VERSION_STABLE) ->setParam('organization', $organization) ->setParam('image', $image) - ->setParam('enableAssistant', $enableAssistant); + ->setParam('enableAssistant', $enableAssistant) + ->setParam('database', $database); $templateForEnv->setParam('vars', $input); diff --git a/src/Appwrite/Platform/Tasks/Interval.php b/src/Appwrite/Platform/Tasks/Interval.php index 6a11881ad1..38fc611465 100644 --- a/src/Appwrite/Platform/Tasks/Interval.php +++ b/src/Appwrite/Platform/Tasks/Interval.php @@ -7,7 +7,7 @@ use DateTime; use Swoole\Coroutine\Channel; use Swoole\Process; use Swoole\Timer; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime as DatabaseDateTime; use Utopia\Database\Document; diff --git a/src/Appwrite/Platform/Tasks/Maintenance.php b/src/Appwrite/Platform/Tasks/Maintenance.php index c0914c6544..2dace58d1d 100644 --- a/src/Appwrite/Platform/Tasks/Maintenance.php +++ b/src/Appwrite/Platform/Tasks/Maintenance.php @@ -6,7 +6,7 @@ use Appwrite\Event\Certificate; use Appwrite\Event\Delete; use DateInterval; use DateTime; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime as DatabaseDateTime; use Utopia\Database\Document; diff --git a/src/Appwrite/Platform/Tasks/Migrate.php b/src/Appwrite/Platform/Tasks/Migrate.php index d88e805fa8..cec2f6ec27 100644 --- a/src/Appwrite/Platform/Tasks/Migrate.php +++ b/src/Appwrite/Platform/Tasks/Migrate.php @@ -4,12 +4,12 @@ namespace Appwrite\Platform\Tasks; use Appwrite\Migration\Migration; use Redis; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception; use Utopia\Database\Validator\Authorization; -use Utopia\Http; +use Utopia\Http\Http; use Utopia\Platform\Action; use Utopia\Registry\Registry; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Tasks/QueueRetry.php b/src/Appwrite/Platform/Tasks/QueueRetry.php index 442fa39823..cd92ad8307 100644 --- a/src/Appwrite/Platform/Tasks/QueueRetry.php +++ b/src/Appwrite/Platform/Tasks/QueueRetry.php @@ -2,7 +2,7 @@ namespace Appwrite\Platform\Tasks; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Platform\Action; use Utopia\Queue\Publisher; use Utopia\Queue\Queue; diff --git a/src/Appwrite/Platform/Tasks/SDKs.php b/src/Appwrite/Platform/Tasks/SDKs.php index 013fae1193..f45435757b 100644 --- a/src/Appwrite/Platform/Tasks/SDKs.php +++ b/src/Appwrite/Platform/Tasks/SDKs.php @@ -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; @@ -23,8 +24,8 @@ use Appwrite\SDK\Language\Swift; use Appwrite\SDK\Language\Web; use Appwrite\SDK\SDK; use Appwrite\Spec\Swagger2; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Platform\Action; use Utopia\Validator\Nullable; use Utopia\Validator\Text; @@ -51,6 +52,7 @@ class SDKs extends Action 'graphql', 'rest', 'markdown', + 'agent-skills' ]; public static function getName(): string @@ -78,8 +80,11 @@ class SDKs extends Action ->callback($this->action(...)); } - public function action(?string $selectedPlatform, ?string $selectedSDK, ?string $version, ?string $git, ?string $message, ?string $release, ?string $commit, ?string $sdks): void + public function action(?string $platform, ?string $sdk, ?string $version, ?string $git, ?string $message, ?string $release, ?string $commit, ?string $sdks): void { + $selectedPlatform = $platform; + $selectedSDK = $sdk; + if (!$sdks) { $selectedPlatform ??= Console::confirm('Choose Platform ("' . implode('", "', static::getPlatforms()) . '" or "*" for all):'); $selectedSDK ??= \strtolower(Console::confirm('Choose SDK ("*" for all):')); @@ -281,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'); } @@ -573,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}"); } diff --git a/src/Appwrite/Platform/Tasks/SSL.php b/src/Appwrite/Platform/Tasks/SSL.php index 651cb4de11..ef8283f168 100644 --- a/src/Appwrite/Platform/Tasks/SSL.php +++ b/src/Appwrite/Platform/Tasks/SSL.php @@ -3,8 +3,12 @@ namespace Appwrite\Platform\Tasks; use Appwrite\Event\Certificate; -use Utopia\CLI\Console; +use Utopia\Console; +use Utopia\Database\Database; use Utopia\Database\Document; +use Utopia\Database\Helpers\ID; +use Utopia\Database\Query; +use Utopia\Domains\Domain; use Utopia\Platform\Action; use Utopia\System\System; use Utopia\Validator\Boolean; @@ -22,22 +26,85 @@ class SSL extends Action $this ->desc('Validate server certificates') ->param('domain', System::getEnv('_APP_DOMAIN', ''), new Hostname(), 'Domain to generate certificate for. If empty, main domain will be used.', true) - ->param('skip-check', true, new Boolean(true), 'If DNS and renew check should be skipped. Defaults to true, and when true, all jobs will result in certificate generation attempt.', true) + ->param('skip-check', 'true', new Boolean(true), 'If DNS and renew check should be skipped. Defaults to true, and when true, all jobs will result in certificate generation attempt.', true) + ->inject('console') + ->inject('dbForPlatform') ->inject('queueForCertificates') ->callback($this->action(...)); } - public function action(string $domain, bool|string $skipCheck, Certificate $queueForCertificates): void + public function action(string $domain, bool|string $skipCheck, Document $console, Database $dbForPlatform, Certificate $queueForCertificates): void { - $skipCheck = \strval($skipCheck) === 'true'; + $domain = new Domain(!empty($domain) ? $domain : ''); + if (!$domain->isKnown() || $domain->isTest()) { + Console::error('Domain is not known or is a test domain: ' . $domain->get()); + return; + } - Console::success('Scheduling a job to issue a TLS certificate for domain: ' . $domain); + $skipCheck = \strval($skipCheck) === 'true'; + $isMd5 = System::getEnv('_APP_RULES_FORMAT') === 'md5'; + + $rule = $isMd5 + ? $dbForPlatform->getDocument('rules', md5($domain->get())) + : $dbForPlatform->findOne('rules', [ + Query::equal('domain', [$domain->get()]), + ]); + + if ($rule->isEmpty()) { + $owner = ''; + + // Mark owner as Appwrite if its appwrite-owned domain + $appwriteDomains = []; + $appwriteDomainEnvs = [ + System::getEnv('_APP_DOMAIN_FUNCTIONS_FALLBACK', ''), + System::getEnv('_APP_DOMAIN_FUNCTIONS', ''), + System::getEnv('_APP_DOMAIN_SITES', ''), + ]; + foreach ($appwriteDomainEnvs as $appwriteDomainEnv) { + foreach (\explode(',', $appwriteDomainEnv) as $appwriteDomain) { + if (empty($appwriteDomain)) { + continue; + } + $appwriteDomains[] = $appwriteDomain; + } + } + + foreach ($appwriteDomains as $appwriteDomain) { + if (\str_ends_with($domain->get(), $appwriteDomain)) { + $owner = 'Appwrite'; + break; + } + } + + $ruleId = $isMd5 ? md5($domain->get()) : ID::unique(); + $rule = $dbForPlatform->createDocument('rules', new Document([ + '$id' => $ruleId, + 'domain' => $domain->get(), + 'type' => 'api', + 'status' => RULE_STATUS_CERTIFICATE_GENERATING, + 'projectId' => $console->getId(), + 'projectInternalId' => $console->getSequence(), + 'search' => implode(' ', [$ruleId, $domain->get()]), + 'owner' => $owner, + 'region' => $console->getAttribute('region') + ])); + + Console::info('Rule ' . $rule->getId() . ' created for domain: ' . $domain->get()); + } else { + $rule = $dbForPlatform->updateDocument('rules', $rule->getId(), new Document([ + 'status' => RULE_STATUS_CERTIFICATE_GENERATING, + ])); + + Console::info('Updated existing rule ' . $rule->getId() . ' for domain: ' . $domain->get()); + } $queueForCertificates ->setDomain(new Document([ - 'domain' => $domain + 'domain' => $domain->get() ])) ->setSkipRenewCheck($skipCheck) ->trigger(); + + Console::success('Scheduled a job to issue a TLS certificate for domain: ' . $domain->get()); } } diff --git a/src/Appwrite/Platform/Tasks/ScheduleBase.php b/src/Appwrite/Platform/Tasks/ScheduleBase.php index 19ed3bc099..cfcdc2503e 100644 --- a/src/Appwrite/Platform/Tasks/ScheduleBase.php +++ b/src/Appwrite/Platform/Tasks/ScheduleBase.php @@ -3,7 +3,7 @@ namespace Appwrite\Platform\Tasks; use Swoole\Timer; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; diff --git a/src/Appwrite/Platform/Tasks/ScheduleFunctions.php b/src/Appwrite/Platform/Tasks/ScheduleFunctions.php index 7fda2f75df..88725a190a 100644 --- a/src/Appwrite/Platform/Tasks/ScheduleFunctions.php +++ b/src/Appwrite/Platform/Tasks/ScheduleFunctions.php @@ -4,7 +4,7 @@ namespace Appwrite\Platform\Tasks; use Appwrite\Event\Func; use Cron\CronExpression; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; diff --git a/src/Appwrite/Platform/Tasks/Screenshot.php b/src/Appwrite/Platform/Tasks/Screenshot.php index 71adb285c7..59e0b11c89 100644 --- a/src/Appwrite/Platform/Tasks/Screenshot.php +++ b/src/Appwrite/Platform/Tasks/Screenshot.php @@ -8,8 +8,8 @@ namespace Appwrite\Platform\Tasks; use Appwrite\ID; use Tests\E2E\Client; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Platform\Action; use Utopia\System\System; use Utopia\Validator\Text; diff --git a/src/Appwrite/Platform/Tasks/Specs.php b/src/Appwrite/Platform/Tasks/Specs.php index 57051f24f4..02d83e6d48 100644 --- a/src/Appwrite/Platform/Tasks/Specs.php +++ b/src/Appwrite/Platform/Tasks/Specs.php @@ -14,14 +14,14 @@ use Swoole\Http\Request as SwooleRequest; use Swoole\Http\Response as SwooleResponse; use Utopia\Cache\Adapter\None; use Utopia\Cache\Cache; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Adapter\MySQL; use Utopia\Database\Database; -use Utopia\Http; +use Utopia\Http\Http; +use Utopia\Http\Request as UtopiaRequest; +use Utopia\Http\Response as UtopiaResponse; use Utopia\Platform\Action; -use Utopia\Request as UtopiaRequest; -use Utopia\Response as UtopiaResponse; use Utopia\System\System; use Utopia\Validator\Text; use Utopia\Validator\WhiteList; diff --git a/src/Appwrite/Platform/Tasks/StatsResources.php b/src/Appwrite/Platform/Tasks/StatsResources.php index 6d04d2109a..6c0e8da48b 100644 --- a/src/Appwrite/Platform/Tasks/StatsResources.php +++ b/src/Appwrite/Platform/Tasks/StatsResources.php @@ -4,7 +4,7 @@ namespace Appwrite\Platform\Tasks; use Appwrite\Event\StatsResources as EventStatsResources; use Appwrite\Platform\Action; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Query; @@ -47,7 +47,7 @@ class StatsResources extends Action ->callback($this->action(...)); } - public function action(Database $dbForPlatform, callable $logError, EventStatsResources $queue): void + public function action(Database $dbForPlatform, callable $logError, EventStatsResources $queueForStatsResources): void { $this->logError = $logError; $this->dbForPlatform = $dbForPlatform; @@ -60,7 +60,7 @@ class StatsResources extends Action $interval = (int) System::getEnv('_APP_STATS_RESOURCES_INTERVAL', '3600'); - Console::loop(function () use ($queue, $dbForPlatform) { + Console::loop(function () use ($queueForStatsResources, $dbForPlatform) { $last24Hours = (new \DateTime())->sub(\DateInterval::createFromDateString('24 hours')); /** @@ -69,8 +69,8 @@ class StatsResources extends Action $this->foreachDocument($this->dbForPlatform, 'projects', [ Query::greaterThanEqual('accessedAt', DateTime::format($last24Hours)), Query::equal('region', [System::getEnv('_APP_REGION', 'default')]) - ], function ($project) use ($queue) { - $queue + ], function ($project) use ($queueForStatsResources) { + $queueForStatsResources ->setProject($project) ->trigger(); Console::success('project: ' . $project->getId() . '(' . $project->getSequence() . ')' . ' queued'); diff --git a/src/Appwrite/Platform/Tasks/Upgrade.php b/src/Appwrite/Platform/Tasks/Upgrade.php index d6159d2718..df9257d329 100644 --- a/src/Appwrite/Platform/Tasks/Upgrade.php +++ b/src/Appwrite/Platform/Tasks/Upgrade.php @@ -2,7 +2,8 @@ namespace Appwrite\Platform\Tasks; -use Utopia\CLI\Console; +use Utopia\Console; +use Utopia\System\System; use Utopia\Validator\Boolean; use Utopia\Validator\Text; @@ -23,10 +24,11 @@ class Upgrade extends Install ->param('image', 'appwrite', new Text(0), 'Main appwrite docker image', true) ->param('interactive', 'Y', new Text(1), 'Run an interactive session', true) ->param('no-start', false, new Boolean(true), 'Run an interactive session', true) + ->param('database', 'mariadb', new Text(length: 0), 'Database to use (mariadb|postgresql)', true) ->callback($this->action(...)); } - public function action(string $httpPort, string $httpsPort, string $organization, string $image, string $interactive, bool $noStart): void + public function action(string $httpPort, string $httpsPort, string $organization, string $image, string $interactive, bool $noStart, string $database): void { // Check for previous installation $data = @file_get_contents($this->path . '/docker-compose.yml'); @@ -39,6 +41,7 @@ class Upgrade extends Install Console::log(' └── docker-compose.yml'); Console::exit(1); } - parent::action($httpPort, $httpsPort, $organization, $image, $interactive, $noStart); + $database = System::getEnv('_APP_DB_ADAPTER', 'mariadb'); + parent::action($httpPort, $httpsPort, $organization, $image, $interactive, $noStart, $database); } } diff --git a/src/Appwrite/Platform/Tasks/Vars.php b/src/Appwrite/Platform/Tasks/Vars.php index 542b5bdc9f..e42330487b 100644 --- a/src/Appwrite/Platform/Tasks/Vars.php +++ b/src/Appwrite/Platform/Tasks/Vars.php @@ -2,8 +2,8 @@ namespace Appwrite\Platform\Tasks; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Platform\Action; use Utopia\System\System; diff --git a/src/Appwrite/Platform/Tasks/Version.php b/src/Appwrite/Platform/Tasks/Version.php index 25e2d13c65..c344039b0b 100644 --- a/src/Appwrite/Platform/Tasks/Version.php +++ b/src/Appwrite/Platform/Tasks/Version.php @@ -2,7 +2,7 @@ namespace Appwrite\Platform\Tasks; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Platform\Action; use Utopia\System\System; diff --git a/src/Appwrite/Platform/Workers/Audits.php b/src/Appwrite/Platform/Workers/Audits.php index 91dbb7cb00..d7c57c7fed 100644 --- a/src/Appwrite/Platform/Workers/Audits.php +++ b/src/Appwrite/Platform/Workers/Audits.php @@ -4,7 +4,7 @@ namespace Appwrite\Platform\Workers; use Exception; use Throwable; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Document; use Utopia\Database\Exception\Authorization; use Utopia\Database\Exception\Structure; diff --git a/src/Appwrite/Platform/Workers/Certificates.php b/src/Appwrite/Platform/Workers/Certificates.php index bfa6bf87c7..7de67a2b66 100644 --- a/src/Appwrite/Platform/Workers/Certificates.php +++ b/src/Appwrite/Platform/Workers/Certificates.php @@ -15,7 +15,7 @@ use Appwrite\Template\Template; use Appwrite\Utopia\Response\Model\Rule; use Exception; use Throwable; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; @@ -153,11 +153,11 @@ class Certificates extends Action ): void { // Get rule $rule = System::getEnv('_APP_RULES_FORMAT') === 'md5' - ? $authorization->skip(fn () => $dbForPlatform->getDocument('rules', md5($domain->get()))) - : $authorization->skip(fn () => $dbForPlatform->findOne('rules', [ + ? $dbForPlatform->getDocument('rules', md5($domain->get())) + : $dbForPlatform->findOne('rules', [ Query::equal('domain', [$domain->get()]), Query::limit(1), - ])); + ]); // Skip if rule is not desired state (created but not verified yet). if ($rule->getAttribute('status', '') !== RULE_STATUS_CREATED) { @@ -177,7 +177,10 @@ class Certificates extends Action Console::success('Domain verification succeeded.'); } catch (AppwriteException $err) { Console::warning('Domain verification failed: ' . $err->getMessage()); - $rule->setAttribute('logs', $err->getMessage()); + $date = \date('H:i:s'); + $logs = "\033[90m[{$date}] \033[31mDNS verification failed: \033[0m\n"; + $logs .= \mb_strcut($err->getMessage(), 0, 500000); // Limit to 500kb + $rule->setAttribute('logs', $logs); } finally { // Update rule and emit events $this->updateRuleAndSendEvents($rule, $dbForPlatform, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime); @@ -269,11 +272,11 @@ class Certificates extends Action // Get rule document for domain // TODO: (@Meldiron) Remove after 1.7.x migration $rule = System::getEnv('_APP_RULES_FORMAT') === 'md5' - ? $authorization->skip(fn () => $dbForPlatform->getDocument('rules', md5($domain->get()))) - : $authorization->skip(fn () => $dbForPlatform->findOne('rules', [ + ? $dbForPlatform->getDocument('rules', md5($domain->get())) + : $dbForPlatform->findOne('rules', [ Query::equal('domain', [$domain->get()]), Query::limit(1), - ])); + ]); // Rule not found (or) not in the expected state if ($rule->isEmpty() || !\in_array($rule->getAttribute('status'), [RULE_STATUS_CERTIFICATE_GENERATING, RULE_STATUS_VERIFIED])) { @@ -290,9 +293,11 @@ class Certificates extends Action $certificate->setAttribute('domain', $domain->get()); } + $date = \date('H:i:s'); + $logs = "\033[90m[{$date}] \033[97mProcessing SSL certificate issuance. \033[0m\n"; + try { - $date = \date('H:i:s'); - $certificate->setAttribute('logs', "\033[90m[{$date}] \033[97mCertificate generation started. \033[0m\n"); + $certificate->setAttribute('logs', $logs); // Persist ASAP so that logs are reset in retry flow and user can see the latest logs on Console. $certificate = $this->upsertCertificate($rule, $certificate, $dbForPlatform); @@ -314,10 +319,16 @@ class Certificates extends Action $certName = ID::unique(); $renewDate = $certificates->issueCertificate($certName, $domain->get(), $domainType); + $date = \date('H:i:s'); // If certificate is generated instantly, we can mark the rule as 'verified'. if ($certificates->isInstantGeneration($domain->get(), $domainType)) { $rule->setAttribute('status', RULE_STATUS_VERIFIED); - $certificate->setAttribute('logs', 'Certificate successfully generated.'); + $logs .= "\033[90m[{$date}] \033[97mSSL certificate successfully issued. \033[0m\n"; + $certificate->setAttribute('logs', $logs); + } else { + // Delayed generation: third-party handles certificate issuance asynchronously + $logs .= "\033[90m[{$date}] \033[97mSSL certificate is being issued. This usually takes a few minutes — no action needed on your end. We'll periodically check and update the status. \033[0m\n"; + $certificate->setAttribute('logs', $logs); } $certificate->setAttributes([ @@ -326,16 +337,14 @@ class Certificates extends Action 'renewDate' => $renewDate, ]); } catch (Throwable $e) { - $logs = $e->getMessage(); - $currentLogs = $certificate->getAttribute('logs', ''); $date = \date('H:i:s'); - $errorMessage = "\033[90m[{$date}] \033[31mCertificate generation failed: \033[0m\n"; + $logs .= "\033[90m[{$date}] \033[31mSSL certificate issuance failed: \033[0m\n"; + $logs .= \mb_strcut($e->getMessage(), 0, 500000); // Limit to 500kb $attempts = $certificate->getAttribute('attempts', 0) + 1; // Increase attempts count // Update attributes on certificate document $certificate->setAttributes([ - 'logs' => $currentLogs . $errorMessage . \mb_strcut($logs, 0, 500000), // Limit to 500kb 'attempts' => $attempts, 'renewDate' => DateTime::now(), // Store current time as renew date to ensure another attempt in next maintenance cycle. ]); @@ -348,14 +357,13 @@ class Certificates extends Action throw $e; } finally { - // All actions result in new 'updated' date - $certificate->setAttribute('updated', DateTime::now()); - // Save certificate document to database + // Update certificate document with logs + $certificate->setAttribute('logs', $logs); $this->upsertCertificate($rule, $certificate, $dbForPlatform); - // Ensure certificate is associated with the rule - $rule->setAttribute('certificateId', $certificate->getId()); // Update rule and emit events + $rule->setAttribute('certificateId', $certificate->getId()); + $rule->setAttribute('logs', $logs); $this->updateRuleAndSendEvents($rule, $dbForPlatform, $queueForEvents, $queueForWebhooks, $queueForFunctions, $queueForRealtime); } } @@ -469,11 +477,20 @@ class Certificates extends Action { $mainDomain = $validationDomain ?? $this->getMainDomain(); $isMainDomain = !isset($mainDomain) || $domain->get() === $mainDomain; - if (!$isMainDomain) { - $this->verifyRule($rule, $log); - } else { + + if ($isMainDomain) { // Main domain validation // TODO: Would be awesome to check A/AAAA record here. Maybe dry run? + return; + } + + try { + $this->verifyRule($rule, $log); + } catch (AppwriteException $err) { + $msg = $err->getMessage() . "\n"; + $msg .= "Verify your DNS records are correctly configured and try again.\n"; + $msg .= "If they're correct and it still fails, please retry after sometime. DNS records can take up to 48 hours to propagate.\n"; + throw new AppwriteException($err->getType(), $msg); } } diff --git a/src/Appwrite/Platform/Workers/Deletes.php b/src/Appwrite/Platform/Workers/Deletes.php index dc1775e8b0..a211ec12fd 100644 --- a/src/Appwrite/Platform/Workers/Deletes.php +++ b/src/Appwrite/Platform/Workers/Deletes.php @@ -13,8 +13,8 @@ use Utopia\Audit\Adapter\SQL; use Utopia\Audit\Audit; use Utopia\Cache\Adapter\Filesystem; use Utopia\Cache\Cache; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; @@ -974,7 +974,7 @@ class Deletes extends Action $deploymentIds = []; $this->deleteByGroup('deployments', [ Query::equal('resourceInternalId', [$siteInternalId]), - Query::equal('resourceType', ['site']), + Query::equal('resourceType', ['sites']), Query::orderAsc() ], $dbForProject, function (Document $document) use ($project, $certificates, $deviceForSites, $deviceForBuilds, $deviceForFiles, $dbForPlatform, &$deploymentInternalIds) { $deploymentInternalIds[] = $document->getSequence(); @@ -1062,7 +1062,7 @@ class Deletes extends Action $deploymentInternalIds = []; $this->deleteByGroup('deployments', [ Query::equal('resourceInternalId', [$functionInternalId]), - Query::equal('resourceType', ['function']), + Query::equal('resourceType', ['functions']), Query::orderAsc() ], $dbForProject, function (Document $document) use ($dbForPlatform, $project, $certificates, $deviceForFunctions, $deviceForBuilds, &$deploymentInternalIds) { $deploymentInternalIds[] = $document->getSequence(); @@ -1391,31 +1391,37 @@ class Deletes extends Action /** * @param Database $dbForPlatform * @param callable $getProjectDB - * @param Document $document + * @param Document $installation * @param Document $project * @return void * @throws Exception */ - private function deleteInstallation(Database $dbForPlatform, callable $getProjectDB, Document $document, Document $project): void + private function deleteInstallation(Database $dbForPlatform, callable $getProjectDB, Document $installation, Document $project): void { $dbForProject = $getProjectDB($project); - $this->listByGroup('functions', [ - Query::equal('installationInternalId', [$document->getSequence()]) - ], $dbForProject, function ($function) use ($dbForProject, $dbForPlatform) { - $dbForPlatform->deleteDocument('repositories', $function->getAttribute('repositoryId')); + // Cleanup sites and functions + foreach (['sites', 'functions'] as $collection) { + $this->listByGroup($collection, [ + Query::equal('installationInternalId', [$installation->getSequence()]) + ], $dbForProject, function ($document) use ($collection, $dbForProject, $dbForPlatform) { + $repositoryId = $document->getAttribute('repositoryId', ''); + if (!empty($repositoryId)) { + $dbForPlatform->deleteDocument('repositories', $repositoryId); + } - $function = $function - ->setAttribute('installationId', '') - ->setAttribute('installationInternalId', '') - ->setAttribute('providerRepositoryId', '') - ->setAttribute('providerBranch', '') - ->setAttribute('providerSilentMode', false) - ->setAttribute('providerRootDirectory', '') - ->setAttribute('repositoryId', '') - ->setAttribute('repositoryInternalId', ''); - $dbForProject->updateDocument('functions', $function->getId(), $function); - }); + $document = $document + ->setAttribute('installationId', '') + ->setAttribute('installationInternalId', '') + ->setAttribute('providerRepositoryId', '') + ->setAttribute('providerBranch', '') + ->setAttribute('providerSilentMode', false) + ->setAttribute('providerRootDirectory', '') + ->setAttribute('repositoryId', '') + ->setAttribute('repositoryInternalId', ''); + $dbForProject->updateDocument($collection, $document->getId(), $document); + }); + } } /** diff --git a/src/Appwrite/Platform/Workers/Executions.php b/src/Appwrite/Platform/Workers/Executions.php new file mode 100644 index 0000000000..d874e26267 --- /dev/null +++ b/src/Appwrite/Platform/Workers/Executions.php @@ -0,0 +1,52 @@ +desc('Executions worker') + ->groups(['executions']) + ->inject('message') + ->inject('dbForProject') + ->callback($this->action(...)); + } + + public function action( + Message $message, + Database $dbForProject, + ): void { + $payload = $message->getPayload() ?? []; + + if (empty($payload)) { + throw new Exception('Missing payload'); + } + + $execution = new Document($payload['execution'] ?? []); + + if ($execution->isEmpty()) { + throw new Exception('Missing execution'); + } + + $project = new Document($payload['project'] ?? []); + if ($project->getId() != '6862e6a6000cce69f9da') { + $dbForProject->upsertDocument('executions', $execution); + } + } +} diff --git a/src/Appwrite/Platform/Workers/Functions.php b/src/Appwrite/Platform/Workers/Functions.php index a0f4b65763..9f1f328fd6 100644 --- a/src/Appwrite/Platform/Workers/Functions.php +++ b/src/Appwrite/Platform/Workers/Functions.php @@ -4,6 +4,7 @@ namespace Appwrite\Platform\Workers; use Ahc\Jwt\JWT; use Appwrite\Event\Event; +use Appwrite\Event\Execution as ExecutionEvent; use Appwrite\Event\Func; use Appwrite\Event\Realtime; use Appwrite\Event\StatsUsage; @@ -12,12 +13,10 @@ use Appwrite\Extend\Exception as AppwriteException; use Appwrite\Utopia\Response\Model\Execution; use Exception; use Executor\Executor; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; -use Utopia\Database\Exception\Conflict; -use Utopia\Database\Exception\Structure; use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; @@ -50,6 +49,7 @@ class Functions extends Action ->inject('queueForRealtime') ->inject('queueForEvents') ->inject('queueForStatsUsage') + ->inject('queueForExecutions') ->inject('log') ->inject('executor') ->inject('isResourceBlocked') @@ -65,6 +65,7 @@ class Functions extends Action Realtime $queueForRealtime, Event $queueForEvents, StatsUsage $queueForStatsUsage, + ExecutionEvent $queueForExecutions, Log $log, Executor $executor, callable $isResourceBlocked @@ -77,13 +78,6 @@ class Functions extends Action $type = $payload['type'] ?? ''; - // Short-term solution to offhand write operation from API container - if ($type === Func::TYPE_ASYNC_WRITE) { - $execution = new Document($payload['execution'] ?? []); - $dbForProject->createDocument('executions', $execution); - return; - } - $events = $payload['events'] ?? []; $data = $payload['body'] ?? ''; $eventData = $payload['payload'] ?? ''; @@ -164,6 +158,7 @@ class Functions extends Action queueForRealtime: $queueForRealtime, queueForStatsUsage: $queueForStatsUsage, queueForEvents: $queueForEvents, + queueForExecutions: $queueForExecutions, project: $project, function: $function, executor: $executor, @@ -208,6 +203,7 @@ class Functions extends Action queueForRealtime: $queueForRealtime, queueForStatsUsage: $queueForStatsUsage, queueForEvents: $queueForEvents, + queueForExecutions: $queueForExecutions, project: $project, function: $function, executor: $executor, @@ -234,6 +230,7 @@ class Functions extends Action queueForRealtime: $queueForRealtime, queueForStatsUsage: $queueForStatsUsage, queueForEvents: $queueForEvents, + queueForExecutions: $queueForExecutions, project: $project, function: $function, executor: $executor, @@ -266,7 +263,8 @@ class Functions extends Action */ private function fail( string $message, - Database $dbForProject, + Document $project, + ExecutionEvent $queueForExecutions, Document $function, string $trigger, string $path, @@ -309,11 +307,10 @@ class Functions extends Action 'duration' => 0.0, ]); - $execution = $dbForProject->createDocument('executions', $execution); - - if ($execution->isEmpty()) { - throw new Exception('Failed to create execution'); - } + $queueForExecutions + ->setExecution($execution) + ->setProject($project) + ->trigger(); } /** @@ -337,9 +334,6 @@ class Functions extends Action * @param string|null $eventData * @param string|null $executionId * @return void - * @throws Structure - * @throws \Utopia\Database\Exception - * @throws Conflict */ private function execute( Log $log, @@ -349,6 +343,7 @@ class Functions extends Action Realtime $queueForRealtime, StatsUsage $queueForStatsUsage, Event $queueForEvents, + ExecutionEvent $queueForExecutions, Document $project, Document $function, Executor $executor, @@ -376,19 +371,19 @@ class Functions extends Action if ($deployment->getAttribute('resourceId') !== $functionId) { $errorMessage = 'The execution could not be completed because a corresponding deployment was not found. A function deployment needs to be created before it can be executed. Please create a deployment for your function and try again.'; - $this->fail($errorMessage, $dbForProject, $function, $trigger, $path, $method, $user, $jwt, $event); + $this->fail($errorMessage, $project, $queueForExecutions, $function, $trigger, $path, $method, $user, $jwt, $event); return; } if ($deployment->isEmpty()) { $errorMessage = 'The execution could not be completed because a corresponding deployment was not found. A function deployment needs to be created before it can be executed. Please create a deployment for your function and try again.'; - $this->fail($errorMessage, $dbForProject, $function, $trigger, $path, $method, $user, $jwt, $event); + $this->fail($errorMessage, $project, $queueForExecutions, $function, $trigger, $path, $method, $user, $jwt, $event); return; } if ($deployment->getAttribute('status') !== 'ready') { $errorMessage = 'The execution could not be completed because the build is not ready. Please wait for the build to complete and try again.'; - $this->fail($errorMessage, $dbForProject, $function, $trigger, $path, $method, $user, $jwt, $event); + $this->fail($errorMessage, $project, $queueForExecutions, $function, $trigger, $path, $method, $user, $jwt, $event); return; } @@ -419,56 +414,38 @@ class Functions extends Action $headers['x-appwrite-continent-code'] = ''; $headers['x-appwrite-continent-eu'] = 'false'; - /** Create execution or update execution status */ - $execution = $dbForProject->getDocument('executions', $executionId ?? ''); - if ($execution->isEmpty()) { + /** Create or update execution to processing status */ + if (empty($executionId)) { $executionId = ID::unique(); - $headers['x-appwrite-execution-id'] = $executionId; - $headersFiltered = []; - foreach ($headers as $key => $value) { - if (\in_array(\strtolower($key), FUNCTION_ALLOWLIST_HEADERS_REQUEST)) { - $headersFiltered[] = [ 'name' => $key, 'value' => $value ]; - } - } + } + $headers['x-appwrite-execution-id'] = $executionId; - $execution = new Document([ - '$id' => $executionId, - '$permissions' => $user->isEmpty() ? [] : [Permission::read(Role::user($user->getId()))], - 'resourceInternalId' => $function->getSequence(), - 'resourceId' => $function->getId(), - 'resourceType' => 'functions', - 'deploymentInternalId' => $deployment->getSequence(), - 'deploymentId' => $deployment->getId(), - 'trigger' => $trigger, - 'status' => 'processing', - 'responseStatusCode' => 0, - 'responseHeaders' => [], - 'requestPath' => $path, - 'requestMethod' => $method, - 'requestHeaders' => $headersFiltered, - 'errors' => '', - 'logs' => '', - 'duration' => 0.0, - ]); - - $execution = $dbForProject->createDocument('executions', $execution); - - // TODO: @Meldiron Trigger executions.create event here - - if ($execution->isEmpty()) { - throw new Exception('Failed to create or read execution'); + $headersFiltered = []; + foreach ($headers as $key => $value) { + if (\in_array(\strtolower($key), FUNCTION_ALLOWLIST_HEADERS_REQUEST)) { + $headersFiltered[] = [ 'name' => $key, 'value' => $value ]; } } - if ($execution->getAttribute('status') !== 'processing') { - $execution->setAttribute('status', 'processing'); - - try { - $execution = $dbForProject->updateDocument('executions', $executionId, $execution); - } catch (\Throwable $e) { - $log->addExtra('updateError', $e->getMessage()); - } - } + $execution = new Document([ + '$id' => $executionId, + '$permissions' => $user->isEmpty() ? [] : [Permission::read(Role::user($user->getId()))], + 'resourceInternalId' => $function->getSequence(), + 'resourceId' => $function->getId(), + 'resourceType' => 'functions', + 'deploymentInternalId' => $deployment->getSequence(), + 'deploymentId' => $deployment->getId(), + 'trigger' => $trigger, + 'status' => 'processing', + 'responseStatusCode' => 0, + 'responseHeaders' => [], + 'requestPath' => $path, + 'requestMethod' => $method, + 'requestHeaders' => $headersFiltered, + 'errors' => '', + 'logs' => '', + 'duration' => 0.0, + ]); $durationStart = \microtime(true); @@ -610,12 +587,11 @@ class Functions extends Action $error = $th->getMessage(); $errorCode = $th->getCode(); } finally { - /** Update execution status */ - try { - $execution = $dbForProject->updateDocument('executions', $executionId, $execution); - } catch (\Throwable $e) { - $log->addExtra('updateError', $e->getMessage()); - } + /** Persist final execution status */ + $queueForExecutions + ->setExecution($execution) + ->setProject($project) + ->trigger(); /** Trigger usage queue */ $queueForStatsUsage diff --git a/src/Appwrite/Platform/Workers/Messaging.php b/src/Appwrite/Platform/Workers/Messaging.php index f09a67755a..3fd15478d5 100644 --- a/src/Appwrite/Platform/Workers/Messaging.php +++ b/src/Appwrite/Platform/Workers/Messaging.php @@ -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 $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> $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; - } } diff --git a/src/Appwrite/Platform/Workers/Migrations.php b/src/Appwrite/Platform/Workers/Migrations.php index 1e2bace54b..c6b005c334 100644 --- a/src/Appwrite/Platform/Workers/Migrations.php +++ b/src/Appwrite/Platform/Workers/Migrations.php @@ -5,10 +5,11 @@ namespace Appwrite\Platform\Workers; use Ahc\Jwt\JWT; use Appwrite\Event\Mail; use Appwrite\Event\Realtime; +use Appwrite\Event\StatsUsage; use Appwrite\Extend\Exception; use Appwrite\Template\Template; -use Utopia\CLI\Console; use Utopia\Config\Config; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Exception\Authorization as AuthorizationException; @@ -25,6 +26,10 @@ use Utopia\Migration\Destination; use Utopia\Migration\Destinations\Appwrite as DestinationAppwrite; use Utopia\Migration\Destinations\CSV as DestinationCSV; use Utopia\Migration\Exception as MigrationException; +use Utopia\Migration\Resource; +use Utopia\Migration\Resources\Database\Database as ResourceDatabase; +use Utopia\Migration\Resources\Database\Row as ResourceRow; +use Utopia\Migration\Resources\Database\Table as ResourceTable; use Utopia\Migration\Source; use Utopia\Migration\Sources\Appwrite as SourceAppwrite; use Utopia\Migration\Sources\CSV; @@ -52,6 +57,7 @@ class Migrations extends Action */ protected array $sourceReport = []; + private string $source; /** * @var callable|null */ @@ -78,6 +84,7 @@ class Migrations extends Action ->inject('deviceForMigrations') ->inject('deviceForFiles') ->inject('queueForMails') + ->inject('queueForStatsUsage') ->inject('plan') ->inject('authorization') ->callback($this->action(...)); @@ -96,6 +103,7 @@ class Migrations extends Action Device $deviceForMigrations, Device $deviceForFiles, Mail $queueForMails, + StatsUsage $queueForStatsUsage, array $plan, Authorization $authorization, ): void { @@ -139,6 +147,7 @@ class Migrations extends Action $migration, $queueForRealtime, $queueForMails, + $queueForStatsUsage, $platform, $authorization ); @@ -324,6 +333,7 @@ class Migrations extends Action Document $migration, Realtime $queueForRealtime, Mail $queueForMails, + StatsUsage $queueForStatsUsage, array $platform, Authorization $authorization, ): void { @@ -333,8 +343,12 @@ class Migrations extends Action $transfer = $source = $destination = null; - $protocol = System::getEnv('_APP_OPTIONS_FORCE_HTTPS') === 'disabled' ? 'http' : 'https'; - $endpoint = $protocol . '://' . $platform['apiHostname'] . '/v1'; + $host = System::getEnv('_APP_MIGRATION_HOST'); + if (empty($host)) { + throw new \Exception('_APP_MIGRATION_HOST is not set'); + } + + $endpoint = 'http://'.$host.'/v1'; try { $credentials = $migration->getAttribute('credentials', []); @@ -350,10 +364,6 @@ class Migrations extends Action $credentials['destinationEndpoint'] = $endpoint; } - if (($credentials['endpoint'] ?? '') === 'http://localhost/v1') { - $credentials['endpoint'] = $endpoint; - } - $migration->setAttribute('credentials', $credentials); $migration->setAttribute('stage', 'processing'); @@ -368,6 +378,7 @@ class Migrations extends Action $destination ); + $aggregatedResources = []; /** Start Transfer */ if (empty($source->getErrors())) { $migration->setAttribute('stage', 'migrating'); @@ -375,9 +386,40 @@ class Migrations extends Action $transfer->run( $migration->getAttribute('resources'), - function () use ($migration, $transfer, $project, $queueForRealtime) { + function ($resources) use ($migration, $transfer, $project, $queueForRealtime, &$aggregatedResources) { $migration->setAttribute('resourceData', json_encode($transfer->getCache())); $migration->setAttribute('statusCounters', json_encode($transfer->getStatusCounters())); + + if (!empty($resources)) { + /** + * @var Resource $resource + */ + $resource = $resources[0]; + $count = count($resources); + $databaseId = null; + $tableId = null; + switch ($resource->getName()) { + case ResourceTable::getName(): + /** @var ResourceTable $resource */ + $databaseId = $resource->getDatabase()->getSequence(); + break; + case ResourceRow::getName(): + /** @var ResourceRow $resource */ + $table = $resource->getTable(); + $databaseId = $table->getDatabase()->getSequence(); + $tableId = $table->getSequence(); + break; + default: + break; + } + $aggregatedResources[] = [ + 'name' => $resource->getName(), + 'count' => $count, + 'databaseId' => $databaseId, + 'tableId' => $tableId + ]; + + } $this->updateMigrationDocument($migration, $project, $queueForRealtime); }, $migration->getAttribute('resourceId'), @@ -443,6 +485,16 @@ class Migrations extends Action } if ($migration->getAttribute('status', '') === 'completed') { + foreach ($aggregatedResources as $resource) { + $this->processMigrationResourceStats( + $resource, + $queueForStatsUsage, + $project, + $migration->getAttribute('source'), + $authorization, + $migration->getAttribute('resourceId') + ); + } $destination?->success(); $source?->success(); @@ -481,7 +533,6 @@ class Migrations extends Action array $platform, Authorization $authorization, ): void { - $credentials = $migration->getAttribute('credentials', []); $options = $migration->getAttribute('options', []); $bucketId = 'default'; // Always use platform default bucket $filename = $options['filename'] ?? 'export_' . \time(); @@ -494,7 +545,7 @@ class Migrations extends Action throw new \Exception('User ' . $userInternalId . ' not found'); } - $bucket = $authorization->skip(fn () => $this->dbForPlatform->getDocument('buckets', $bucketId)); + $bucket = $this->dbForPlatform->getDocument('buckets', $bucketId); if ($bucket->isEmpty()) { throw new \Exception('Bucket not found'); } @@ -577,8 +628,11 @@ class Migrations extends Action ]); // Generate download URL with JWT + $endpoint = System::getEnv('_APP_DOMAIN', ''); + $protocol = System::getEnv('_APP_OPTIONS_FORCE_HTTPS', 'disabled') === 'enabled' ? 'https' : 'http'; + + $downloadUrl = "{$protocol}://{$endpoint}/v1/storage/buckets/{$bucketId}/files/{$fileId}/push?project={$project->getId()}&jwt={$jwt}"; - $downloadUrl = "{$credentials['endpoint']}/storage/buckets/{$bucketId}/files/{$fileId}/push?project={$project->getId()}&jwt={$jwt}"; $options['downloadUrl'] = $downloadUrl; $migration->setAttribute('options', $options); $this->updateMigrationDocument($migration, $project, $queueForRealtime); @@ -735,4 +789,58 @@ class Migrations extends Action return $errors; } + + private function processMigrationResourceStats(array $resources, StatsUsage $queueForStatsUsage, Document $projectDocument, string $source, Authorization $authorization, ?string $resourceId) + { + $resourceName = $resources['name']; + $count = $resources['count']; + $databaseInternalId = $resources['databaseId']; + $tableInternalId = $resources['tableId']; + + if ($source === CSV::getName()) { + [$databaseId, $tableId] = explode(':', $resourceId); + $database = $authorization->skip(fn () => $this->dbForProject->getDocument('databases', $databaseId)); + $table = $authorization->skip(fn () => $this->dbForProject->getDocument('database_' . $database->getSequence(), $tableId)); + $databaseInternalId = (int) $database->getSequence(); + $tableInternalId = (int) $table->getSequence(); + } + + switch ($resourceName) { + case ResourceDatabase::getName(): + $queueForStatsUsage->addMetric(METRIC_DATABASES, $count); + break; + + case ResourceTable::getName(): + $queueForStatsUsage + ->addMetric(METRIC_COLLECTIONS, $count) + ->addMetric( + str_replace('{databaseInternalId}', $databaseInternalId, METRIC_DATABASE_ID_COLLECTIONS), + $count + ); + break; + + case ResourceRow::getName(): + $queueForStatsUsage + ->addMetric( + str_replace( + ['{databaseInternalId}','{collectionInternalId}'], + [$databaseInternalId, $tableInternalId], + METRIC_DATABASE_ID_COLLECTION_ID_DOCUMENTS + ), + $count + ) + ->addMetric( + str_replace('{databaseInternalId}', $databaseInternalId, METRIC_DATABASE_ID_DOCUMENTS), + $count + ) + ->addMetric(METRIC_DOCUMENTS, $count); + break; + + default: + break; + } + + $queueForStatsUsage->setProject($projectDocument)->trigger(); + $queueForStatsUsage->reset(); + } } diff --git a/src/Appwrite/Platform/Workers/StatsResources.php b/src/Appwrite/Platform/Workers/StatsResources.php index 1c3db8d9c9..e5b0ca024c 100644 --- a/src/Appwrite/Platform/Workers/StatsResources.php +++ b/src/Appwrite/Platform/Workers/StatsResources.php @@ -5,7 +5,7 @@ namespace Appwrite\Platform\Workers; use Appwrite\Platform\Action; use Exception; use Throwable; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\Document; use Utopia\Database\Query; diff --git a/src/Appwrite/Platform/Workers/StatsUsage.php b/src/Appwrite/Platform/Workers/StatsUsage.php index 6b62da8f80..56298a0dcd 100644 --- a/src/Appwrite/Platform/Workers/StatsUsage.php +++ b/src/Appwrite/Platform/Workers/StatsUsage.php @@ -4,7 +4,7 @@ namespace Appwrite\Platform\Workers; use Exception; use Throwable; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Database; use Utopia\Database\DateTime; use Utopia\Database\Document; diff --git a/src/Appwrite/PubSub/Adapter/Redis.php b/src/Appwrite/PubSub/Adapter/Redis.php index 187eb9cd95..f5218df93c 100644 --- a/src/Appwrite/PubSub/Adapter/Redis.php +++ b/src/Appwrite/PubSub/Adapter/Redis.php @@ -16,7 +16,7 @@ class Redis implements Adapter public function ping($message = null): bool { - return $this->client->ping($message); + return (bool) $this->client->ping($message); } public function subscribe($channels, $callback) diff --git a/src/Appwrite/SDK/Specification/Format.php b/src/Appwrite/SDK/Specification/Format.php index 93a470a6a3..53b4f1b3fa 100644 --- a/src/Appwrite/SDK/Specification/Format.php +++ b/src/Appwrite/SDK/Specification/Format.php @@ -4,8 +4,8 @@ namespace Appwrite\SDK\Specification; use Appwrite\Utopia\Response\Model; use Utopia\Config\Config; -use Utopia\Http; -use Utopia\Route; +use Utopia\Http\Http; +use Utopia\Http\Route; abstract class Format { diff --git a/src/Appwrite/SDK/Specification/Format/Swagger2.php b/src/Appwrite/SDK/Specification/Format/Swagger2.php index 0d66e4d725..d70bda9285 100644 --- a/src/Appwrite/SDK/Specification/Format/Swagger2.php +++ b/src/Appwrite/SDK/Specification/Format/Swagger2.php @@ -16,7 +16,7 @@ use Utopia\Database\Database; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; use Utopia\Database\Validator\Spatial; -use Utopia\Route; +use Utopia\Http\Route; use Utopia\Validator; use Utopia\Validator\ArrayList; use Utopia\Validator\Nullable; diff --git a/src/Appwrite/Utopia/Database/RuntimeQuery.php b/src/Appwrite/Utopia/Database/RuntimeQuery.php index f959e9b573..369006d9df 100644 --- a/src/Appwrite/Utopia/Database/RuntimeQuery.php +++ b/src/Appwrite/Utopia/Database/RuntimeQuery.php @@ -4,6 +4,11 @@ namespace Appwrite\Utopia\Database; use Utopia\Database\Query; +/** + * RuntimeQuery handles real-time query filtering for Appwrite's Realtime subscriptions. + * + * Queries are pre-compiled at subscription time for fast evaluation during message delivery. + */ class RuntimeQuery extends Query { public const ALLOWED_QUERIES = [ @@ -28,16 +33,19 @@ class RuntimeQuery extends Query ]; /** - * Checks if a query is select("*") which means "listen to all events" + * Checks if a query is a select("*") query. * * @param Query $query * @return bool */ public static function isSelectAll(Query $query): bool { - return $query->getMethod() === Query::TYPE_SELECT - && count($query->getValues()) === 1 - && $query->getValues()[0] === '*'; + if ($query->getMethod() !== Query::TYPE_SELECT) { + return false; + } + + $values = $query->getValues(); + return count($values) === 1 && $values[0] === '*'; } /** @@ -60,105 +68,222 @@ class RuntimeQuery extends Query } /** + * Pre-compile queries into an optimized format for fast evaluation. + * Call this once when subscription is created, store the result. + * * @param array $queries - * @param array $payload + * @return array Compiled query structure with 'type' key */ - public static function filter(array $queries, array $payload): array + public static function compile(array $queries): array { if (empty($queries)) { - return $payload; + return ['type' => 'selectAll']; } - // Check if select("*") is present - if so, return payload (match all) + // Check for select("*") upfront foreach ($queries as $query) { - if (self::isSelectAll($query)) { - return $payload; + if ($query->getMethod() === Query::TYPE_SELECT) { + $values = $query->getValues(); + if (count($values) === 1 && $values[0] === '*') { + return ['type' => 'selectAll']; + } } } - // multiple queries follows and condition + // Compile queries into flat structure + $compiled = [ + 'type' => 'filter', + 'conditions' => [], + 'attributes' => [], + 'hasOr' => false, + ]; + foreach ($queries as $query) { - if (!self::evaluateFilter($query, $payload)) { - return []; - }; + $condition = self::compileCondition($query); + $compiled['conditions'][] = $condition; + self::extractAttributes($condition, $compiled['attributes'], $compiled['hasOr']); } + + $compiled['attributes'] = array_unique($compiled['attributes']); + + return $compiled; + } + + /** + * Compile a single query condition into an optimized array format. + */ + private static function compileCondition(Query $query): array + { + $method = $query->getMethod(); + + if ($method === Query::TYPE_AND) { + return [ + 'op' => 'AND', + 'conditions' => array_map([self::class, 'compileCondition'], $query->getValues()), + ]; + } + + if ($method === Query::TYPE_OR) { + return [ + 'op' => 'OR', + 'conditions' => array_map([self::class, 'compileCondition'], $query->getValues()), + ]; + } + + return [ + 'op' => $method, + 'attr' => $query->getAttribute(), + 'values' => $query->getValues(), + ]; + } + + /** + * Extract all attribute names from a compiled condition tree. + * Also tracks whether any OR conditions exist. + */ + private static function extractAttributes(array $condition, array &$attributes, bool &$hasOr): void + { + if (isset($condition['op']) && $condition['op'] === 'OR') { + $hasOr = true; + } + if (isset($condition['attr'])) { + $attributes[] = $condition['attr']; + } + if (isset($condition['conditions'])) { + foreach ($condition['conditions'] as $sub) { + self::extractAttributes($sub, $attributes, $hasOr); + } + } + } + + /** + * Fast filter using pre-compiled query structure. + * + * @param array $compiled Result from compile() + * @param array $payload Event payload + * @return array|null Null if no match, payload if match + */ + public static function filter(array $compiled, array $payload): ?array + { + // Fast path for select("*") subscriptions + if ($compiled['type'] === 'selectAll') { + return $payload; + } + + // Quick rejection: if payload is missing any required attribute, fail fast + // Skip this optimization when OR conditions exist (OR can match with partial attributes) + if (empty($compiled['hasOr'])) { + foreach ($compiled['attributes'] as $attr) { + if (!isset($payload[$attr]) && !\array_key_exists($attr, $payload)) { + return null; + } + } + } + + // Evaluate all conditions (AND logic at top level) + foreach ($compiled['conditions'] as $condition) { + if (!self::evaluateCondition($condition, $payload)) { + return null; + } + } + return $payload; } - private static function evaluateFilter(Query $query, array $payload): bool + /** + * Evaluate a single compiled condition against a payload. + */ + private static function evaluateCondition(array $condition, array $payload): bool { - $attribute = $query->getAttribute(); - $method = $query->getMethod(); - $values = $query->getValues(); + $op = $condition['op']; - // during 'and' and 'or' attribute will not be present - switch ($method) { - case Query::TYPE_AND: - // All subqueries must evaluate to true - foreach ($query->getValues() as $subquery) { - if (!self::evaluateFilter($subquery, $payload)) { + // Handle AND/OR + if ($op === 'AND') { + foreach ($condition['conditions'] as $sub) { + if (!self::evaluateCondition($sub, $payload)) { + return false; + } + } + return true; + } + + if ($op === 'OR') { + foreach ($condition['conditions'] as $sub) { + if (self::evaluateCondition($sub, $payload)) { + return true; + } + } + return false; + } + + // Leaf condition - direct comparison + $attr = $condition['attr']; + + if (!\array_key_exists($attr, $payload)) { + return false; + } + + $value = $payload[$attr]; + $targets = $condition['values']; + + // Inlined comparisons - no closures, no method calls + switch ($op) { + case Query::TYPE_EQUAL: + foreach ($targets as $target) { + if ($value === $target) { + return true; + } + } + return false; + + case Query::TYPE_NOT_EQUAL: + foreach ($targets as $target) { + if ($value === $target) { return false; } } return true; - case Query::TYPE_OR: - // At least one subquery must evaluate to true - foreach ($query->getValues() as $subquery) { - if (self::evaluateFilter($subquery, $payload)) { + case Query::TYPE_LESSER: + foreach ($targets as $target) { + if ($value < $target) { return true; } } return false; - } - - $hasAttribute = \array_key_exists($attribute, $payload); - if (!$hasAttribute) { - return false; - } - - // null can be a value as well - $payloadAttributeValue = $payload[$attribute]; - switch ($method) { - case Query::TYPE_EQUAL: - return self::anyMatch($values, fn ($value) => $payloadAttributeValue === $value); - - case Query::TYPE_NOT_EQUAL: - return !self::anyMatch($values, fn ($value) => $payloadAttributeValue === $value); - - case Query::TYPE_LESSER: - return self::anyMatch($values, fn ($value) => $payloadAttributeValue < $value); case Query::TYPE_LESSER_EQUAL: - return self::anyMatch($values, fn ($value) => $payloadAttributeValue <= $value); + foreach ($targets as $target) { + if ($value <= $target) { + return true; + } + } + return false; case Query::TYPE_GREATER: - return self::anyMatch($values, fn ($value) => $payloadAttributeValue > $value); + foreach ($targets as $target) { + if ($value > $target) { + return true; + } + } + return false; case Query::TYPE_GREATER_EQUAL: - return self::anyMatch($values, fn ($value) => $payloadAttributeValue >= $value); + foreach ($targets as $target) { + if ($value >= $target) { + return true; + } + } + return false; - // attribute must be present and should be explicitly null case Query::TYPE_IS_NULL: - return $payloadAttributeValue === null; + return $value === null; case Query::TYPE_IS_NOT_NULL: - return $payloadAttributeValue !== null; + return $value !== null; default: - throw new \InvalidArgumentException( - "Unsupported query method: {$method}" - ); + return false; } } - - private static function anyMatch(array $values, callable $fn): bool - { - foreach ($values as $value) { - if ($fn($value)) { - return true; - } - } - return false; - } } diff --git a/src/Appwrite/Utopia/Database/Validator/Queries/Keys.php b/src/Appwrite/Utopia/Database/Validator/Queries/Keys.php new file mode 100644 index 0000000000..4bae12765c --- /dev/null +++ b/src/Appwrite/Utopia/Database/Validator/Queries/Keys.php @@ -0,0 +1,18 @@ +swoole = $response; parent::__construct($response); } diff --git a/src/Appwrite/Utopia/Response/Model/Collection.php b/src/Appwrite/Utopia/Response/Model/Collection.php index 9350b6298c..407db3aea9 100644 --- a/src/Appwrite/Utopia/Response/Model/Collection.php +++ b/src/Appwrite/Utopia/Response/Model/Collection.php @@ -87,6 +87,18 @@ class Collection extends Model 'example' => new \stdClass(), 'array' => true ]) + ->addRule('bytesMax', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Maximum document size in bytes. Returns 0 when no limit applies.', + 'default' => 0, + 'example' => 65535, + ]) + ->addRule('bytesUsed', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Currently used document size in bytes based on defined attributes.', + 'default' => 0, + 'example' => 1500, + ]) ; } diff --git a/src/Appwrite/Utopia/Response/Model/Table.php b/src/Appwrite/Utopia/Response/Model/Table.php index c45ee85a69..20cd3ccca2 100644 --- a/src/Appwrite/Utopia/Response/Model/Table.php +++ b/src/Appwrite/Utopia/Response/Model/Table.php @@ -92,6 +92,18 @@ class Table extends Model 'example' => new \stdClass(), 'array' => true ]) + ->addRule('bytesMax', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Maximum row size in bytes. Returns 0 when no limit applies.', + 'default' => 0, + 'example' => 65535, + ]) + ->addRule('bytesUsed', [ + 'type' => self::TYPE_INTEGER, + 'description' => 'Currently used row size in bytes based on defined columns.', + 'default' => 0, + 'example' => 1500, + ]) ; } diff --git a/src/Appwrite/Utopia/View.php b/src/Appwrite/Utopia/View.php index e4ed8164c9..c5f66ae9ee 100644 --- a/src/Appwrite/Utopia/View.php +++ b/src/Appwrite/Utopia/View.php @@ -2,7 +2,7 @@ namespace Appwrite\Utopia; -use Utopia\View as OldView; +use Utopia\Http\View as OldView; class View extends OldView { diff --git a/src/Executor/Executor.php b/src/Executor/Executor.php index c891fb82e0..a8fab8fead 100644 --- a/src/Executor/Executor.php +++ b/src/Executor/Executor.php @@ -69,7 +69,7 @@ class Executor string $entrypoint = '', string $destination = '', array $variables = [], - string $command = null, + ?string $command = null, string $outputDirectory = '', string $runtimeEntrypoint = '' ) { @@ -294,7 +294,7 @@ class Executor * @return array|string * @throws Exception */ - private function call(string $endpoint, string $method, string $path = '', array $headers = [], array $params = [], bool $decode = true, int $timeout = 15, callable $callback = null) + private function call(string $endpoint, string $method, string $path = '', array $headers = [], array $params = [], bool $decode = true, int $timeout = 15, ?callable $callback = null) { $headers = array_merge($this->headers, $headers); $ch = curl_init($endpoint . $path . (($method == self::METHOD_GET && !empty($params)) ? '?' . http_build_query($params) : '')); diff --git a/tests/e2e/Client.php b/tests/e2e/Client.php index 6b81713654..ccdfb84e00 100644 --- a/tests/e2e/Client.php +++ b/tests/e2e/Client.php @@ -185,6 +185,14 @@ class Client $responseHeaders = []; $cookies = []; + if (isset($params['queries'])) { + foreach ($params['queries'] as $value) { + if (!is_string($value)) { + throw new Exception('Queries must be converted to strings'); + } + } + } + $query = match ($headers['content-type']) { 'application/json' => json_encode($params), 'multipart/form-data' => $this->flatten($params), diff --git a/tests/e2e/General/CompressionTest.php b/tests/e2e/General/CompressionTest.php index cff23b1201..b8395d2b4a 100644 --- a/tests/e2e/General/CompressionTest.php +++ b/tests/e2e/General/CompressionTest.php @@ -86,8 +86,11 @@ class CompressionTest extends Scope $this->assertEquals(200, $response['headers']['status-code']); $this->assertArrayNotHasKey('content-encoding', $response['headers']); - $this->assertEquals('chunked', $response['headers']['transfer-encoding'] ?? null, 'Uncompressed response should use chunked transfer, headers received: ' . json_encode($response['headers'], JSON_PRETTY_PRINT)); - $this->assertArrayNotHasKey('content-length', $response['headers'], 'Uncompressed response should not send content length when chunked.'); + + if ($this->endpoint !== 'http://appwrite/v1') { + $this->assertEquals('chunked', $response['headers']['transfer-encoding'] ?? null, 'Uncompressed response should use chunked transfer, headers received: ' . json_encode($response['headers'], JSON_PRETTY_PRINT)); + $this->assertArrayNotHasKey('content-length', $response['headers'], 'Uncompressed response should not send content length when chunked.'); + } $this->assertArrayHasKey('longValue', $response['body'], 'Prefs payload should expose longValue at the top level, body received: ' . json_encode($response['body'], JSON_PRETTY_PRINT)); diff --git a/tests/e2e/Scopes/ProjectCustom.php b/tests/e2e/Scopes/ProjectCustom.php index 52c53016d6..1859d551a4 100644 --- a/tests/e2e/Scopes/ProjectCustom.php +++ b/tests/e2e/Scopes/ProjectCustom.php @@ -60,6 +60,7 @@ trait ProjectCustom 'cookie' => 'a_session_console=' . $this->getRoot()['session'], 'x-appwrite-project' => 'console', ], [ + 'keyId' => ID::unique(), 'name' => 'Demo Project Key', 'scopes' => [ 'users.read', @@ -194,6 +195,7 @@ trait ProjectCustom 'cookie' => 'a_session_console=' . $this->getRoot()['session'], 'x-appwrite-project' => 'console', ], [ + 'keyId' => ID::unique(), 'name' => 'Demo Project Key', 'scopes' => $scopes, ]); diff --git a/tests/e2e/Scopes/Scope.php b/tests/e2e/Scopes/Scope.php index 8731a29672..3a2bb83aa7 100644 --- a/tests/e2e/Scopes/Scope.php +++ b/tests/e2e/Scopes/Scope.php @@ -18,7 +18,8 @@ abstract class Scope extends TestCase public const REQUEST_TYPE_SMS = 'sms'; protected ?Client $client = null; - protected string $endpoint = 'http://appwrite.test/v1'; + protected string $endpoint = 'http://appwrite/v1'; + protected string $webEndpoint = 'http://appwrite.test/v1'; protected function setUp(): void { diff --git a/tests/e2e/Services/Avatars/AvatarsBase.php b/tests/e2e/Services/Avatars/AvatarsBase.php index aca3af6dfa..3de1b1efe2 100644 --- a/tests/e2e/Services/Avatars/AvatarsBase.php +++ b/tests/e2e/Services/Avatars/AvatarsBase.php @@ -532,7 +532,6 @@ trait AvatarsBase $this->assertEquals($image->getImageWidth(), $original->getImageWidth()); $this->assertEquals($image->getImageHeight(), $original->getImageHeight()); $this->assertEquals('PNG', $image->getImageFormat()); - $this->assertEquals(strlen(\file_get_contents(__DIR__ . '/../../../resources/initials.png')), strlen($response['body'])); } public function testSpecialCharsInitalImage() @@ -556,7 +555,6 @@ trait AvatarsBase $this->assertEquals($image->getImageWidth(), $original->getImageWidth()); $this->assertEquals($image->getImageHeight(), $original->getImageHeight()); $this->assertEquals('PNG', $image->getImageFormat()); - $this->assertEquals(strlen(\file_get_contents(__DIR__ . '/../../../resources/initials.png')), strlen($response['body'])); } public function testGetScreenshot(): array diff --git a/tests/e2e/Services/Databases/Legacy/DatabasesBase.php b/tests/e2e/Services/Databases/Legacy/DatabasesBase.php index 6cde01e240..c6944089c0 100644 --- a/tests/e2e/Services/Databases/Legacy/DatabasesBase.php +++ b/tests/e2e/Services/Databases/Legacy/DatabasesBase.php @@ -62,6 +62,12 @@ trait DatabasesBase $this->assertEquals(201, $movies['headers']['status-code']); $this->assertEquals($movies['body']['name'], 'Movies'); + $this->assertArrayHasKey('bytesMax', $movies['body']); + $this->assertArrayHasKey('bytesUsed', $movies['body']); + $this->assertIsInt($movies['body']['bytesMax']); + $this->assertIsInt($movies['body']['bytesUsed']); + $this->assertGreaterThanOrEqual(0, $movies['body']['bytesMax']); + $this->assertGreaterThanOrEqual(0, $movies['body']['bytesUsed']); $actors = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections', array_merge([ 'content-type' => 'application/json', @@ -143,6 +149,8 @@ trait DatabasesBase $this->assertEquals(200, $response['headers']['status-code']); $this->assertFalse($response['body']['enabled']); + $this->assertArrayHasKey('bytesMax', $response['body']); + $this->assertArrayHasKey('bytesUsed', $response['body']); if ($this->getSide() === 'client') { $responseCreateDocument = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $data['moviesId'] . '/documents', array_merge([ @@ -363,6 +371,9 @@ trait DatabasesBase $this->assertIsArray($movies['body']['attributes']); $this->assertCount(9, $movies['body']['attributes']); + $this->assertArrayHasKey('bytesMax', $movies['body']); + $this->assertArrayHasKey('bytesUsed', $movies['body']); + $this->assertGreaterThanOrEqual(0, $movies['body']['bytesUsed']); $this->assertEquals($movies['body']['attributes'][0]['key'], $title['body']['key']); $this->assertEquals($movies['body']['attributes'][1]['key'], $description['body']['key']); $this->assertEquals($movies['body']['attributes'][2]['key'], $tagline['body']['key']); @@ -2419,22 +2430,36 @@ trait DatabasesBase $this->assertEquals($document['title'], $response['body']['title']); $this->assertEquals($document['releaseYear'], $response['body']['releaseYear']); $this->assertArrayNotHasKey('birthDay', $response['body']); + $sequence = $response['body']['$sequence']; - // Query by sequence + // Query by sequence on get single document route $response = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $document['$collectionId'] . '/documents/' . $document['$id'], array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ 'queries' => [ - Query::equal('$sequence', [$sequence]) + Query::equal('$sequence', [$sequence])->toString() + ], + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + $this->assertEquals('Invalid query method: equal', $response['body']['message']); + + // Query by sequence + $response = $this->client->call(Client::METHOD_GET, '/databases/' . $databaseId . '/collections/' . $document['$collectionId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::equal('$sequence', [$sequence.''])->toString() ], ]); $this->assertEquals(200, $response['headers']['status-code']); - $this->assertEquals($document['title'], $response['body']['title']); - $this->assertEquals($document['releaseYear'], $response['body']['releaseYear']); - $this->assertTrue(array_key_exists('$sequence', $response['body'])); + $this->assertEquals($document['title'], $response['body']['documents'][0]['title']); + $this->assertEquals($document['releaseYear'], $response['body']['documents'][0]['releaseYear']); + $this->assertTrue(array_key_exists('$sequence', $response['body']['documents'][0])); } /** diff --git a/tests/e2e/Services/Databases/TablesDB/DatabasesBase.php b/tests/e2e/Services/Databases/TablesDB/DatabasesBase.php index 58bb92f643..50f5cd4232 100644 --- a/tests/e2e/Services/Databases/TablesDB/DatabasesBase.php +++ b/tests/e2e/Services/Databases/TablesDB/DatabasesBase.php @@ -62,6 +62,12 @@ trait DatabasesBase $this->assertEquals(201, $movies['headers']['status-code']); $this->assertEquals($movies['body']['name'], 'Movies'); + $this->assertArrayHasKey('bytesMax', $movies['body']); + $this->assertArrayHasKey('bytesUsed', $movies['body']); + $this->assertIsInt($movies['body']['bytesMax']); + $this->assertIsInt($movies['body']['bytesUsed']); + $this->assertGreaterThanOrEqual(0, $movies['body']['bytesMax']); + $this->assertGreaterThanOrEqual(0, $movies['body']['bytesUsed']); $actors = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables', array_merge([ 'content-type' => 'application/json', @@ -143,6 +149,8 @@ trait DatabasesBase $this->assertEquals(200, $response['headers']['status-code']); $this->assertFalse($response['body']['enabled']); + $this->assertArrayHasKey('bytesMax', $response['body']); + $this->assertArrayHasKey('bytesUsed', $response['body']); if ($this->getSide() === 'client') { $responseCreateRow = $this->client->call(Client::METHOD_POST, '/tablesdb/' . $databaseId . '/tables/' . $data['moviesId'] . '/rows', array_merge([ @@ -363,6 +371,9 @@ trait DatabasesBase $this->assertIsArray($movies['body']['columns']); $this->assertCount(9, $movies['body']['columns']); + $this->assertArrayHasKey('bytesMax', $movies['body']); + $this->assertArrayHasKey('bytesUsed', $movies['body']); + $this->assertGreaterThanOrEqual(0, $movies['body']['bytesUsed']); $this->assertEquals($movies['body']['columns'][0]['key'], $title['body']['key']); $this->assertEquals($movies['body']['columns'][1]['key'], $description['body']['key']); $this->assertEquals($movies['body']['columns'][2]['key'], $tagline['body']['key']); @@ -2347,6 +2358,36 @@ trait DatabasesBase $this->assertEquals($row['title'], $response['body']['title']); $this->assertEquals($row['releaseYear'], $response['body']['releaseYear']); $this->assertArrayNotHasKey('birthDay', $response['body']); + + $sequence = $response['body']['$sequence']; + + // Query by sequence on get single row route + $response = $this->client->call(Client::METHOD_GET, '/tablesdb/' . $databaseId . '/tables/' . $row['$tableId'] . '/rows/' . $row['$id'], array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::equal('$sequence', [$sequence])->toString() + ], + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + $this->assertEquals('Invalid query method: equal', $response['body']['message']); + + // Query by sequence + $response = $this->client->call(Client::METHOD_GET, '/tablesdb/' . $databaseId . '/tables/' . $row['$tableId'] . '/rows', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::equal('$sequence', [$sequence.''])->toString() + ], + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals($row['title'], $response['body']['rows'][0]['title']); + $this->assertEquals($row['releaseYear'], $response['body']['rows'][0]['releaseYear']); + $this->assertTrue(array_key_exists('$sequence', $response['body']['rows'][0])); } /** diff --git a/tests/e2e/Services/Functions/FunctionsBase.php b/tests/e2e/Services/Functions/FunctionsBase.php index 4994561c9a..8461e0deb9 100644 --- a/tests/e2e/Services/Functions/FunctionsBase.php +++ b/tests/e2e/Services/Functions/FunctionsBase.php @@ -5,7 +5,7 @@ namespace Tests\E2E\Services\Functions; use Appwrite\Tests\Async; use CURLFile; use Tests\E2E\Client; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Helpers\ID; use Utopia\Database\Query; use Utopia\System\System; diff --git a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php index 35bdf90347..c1a4f7e8a9 100644 --- a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php +++ b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php @@ -8,7 +8,7 @@ use Tests\E2E\Client; use Tests\E2E\Scopes\ProjectCustom; use Tests\E2E\Scopes\Scope; use Tests\E2E\Scopes\SideServer; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Document; use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Role; @@ -1751,7 +1751,10 @@ class FunctionsCustomServerTest extends Scope $this->assertEventually(function () use ($functionId, $userId) { $executions = $this->listExecutions($functionId); - $lastExecution = $executions['body']['executions'][0]; + $this->assertEquals(200, $executions['headers']['status-code']); + $executionsList = $executions['body']['executions'] ?? []; + $this->assertNotEmpty($executionsList); + $lastExecution = $executionsList[0]; $this->assertEquals('completed', $lastExecution['status']); $this->assertEquals(204, $lastExecution['responseStatusCode']); diff --git a/tests/e2e/Services/GraphQL/Base.php b/tests/e2e/Services/GraphQL/Base.php index c88e41ce8b..3e2624f83c 100644 --- a/tests/e2e/Services/GraphQL/Base.php +++ b/tests/e2e/Services/GraphQL/Base.php @@ -3,7 +3,7 @@ namespace Tests\E2E\Services\GraphQL; use CURLFile; -use Utopia\CLI\Console; +use Utopia\Console; trait Base { diff --git a/tests/e2e/Services/GraphQL/ScopeTest.php b/tests/e2e/Services/GraphQL/ScopeTest.php index f3c80a7418..f6d8b5b0f2 100644 --- a/tests/e2e/Services/GraphQL/ScopeTest.php +++ b/tests/e2e/Services/GraphQL/ScopeTest.php @@ -33,7 +33,7 @@ class ScopeTest extends Scope 'x-appwrite-key' => $apiKey, ], $gqlPayload); - $message = "app.{$projectId}@service.appwrite.test (role: applications) missing scopes ([\"databases.write\"])"; + $message = "app.{$projectId}@service.appwrite (role: applications) missing scopes ([\"databases.write\"])"; $this->assertArrayHasKey('errors', $database['body']); $this->assertEquals($message, $database['body']['errors'][0]['message']); } diff --git a/tests/e2e/Services/Migrations/MigrationsBase.php b/tests/e2e/Services/Migrations/MigrationsBase.php index bed7a7e542..aad0b73aa9 100644 --- a/tests/e2e/Services/Migrations/MigrationsBase.php +++ b/tests/e2e/Services/Migrations/MigrationsBase.php @@ -89,7 +89,7 @@ trait MigrationsBase { $response = $this->performMigrationSync([ 'resources' => Appwrite::getSupportedResources(), - 'endpoint' => $this->endpoint, + 'endpoint' => $this->webEndpoint, 'projectId' => $this->getProject()['$id'], 'apiKey' => $this->getProject()['apiKey'], ]); @@ -126,7 +126,7 @@ trait MigrationsBase 'resources' => [ Resource::TYPE_USER, ], - 'endpoint' => $this->endpoint, + 'endpoint' => $this->webEndpoint, 'projectId' => $this->getProject()['$id'], 'apiKey' => $this->getProject()['apiKey'], ]); @@ -188,7 +188,7 @@ trait MigrationsBase 'resources' => [ Resource::TYPE_USER, ], - 'endpoint' => $this->endpoint, + 'endpoint' => $this->webEndpoint, 'projectId' => $this->getProject()['$id'], 'apiKey' => $this->getProject()['apiKey'], ]); @@ -277,7 +277,7 @@ trait MigrationsBase Resource::TYPE_TEAM, Resource::TYPE_MEMBERSHIP, ], - 'endpoint' => $this->endpoint, + 'endpoint' => $this->webEndpoint, 'projectId' => $this->getProject()['$id'], 'apiKey' => $this->getProject()['apiKey'], ]); @@ -393,7 +393,7 @@ trait MigrationsBase 'resources' => [ Resource::TYPE_DATABASE, ], - 'endpoint' => $this->endpoint, + 'endpoint' => $this->webEndpoint, 'projectId' => $this->getProject()['$id'], 'apiKey' => $this->getProject()['apiKey'], ]); @@ -484,7 +484,7 @@ trait MigrationsBase Resource::TYPE_TABLE, Resource::TYPE_COLUMN, ], - 'endpoint' => $this->endpoint, + 'endpoint' => $this->webEndpoint, 'projectId' => $this->getProject()['$id'], 'apiKey' => $this->getProject()['apiKey'], ]); @@ -571,7 +571,7 @@ trait MigrationsBase Resource::TYPE_COLUMN, Resource::TYPE_ROW, ], - 'endpoint' => $this->endpoint, + 'endpoint' => $this->webEndpoint, 'projectId' => $this->getProject()['$id'], 'apiKey' => $this->getProject()['apiKey'], ]); @@ -651,7 +651,7 @@ trait MigrationsBase 'resources' => [ Resource::TYPE_BUCKET ], - 'endpoint' => $this->endpoint, + 'endpoint' => $this->webEndpoint, 'projectId' => $this->getProject()['$id'], 'apiKey' => $this->getProject()['apiKey'], ]); @@ -747,7 +747,7 @@ trait MigrationsBase Resource::TYPE_BUCKET, Resource::TYPE_FILE ], - 'endpoint' => $this->endpoint, + 'endpoint' => $this->webEndpoint, 'projectId' => $this->getProject()['$id'], 'apiKey' => $this->getProject()['apiKey'], ]); @@ -818,7 +818,7 @@ trait MigrationsBase Resource::TYPE_FUNCTION, Resource::TYPE_DEPLOYMENT ], - 'endpoint' => $this->endpoint, + 'endpoint' => $this->webEndpoint, 'projectId' => $this->getProject()['$id'], 'apiKey' => $this->getProject()['apiKey'], ]); @@ -1119,7 +1119,7 @@ trait MigrationsBase // all data exists, pass. $migration = $this->performCsvMigration( [ - 'endpoint' => $this->endpoint, + 'endpoint' => $this->webEndpoint, 'fileId' => $fileIds['default'], 'bucketId' => $bucketIds['default'], 'resourceId' => $databaseId . ':' . $tableId, @@ -1161,7 +1161,7 @@ trait MigrationsBase // all data exists and includes internals, pass. $migration = $this->performCsvMigration( [ - 'endpoint' => $this->endpoint, + 'endpoint' => $this->webEndpoint, 'fileId' => $fileIds['documents-internals'], 'bucketId' => $bucketIds['documents-internals'], 'resourceId' => $databaseId . ':' . $tableId, diff --git a/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php b/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php index ff917dea5c..1d15f10971 100644 --- a/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php +++ b/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php @@ -1168,7 +1168,7 @@ class ProjectsConsoleClientTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ - 'duration' => 60, // Set session duration to 1 minute + 'duration' => 10, // Set session duration to 10 seconds ]); $this->assertEquals(200, $response['headers']['status-code']); @@ -1177,7 +1177,7 @@ class ProjectsConsoleClientTest extends Scope $this->assertArrayHasKey('platforms', $response['body']); $this->assertArrayHasKey('webhooks', $response['body']); $this->assertArrayHasKey('keys', $response['body']); - $this->assertEquals(60, $response['body']['authDuration']); + $this->assertEquals(10, $response['body']['authDuration']); $projectId = $response['body']['$id']; @@ -1218,44 +1218,30 @@ class ProjectsConsoleClientTest extends Scope $this->assertEquals(200, $response['headers']['status-code']); - // Check session doesn't expire too soon. - sleep(30); + // Eventually session expires, within 15 seconds (10+variance) + $this->assertEventually(function () use ($projectId, $sessionCookie) { + // Get User + $response = $this->client->call(Client::METHOD_GET, '/account', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'Cookie' => $sessionCookie, + ])); - // Get User - $response = $this->client->call(Client::METHOD_GET, '/account', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $projectId, - 'Cookie' => $sessionCookie, - ])); + $this->assertEquals(401, $response['headers']['status-code']); + }, timeoutMs: 15 * 1000); - $this->assertEquals(200, $response['headers']['status-code']); - - // Wait just over a minute - sleep(35); - - // Get User - $response = $this->client->call(Client::METHOD_GET, '/account', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $projectId, - 'Cookie' => $sessionCookie, - ])); - - $this->assertEquals(401, $response['headers']['status-code']); - - // Set session duration to 15s + // Set session duration to 10min $response = $this->client->call(Client::METHOD_PATCH, '/projects/' . $id . '/auth/duration', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ - 'duration' => 15, // seconds + 'duration' => 600, // seconds ]); $this->assertEquals(200, $response['headers']['status-code']); - $this->assertEquals(15, $response['body']['authDuration']); - - // Wait 20 seconds, ensure non-valid session - \sleep(20); + $this->assertEquals(600, $response['body']['authDuration']); + // Ensure session is still expired (new duration only affects new sessions) $response = $this->client->call(Client::METHOD_GET, '/account', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $projectId, @@ -2774,6 +2760,7 @@ class ProjectsConsoleClientTest extends Scope 'x-appwrite-project' => $this->getProject()['$id'], 'cookie' => 'a_session_console=' . $this->getRoot()['session'], ]), [ + 'keyId' => ID::unique(), 'name' => 'Key Test', 'scopes' => ['functions.read', 'teams.write'], ]); @@ -3123,6 +3110,7 @@ class ProjectsConsoleClientTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ + 'keyId' => ID::unique(), 'name' => 'Key Test', 'scopes' => ['teams.read', 'teams.write'], ]); @@ -3138,6 +3126,66 @@ class ProjectsConsoleClientTest extends Scope $this->assertArrayHasKey('accessedAt', $response['body']); $this->assertEmpty($response['body']['accessedAt']); + /** + * Test for SUCCESS without key ID + */ + $response = $this->client->call(Client::METHOD_POST, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'name' => 'Key Custom', + 'scopes' => ['teams.read', 'teams.write'], + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + + /** + * Test for SUCCESS with custom ID + */ + $customKeyId = \uniqid() . 'custom-id'; + $response = $this->client->call(Client::METHOD_POST, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'keyId' => $customKeyId, + 'name' => 'Key Custom', + 'scopes' => ['teams.read', 'teams.write'], + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertSame($customKeyId, $response['body']['$id']); + + /** + * Test for FAILURE with custom ID + */ + $response = $this->client->call(Client::METHOD_POST, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'keyId' => $customKeyId, + 'name' => 'Key Custom', + 'scopes' => ['teams.read', 'teams.write'], + ]); + + $this->assertEquals(409, $response['headers']['status-code']); + + /** + * Test for SUCCESS with magic string ID + */ + $response = $this->client->call(Client::METHOD_POST, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'keyId' => 'unique()', + 'name' => 'Key Custom', + 'scopes' => ['teams.read', 'teams.write'], + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertNotSame('unique()', $response['body']['$id']); + $data = array_merge($data, [ 'keyId' => $response['body']['$id'], 'secret' => $response['body']['secret'] @@ -3150,6 +3198,7 @@ class ProjectsConsoleClientTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ + 'keyId' => ID::unique(), 'name' => 'Key Test', 'scopes' => ['unknown'], ]); @@ -3167,19 +3216,258 @@ class ProjectsConsoleClientTest extends Scope { $id = $data['projectId'] ?? ''; + /** Create a second key with an expiry for query testing */ + $expireDate = DateTime::addSeconds(new \DateTime(), 3600); + $response = $this->client->call(Client::METHOD_POST, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'name' => 'Key Test 2', + 'scopes' => ['users.read'], + 'expire' => $expireDate, + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $key2Id = $response['body']['$id']; + + /** List all keys (no queries) */ $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), []); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals(5, $response['body']['total']); + $this->assertCount(5, $response['body']['keys']); + + /** List keys with limit */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::limit(1)->toString(), + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertCount(1, $response['body']['keys']); + $this->assertEquals(5, $response['body']['total']); + + /** List keys with offset */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::offset(1)->toString(), + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertCount(4, $response['body']['keys']); + $this->assertEquals(5, $response['body']['total']); + + /** List keys with cursor after */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::cursorAfter(new Document(['$id' => $data['keyId']]))->toString(), + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertCount(1, $response['body']['keys']); + $this->assertEquals(5, $response['body']['total']); + $this->assertEquals($key2Id, $response['body']['keys'][0]['$id']); + + /** List keys filtering by expire (lessThan now — should match none) */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::lessThan('expire', (new \DateTime())->format('Y-m-d H:i:s'))->toString(), + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals(0, $response['body']['total']); + + /** List keys filtering by expire (greaterThan now — should match the key with expiry) */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::greaterThan('expire', (new \DateTime())->format('Y-m-d H:i:s'))->toString(), + ] + ]); $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals(1, $response['body']['total']); + $this->assertCount(1, $response['body']['keys']); + + /** List keys filtering by name (equal — exact match) */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::equal('name', ['Key Test'])->toString(), + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals(1, $response['body']['total']); + $this->assertCount(1, $response['body']['keys']); + $this->assertEquals('Key Test', $response['body']['keys'][0]['name']); + + /** List keys filtering by name (equal — multiple values) */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::equal('name', ['Key Test', 'Key Test 2'])->toString(), + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals(2, $response['body']['total']); + $this->assertCount(2, $response['body']['keys']); + + /** List keys filtering by name (equal — no match) */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::equal('name', ['Non Existent Key'])->toString(), + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals(0, $response['body']['total']); + $this->assertCount(0, $response['body']['keys']); + + /** List keys filtering by scopes (contains — match key with teams.read) */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::contains('scopes', ['teams.read'])->toString(), + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals(4, $response['body']['total']); + $this->assertCount(4, $response['body']['keys']); + + /** List keys filtering by scopes (contains — match key with users.read) */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::contains('scopes', ['users.read'])->toString(), + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals(1, $response['body']['total']); + $this->assertCount(1, $response['body']['keys']); + + /** List keys filtering by scopes (contains — no match) */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::contains('scopes', ['databases.read'])->toString(), + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals(0, $response['body']['total']); + $this->assertCount(0, $response['body']['keys']); + + /** List keys filtering by name and scopes combined */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::equal('name', ['Key Test'])->toString(), + Query::contains('scopes', ['teams.read'])->toString(), + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals(1, $response['body']['total']); + $this->assertCount(1, $response['body']['keys']); + $this->assertEquals('Key Test', $response['body']['keys'][0]['name']); + + /** List keys with orderDesc */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::orderDesc('$createdAt')->toString(), + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertCount(5, $response['body']['keys']); + $this->assertGreaterThan($response['body']['keys'][1]['$createdAt'], $response['body']['keys'][0]['$createdAt']); + + /** List keys with total disabled */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'total' => false, + 'queries' => [ + Query::limit(1)->toString() + ] + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertCount(1, $response['body']['keys']); + $this->assertEquals(0, $response['body']['total']); /** * Test for FAILURE */ + /** Test invalid query attribute */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::equal('secret', ['test'])->toString(), + ] + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + /** Test invalid cursor */ + $response = $this->client->call(Client::METHOD_GET, '/projects/' . $id . '/keys', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'queries' => [ + Query::cursorAfter(new Document(['$id' => 'invalid']))->toString(), + ] + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + return $data; } @@ -3200,7 +3488,7 @@ class ProjectsConsoleClientTest extends Scope $this->assertEquals(200, $response['headers']['status-code']); $this->assertNotEmpty($response['body']['$id']); $this->assertEquals($keyId, $response['body']['$id']); - $this->assertEquals('Key Test', $response['body']['name']); + $this->assertEquals('Key Custom', $response['body']['name']); $this->assertContains('teams.read', $response['body']['scopes']); $this->assertContains('teams.write', $response['body']['scopes']); $this->assertCount(2, $response['body']['scopes']); @@ -3240,6 +3528,7 @@ class ProjectsConsoleClientTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ + 'keyId' => ID::unique(), 'name' => 'Key Test', 'scopes' => ['users.write'], 'expire' => DateTime::addSeconds(new \DateTime(), 3600), @@ -3260,6 +3549,7 @@ class ProjectsConsoleClientTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ + 'keyId' => ID::unique(), 'name' => 'Key Test', 'scopes' => ['health.read'], 'expire' => null, @@ -3282,6 +3572,7 @@ class ProjectsConsoleClientTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ + 'keyId' => ID::unique(), 'name' => 'Key Test', 'scopes' => ['health.read'], 'expire' => DateTime::addSeconds(new \DateTime(), -3600), @@ -3323,6 +3614,7 @@ class ProjectsConsoleClientTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ + 'keyId' => ID::unique(), 'name' => 'Key Test', 'scopes' => ['teams.read'], 'expire' => DateTime::addSeconds(new \DateTime(), 3600), @@ -3355,6 +3647,7 @@ class ProjectsConsoleClientTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ + 'keyId' => ID::unique(), 'name' => 'Key Test', 'scopes' => ['health.read'], 'expire' => DateTime::addSeconds(new \DateTime(), 3600), @@ -4364,6 +4657,7 @@ class ProjectsConsoleClientTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ + 'keyId' => ID::unique(), 'name' => 'Key Test', 'scopes' => ['users.read', 'users.write'], ]); @@ -4384,6 +4678,7 @@ class ProjectsConsoleClientTest extends Scope 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ + 'keyId' => ID::unique(), 'name' => 'Key Test', 'scopes' => ['users.read', 'users.write'], ]); @@ -5092,6 +5387,31 @@ class ProjectsConsoleClientTest extends Scope ]); $this->assertEquals(200, $response['headers']['status-code']); + /** Ensure any hostname is allowed */ + $response = $this->client->call(Client::METHOD_GET, '/account/sessions/oauth2/' . $provider, [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'x-appwrite-dev-key' => $devKey['secret'], + 'origin' => '', + 'referer' => 'https://domain-without-rule.com' + ], [ + 'success' => 'https://domain-without-rule.com', + 'failure' => 'https://domain-without-rule.com' + ], followRedirects: false); + $this->assertEquals(301, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_GET, '/account/sessions/oauth2/' . $provider, [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'x-appwrite-dev-key' => $devKey['secret'], + 'referer' => '', + 'origin' => 'https://domain-without-rule.com' + ], [ + 'success' => 'https://domain-without-rule.com', + 'failure' => 'https://domain-without-rule.com' + ], followRedirects: false); + $this->assertEquals(301, $response['headers']['status-code']); + /** Test hostname in Magic URL */ $response = $this->client->call(Client::METHOD_POST, '/account/sessions/magic-url', [ 'content-type' => 'application/json', @@ -5116,6 +5436,180 @@ class ProjectsConsoleClientTest extends Scope $this->assertEquals(201, $response['headers']['status-code']); } + public function testRuleOAuthRedirect(): void + { + // Prepare project + $projectId = $this->setupProject([ + 'projectId' => ID::unique(), + 'name' => 'testRuleOAuthRedirect', + 'region' => System::getEnv('_APP_REGION', 'default') + ]); + + $provider = 'mock'; + $appId = '1'; + $secret = '123456'; + + // Prepare OAuth provider + $response = $this->client->call(Client::METHOD_PATCH, '/projects/' . $projectId . '/oauth2', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'provider' => $provider, + 'appId' => $appId, + 'secret' => $secret, + 'enabled' => true, + ]); + $this->assertEquals(200, $response['headers']['status-code']); + + // Prepare rule. In reality this is site rule, but for testing, API rule is enough, and faster to prepare + $domain = \uniqid() . '-with-rule.custom.localhost'; + $rule = $this->client->call(Client::METHOD_POST, '/proxy/rules/api', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'x-appwrite-mode' => 'admin', + ], $this->getHeaders()), [ + 'domain' => $domain + ]); + + $this->assertEquals(201, $rule['headers']['status-code']); + + // Ensure unknown domain cannot be redirect URL + $response = $this->client->call(Client::METHOD_GET, '/account/sessions/oauth2/' . $provider, [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'referer' => 'https://' . $domain, + 'origin' => '', + ], [ + 'success' => 'https://domain-without-rule.com', + 'failure' => 'https://domain-without-rule.com' + ], followRedirects: false); + $this->assertEquals(400, $response['headers']['status-code']); + + // Also ensure final step blocks unknown redirect URL + $response = $this->client->call(Client::METHOD_GET, '/account/sessions/oauth2/' . $provider . '/redirect', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'origin' => '', + 'referer' => 'https://mockserver.com', + ], [ + 'code' => 'any-code', + 'state' => \json_encode([ + 'success' => 'https://domain-without-rule.com', + 'failure' => 'https://domain-without-rule.com' + ]), + 'error' => '', + 'error_description' => '', + ], followRedirects: false); + $this->assertEquals(400, $response['headers']['status-code']); + $this->assertStringContainsString('project_invalid_success_url', $response['body']); + + // Ensure rule's domain can be redirect URL + $response = $this->client->call(Client::METHOD_GET, '/account/sessions/oauth2/' . $provider, [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'referer' => 'https://' . $domain, + 'origin' => '', + ], [ + 'success' => 'https://' . $domain, + 'failure' => 'https://' . $domain + ], followRedirects: false); + $this->assertEquals(301, $response['headers']['status-code']); + + // Also ensure final step allows redirect URL + $response = $this->client->call(Client::METHOD_GET, '/account/sessions/oauth2/' . $provider . '/redirect', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'origin' => '', + 'referer' => 'https://mockserver.com', + ], [ + 'code' => 'any-code', + 'state' => \json_encode([ + 'success' => 'https://' . $domain, + 'failure' => 'https://' . $domain + ]), + 'error' => '', + 'error_deescription' => '', + ], followRedirects: false); + $this->assertEquals(301, $response['headers']['status-code']); + $this->assertStringContainsString('https://' . $domain, $response['headers']['location']); + + // Ensure unknown domain cannot be redirect URL + $response = $this->client->call(Client::METHOD_POST, '/account/sessions/magic-url', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'referer' => 'https://' . $domain, + 'origin' => '', + ], [ + 'userId' => ID::unique(), + 'email' => 'user@appwrite.io', + 'url' => 'https://domain-without-rule.com', + ]); + $this->assertEquals(400, $response['headers']['status-code']); + + // Ensure rule's domain can be redirect URL + $response = $this->client->call(Client::METHOD_POST, '/account/sessions/magic-url', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'referer' => 'https://' . $domain, + 'origin' => '', + ], [ + 'userId' => ID::unique(), + 'email' => 'user@appwrite.io', + 'url' => 'https://' . $domain, + ]); + $this->assertEquals(201, $response['headers']['status-code']); + } + + public function testOAuthRedirectWithCustomSchemeState(): void + { + // Prepare project + $projectId = $this->setupProject([ + 'projectId' => ID::unique(), + 'name' => 'testOAuthRedirectWithCustomSchemeState', + 'region' => System::getEnv('_APP_REGION', 'default') + ]); + + $provider = 'mock'; + $appId = '1'; + $secret = '123456'; + + // Prepare OAuth provider + $response = $this->client->call(Client::METHOD_PATCH, '/projects/' . $projectId . '/oauth2', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'provider' => $provider, + 'appId' => $appId, + 'secret' => $secret, + 'enabled' => true, + ]); + $this->assertEquals(200, $response['headers']['status-code']); + + $scheme = 'appwrite-callback-' . $projectId; + $state = \json_encode([ + 'success' => $scheme . ':///', + 'failure' => $scheme . ':///' + ]); + + $response = $this->client->call(Client::METHOD_GET, '/account/sessions/oauth2/' . $provider . '/redirect', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'origin' => '', + 'referer' => '', + ], [ + 'code' => 'any-code', + 'state' => $state, + 'error' => 'access_denied', + 'error_description' => 'test', + ], followRedirects: false); + + $this->assertEquals(301, $response['headers']['status-code']); + $this->assertStringStartsWith($scheme . '://', $response['headers']['location']); + $this->assertStringContainsString('error=', $response['headers']['location']); + } + /** * @group abuseEnabled */ @@ -5173,6 +5667,68 @@ class ProjectsConsoleClientTest extends Scope $this->assertEquals($origin, $response['headers']['access-control-allow-origin'] ?? null); } + public function testConsoleCorsWithTrustedProject(): void + { + $trustedProjectIds = ['trusted-project', 'another-trusted-project']; // Set in env variable + + $projectIds = \array_merge($trustedProjectIds, ['untrusted-project-id']); + + foreach ($projectIds as $projectId) { + try { + // Create project + $this->setupProject([ + 'projectId' => $projectId, + 'name' => 'Trusted project', + 'region' => System::getEnv('_APP_REGION', 'default') + ]); + + // Add domain to trusted project; API for simplicity, in real work this will be site + $domain = \uniqid() . '.custom.localhost'; + $rule = $this->client->call(Client::METHOD_POST, '/proxy/rules/api', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'x-appwrite-mode' => 'admin', + ], $this->getHeaders()), [ + 'domain' => $domain + ]); + + $this->assertEquals(201, $rule['headers']['status-code']); + + // Talk to Console APIs from trusted project domain + $currencies = $this->client->call( + Client::METHOD_GET, + '/locale/currencies', + array_merge( + $this->getHeaders(), + [ + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + 'origin' => 'http://' . $domain + ] + ) + ); + + if (\in_array($projectId, $trustedProjectIds)) { + // Trusted projects can + $this->assertEquals(200, $currencies['headers']['status-code']); + $this->assertSame('http://' . $domain, $currencies['headers']['access-control-allow-origin']); + } else { + // Untrusted projects cannot + $this->assertEquals(403, $currencies['headers']['status-code']); + $this->assertArrayNotHasKey('access-control-allow-origin', $currencies['headers']); + } + } finally { + // Cleanup + $response = $this->client->call(Client::METHOD_DELETE, '/projects/' . $projectId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(204, $response['headers']['status-code']); + } + } + } + /** * @group abuseEnabled */ diff --git a/tests/e2e/Services/Proxy/ProxyBase.php b/tests/e2e/Services/Proxy/ProxyBase.php index c6d63495a0..75d7208002 100644 --- a/tests/e2e/Services/Proxy/ProxyBase.php +++ b/tests/e2e/Services/Proxy/ProxyBase.php @@ -6,7 +6,7 @@ use Appwrite\ID; use Appwrite\Tests\Async; use CURLFile; use Tests\E2E\Client; -use Utopia\CLI\Console; +use Utopia\Console; trait ProxyBase { diff --git a/tests/e2e/Services/Proxy/ProxyCustomServerTest.php b/tests/e2e/Services/Proxy/ProxyCustomServerTest.php index be0b89b404..5c62240891 100644 --- a/tests/e2e/Services/Proxy/ProxyCustomServerTest.php +++ b/tests/e2e/Services/Proxy/ProxyCustomServerTest.php @@ -546,7 +546,7 @@ class ProxyCustomServerTest extends Scope $rules = $this->listRules([ 'search' => $rule1Domain, - 'queries' => [ Query::orderDesc('$createdAt') ] + 'queries' => [ Query::orderDesc('$createdAt')->toString() ] ]); $this->assertEquals(200, $rules['headers']['status-code']); @@ -555,7 +555,7 @@ class ProxyCustomServerTest extends Scope $rules = $this->listRules([ 'search' => $rule2Domain, - 'queries' => [ Query::orderDesc('$createdAt') ] + 'queries' => [ Query::orderDesc('$createdAt')->toString() ] ]); $this->assertEquals(200, $rules['headers']['status-code']); $ruleIds = \array_column($rules['body']['rules'], '$id'); @@ -563,7 +563,7 @@ class ProxyCustomServerTest extends Scope $rules = $this->listRules([ 'search' => $rule1Id, - 'queries' => [ Query::orderDesc('$createdAt') ] + 'queries' => [ Query::orderDesc('$createdAt')->toString() ] ]); $this->assertEquals(200, $rules['headers']['status-code']); $ruleDomains = \array_column($rules['body']['rules'], 'domain'); @@ -571,7 +571,7 @@ class ProxyCustomServerTest extends Scope $rules = $this->listRules([ 'search' => $rule2Id, - 'queries' => [ Query::orderDesc('$createdAt') ] + 'queries' => [ Query::orderDesc('$createdAt')->toString() ] ]); $this->assertEquals(200, $rules['headers']['status-code']); $ruleDomains = \array_column($rules['body']['rules'], 'domain'); diff --git a/tests/e2e/Services/Realtime/RealtimeBase.php b/tests/e2e/Services/Realtime/RealtimeBase.php index 1b77c0ad4a..92d29ba3a3 100644 --- a/tests/e2e/Services/Realtime/RealtimeBase.php +++ b/tests/e2e/Services/Realtime/RealtimeBase.php @@ -68,6 +68,27 @@ trait RealtimeBase ); } + /** + * Build WebSocket client with custom query parameters. + * Useful for testing edge cases like project in header only, or project as Query array. + * + * @param array $queryParams Custom query parameters (e.g., ['channels' => ['project'], 'project' => [...]]) + * @param array $headers HTTP headers + * @return WebSocketClient + */ + private function getWebsocketWithCustomQuery(array $queryParams, array $headers = []): WebSocketClient + { + $queryString = http_build_query($queryParams); + + return new WebSocketClient( + "ws://appwrite.test/v1/realtime?" . $queryString, + [ + "headers" => $headers, + "timeout" => 30, + ] + ); + } + public function testConnection(): void { /** diff --git a/tests/e2e/Services/Realtime/RealtimeCustomClientQueryTest.php b/tests/e2e/Services/Realtime/RealtimeCustomClientQueryTest.php index e93e955f1a..b1fbb14bbb 100644 --- a/tests/e2e/Services/Realtime/RealtimeCustomClientQueryTest.php +++ b/tests/e2e/Services/Realtime/RealtimeCustomClientQueryTest.php @@ -1234,6 +1234,183 @@ class RealtimeCustomClientQueryTest extends Scope $client->close(); } + public function testCollectionScopedDocumentsChannelReceivesEvents() + { + $user = $this->getUser(); + $session = $user['session'] ?? ''; + $projectId = $this->getProject()['$id']; + + // Setup database and collection + $database = $this->client->call(Client::METHOD_POST, '/databases', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'databaseId' => ID::unique(), + 'name' => 'Scoped Channel DB', + ]); + $databaseId = $database['body']['$id']; + + $collection = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'collectionId' => ID::unique(), + 'name' => 'Scoped Channel Collection', + 'permissions' => [ + Permission::create(Role::user($user['$id'])), + ], + 'documentSecurity' => true, + ]); + $collectionId = $collection['body']['$id']; + + $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'status', + 'size' => 256, + 'required' => false, + ]); + + sleep(2); + + // Subscribe only to the fully-qualified documents channel for this collection + $scopedChannel = 'databases.' . $databaseId . '.collections.' . $collectionId . '.documents'; + $client = $this->getWebsocket([$scopedChannel], [ + 'origin' => 'http://localhost', + 'cookie' => 'a_session_' . $projectId . '=' . $session, + ]); + + $response = json_decode($client->receive(), true); + $this->assertEquals('connected', $response['type']); + $this->assertContains($scopedChannel, $response['data']['channels']); + + // Create document in that collection - should receive event on the scoped channel + $documentId = ID::unique(); + $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + ], $this->getHeaders()), [ + 'documentId' => $documentId, + 'data' => [ + 'status' => 'active' + ], + 'permissions' => [ + Permission::read(Role::any()), + ], + ]); + + $event = json_decode($client->receive(), true); + $this->assertEquals('event', $event['type']); + $this->assertEquals($documentId, $event['data']['payload']['$id']); + + $client->close(); + } + + public function testCollectionScopedDocumentsChannelWithQuery() + { + $user = $this->getUser(); + $session = $user['session'] ?? ''; + $projectId = $this->getProject()['$id']; + + // Setup database and collection + $database = $this->client->call(Client::METHOD_POST, '/databases', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'databaseId' => ID::unique(), + 'name' => 'Scoped Channel Query DB', + ]); + $databaseId = $database['body']['$id']; + + $collection = $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'collectionId' => ID::unique(), + 'name' => 'Scoped Channel Query Collection', + 'permissions' => [ + Permission::create(Role::user($user['$id'])), + ], + 'documentSecurity' => true, + ]); + $collectionId = $collection['body']['$id']; + + $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes/string', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'key' => 'status', + 'size' => 256, + 'required' => false, + ]); + + sleep(2); + + $targetDocumentId = ID::unique(); + + // Subscribe with query for specific document ID on the fully-qualified documents channel + $scopedChannel = 'databases.' . $databaseId . '.collections.' . $collectionId . '.documents'; + $client = $this->getWebsocket([$scopedChannel], [ + 'origin' => 'http://localhost', + 'cookie' => 'a_session_' . $projectId . '=' . $session, + ], null, [ + Query::equal('$id', [$targetDocumentId])->toString(), + ]); + + $response = json_decode($client->receive(), true); + $this->assertEquals('connected', $response['type']); + $this->assertContains($scopedChannel, $response['data']['channels']); + + // Create document with matching ID - should receive event + $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + ], $this->getHeaders()), [ + 'documentId' => $targetDocumentId, + 'data' => [ + 'status' => 'active' + ], + 'permissions' => [ + Permission::read(Role::any()), + ], + ]); + + $event = json_decode($client->receive(), true); + $this->assertEquals('event', $event['type']); + $this->assertEquals($targetDocumentId, $event['data']['payload']['$id']); + + // Create document with different ID - should NOT receive event + $otherDocumentId = ID::unique(); + $this->client->call(Client::METHOD_POST, '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $projectId, + ], $this->getHeaders()), [ + 'documentId' => $otherDocumentId, + 'data' => [ + 'status' => 'inactive' + ], + 'permissions' => [ + Permission::read(Role::any()), + ], + ]); + + try { + $client->receive(); + $this->fail('Expected TimeoutException - event should be filtered for scoped channel query'); + } catch (TimeoutException $e) { + $this->assertTrue(true); + } + + $client->close(); + } + public function testFilesChannelWithQuery() { $user = $this->getUser(); @@ -2085,4 +2262,192 @@ class RealtimeCustomClientQueryTest extends Scope $client->close(); } + + public function testProjectChannelWithQuery() + { + $user = $this->getUser(); + $session = $user['session'] ?? ''; + $projectId = $this->getProject()['$id']; + + // Test OLD SDK behavior: project=projectId (string) in query param + // For reserved \"project\" param, string is treated as routing-only (project ID), + // and is not used as queries for the project channel. We should fall back to select(*). + $clientOldSdk = $this->getWebsocket(['project'], [ + 'origin' => 'http://localhost', + 'cookie' => 'a_session_' . $projectId . '=' . $session, + ], $projectId, null); + + $response = json_decode($clientOldSdk->receive(), true); + $this->assertEquals('connected', $response['type']); + $this->assertContains('project', $response['data']['channels']); + // Should have default select(['*']) subscription since project param was treated as project ID, not queries + $this->assertArrayHasKey('subscriptions', $response['data']); + $this->assertIsArray($response['data']['subscriptions']); + $this->assertNotEmpty($response['data']['subscriptions']); + + $clientOldSdk->close(); + + // Test NEW SDK behavior: project=Query array in query param, project ID in header + // The reserved param logic should use Query array as subscription queries for project channel + $queryArray = [Query::select(['*'])->toString()]; + $clientNewSdk = $this->getWebsocketWithCustomQuery( + [ + 'channels' => ['project'], + 'project' => [ + 0 => [ + 0 => $queryArray[0] + ] + ] + ], + [ + 'origin' => 'http://localhost', + 'cookie' => 'a_session_' . $projectId . '=' . $session, + 'x-appwrite-project' => $projectId, + ] + ); + + $response = json_decode($clientNewSdk->receive(), true); + $this->assertEquals('connected', $response['type']); + $this->assertContains('project', $response['data']['channels']); + // Should have subscription with the provided query + $this->assertArrayHasKey('subscriptions', $response['data']); + $this->assertIsArray($response['data']['subscriptions']); + $this->assertNotEmpty($response['data']['subscriptions']); + + $clientNewSdk->close(); + + // Test edge case: project param is array but not a valid Query array + // This should now fail with an invalid query error rather than silently falling back. + $clientEdgeCase = $this->getWebsocketWithCustomQuery( + [ + 'channels' => ['project'], + 'project' => ['invalid', 'array'] + ], + [ + 'origin' => 'http://localhost', + 'cookie' => 'a_session_' . $projectId . '=' . $session, + 'x-appwrite-project' => $projectId, + ] + ); + + $response = json_decode($clientEdgeCase->receive(), true); + $this->assertEquals('error', $response['type']); + $this->assertStringContainsString('Invalid query', $response['data']['message']); + } + + public function testProjectChannelWithHeaderOnly() + { + $user = $this->getUser(); + $session = $user['session'] ?? ''; + $projectId = $this->getProject()['$id']; + + // Test: project ID only in header, no project query param + // This simulates a client that only uses x-appwrite-project header + $client = $this->getWebsocketWithCustomQuery( + [ + 'channels' => ['project'] + ], + [ + 'origin' => 'http://localhost', + 'cookie' => 'a_session_' . $projectId . '=' . $session, + 'x-appwrite-project' => $projectId, + ] + ); + + $response = json_decode($client->receive(), true); + $this->assertEquals('connected', $response['type']); + $this->assertContains('project', $response['data']['channels']); + // Should have default select(['*']) subscription since no project query param + $this->assertArrayHasKey('subscriptions', $response['data']); + $this->assertIsArray($response['data']['subscriptions']); + $this->assertNotEmpty($response['data']['subscriptions']); + + $client->close(); + + // Test: project channel with queries, project ID only in header + $queryArray = [Query::select(['*'])->toString()]; + $clientWithQuery = $this->getWebsocketWithCustomQuery( + [ + 'channels' => ['project'], + 'project' => [ + 0 => [ + 0 => $queryArray[0] + ] + ] + ], + [ + 'origin' => 'http://localhost', + 'cookie' => 'a_session_' . $projectId . '=' . $session, + 'x-appwrite-project' => $projectId, + ] + ); + + $response = json_decode($clientWithQuery->receive(), true); + $this->assertEquals('connected', $response['type']); + $this->assertContains('project', $response['data']['channels']); + $this->assertArrayHasKey('subscriptions', $response['data']); + $this->assertIsArray($response['data']['subscriptions']); + $this->assertNotEmpty($response['data']['subscriptions']); + + $clientWithQuery->close(); + } + + public function testTestsChannelWithQueries() + { + $projectId = 'console'; + + // Subscribe without queries - should receive all events + $clientNoQuery = $this->getWebsocket(['tests'], [ + 'origin' => 'http://localhost', + ], $projectId); + + $response = json_decode($clientNoQuery->receive(), true); + $this->assertEquals('connected', $response['type']); + + // Subscribe with matching query - should receive events + $clientWithMatchingQuery = $this->getWebsocket(['tests'], [ + 'origin' => 'http://localhost', + ], $projectId, [ + Query::equal('response', ['WS:/v1/realtime:passed'])->toString(), + ]); + + $response = json_decode($clientWithMatchingQuery->receive(), true); + $this->assertEquals('connected', $response['type']); + + // Subscribe with non-matching query - should NOT receive events + $clientWithNonMatchingQuery = $this->getWebsocket(['tests'], [ + 'origin' => 'http://localhost', + ], $projectId, [ + Query::equal('response', ['failed'])->toString(), + ]); + + $response = json_decode($clientWithNonMatchingQuery->receive(), true); + $this->assertEquals('connected', $response['type']); + + sleep(6); + + // Client without query should receive event + $eventNoQuery = json_decode($clientNoQuery->receive(), true); + $this->assertEquals('event', $eventNoQuery['type']); + $this->assertEquals('test.event', $eventNoQuery['data']['events'][0]); + $this->assertEquals('WS:/v1/realtime:passed', $eventNoQuery['data']['payload']['response']); + + // Client with matching query should receive event + $eventMatching = json_decode($clientWithMatchingQuery->receive(), true); + $this->assertEquals('event', $eventMatching['type']); + $this->assertEquals('test.event', $eventMatching['data']['events'][0]); + $this->assertEquals('WS:/v1/realtime:passed', $eventMatching['data']['payload']['response']); + + // Client with non-matching query should NOT receive event + try { + $clientWithNonMatchingQuery->receive(); + $this->fail('Expected TimeoutException - client with non-matching query should not receive event'); + } catch (TimeoutException $e) { + $this->assertTrue(true); + } + + $clientNoQuery->close(); + $clientWithMatchingQuery->close(); + $clientWithNonMatchingQuery->close(); + } } diff --git a/tests/e2e/Services/Sites/SitesBase.php b/tests/e2e/Services/Sites/SitesBase.php index e7af09d1d9..67759299d4 100644 --- a/tests/e2e/Services/Sites/SitesBase.php +++ b/tests/e2e/Services/Sites/SitesBase.php @@ -6,7 +6,7 @@ use Appwrite\Tests\Async; use Appwrite\Tests\Async\Exceptions\Critical; use CURLFile; use Tests\E2E\Client; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Helpers\ID; use Utopia\Database\Query; use Utopia\System\System; @@ -335,21 +335,28 @@ trait SitesBase protected function helperGetLatestCommit(string $owner, string $repository): ?string { - $ch = curl_init("https://api.github.com/repos/{$owner}/{$repository}/commits/main"); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HTTPHEADER, [ - 'User-Agent: Appwrite', - 'Accept: application/vnd.github.v3+json' - ]); + $maxRetries = 3; + for ($attempt = 0; $attempt < $maxRetries; $attempt++) { + if ($attempt > 0) { + sleep(5); + } - $response = curl_exec($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - curl_close($ch); + $ch = curl_init("https://api.github.com/repos/{$owner}/{$repository}/commits/main"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'User-Agent: Appwrite', + 'Accept: application/vnd.github.v3+json' + ]); - if ($httpCode === 200) { - $commitData = json_decode($response, true); - if (isset($commitData['sha'])) { - return $commitData['sha']; + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($httpCode === 200) { + $commitData = json_decode($response, true); + if (isset($commitData['sha'])) { + return $commitData['sha']; + } } } diff --git a/tests/e2e/Services/Sites/SitesCustomServerTest.php b/tests/e2e/Services/Sites/SitesCustomServerTest.php index 27294a9c3b..b099342dce 100644 --- a/tests/e2e/Services/Sites/SitesCustomServerTest.php +++ b/tests/e2e/Services/Sites/SitesCustomServerTest.php @@ -9,7 +9,7 @@ use Tests\E2E\Client; use Tests\E2E\Scopes\ProjectCustom; use Tests\E2E\Scopes\Scope; use Tests\E2E\Scopes\SideServer; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Document; use Utopia\Database\Helpers\ID; use Utopia\Database\Query; @@ -155,7 +155,7 @@ class SitesCustomServerTest extends Scope 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ 'queries' => [ - Query::equal('deploymentResourceId', [$siteId]) + Query::equal('deploymentResourceId', [$siteId])->toString() ] ]); diff --git a/tests/e2e/Services/Teams/TeamsCustomClientTest.php b/tests/e2e/Services/Teams/TeamsCustomClientTest.php index e30dacac74..6dbead76db 100644 --- a/tests/e2e/Services/Teams/TeamsCustomClientTest.php +++ b/tests/e2e/Services/Teams/TeamsCustomClientTest.php @@ -6,7 +6,7 @@ use Tests\E2E\Client; use Tests\E2E\Scopes\ProjectCustom; use Tests\E2E\Scopes\Scope; use Tests\E2E\Scopes\SideClient; -use Utopia\CLI\Console; +use Utopia\Console; class TeamsCustomClientTest extends Scope { diff --git a/tests/e2e/Services/Webhooks/WebhooksCustomServerTest.php b/tests/e2e/Services/Webhooks/WebhooksCustomServerTest.php index d1f1106247..de431edbc2 100644 --- a/tests/e2e/Services/Webhooks/WebhooksCustomServerTest.php +++ b/tests/e2e/Services/Webhooks/WebhooksCustomServerTest.php @@ -8,7 +8,7 @@ use Tests\E2E\Client; use Tests\E2E\Scopes\ProjectCustom; use Tests\E2E\Scopes\Scope; use Tests\E2E\Scopes\SideServer; -use Utopia\CLI\Console; +use Utopia\Console; use Utopia\Database\Helpers\ID; use Utopia\Database\Helpers\Permission; use Utopia\Database\Helpers\Role; diff --git a/tests/resources/docker/docker-compose.yml b/tests/resources/docker/docker-compose.yml index 039ffb731a..8530df0db6 100644 --- a/tests/resources/docker/docker-compose.yml +++ b/tests/resources/docker/docker-compose.yml @@ -1,6 +1,6 @@ services: traefik: - image: traefik:2.2 + image: traefik:3.6 container_name: appwrite-traefik command: - --log.level=DEBUG @@ -212,6 +212,27 @@ services: - _APP_DB_USER - _APP_DB_PASS + appwrite-worker-executions: + entrypoint: worker-executions + container_name: appwrite-worker-executions + build: + context: . + restart: unless-stopped + networks: + - appwrite + depends_on: + - redis + - mariadb + environment: + - _APP_ENV + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + appwrite-worker-functions: entrypoint: worker-functions container_name: appwrite-worker-functions diff --git a/tests/unit/Docker/ComposeTest.php b/tests/unit/Docker/ComposeTest.php index 93e0204264..e63d877baf 100644 --- a/tests/unit/Docker/ComposeTest.php +++ b/tests/unit/Docker/ComposeTest.php @@ -23,10 +23,10 @@ class ComposeTest extends TestCase public function testServices(): void { - $this->assertCount(15, $this->object->getServices()); + $this->assertCount(16, $this->object->getServices()); $this->assertEquals('appwrite', $this->object->getService('appwrite')->getContainerName()); $this->assertEquals('', $this->object->getService('appwrite')->getImageVersion()); - $this->assertEquals('2.2', $this->object->getService('traefik')->getImageVersion()); + $this->assertEquals('3.6', $this->object->getService('traefik')->getImageVersion()); $this->assertEquals(['2080' => '80', '2443' => '443', '8080' => '8080'], $this->object->getService('traefik')->getPorts()); } diff --git a/tests/unit/Network/Validators/OriginTest.php b/tests/unit/Network/Validators/OriginTest.php index a4c235f755..7a19daecbf 100644 --- a/tests/unit/Network/Validators/OriginTest.php +++ b/tests/unit/Network/Validators/OriginTest.php @@ -16,6 +16,8 @@ class OriginTest extends TestCase $this->assertEquals(false, $validator->isValid('')); $this->assertEquals(false, $validator->isValid('/')); + $this->assertEquals(false, $validator->isValid([])); + $this->assertEquals(false, $validator->isValid(['http://localhost'])); $this->assertEquals(true, $validator->isValid('https://localhost')); $this->assertEquals(true, $validator->isValid('http://localhost')); @@ -74,4 +76,60 @@ class OriginTest extends TestCase $this->assertEquals(false, $validator->isValid('random-scheme://localhost')); $this->assertEquals('Invalid Scheme. The scheme used (random-scheme) in the Origin (random-scheme://localhost) is not supported. If you are using a custom scheme, please change it to `appwrite-callback-`', $validator->getDescription()); } + + public function testGetAllowedHostnames(): void + { + $validator = new Origin( + allowedHostnames: ['appwrite.io', 'localhost'], + allowedSchemes: ['exp'] + ); + + $this->assertEquals(['appwrite.io', 'localhost'], $validator->getAllowedHostnames()); + } + + public function testGetAllowedSchemes(): void + { + $validator = new Origin( + allowedHostnames: ['appwrite.io'], + allowedSchemes: ['exp', 'appwrite-callback-123'] + ); + + $this->assertEquals(['exp', 'appwrite-callback-123'], $validator->getAllowedSchemes()); + } + + public function testSetAllowedHostnames(): void + { + $validator = new Origin( + allowedHostnames: ['appwrite.io'], + allowedSchemes: ['exp'] + ); + + $this->assertEquals(true, $validator->isValid('https://appwrite.io')); + $this->assertEquals(false, $validator->isValid('https://example.com')); + + $result = $validator->setAllowedHostnames(['example.com']); + + $this->assertSame($validator, $result); + $this->assertEquals(['example.com'], $validator->getAllowedHostnames()); + $this->assertEquals(true, $validator->isValid('https://example.com')); + $this->assertEquals(false, $validator->isValid('https://appwrite.io')); + } + + public function testSetAllowedSchemes(): void + { + $validator = new Origin( + allowedHostnames: ['appwrite.io'], + allowedSchemes: ['exp'] + ); + + $this->assertEquals(true, $validator->isValid('exp://')); + $this->assertEquals(false, $validator->isValid('appwrite-callback-456://')); + + $result = $validator->setAllowedSchemes(['appwrite-callback-456']); + + $this->assertSame($validator, $result); + $this->assertEquals(['appwrite-callback-456'], $validator->getAllowedSchemes()); + $this->assertEquals(true, $validator->isValid('appwrite-callback-456://')); + $this->assertEquals(false, $validator->isValid('exp://')); + } } diff --git a/tests/unit/Utopia/Database/Query/RuntimeQueryTest.php b/tests/unit/Utopia/Database/Query/RuntimeQueryTest.php index 51d3a307da..f7d73eb287 100644 --- a/tests/unit/Utopia/Database/Query/RuntimeQueryTest.php +++ b/tests/unit/Utopia/Database/Query/RuntimeQueryTest.php @@ -16,10 +16,19 @@ class RuntimeQueryTest extends TestCase { } + /** + * Helper to compile and filter queries in one step for tests. + */ + private function compileAndFilter(array $queries, array $payload): ?array + { + $compiled = RuntimeQuery::compile($queries); + return RuntimeQuery::filter($compiled, $payload); + } + public function testFilterEmptyQueries(): void { $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter([], $payload); + $result = $this->compileAndFilter([], $payload); $this->assertEquals($payload, $result); } @@ -27,15 +36,15 @@ class RuntimeQueryTest extends TestCase { $queries = [Query::equal('name', ['Jane'])]; $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter($queries, $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter($queries, $payload); + $this->assertNull($result); } public function testFilterWithMatchingQuery(): void { $queries = [Query::equal('name', ['John'])]; $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter($queries, $payload); + $result = $this->compileAndFilter($queries, $payload); $this->assertEquals($payload, $result); } @@ -44,7 +53,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::equal('name', ['John']); $payload = ['name' => 'John']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -52,15 +61,15 @@ class RuntimeQueryTest extends TestCase { $query = Query::equal('name', ['Jane']); $payload = ['name' => 'John']; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testEqualMultipleValuesMatch(): void { $query = Query::equal('status', ['active', 'pending', 'approved']); $payload = ['status' => 'active']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -68,15 +77,15 @@ class RuntimeQueryTest extends TestCase { $query = Query::equal('status', ['active', 'pending', 'approved']); $payload = ['status' => 'rejected']; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testEqualNumericValues(): void { $query = Query::equal('age', [30, 25, 35]); $payload = ['age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -84,7 +93,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::equal('active', [true]); $payload = ['active' => true]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -92,8 +101,8 @@ class RuntimeQueryTest extends TestCase { $query = Query::equal('missing', ['value']); $payload = ['name' => 'John']; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } // TYPE_NOT_EQUAL tests @@ -101,7 +110,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::notEqual('name', ['Jane']); $payload = ['name' => 'John']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -109,8 +118,8 @@ class RuntimeQueryTest extends TestCase { $query = Query::notEqual('name', ['John']); $payload = ['name' => 'John']; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testNotEqualMultipleValues(): void @@ -119,13 +128,13 @@ class RuntimeQueryTest extends TestCase // and Query::parse will be done first and parse doesn't allow multiple notEqual values $query = Query::notEqual('status', ['rejected', 'cancelled']); $payload = ['status' => 'active']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); $query = Query::notEqual('status', ['active', 'pending']); $payload = ['status' => 'active']; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } // TYPE_LESSER tests @@ -133,7 +142,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::lessThan('age', 30); $payload = ['age' => 25]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -141,16 +150,16 @@ class RuntimeQueryTest extends TestCase { $query = Query::lessThan('age', 30); $payload = ['age' => 35]; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testLesserEqualValue(): void { $query = Query::lessThan('age', 30); $payload = ['age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testLesserMultipleValues(): void @@ -159,7 +168,7 @@ class RuntimeQueryTest extends TestCase // This test uses a single value as Query class requires $query = Query::lessThan('age', 30); $payload = ['age' => 25]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -167,7 +176,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::lessThan('name', 'M'); $payload = ['name' => 'A']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -176,7 +185,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::lessThanEqual('age', 30); $payload = ['age' => 25]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -184,7 +193,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::lessThanEqual('age', 30); $payload = ['age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -192,8 +201,8 @@ class RuntimeQueryTest extends TestCase { $query = Query::lessThanEqual('age', 30); $payload = ['age' => 35]; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testLesserEqualMultipleValues(): void @@ -201,7 +210,7 @@ class RuntimeQueryTest extends TestCase // Note: Query::lessThanEqual only accepts single value $query = Query::lessThanEqual('age', 30); $payload = ['age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -210,7 +219,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::greaterThan('age', 30); $payload = ['age' => 35]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -218,16 +227,16 @@ class RuntimeQueryTest extends TestCase { $query = Query::greaterThan('age', 30); $payload = ['age' => 25]; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testGreaterEqualValue(): void { $query = Query::greaterThan('age', 30); $payload = ['age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testGreaterMultipleValues(): void @@ -235,7 +244,7 @@ class RuntimeQueryTest extends TestCase // Note: Query::greaterThan only accepts single value $query = Query::greaterThan('age', 20); $payload = ['age' => 35]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -244,7 +253,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::greaterThanEqual('age', 30); $payload = ['age' => 35]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -252,7 +261,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::greaterThanEqual('age', 30); $payload = ['age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -260,8 +269,8 @@ class RuntimeQueryTest extends TestCase { $query = Query::greaterThanEqual('age', 30); $payload = ['age' => 25]; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testGreaterEqualMultipleValues(): void @@ -269,7 +278,7 @@ class RuntimeQueryTest extends TestCase // Note: Query::greaterThanEqual only accepts single value $query = Query::greaterThanEqual('age', 20); $payload = ['age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -278,7 +287,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::isNull('description'); $payload = ['description' => null]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -286,16 +295,16 @@ class RuntimeQueryTest extends TestCase { $query = Query::isNull('description'); $payload = ['description' => 'Some text']; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testIsNullMissingAttribute(): void { $query = Query::isNull('missing'); $payload = ['name' => 'John']; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } // TYPE_IS_NOT_NULL tests @@ -303,7 +312,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::isNotNull('description'); $payload = ['description' => 'Some text']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -311,16 +320,16 @@ class RuntimeQueryTest extends TestCase { $query = Query::isNotNull('description'); $payload = ['description' => null]; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testIsNotNullMissingAttribute(): void { $query = Query::isNotNull('missing'); $payload = ['name' => 'John']; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } // TYPE_AND tests @@ -331,7 +340,7 @@ class RuntimeQueryTest extends TestCase Query::equal('age', [30]) ]); $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -342,8 +351,8 @@ class RuntimeQueryTest extends TestCase Query::equal('age', [25]) ]); $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testAndAllFail(): void @@ -353,8 +362,8 @@ class RuntimeQueryTest extends TestCase Query::equal('age', [25]) ]); $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testAndMultipleConditions(): void @@ -365,7 +374,7 @@ class RuntimeQueryTest extends TestCase Query::isNotNull('email') ]); $payload = ['status' => 'active', 'age' => 25, 'email' => 'test@example.com']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -379,7 +388,7 @@ class RuntimeQueryTest extends TestCase ]) ]); $payload = ['name' => 'John', 'age' => 30, 'status' => 'active']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -391,7 +400,7 @@ class RuntimeQueryTest extends TestCase Query::equal('name', ['Jane']) ]); $payload = ['name' => 'John']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -402,7 +411,7 @@ class RuntimeQueryTest extends TestCase Query::equal('status', ['pending']) ]); $payload = ['status' => 'active']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -413,8 +422,8 @@ class RuntimeQueryTest extends TestCase Query::equal('age', [25]) ]); $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testOrMultipleConditions(): void @@ -425,7 +434,7 @@ class RuntimeQueryTest extends TestCase Query::equal('status', ['approved']) ]); $payload = ['status' => 'pending']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -439,7 +448,7 @@ class RuntimeQueryTest extends TestCase ]) ]); $payload = ['name' => 'Bob']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -450,10 +459,36 @@ class RuntimeQueryTest extends TestCase Query::equal('email', ['john@example.com']) ]); $payload = ['name' => 'Jane', 'email' => 'john@example.com']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } + public function testOrWithMissingAttributeInOneBranch(): void + { + // OR should match when one branch's attribute is missing but another branch matches + $query = Query::or([ + Query::equal('name', ['John']), + Query::equal('email', ['john@example.com']) + ]); + // Payload only has email, not name - should still match via email branch + $payload = ['email' => 'john@example.com']; + $result = $this->compileAndFilter([$query], $payload); + $this->assertEquals($payload, $result); + } + + public function testOrWithMissingAttributeNoMatch(): void + { + // OR should not match when the only matching branch has missing attribute + $query = Query::or([ + Query::equal('name', ['John']), + Query::equal('email', ['john@example.com']) + ]); + // Payload only has name but it doesn't match - should not match + $payload = ['name' => 'Jane']; + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); + } + // Complex combinations public function testAndOrCombination(): void { @@ -465,7 +500,7 @@ class RuntimeQueryTest extends TestCase ]) ]); $payload = ['type' => 'user', 'status' => 'active']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -482,7 +517,7 @@ class RuntimeQueryTest extends TestCase ]) ]); $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -494,7 +529,7 @@ class RuntimeQueryTest extends TestCase Query::equal('age', [30]) ]; $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter($queries, $payload); + $result = $this->compileAndFilter($queries, $payload); $this->assertEquals($payload, $result); } @@ -505,9 +540,9 @@ class RuntimeQueryTest extends TestCase Query::equal('age', [25]) ]; $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter($queries, $payload); + $result = $this->compileAndFilter($queries, $payload); // With AND logic, if first matches but second doesn't, should return empty - $this->assertEquals([], $result); + $this->assertNull($result); } public function testMultipleQueriesSecondMatches(): void @@ -517,9 +552,9 @@ class RuntimeQueryTest extends TestCase Query::equal('age', [30]) ]; $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter($queries, $payload); + $result = $this->compileAndFilter($queries, $payload); // With AND logic, if second matches but first doesn't, should return empty - $this->assertEquals([], $result); + $this->assertNull($result); } public function testMultipleQueriesNoneMatch(): void @@ -529,23 +564,23 @@ class RuntimeQueryTest extends TestCase Query::equal('age', [25]) ]; $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter($queries, $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter($queries, $payload); + $this->assertNull($result); } public function testEmptyPayload(): void { $query = Query::equal('name', ['John']); $payload = []; - $result = RuntimeQuery::filter([$query], $payload); - $this->assertEquals([], $result); + $result = $this->compileAndFilter([$query], $payload); + $this->assertNull($result); } public function testEmptyAndQuery(): void { $query = Query::and([]); $payload = ['name' => 'John']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); // Empty AND should return true (all conditions pass vacuously) $this->assertEquals($payload, $result); } @@ -554,9 +589,9 @@ class RuntimeQueryTest extends TestCase { $query = Query::or([]); $payload = ['name' => 'John']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); // Empty OR should return false (no conditions match) - $this->assertEquals([], $result); + $this->assertNull($result); } // Type-specific edge cases @@ -564,7 +599,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::equal('count', [0]); $payload = ['count' => 0]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -572,7 +607,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::equal('name', ['']); $payload = ['name' => '']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -580,7 +615,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::equal('active', [false]); $payload = ['active' => false]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -588,7 +623,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::greaterThan('score', 8.5); $payload = ['score' => 9.2]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -596,7 +631,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::lessThan('version', '10'); $payload = ['version' => '9']; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -667,7 +702,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::select(['*']); $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } @@ -679,7 +714,7 @@ class RuntimeQueryTest extends TestCase Query::equal('name', ['Jane']), // This would normally fail ]; $payload = ['name' => 'John', 'age' => 30]; - $result = RuntimeQuery::filter($queries, $payload); + $result = $this->compileAndFilter($queries, $payload); // select("*") takes precedence - returns payload $this->assertEquals($payload, $result); } @@ -688,7 +723,7 @@ class RuntimeQueryTest extends TestCase { $query = Query::select(['*']); $payload = []; - $result = RuntimeQuery::filter([$query], $payload); + $result = $this->compileAndFilter([$query], $payload); $this->assertEquals($payload, $result); } } diff --git a/tests/unit/Utopia/RequestTest.php b/tests/unit/Utopia/RequestTest.php index 63655de21d..78a3717c38 100644 --- a/tests/unit/Utopia/RequestTest.php +++ b/tests/unit/Utopia/RequestTest.php @@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase; use Swoole\Http\Request as SwooleRequest; use Tests\Unit\Utopia\Request\Filters\First; use Tests\Unit\Utopia\Request\Filters\Second; -use Utopia\Route; +use Utopia\Http\Route; class RequestTest extends TestCase {