mirror of
https://github.com/appwrite/appwrite
synced 2026-05-23 00:49:02 +00:00
Merge branch '1.6.x' of https://github.com/appwrite/appwrite into multi-region-support
# Conflicts: # app/init.php # app/realtime.php # composer.json # src/Appwrite/Platform/Tasks/ScheduleBase.php # src/Appwrite/Platform/Tasks/ScheduleExecutions.php # src/Appwrite/Platform/Tasks/ScheduleFunctions.php # src/Appwrite/Platform/Tasks/ScheduleMessages.php # src/Appwrite/Platform/Workers/Deletes.php # src/Appwrite/Platform/Workers/Migrations.php
This commit is contained in:
commit
3f19fac0b4
82 changed files with 4030 additions and 3922 deletions
35
.github/workflows/tests.yml
vendored
35
.github/workflows/tests.yml
vendored
|
|
@ -16,22 +16,22 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build Appwrite
|
||||
uses: docker/build-push-action@v3
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: .
|
||||
push: false
|
||||
tags: ${{ env.IMAGE }}
|
||||
load: true
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
cache-from: type=gha,scope=appwrite
|
||||
cache-to: type=gha,mode=max,scope=appwrite
|
||||
outputs: type=docker,dest=/tmp/${{ env.IMAGE }}.tar
|
||||
build-args: |
|
||||
DEBUG=false
|
||||
|
|
@ -39,9 +39,11 @@ jobs:
|
|||
VERSION=dev
|
||||
|
||||
- name: Cache Docker Image
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
key: ${{ env.CACHE_KEY }}
|
||||
restore-keys: |
|
||||
appwrite-dev-
|
||||
path: /tmp/${{ env.IMAGE }}.tar
|
||||
|
||||
unit_test:
|
||||
|
|
@ -51,10 +53,10 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Load Cache
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
key: ${{ env.CACHE_KEY }}
|
||||
path: /tmp/${{ env.IMAGE }}.tar
|
||||
|
|
@ -81,10 +83,10 @@ jobs:
|
|||
needs: setup
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Load Cache
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
key: ${{ env.CACHE_KEY }}
|
||||
path: /tmp/${{ env.IMAGE }}.tar
|
||||
|
|
@ -113,6 +115,7 @@ jobs:
|
|||
Console,
|
||||
Databases,
|
||||
Functions,
|
||||
FunctionsSchedule,
|
||||
GraphQL,
|
||||
Health,
|
||||
Locale,
|
||||
|
|
@ -128,10 +131,10 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Load Cache
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
key: ${{ env.CACHE_KEY }}
|
||||
path: /tmp/${{ env.IMAGE }}.tar
|
||||
|
|
@ -141,7 +144,7 @@ jobs:
|
|||
run: |
|
||||
docker load --input /tmp/${{ env.IMAGE }}.tar
|
||||
docker compose up -d
|
||||
sleep 25
|
||||
sleep 30
|
||||
|
||||
- name: Run ${{matrix.service}} Tests
|
||||
run: docker compose exec -T appwrite test /usr/src/code/tests/e2e/Services/${{matrix.service}} --debug
|
||||
|
|
@ -149,15 +152,15 @@ jobs:
|
|||
- name: Run ${{matrix.service}} Shared Tables Tests
|
||||
run: _APP_DATABASE_SHARED_TABLES=database_db_main docker compose exec -T appwrite test /usr/src/code/tests/e2e/Services/${{matrix.service}} --debug
|
||||
|
||||
benchamrking:
|
||||
benchmarking:
|
||||
name: Benchmark
|
||||
runs-on: ubuntu-latest
|
||||
needs: setup
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
- name: Load Cache
|
||||
uses: actions/cache@v3
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
key: ${{ env.CACHE_KEY }}
|
||||
path: /tmp/${{ env.IMAGE }}.tar
|
||||
|
|
|
|||
|
|
@ -320,15 +320,12 @@ These are the current metrics we collect usage stats for:
|
|||
| executions | Total number of executions per project |
|
||||
| databases | Total number of databases per project |
|
||||
| databases.storage | Total amount of storage used by all databases per project (in bytes) |
|
||||
| databases.storage_disk | Total amount of storage used by all database per project on disk (in bytes) |
|
||||
| collections | Total number of collections per project |
|
||||
| {databaseInternalId}.collections | Total number of collections per database|
|
||||
| {databaseInternalId}.storage | Sum of database storage (in bytes) |
|
||||
| {databaseInternalId}.storage_disk | Sum of database storage on disk (in bytes) |
|
||||
| documents | Total number of documents per project |
|
||||
| {databaseInternalId}.{collectionInternalId}.documents | Total number of documents per collection |
|
||||
| {databaseInternalId}.{collectionInternalId}.storage | Sum of database storage used by the collection (in bytes) |
|
||||
| {databsaeInternalId}.{collectionInternalId}.storage_disk | Sum of database storage used by the collection on disk (in bytes) |
|
||||
| buckets | Total number of buckets per project |
|
||||
| files | Total number of files per project |
|
||||
| {bucketInternalId}.files.storage | Sum of files.storage per bucket (in bytes) |
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@ RUN \
|
|||
apk add boost boost-dev; \
|
||||
fi
|
||||
|
||||
RUN apk add libwebp
|
||||
|
||||
WORKDIR /usr/src/code
|
||||
|
||||
COPY --from=composer /usr/local/src/vendor /usr/src/code/vendor
|
||||
|
|
|
|||
|
|
@ -201,8 +201,12 @@ CLI::setResource('logError', function (Registry $register) {
|
|||
$isProduction = System::getEnv('_APP_ENV', 'development') === 'production';
|
||||
$log->setEnvironment($isProduction ? Log::ENVIRONMENT_PRODUCTION : Log::ENVIRONMENT_STAGING);
|
||||
|
||||
$responseCode = $logger->addLog($log);
|
||||
Console::info('Usage stats log pushed with status code: ' . $responseCode);
|
||||
try {
|
||||
$responseCode = $logger->addLog($log);
|
||||
Console::info('Error log pushed with status code: ' . $responseCode);
|
||||
} catch (Throwable $th) {
|
||||
Console::error('Error pushing log: ' . $th->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
Console::warning("Failed: {$error->getMessage()}");
|
||||
|
|
|
|||
|
|
@ -4109,13 +4109,24 @@ $projectCollections = array_merge([
|
|||
'$id' => ID::custom('source'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => 8192,
|
||||
'size' => 8192, // reduce size
|
||||
'signed' => true,
|
||||
'required' => true,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('destination'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => false, // make true after patch script
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('credentials'),
|
||||
'type' => Database::VAR_STRING,
|
||||
|
|
@ -4138,6 +4149,28 @@ $projectCollections = array_merge([
|
|||
'array' => true,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('resourceId'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('resourceType'),
|
||||
'type' => Database::VAR_STRING,
|
||||
'format' => '',
|
||||
'size' => Database::LENGTH_KEY,
|
||||
'signed' => true,
|
||||
'required' => false,
|
||||
'default' => null,
|
||||
'array' => false,
|
||||
'filters' => [],
|
||||
],
|
||||
[
|
||||
'$id' => ID::custom('statusCounters'),
|
||||
'type' => Database::VAR_STRING,
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
<?php
|
||||
|
||||
const APP_PLATFORM_SERVER = 'server';
|
||||
const APP_PLATFORM_CLIENT = 'client';
|
||||
const APP_PLATFORM_CONSOLE = 'console';
|
||||
|
||||
return [
|
||||
APP_PLATFORM_CLIENT => [
|
||||
'key' => APP_PLATFORM_CLIENT,
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@ $member = [
|
|||
'files.read',
|
||||
'files.write',
|
||||
'projects.read',
|
||||
'projects.write',
|
||||
'locale.read',
|
||||
'avatars.read',
|
||||
'execution.read',
|
||||
|
|
@ -49,6 +48,7 @@ $admins = [
|
|||
'collections.write',
|
||||
'platforms.read',
|
||||
'platforms.write',
|
||||
'projects.write',
|
||||
'keys.read',
|
||||
'keys.write',
|
||||
'webhooks.read',
|
||||
|
|
@ -75,7 +75,7 @@ $admins = [
|
|||
'topics.write',
|
||||
'topics.read',
|
||||
'subscribers.write',
|
||||
'subscribers.read'
|
||||
'subscribers.read',
|
||||
];
|
||||
|
||||
return [
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\n",
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\r\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "User",
|
||||
|
|
@ -239,7 +239,7 @@
|
|||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -556,7 +556,7 @@
|
|||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -624,7 +624,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -711,7 +711,7 @@
|
|||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -774,7 +774,7 @@
|
|||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -850,7 +850,7 @@
|
|||
}
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -928,7 +928,7 @@
|
|||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -981,7 +981,7 @@
|
|||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -1032,7 +1032,7 @@
|
|||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -1083,7 +1083,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -1570,7 +1570,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Token",
|
||||
|
|
@ -1802,7 +1802,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Session",
|
||||
|
|
@ -1954,7 +1954,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed.\n\nIf there is already an active session, the new session will be attached to the logged-in account. If there are no active sessions, the server will attempt to look for a user with the same email address as the email received from the OAuth2 provider and attach the new session to the existing user. If no matching user is found - the server will create a new user.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\n",
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed.\r\n\r\nIf there is already an active session, the new session will be attached to the logged-in account. If there are no active sessions, the server will attempt to look for a user with the same email address as the email received from the OAuth2 provider and attach the new session to the existing user. If no matching user is found - the server will create a new user.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\r\n",
|
||||
"responses": {
|
||||
"301": {
|
||||
"description": "File"
|
||||
|
|
@ -2703,7 +2703,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2784,7 +2784,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\n",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2873,7 +2873,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \n\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \r\n\r\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"301": {
|
||||
"description": "File"
|
||||
|
|
@ -3009,7 +3009,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3088,7 +3088,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\n",
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3368,7 +3368,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3496,7 +3496,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3628,7 +3628,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3688,7 +3688,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -4178,7 +4178,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -4262,7 +4262,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\n\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\r\n\r\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -4356,7 +4356,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\n",
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -5319,7 +5319,7 @@
|
|||
"tags": [
|
||||
"locale"
|
||||
],
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\n\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\r\n\r\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Locale",
|
||||
|
|
@ -5368,7 +5368,7 @@
|
|||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"tags": [
|
||||
"locale"
|
||||
|
|
@ -6001,7 +6001,7 @@
|
|||
"tags": [
|
||||
"storage"
|
||||
],
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\n\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\n\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\n\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\n",
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\r\n\r\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\r\n\r\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\r\n\r\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "File",
|
||||
|
|
@ -6268,7 +6268,7 @@
|
|||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"tags": [
|
||||
"storage"
|
||||
|
|
@ -6610,7 +6610,8 @@
|
|||
"jpeg",
|
||||
"gif",
|
||||
"png",
|
||||
"webp"
|
||||
"webp",
|
||||
"avif"
|
||||
],
|
||||
"x-enum-name": "ImageFormat",
|
||||
"x-enum-keys": [],
|
||||
|
|
@ -7156,7 +7157,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\n\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\n\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \n\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\n",
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\r\n\r\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\r\n\r\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \r\n\r\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Membership",
|
||||
|
|
@ -7343,7 +7344,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\n",
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -7508,7 +7509,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\n\nIf the request is successful, a session for the user is automatically created.\n",
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\r\n\r\nIf the request is successful, a session for the user is automatically created.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -9405,7 +9406,7 @@
|
|||
"responseBody": {
|
||||
"type": "string",
|
||||
"description": "HTTP response body. This will return empty unless execution is created as synchronous.",
|
||||
"x-example": "Developers are awesome."
|
||||
"x-example": ""
|
||||
},
|
||||
"responseHeaders": {
|
||||
"type": "array",
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -167,7 +167,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\n",
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\r\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "User",
|
||||
|
|
@ -241,7 +241,7 @@
|
|||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -562,7 +562,7 @@
|
|||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -631,7 +631,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -719,7 +719,7 @@
|
|||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -783,7 +783,7 @@
|
|||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -859,7 +859,7 @@
|
|||
}
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -938,7 +938,7 @@
|
|||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -992,7 +992,7 @@
|
|||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -1044,7 +1044,7 @@
|
|||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -1096,7 +1096,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -1590,7 +1590,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Token",
|
||||
|
|
@ -1825,7 +1825,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Session",
|
||||
|
|
@ -2370,7 +2370,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2451,7 +2451,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\n",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2540,7 +2540,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \n\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \r\n\r\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"301": {
|
||||
"description": "File"
|
||||
|
|
@ -2676,7 +2676,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2755,7 +2755,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\n",
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3039,7 +3039,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3169,7 +3169,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3303,7 +3303,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3365,7 +3365,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3857,7 +3857,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3943,7 +3943,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\n\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\r\n\r\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -4039,7 +4039,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\n",
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -4211,7 +4211,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a new Database.\n",
|
||||
"description": "Create a new Database.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Database",
|
||||
|
|
@ -5026,7 +5026,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a boolean attribute.\n",
|
||||
"description": "Create a boolean attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeBoolean",
|
||||
|
|
@ -5472,7 +5472,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create an email attribute.\n",
|
||||
"description": "Create an email attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeEmail",
|
||||
|
|
@ -5581,7 +5581,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an email attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an email attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeEmail",
|
||||
|
|
@ -5695,7 +5695,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create an enumeration attribute. The `elements` param acts as a white-list of accepted values for this attribute. \n",
|
||||
"description": "Create an enumeration attribute. The `elements` param acts as a white-list of accepted values for this attribute. \r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeEnum",
|
||||
|
|
@ -5813,7 +5813,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an enum attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an enum attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeEnum",
|
||||
|
|
@ -5936,7 +5936,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a float attribute. Optionally, minimum and maximum values can be provided.\n",
|
||||
"description": "Create a float attribute. Optionally, minimum and maximum values can be provided.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeFloat",
|
||||
|
|
@ -6055,7 +6055,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update a float attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update a float attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeFloat",
|
||||
|
|
@ -6181,7 +6181,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create an integer attribute. Optionally, minimum and maximum values can be provided.\n",
|
||||
"description": "Create an integer attribute. Optionally, minimum and maximum values can be provided.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeInteger",
|
||||
|
|
@ -6300,7 +6300,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an integer attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an integer attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeInteger",
|
||||
|
|
@ -6426,7 +6426,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create IP address attribute.\n",
|
||||
"description": "Create IP address attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeIP",
|
||||
|
|
@ -6535,7 +6535,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an ip attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an ip attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeIP",
|
||||
|
|
@ -6649,7 +6649,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\n",
|
||||
"description": "Create relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeRelationship",
|
||||
|
|
@ -6783,7 +6783,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a string attribute.\n",
|
||||
"description": "Create a string attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeString",
|
||||
|
|
@ -6903,7 +6903,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update a string attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update a string attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeString",
|
||||
|
|
@ -7022,7 +7022,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a URL attribute.\n",
|
||||
"description": "Create a URL attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeURL",
|
||||
|
|
@ -7131,7 +7131,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an url attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an url attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeURL",
|
||||
|
|
@ -7433,7 +7433,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\n",
|
||||
"description": "Update relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeRelationship",
|
||||
|
|
@ -8119,7 +8119,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Creates an index on the attributes listed. Your index should include all the attributes you will query in a single request.\nAttributes can be `key`, `fulltext`, and `unique`.",
|
||||
"description": "Creates an index on the attributes listed. Your index should include all the attributes you will query in a single request.\r\nAttributes can be `key`, `fulltext`, and `unique`.",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "Index",
|
||||
|
|
@ -8767,7 +8767,7 @@
|
|||
"tags": [
|
||||
"functions"
|
||||
],
|
||||
"description": "List allowed function specifications for this instance.\n",
|
||||
"description": "List allowed function specifications for this instance.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Specifications List",
|
||||
|
|
@ -9249,7 +9249,7 @@
|
|||
"tags": [
|
||||
"functions"
|
||||
],
|
||||
"description": "Create a new function code deployment. Use this endpoint to upload a new version of your code function. To execute your newly uploaded code, you'll need to update the function's deployment to use your new deployment UID.\n\nThis endpoint accepts a tar.gz file compressed with your code. Make sure to include any dependencies your code has within the compressed file. You can learn more about code packaging in the [Appwrite Cloud Functions tutorial](https:\/\/appwrite.io\/docs\/functions).\n\nUse the \"command\" param to set the entrypoint used to execute your code.",
|
||||
"description": "Create a new function code deployment. Use this endpoint to upload a new version of your code function. To execute your newly uploaded code, you'll need to update the function's deployment to use your new deployment UID.\r\n\r\nThis endpoint accepts a tar.gz file compressed with your code. Make sure to include any dependencies your code has within the compressed file. You can learn more about code packaging in the [Appwrite Cloud Functions tutorial](https:\/\/appwrite.io\/docs\/functions).\r\n\r\nUse the \"command\" param to set the entrypoint used to execute your code.",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "Deployment",
|
||||
|
|
@ -10068,7 +10068,7 @@
|
|||
"tags": [
|
||||
"functions"
|
||||
],
|
||||
"description": "Delete a function execution by its unique ID.\n",
|
||||
"description": "Delete a function execution by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"204": {
|
||||
"description": "No content"
|
||||
|
|
@ -11279,7 +11279,7 @@
|
|||
"tags": [
|
||||
"health"
|
||||
],
|
||||
"description": "Returns the amount of failed jobs in a given queue.\n",
|
||||
"description": "Returns the amount of failed jobs in a given queue.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Health Queue",
|
||||
|
|
@ -12046,7 +12046,7 @@
|
|||
"tags": [
|
||||
"locale"
|
||||
],
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\n\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\r\n\r\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Locale",
|
||||
|
|
@ -12097,7 +12097,7 @@
|
|||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"tags": [
|
||||
"locale"
|
||||
|
|
@ -12720,7 +12720,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update an email message by its unique ID.\n",
|
||||
"description": "Update an email message by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -13027,7 +13027,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update a push notification by its unique ID.\n",
|
||||
"description": "Update a push notification by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -13299,7 +13299,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update an email message by its unique ID.\n",
|
||||
"description": "Update an email message by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -13414,7 +13414,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a message by its unique ID.\n",
|
||||
"description": "Get a message by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -15915,7 +15915,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a provider by its unique ID.\n",
|
||||
"description": "Get a provider by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Provider",
|
||||
|
|
@ -16355,7 +16355,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a topic by its unique ID.\n",
|
||||
"description": "Get a topic by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Topic",
|
||||
|
|
@ -16418,7 +16418,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update a topic by its unique ID.\n",
|
||||
"description": "Update a topic by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Topic",
|
||||
|
|
@ -16822,7 +16822,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a subscriber by its unique ID.\n",
|
||||
"description": "Get a subscriber by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Subscriber",
|
||||
|
|
@ -17516,7 +17516,7 @@
|
|||
"tags": [
|
||||
"storage"
|
||||
],
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\n\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\n\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\n\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\n",
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\r\n\r\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\r\n\r\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\r\n\r\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "File",
|
||||
|
|
@ -17789,7 +17789,7 @@
|
|||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"tags": [
|
||||
"storage"
|
||||
|
|
@ -18137,7 +18137,8 @@
|
|||
"jpeg",
|
||||
"gif",
|
||||
"png",
|
||||
"webp"
|
||||
"webp",
|
||||
"avif"
|
||||
],
|
||||
"x-enum-name": "ImageFormat",
|
||||
"x-enum-keys": [],
|
||||
|
|
@ -18697,7 +18698,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\n\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\n\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \n\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\n",
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\r\n\r\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\r\n\r\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \r\n\r\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Membership",
|
||||
|
|
@ -18888,7 +18889,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\n",
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -19057,7 +19058,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\n\nIf the request is successful, a session for the user is automatically created.\n",
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\r\n\r\nIf the request is successful, a session for the user is automatically created.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -19645,7 +19646,7 @@
|
|||
},
|
||||
"\/users\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "usersListIdentities",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -20580,7 +20581,7 @@
|
|||
"tags": [
|
||||
"users"
|
||||
],
|
||||
"description": "Update the user labels by its unique ID. \n\nLabels can be used to grant access to resources. While teams are a way for user's to share access to a resource, labels can be defined by the developer to grant access without an invitation. See the [Permissions docs](https:\/\/appwrite.io\/docs\/permissions) for more info.",
|
||||
"description": "Update the user labels by its unique ID. \r\n\r\nLabels can be used to grant access to resources. While teams are a way for user's to share access to a resource, labels can be defined by the developer to grant access without an invitation. See the [Permissions docs](https:\/\/appwrite.io\/docs\/permissions) for more info.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "User",
|
||||
|
|
@ -20885,7 +20886,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/mfa\/authenticators\/{type}": {
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "usersDeleteMfaAuthenticator",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -20964,7 +20965,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "usersListMfaFactors",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -21028,7 +21029,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "usersGetMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -21090,7 +21091,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "usersUpdateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -21152,7 +21153,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "usersCreateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -21677,7 +21678,7 @@
|
|||
"tags": [
|
||||
"users"
|
||||
],
|
||||
"description": "Creates a session for a user. Returns an immediately usable session object.\n\nIf you want to generate a token for a custom authentication flow, use the [POST \/users\/{userId}\/tokens](https:\/\/appwrite.io\/docs\/server\/users#createToken) endpoint.",
|
||||
"description": "Creates a session for a user. Returns an immediately usable session object.\r\n\r\nIf you want to generate a token for a custom authentication flow, use the [POST \/users\/{userId}\/tokens](https:\/\/appwrite.io\/docs\/server\/users#createToken) endpoint.",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Session",
|
||||
|
|
@ -21941,7 +21942,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/targets": {
|
||||
"get": {
|
||||
"summary": "List User Targets",
|
||||
"summary": "List user targets",
|
||||
"operationId": "usersListTargets",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -22017,7 +22018,7 @@
|
|||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create User Target",
|
||||
"summary": "Create user target",
|
||||
"operationId": "usersCreateTarget",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -22130,7 +22131,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/targets\/{targetId}": {
|
||||
"get": {
|
||||
"summary": "Get User Target",
|
||||
"summary": "Get user target",
|
||||
"operationId": "usersGetTarget",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -22203,7 +22204,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Update User target",
|
||||
"summary": "Update user target",
|
||||
"operationId": "usersUpdateTarget",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -22375,7 +22376,7 @@
|
|||
"tags": [
|
||||
"users"
|
||||
],
|
||||
"description": "Returns a token with a secret key for creating a session. Use the user ID and secret and submit a request to the [PUT \/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process.\n",
|
||||
"description": "Returns a token with a secret key for creating a session. Use the user ID and secret and submit a request to the [PUT \/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -23677,6 +23678,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"size": {
|
||||
"type": "integer",
|
||||
"description": "Attribute size.",
|
||||
|
|
@ -23696,6 +23707,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"size"
|
||||
]
|
||||
},
|
||||
|
|
@ -23734,6 +23747,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"min": {
|
||||
"type": "integer",
|
||||
"description": "Minimum value to enforce for new documents.",
|
||||
|
|
@ -23761,7 +23784,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"required"
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"attributeFloat": {
|
||||
|
|
@ -23799,6 +23824,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"min": {
|
||||
"type": "number",
|
||||
"description": "Minimum value to enforce for new documents.",
|
||||
|
|
@ -23826,7 +23861,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"required"
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"attributeBoolean": {
|
||||
|
|
@ -23864,6 +23901,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"default": {
|
||||
"type": "boolean",
|
||||
"description": "Default value for attribute when not provided. Cannot be set when attribute is required.",
|
||||
|
|
@ -23876,7 +23923,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"required"
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"attributeEmail": {
|
||||
|
|
@ -23914,6 +23963,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "String format.",
|
||||
|
|
@ -23932,6 +23991,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -23970,6 +24031,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"elements": {
|
||||
"type": "array",
|
||||
"description": "Array of elements in enumerated type.",
|
||||
|
|
@ -23996,6 +24067,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"elements",
|
||||
"format"
|
||||
]
|
||||
|
|
@ -24035,6 +24108,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "String format.",
|
||||
|
|
@ -24053,6 +24136,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24091,6 +24176,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "String format.",
|
||||
|
|
@ -24109,6 +24204,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24147,6 +24244,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "ISO 8601 format.",
|
||||
|
|
@ -24165,6 +24272,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24203,6 +24312,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"relatedCollection": {
|
||||
"type": "string",
|
||||
"description": "The ID of the related collection.",
|
||||
|
|
@ -24240,6 +24359,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"relatedCollection",
|
||||
"relationType",
|
||||
"twoWay",
|
||||
|
|
@ -24288,6 +24409,16 @@
|
|||
},
|
||||
"x-example": [],
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Index creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Index update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -24295,7 +24426,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"attributes"
|
||||
"attributes",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"document": {
|
||||
|
|
@ -25966,7 +26099,7 @@
|
|||
"responseBody": {
|
||||
"type": "string",
|
||||
"description": "HTTP response body. This will return empty unless execution is created as synchronous.",
|
||||
"x-example": "Developers are awesome."
|
||||
"x-example": ""
|
||||
},
|
||||
"responseHeaders": {
|
||||
"type": "array",
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\n",
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\r\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "User",
|
||||
|
|
@ -239,7 +239,7 @@
|
|||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -556,7 +556,7 @@
|
|||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -624,7 +624,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -711,7 +711,7 @@
|
|||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -774,7 +774,7 @@
|
|||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -850,7 +850,7 @@
|
|||
}
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -928,7 +928,7 @@
|
|||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -981,7 +981,7 @@
|
|||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -1032,7 +1032,7 @@
|
|||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -1083,7 +1083,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -1570,7 +1570,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Token",
|
||||
|
|
@ -1802,7 +1802,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Session",
|
||||
|
|
@ -1954,7 +1954,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed.\n\nIf there is already an active session, the new session will be attached to the logged-in account. If there are no active sessions, the server will attempt to look for a user with the same email address as the email received from the OAuth2 provider and attach the new session to the existing user. If no matching user is found - the server will create a new user.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\n",
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed.\r\n\r\nIf there is already an active session, the new session will be attached to the logged-in account. If there are no active sessions, the server will attempt to look for a user with the same email address as the email received from the OAuth2 provider and attach the new session to the existing user. If no matching user is found - the server will create a new user.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\r\n",
|
||||
"responses": {
|
||||
"301": {
|
||||
"description": "File"
|
||||
|
|
@ -2703,7 +2703,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2784,7 +2784,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\n",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2873,7 +2873,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \n\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \r\n\r\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"301": {
|
||||
"description": "File"
|
||||
|
|
@ -3009,7 +3009,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3088,7 +3088,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\n",
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3368,7 +3368,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3496,7 +3496,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3628,7 +3628,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3688,7 +3688,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -4178,7 +4178,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -4262,7 +4262,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\n\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\r\n\r\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -4356,7 +4356,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\n",
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -5319,7 +5319,7 @@
|
|||
"tags": [
|
||||
"locale"
|
||||
],
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\n\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\r\n\r\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Locale",
|
||||
|
|
@ -5368,7 +5368,7 @@
|
|||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"tags": [
|
||||
"locale"
|
||||
|
|
@ -6001,7 +6001,7 @@
|
|||
"tags": [
|
||||
"storage"
|
||||
],
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\n\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\n\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\n\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\n",
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\r\n\r\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\r\n\r\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\r\n\r\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "File",
|
||||
|
|
@ -6268,7 +6268,7 @@
|
|||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"tags": [
|
||||
"storage"
|
||||
|
|
@ -6610,7 +6610,8 @@
|
|||
"jpeg",
|
||||
"gif",
|
||||
"png",
|
||||
"webp"
|
||||
"webp",
|
||||
"avif"
|
||||
],
|
||||
"x-enum-name": "ImageFormat",
|
||||
"x-enum-keys": [],
|
||||
|
|
@ -7156,7 +7157,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\n\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\n\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \n\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\n",
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\r\n\r\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\r\n\r\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \r\n\r\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Membership",
|
||||
|
|
@ -7343,7 +7344,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\n",
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -7508,7 +7509,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\n\nIf the request is successful, a session for the user is automatically created.\n",
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\r\n\r\nIf the request is successful, a session for the user is automatically created.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -9405,7 +9406,7 @@
|
|||
"responseBody": {
|
||||
"type": "string",
|
||||
"description": "HTTP response body. This will return empty unless execution is created as synchronous.",
|
||||
"x-example": "Developers are awesome."
|
||||
"x-example": ""
|
||||
},
|
||||
"responseHeaders": {
|
||||
"type": "array",
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -167,7 +167,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\n",
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\r\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "User",
|
||||
|
|
@ -241,7 +241,7 @@
|
|||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -562,7 +562,7 @@
|
|||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -631,7 +631,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -719,7 +719,7 @@
|
|||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -783,7 +783,7 @@
|
|||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -859,7 +859,7 @@
|
|||
}
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -938,7 +938,7 @@
|
|||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -992,7 +992,7 @@
|
|||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -1044,7 +1044,7 @@
|
|||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -1096,7 +1096,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
|
|
@ -1590,7 +1590,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Token",
|
||||
|
|
@ -1825,7 +1825,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Session",
|
||||
|
|
@ -2370,7 +2370,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2451,7 +2451,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\n",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2540,7 +2540,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \n\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \r\n\r\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"301": {
|
||||
"description": "File"
|
||||
|
|
@ -2676,7 +2676,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2755,7 +2755,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\n",
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3039,7 +3039,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3169,7 +3169,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3303,7 +3303,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3365,7 +3365,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3857,7 +3857,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -3943,7 +3943,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\n\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\r\n\r\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -4039,7 +4039,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\n",
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image"
|
||||
|
|
@ -4211,7 +4211,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a new Database.\n",
|
||||
"description": "Create a new Database.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Database",
|
||||
|
|
@ -5026,7 +5026,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a boolean attribute.\n",
|
||||
"description": "Create a boolean attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeBoolean",
|
||||
|
|
@ -5472,7 +5472,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create an email attribute.\n",
|
||||
"description": "Create an email attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeEmail",
|
||||
|
|
@ -5581,7 +5581,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an email attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an email attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeEmail",
|
||||
|
|
@ -5695,7 +5695,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create an enumeration attribute. The `elements` param acts as a white-list of accepted values for this attribute. \n",
|
||||
"description": "Create an enumeration attribute. The `elements` param acts as a white-list of accepted values for this attribute. \r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeEnum",
|
||||
|
|
@ -5813,7 +5813,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an enum attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an enum attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeEnum",
|
||||
|
|
@ -5936,7 +5936,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a float attribute. Optionally, minimum and maximum values can be provided.\n",
|
||||
"description": "Create a float attribute. Optionally, minimum and maximum values can be provided.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeFloat",
|
||||
|
|
@ -6055,7 +6055,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update a float attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update a float attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeFloat",
|
||||
|
|
@ -6181,7 +6181,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create an integer attribute. Optionally, minimum and maximum values can be provided.\n",
|
||||
"description": "Create an integer attribute. Optionally, minimum and maximum values can be provided.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeInteger",
|
||||
|
|
@ -6300,7 +6300,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an integer attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an integer attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeInteger",
|
||||
|
|
@ -6426,7 +6426,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create IP address attribute.\n",
|
||||
"description": "Create IP address attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeIP",
|
||||
|
|
@ -6535,7 +6535,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an ip attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an ip attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeIP",
|
||||
|
|
@ -6649,7 +6649,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\n",
|
||||
"description": "Create relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeRelationship",
|
||||
|
|
@ -6783,7 +6783,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a string attribute.\n",
|
||||
"description": "Create a string attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeString",
|
||||
|
|
@ -6903,7 +6903,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update a string attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update a string attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeString",
|
||||
|
|
@ -7022,7 +7022,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a URL attribute.\n",
|
||||
"description": "Create a URL attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeURL",
|
||||
|
|
@ -7131,7 +7131,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an url attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an url attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeURL",
|
||||
|
|
@ -7433,7 +7433,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\n",
|
||||
"description": "Update relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeRelationship",
|
||||
|
|
@ -8119,7 +8119,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Creates an index on the attributes listed. Your index should include all the attributes you will query in a single request.\nAttributes can be `key`, `fulltext`, and `unique`.",
|
||||
"description": "Creates an index on the attributes listed. Your index should include all the attributes you will query in a single request.\r\nAttributes can be `key`, `fulltext`, and `unique`.",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "Index",
|
||||
|
|
@ -8767,7 +8767,7 @@
|
|||
"tags": [
|
||||
"functions"
|
||||
],
|
||||
"description": "List allowed function specifications for this instance.\n",
|
||||
"description": "List allowed function specifications for this instance.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Specifications List",
|
||||
|
|
@ -9249,7 +9249,7 @@
|
|||
"tags": [
|
||||
"functions"
|
||||
],
|
||||
"description": "Create a new function code deployment. Use this endpoint to upload a new version of your code function. To execute your newly uploaded code, you'll need to update the function's deployment to use your new deployment UID.\n\nThis endpoint accepts a tar.gz file compressed with your code. Make sure to include any dependencies your code has within the compressed file. You can learn more about code packaging in the [Appwrite Cloud Functions tutorial](https:\/\/appwrite.io\/docs\/functions).\n\nUse the \"command\" param to set the entrypoint used to execute your code.",
|
||||
"description": "Create a new function code deployment. Use this endpoint to upload a new version of your code function. To execute your newly uploaded code, you'll need to update the function's deployment to use your new deployment UID.\r\n\r\nThis endpoint accepts a tar.gz file compressed with your code. Make sure to include any dependencies your code has within the compressed file. You can learn more about code packaging in the [Appwrite Cloud Functions tutorial](https:\/\/appwrite.io\/docs\/functions).\r\n\r\nUse the \"command\" param to set the entrypoint used to execute your code.",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "Deployment",
|
||||
|
|
@ -10068,7 +10068,7 @@
|
|||
"tags": [
|
||||
"functions"
|
||||
],
|
||||
"description": "Delete a function execution by its unique ID.\n",
|
||||
"description": "Delete a function execution by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"204": {
|
||||
"description": "No content"
|
||||
|
|
@ -11279,7 +11279,7 @@
|
|||
"tags": [
|
||||
"health"
|
||||
],
|
||||
"description": "Returns the amount of failed jobs in a given queue.\n",
|
||||
"description": "Returns the amount of failed jobs in a given queue.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Health Queue",
|
||||
|
|
@ -12046,7 +12046,7 @@
|
|||
"tags": [
|
||||
"locale"
|
||||
],
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\n\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\r\n\r\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Locale",
|
||||
|
|
@ -12097,7 +12097,7 @@
|
|||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"tags": [
|
||||
"locale"
|
||||
|
|
@ -12720,7 +12720,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update an email message by its unique ID.\n",
|
||||
"description": "Update an email message by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -13027,7 +13027,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update a push notification by its unique ID.\n",
|
||||
"description": "Update a push notification by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -13299,7 +13299,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update an email message by its unique ID.\n",
|
||||
"description": "Update an email message by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -13414,7 +13414,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a message by its unique ID.\n",
|
||||
"description": "Get a message by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -15915,7 +15915,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a provider by its unique ID.\n",
|
||||
"description": "Get a provider by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Provider",
|
||||
|
|
@ -16355,7 +16355,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a topic by its unique ID.\n",
|
||||
"description": "Get a topic by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Topic",
|
||||
|
|
@ -16418,7 +16418,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update a topic by its unique ID.\n",
|
||||
"description": "Update a topic by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Topic",
|
||||
|
|
@ -16822,7 +16822,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a subscriber by its unique ID.\n",
|
||||
"description": "Get a subscriber by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Subscriber",
|
||||
|
|
@ -17516,7 +17516,7 @@
|
|||
"tags": [
|
||||
"storage"
|
||||
],
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\n\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\n\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\n\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\n",
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\r\n\r\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\r\n\r\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\r\n\r\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "File",
|
||||
|
|
@ -17789,7 +17789,7 @@
|
|||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"tags": [
|
||||
"storage"
|
||||
|
|
@ -18137,7 +18137,8 @@
|
|||
"jpeg",
|
||||
"gif",
|
||||
"png",
|
||||
"webp"
|
||||
"webp",
|
||||
"avif"
|
||||
],
|
||||
"x-enum-name": "ImageFormat",
|
||||
"x-enum-keys": [],
|
||||
|
|
@ -18697,7 +18698,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\n\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\n\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \n\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\n",
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\r\n\r\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\r\n\r\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \r\n\r\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Membership",
|
||||
|
|
@ -18888,7 +18889,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\n",
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -19057,7 +19058,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\n\nIf the request is successful, a session for the user is automatically created.\n",
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\r\n\r\nIf the request is successful, a session for the user is automatically created.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -19645,7 +19646,7 @@
|
|||
},
|
||||
"\/users\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "usersListIdentities",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -20580,7 +20581,7 @@
|
|||
"tags": [
|
||||
"users"
|
||||
],
|
||||
"description": "Update the user labels by its unique ID. \n\nLabels can be used to grant access to resources. While teams are a way for user's to share access to a resource, labels can be defined by the developer to grant access without an invitation. See the [Permissions docs](https:\/\/appwrite.io\/docs\/permissions) for more info.",
|
||||
"description": "Update the user labels by its unique ID. \r\n\r\nLabels can be used to grant access to resources. While teams are a way for user's to share access to a resource, labels can be defined by the developer to grant access without an invitation. See the [Permissions docs](https:\/\/appwrite.io\/docs\/permissions) for more info.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "User",
|
||||
|
|
@ -20885,7 +20886,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/mfa\/authenticators\/{type}": {
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "usersDeleteMfaAuthenticator",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -20964,7 +20965,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "usersListMfaFactors",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -21028,7 +21029,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "usersGetMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -21090,7 +21091,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "usersUpdateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -21152,7 +21153,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "usersCreateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -21677,7 +21678,7 @@
|
|||
"tags": [
|
||||
"users"
|
||||
],
|
||||
"description": "Creates a session for a user. Returns an immediately usable session object.\n\nIf you want to generate a token for a custom authentication flow, use the [POST \/users\/{userId}\/tokens](https:\/\/appwrite.io\/docs\/server\/users#createToken) endpoint.",
|
||||
"description": "Creates a session for a user. Returns an immediately usable session object.\r\n\r\nIf you want to generate a token for a custom authentication flow, use the [POST \/users\/{userId}\/tokens](https:\/\/appwrite.io\/docs\/server\/users#createToken) endpoint.",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Session",
|
||||
|
|
@ -21941,7 +21942,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/targets": {
|
||||
"get": {
|
||||
"summary": "List User Targets",
|
||||
"summary": "List user targets",
|
||||
"operationId": "usersListTargets",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -22017,7 +22018,7 @@
|
|||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create User Target",
|
||||
"summary": "Create user target",
|
||||
"operationId": "usersCreateTarget",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -22130,7 +22131,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/targets\/{targetId}": {
|
||||
"get": {
|
||||
"summary": "Get User Target",
|
||||
"summary": "Get user target",
|
||||
"operationId": "usersGetTarget",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -22203,7 +22204,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Update User target",
|
||||
"summary": "Update user target",
|
||||
"operationId": "usersUpdateTarget",
|
||||
"tags": [
|
||||
"users"
|
||||
|
|
@ -22375,7 +22376,7 @@
|
|||
"tags": [
|
||||
"users"
|
||||
],
|
||||
"description": "Returns a token with a secret key for creating a session. Use the user ID and secret and submit a request to the [PUT \/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process.\n",
|
||||
"description": "Returns a token with a secret key for creating a session. Use the user ID and secret and submit a request to the [PUT \/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -23677,6 +23678,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"size": {
|
||||
"type": "integer",
|
||||
"description": "Attribute size.",
|
||||
|
|
@ -23696,6 +23707,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"size"
|
||||
]
|
||||
},
|
||||
|
|
@ -23734,6 +23747,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"min": {
|
||||
"type": "integer",
|
||||
"description": "Minimum value to enforce for new documents.",
|
||||
|
|
@ -23761,7 +23784,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"required"
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"attributeFloat": {
|
||||
|
|
@ -23799,6 +23824,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"min": {
|
||||
"type": "number",
|
||||
"description": "Minimum value to enforce for new documents.",
|
||||
|
|
@ -23826,7 +23861,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"required"
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"attributeBoolean": {
|
||||
|
|
@ -23864,6 +23901,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"default": {
|
||||
"type": "boolean",
|
||||
"description": "Default value for attribute when not provided. Cannot be set when attribute is required.",
|
||||
|
|
@ -23876,7 +23923,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"required"
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"attributeEmail": {
|
||||
|
|
@ -23914,6 +23963,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "String format.",
|
||||
|
|
@ -23932,6 +23991,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -23970,6 +24031,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"elements": {
|
||||
"type": "array",
|
||||
"description": "Array of elements in enumerated type.",
|
||||
|
|
@ -23996,6 +24067,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"elements",
|
||||
"format"
|
||||
]
|
||||
|
|
@ -24035,6 +24108,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "String format.",
|
||||
|
|
@ -24053,6 +24136,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24091,6 +24176,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "String format.",
|
||||
|
|
@ -24109,6 +24204,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24147,6 +24244,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "ISO 8601 format.",
|
||||
|
|
@ -24165,6 +24272,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24203,6 +24312,16 @@
|
|||
"x-example": false,
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"relatedCollection": {
|
||||
"type": "string",
|
||||
"description": "The ID of the related collection.",
|
||||
|
|
@ -24240,6 +24359,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"relatedCollection",
|
||||
"relationType",
|
||||
"twoWay",
|
||||
|
|
@ -24288,6 +24409,16 @@
|
|||
},
|
||||
"x-example": [],
|
||||
"nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Index creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Index update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -24295,7 +24426,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"attributes"
|
||||
"attributes",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"document": {
|
||||
|
|
@ -25966,7 +26099,7 @@
|
|||
"responseBody": {
|
||||
"type": "string",
|
||||
"description": "HTTP response body. This will return empty unless execution is created as synchronous.",
|
||||
"x-example": "Developers are awesome."
|
||||
"x-example": ""
|
||||
},
|
||||
"responseHeaders": {
|
||||
"type": "array",
|
||||
|
|
|
|||
|
|
@ -222,7 +222,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\n",
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\r\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "User",
|
||||
|
|
@ -293,7 +293,7 @@
|
|||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -619,7 +619,7 @@
|
|||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -687,7 +687,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -773,7 +773,7 @@
|
|||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -838,7 +838,7 @@
|
|||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -917,7 +917,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -994,7 +994,7 @@
|
|||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1049,7 +1049,7 @@
|
|||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1102,7 +1102,7 @@
|
|||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1155,7 +1155,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1670,7 +1670,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Token",
|
||||
|
|
@ -1915,7 +1915,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Session",
|
||||
|
|
@ -2075,7 +2075,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed.\n\nIf there is already an active session, the new session will be attached to the logged-in account. If there are no active sessions, the server will attempt to look for a user with the same email address as the email received from the OAuth2 provider and attach the new session to the existing user. If no matching user is found - the server will create a new user.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\n",
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed.\r\n\r\nIf there is already an active session, the new session will be attached to the logged-in account. If there are no active sessions, the server will attempt to look for a user with the same email address as the email received from the OAuth2 provider and attach the new session to the existing user. If no matching user is found - the server will create a new user.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\r\n",
|
||||
"responses": {
|
||||
"301": {
|
||||
"description": "No content"
|
||||
|
|
@ -2836,7 +2836,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2922,7 +2922,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\n",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3017,7 +3017,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \n\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \r\n\r\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"301": {
|
||||
"description": "No content"
|
||||
|
|
@ -3152,7 +3152,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3235,7 +3235,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\n",
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3528,7 +3528,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -3657,7 +3657,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -3790,7 +3790,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -3857,7 +3857,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4348,7 +4348,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4435,7 +4435,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\n\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\r\n\r\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4530,7 +4530,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\n",
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -5528,7 +5528,7 @@
|
|||
"tags": [
|
||||
"locale"
|
||||
],
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\n\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\r\n\r\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Locale",
|
||||
|
|
@ -5573,7 +5573,7 @@
|
|||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -6225,7 +6225,7 @@
|
|||
"tags": [
|
||||
"storage"
|
||||
],
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\n\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\n\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\n\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\n",
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\r\n\r\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\r\n\r\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\r\n\r\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "File",
|
||||
|
|
@ -6476,7 +6476,7 @@
|
|||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -6807,7 +6807,8 @@
|
|||
"jpeg",
|
||||
"gif",
|
||||
"png",
|
||||
"webp"
|
||||
"webp",
|
||||
"avif"
|
||||
],
|
||||
"x-enum-name": "ImageFormat",
|
||||
"x-enum-keys": [],
|
||||
|
|
@ -7367,7 +7368,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\n\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\n\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \n\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\n",
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\r\n\r\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\r\n\r\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \r\n\r\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Membership",
|
||||
|
|
@ -7556,7 +7557,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\n",
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -7718,7 +7719,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\n\nIf the request is successful, a session for the user is automatically created.\n",
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\r\n\r\nIf the request is successful, a session for the user is automatically created.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -9589,9 +9590,9 @@
|
|||
"format": "int32"
|
||||
},
|
||||
"responseBody": {
|
||||
"type": "string",
|
||||
"type": "payload",
|
||||
"description": "HTTP response body. This will return empty unless execution is created as synchronous.",
|
||||
"x-example": "Developers are awesome."
|
||||
"x-example": ""
|
||||
},
|
||||
"responseHeaders": {
|
||||
"type": "array",
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -238,7 +238,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\n",
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\r\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "User",
|
||||
|
|
@ -310,7 +310,7 @@
|
|||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -640,7 +640,7 @@
|
|||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -709,7 +709,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -796,7 +796,7 @@
|
|||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -862,7 +862,7 @@
|
|||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -941,7 +941,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1019,7 +1019,7 @@
|
|||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1075,7 +1075,7 @@
|
|||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1129,7 +1129,7 @@
|
|||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1183,7 +1183,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1705,7 +1705,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Token",
|
||||
|
|
@ -1953,7 +1953,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Session",
|
||||
|
|
@ -2518,7 +2518,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2604,7 +2604,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\n",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2699,7 +2699,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \n\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \r\n\r\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"301": {
|
||||
"description": "No content"
|
||||
|
|
@ -2834,7 +2834,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2917,7 +2917,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\n",
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3214,7 +3214,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -3345,7 +3345,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -3480,7 +3480,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -3549,7 +3549,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4042,7 +4042,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4131,7 +4131,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\n\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\r\n\r\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4228,7 +4228,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\n",
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4400,7 +4400,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a new Database.\n",
|
||||
"description": "Create a new Database.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Database",
|
||||
|
|
@ -5217,7 +5217,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a boolean attribute.\n",
|
||||
"description": "Create a boolean attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeBoolean",
|
||||
|
|
@ -5653,7 +5653,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create an email attribute.\n",
|
||||
"description": "Create an email attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeEmail",
|
||||
|
|
@ -5760,7 +5760,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an email attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an email attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeEmail",
|
||||
|
|
@ -5871,7 +5871,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create an enumeration attribute. The `elements` param acts as a white-list of accepted values for this attribute. \n",
|
||||
"description": "Create an enumeration attribute. The `elements` param acts as a white-list of accepted values for this attribute. \r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeEnum",
|
||||
|
|
@ -5988,7 +5988,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an enum attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an enum attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeEnum",
|
||||
|
|
@ -6109,7 +6109,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a float attribute. Optionally, minimum and maximum values can be provided.\n",
|
||||
"description": "Create a float attribute. Optionally, minimum and maximum values can be provided.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeFloat",
|
||||
|
|
@ -6228,7 +6228,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update a float attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update a float attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeFloat",
|
||||
|
|
@ -6353,7 +6353,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create an integer attribute. Optionally, minimum and maximum values can be provided.\n",
|
||||
"description": "Create an integer attribute. Optionally, minimum and maximum values can be provided.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeInteger",
|
||||
|
|
@ -6472,7 +6472,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an integer attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an integer attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeInteger",
|
||||
|
|
@ -6597,7 +6597,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create IP address attribute.\n",
|
||||
"description": "Create IP address attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeIP",
|
||||
|
|
@ -6704,7 +6704,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an ip attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an ip attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeIP",
|
||||
|
|
@ -6815,7 +6815,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\n",
|
||||
"description": "Create relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeRelationship",
|
||||
|
|
@ -6951,7 +6951,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a string attribute.\n",
|
||||
"description": "Create a string attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeString",
|
||||
|
|
@ -7071,7 +7071,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update a string attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update a string attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeString",
|
||||
|
|
@ -7188,7 +7188,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a URL attribute.\n",
|
||||
"description": "Create a URL attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeURL",
|
||||
|
|
@ -7295,7 +7295,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an url attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an url attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeURL",
|
||||
|
|
@ -7586,7 +7586,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\n",
|
||||
"description": "Update relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeRelationship",
|
||||
|
|
@ -8250,7 +8250,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Creates an index on the attributes listed. Your index should include all the attributes you will query in a single request.\nAttributes can be `key`, `fulltext`, and `unique`.",
|
||||
"description": "Creates an index on the attributes listed. Your index should include all the attributes you will query in a single request.\r\nAttributes can be `key`, `fulltext`, and `unique`.",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "Index",
|
||||
|
|
@ -8917,7 +8917,7 @@
|
|||
"tags": [
|
||||
"functions"
|
||||
],
|
||||
"description": "List allowed function specifications for this instance.\n",
|
||||
"description": "List allowed function specifications for this instance.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Specifications List",
|
||||
|
|
@ -9415,7 +9415,7 @@
|
|||
"tags": [
|
||||
"functions"
|
||||
],
|
||||
"description": "Create a new function code deployment. Use this endpoint to upload a new version of your code function. To execute your newly uploaded code, you'll need to update the function's deployment to use your new deployment UID.\n\nThis endpoint accepts a tar.gz file compressed with your code. Make sure to include any dependencies your code has within the compressed file. You can learn more about code packaging in the [Appwrite Cloud Functions tutorial](https:\/\/appwrite.io\/docs\/functions).\n\nUse the \"command\" param to set the entrypoint used to execute your code.",
|
||||
"description": "Create a new function code deployment. Use this endpoint to upload a new version of your code function. To execute your newly uploaded code, you'll need to update the function's deployment to use your new deployment UID.\r\n\r\nThis endpoint accepts a tar.gz file compressed with your code. Make sure to include any dependencies your code has within the compressed file. You can learn more about code packaging in the [Appwrite Cloud Functions tutorial](https:\/\/appwrite.io\/docs\/functions).\r\n\r\nUse the \"command\" param to set the entrypoint used to execute your code.",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "Deployment",
|
||||
|
|
@ -10231,7 +10231,7 @@
|
|||
"tags": [
|
||||
"functions"
|
||||
],
|
||||
"description": "Delete a function execution by its unique ID.\n",
|
||||
"description": "Delete a function execution by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"204": {
|
||||
"description": "No content"
|
||||
|
|
@ -11494,7 +11494,7 @@
|
|||
"tags": [
|
||||
"health"
|
||||
],
|
||||
"description": "Returns the amount of failed jobs in a given queue.\n",
|
||||
"description": "Returns the amount of failed jobs in a given queue.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Health Queue",
|
||||
|
|
@ -12265,7 +12265,7 @@
|
|||
"tags": [
|
||||
"locale"
|
||||
],
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\n\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\r\n\r\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Locale",
|
||||
|
|
@ -12312,7 +12312,7 @@
|
|||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -12968,7 +12968,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update an email message by its unique ID.\n",
|
||||
"description": "Update an email message by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -13302,7 +13302,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update a push notification by its unique ID.\n",
|
||||
"description": "Update a push notification by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -13596,7 +13596,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update an email message by its unique ID.\n",
|
||||
"description": "Update an email message by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -13715,7 +13715,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a message by its unique ID.\n",
|
||||
"description": "Get a message by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -16355,7 +16355,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a provider by its unique ID.\n",
|
||||
"description": "Get a provider by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Provider",
|
||||
|
|
@ -16803,7 +16803,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a topic by its unique ID.\n",
|
||||
"description": "Get a topic by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Topic",
|
||||
|
|
@ -16866,7 +16866,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update a topic by its unique ID.\n",
|
||||
"description": "Update a topic by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Topic",
|
||||
|
|
@ -17270,7 +17270,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a subscriber by its unique ID.\n",
|
||||
"description": "Get a subscriber by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Subscriber",
|
||||
|
|
@ -17981,7 +17981,7 @@
|
|||
"tags": [
|
||||
"storage"
|
||||
],
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\n\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\n\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\n\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\n",
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\r\n\r\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\r\n\r\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\r\n\r\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "File",
|
||||
|
|
@ -18238,7 +18238,7 @@
|
|||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -18575,7 +18575,8 @@
|
|||
"jpeg",
|
||||
"gif",
|
||||
"png",
|
||||
"webp"
|
||||
"webp",
|
||||
"avif"
|
||||
],
|
||||
"x-enum-name": "ImageFormat",
|
||||
"x-enum-keys": [],
|
||||
|
|
@ -19149,7 +19150,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\n\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\n\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \n\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\n",
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\r\n\r\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\r\n\r\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \r\n\r\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Membership",
|
||||
|
|
@ -19342,7 +19343,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\n",
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -19508,7 +19509,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\n\nIf the request is successful, a session for the user is automatically created.\n",
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\r\n\r\nIf the request is successful, a session for the user is automatically created.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -20105,7 +20106,7 @@
|
|||
},
|
||||
"\/users\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "usersListIdentities",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -21087,7 +21088,7 @@
|
|||
"tags": [
|
||||
"users"
|
||||
],
|
||||
"description": "Update the user labels by its unique ID. \n\nLabels can be used to grant access to resources. While teams are a way for user's to share access to a resource, labels can be defined by the developer to grant access without an invitation. See the [Permissions docs](https:\/\/appwrite.io\/docs\/permissions) for more info.",
|
||||
"description": "Update the user labels by its unique ID. \r\n\r\nLabels can be used to grant access to resources. While teams are a way for user's to share access to a resource, labels can be defined by the developer to grant access without an invitation. See the [Permissions docs](https:\/\/appwrite.io\/docs\/permissions) for more info.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "User",
|
||||
|
|
@ -21383,7 +21384,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/mfa\/authenticators\/{type}": {
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "usersDeleteMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -21460,7 +21461,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "usersListMfaFactors",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -21524,7 +21525,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "usersGetMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -21586,7 +21587,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "usersUpdateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -21648,7 +21649,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "usersCreateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -22175,7 +22176,7 @@
|
|||
"tags": [
|
||||
"users"
|
||||
],
|
||||
"description": "Creates a session for a user. Returns an immediately usable session object.\n\nIf you want to generate a token for a custom authentication flow, use the [POST \/users\/{userId}\/tokens](https:\/\/appwrite.io\/docs\/server\/users#createToken) endpoint.",
|
||||
"description": "Creates a session for a user. Returns an immediately usable session object.\r\n\r\nIf you want to generate a token for a custom authentication flow, use the [POST \/users\/{userId}\/tokens](https:\/\/appwrite.io\/docs\/server\/users#createToken) endpoint.",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Session",
|
||||
|
|
@ -22434,7 +22435,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/targets": {
|
||||
"get": {
|
||||
"summary": "List User Targets",
|
||||
"summary": "List user targets",
|
||||
"operationId": "usersListTargets",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -22509,7 +22510,7 @@
|
|||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create User Target",
|
||||
"summary": "Create user target",
|
||||
"operationId": "usersCreateTarget",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -22625,7 +22626,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/targets\/{targetId}": {
|
||||
"get": {
|
||||
"summary": "Get User Target",
|
||||
"summary": "Get user target",
|
||||
"operationId": "usersGetTarget",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -22696,7 +22697,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Update User target",
|
||||
"summary": "Update user target",
|
||||
"operationId": "usersUpdateTarget",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -22875,7 +22876,7 @@
|
|||
"tags": [
|
||||
"users"
|
||||
],
|
||||
"description": "Returns a token with a secret key for creating a session. Use the user ID and secret and submit a request to the [PUT \/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process.\n",
|
||||
"description": "Returns a token with a secret key for creating a session. Use the user ID and secret and submit a request to the [PUT \/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -24166,6 +24167,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"size": {
|
||||
"type": "integer",
|
||||
"description": "Attribute size.",
|
||||
|
|
@ -24185,6 +24196,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"size"
|
||||
]
|
||||
},
|
||||
|
|
@ -24223,6 +24236,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"min": {
|
||||
"type": "integer",
|
||||
"description": "Minimum value to enforce for new documents.",
|
||||
|
|
@ -24250,7 +24273,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"required"
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"attributeFloat": {
|
||||
|
|
@ -24288,6 +24313,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"min": {
|
||||
"type": "number",
|
||||
"description": "Minimum value to enforce for new documents.",
|
||||
|
|
@ -24315,7 +24350,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"required"
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"attributeBoolean": {
|
||||
|
|
@ -24353,6 +24390,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"default": {
|
||||
"type": "boolean",
|
||||
"description": "Default value for attribute when not provided. Cannot be set when attribute is required.",
|
||||
|
|
@ -24365,7 +24412,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"required"
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"attributeEmail": {
|
||||
|
|
@ -24403,6 +24452,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "String format.",
|
||||
|
|
@ -24421,6 +24480,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24459,6 +24520,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"elements": {
|
||||
"type": "array",
|
||||
"description": "Array of elements in enumerated type.",
|
||||
|
|
@ -24485,6 +24556,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"elements",
|
||||
"format"
|
||||
]
|
||||
|
|
@ -24524,6 +24597,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "String format.",
|
||||
|
|
@ -24542,6 +24625,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24580,6 +24665,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "String format.",
|
||||
|
|
@ -24598,6 +24693,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24636,6 +24733,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "ISO 8601 format.",
|
||||
|
|
@ -24654,6 +24761,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24692,6 +24801,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"relatedCollection": {
|
||||
"type": "string",
|
||||
"description": "The ID of the related collection.",
|
||||
|
|
@ -24729,6 +24848,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"relatedCollection",
|
||||
"relationType",
|
||||
"twoWay",
|
||||
|
|
@ -24777,6 +24898,16 @@
|
|||
},
|
||||
"x-example": [],
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Index creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Index update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -24784,7 +24915,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"attributes"
|
||||
"attributes",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"document": {
|
||||
|
|
@ -26458,9 +26591,9 @@
|
|||
"format": "int32"
|
||||
},
|
||||
"responseBody": {
|
||||
"type": "string",
|
||||
"type": "payload",
|
||||
"description": "HTTP response body. This will return empty unless execution is created as synchronous.",
|
||||
"x-example": "Developers are awesome."
|
||||
"x-example": ""
|
||||
},
|
||||
"responseHeaders": {
|
||||
"type": "array",
|
||||
|
|
|
|||
|
|
@ -222,7 +222,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\n",
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\r\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "User",
|
||||
|
|
@ -293,7 +293,7 @@
|
|||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -619,7 +619,7 @@
|
|||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -687,7 +687,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -773,7 +773,7 @@
|
|||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -838,7 +838,7 @@
|
|||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -917,7 +917,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -994,7 +994,7 @@
|
|||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1049,7 +1049,7 @@
|
|||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1102,7 +1102,7 @@
|
|||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1155,7 +1155,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1670,7 +1670,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Token",
|
||||
|
|
@ -1915,7 +1915,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Session",
|
||||
|
|
@ -2075,7 +2075,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed.\n\nIf there is already an active session, the new session will be attached to the logged-in account. If there are no active sessions, the server will attempt to look for a user with the same email address as the email received from the OAuth2 provider and attach the new session to the existing user. If no matching user is found - the server will create a new user.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\n",
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed.\r\n\r\nIf there is already an active session, the new session will be attached to the logged-in account. If there are no active sessions, the server will attempt to look for a user with the same email address as the email received from the OAuth2 provider and attach the new session to the existing user. If no matching user is found - the server will create a new user.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\r\n",
|
||||
"responses": {
|
||||
"301": {
|
||||
"description": "No content"
|
||||
|
|
@ -2836,7 +2836,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2922,7 +2922,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\n",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3017,7 +3017,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \n\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \r\n\r\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"301": {
|
||||
"description": "No content"
|
||||
|
|
@ -3152,7 +3152,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3235,7 +3235,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\n",
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3528,7 +3528,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -3657,7 +3657,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -3790,7 +3790,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -3857,7 +3857,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4348,7 +4348,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4435,7 +4435,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\n\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\r\n\r\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4530,7 +4530,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\n",
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -5528,7 +5528,7 @@
|
|||
"tags": [
|
||||
"locale"
|
||||
],
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\n\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\r\n\r\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Locale",
|
||||
|
|
@ -5573,7 +5573,7 @@
|
|||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -6225,7 +6225,7 @@
|
|||
"tags": [
|
||||
"storage"
|
||||
],
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\n\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\n\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\n\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\n",
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\r\n\r\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\r\n\r\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\r\n\r\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "File",
|
||||
|
|
@ -6476,7 +6476,7 @@
|
|||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -6807,7 +6807,8 @@
|
|||
"jpeg",
|
||||
"gif",
|
||||
"png",
|
||||
"webp"
|
||||
"webp",
|
||||
"avif"
|
||||
],
|
||||
"x-enum-name": "ImageFormat",
|
||||
"x-enum-keys": [],
|
||||
|
|
@ -7367,7 +7368,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\n\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\n\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \n\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\n",
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\r\n\r\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\r\n\r\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \r\n\r\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Membership",
|
||||
|
|
@ -7556,7 +7557,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\n",
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -7718,7 +7719,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\n\nIf the request is successful, a session for the user is automatically created.\n",
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\r\n\r\nIf the request is successful, a session for the user is automatically created.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -9589,9 +9590,9 @@
|
|||
"format": "int32"
|
||||
},
|
||||
"responseBody": {
|
||||
"type": "string",
|
||||
"type": "payload",
|
||||
"description": "HTTP response body. This will return empty unless execution is created as synchronous.",
|
||||
"x-example": "Developers are awesome."
|
||||
"x-example": ""
|
||||
},
|
||||
"responseHeaders": {
|
||||
"type": "array",
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -238,7 +238,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\n",
|
||||
"description": "Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.\r\nThis endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "User",
|
||||
|
|
@ -310,7 +310,7 @@
|
|||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -640,7 +640,7 @@
|
|||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -709,7 +709,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -796,7 +796,7 @@
|
|||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -862,7 +862,7 @@
|
|||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -941,7 +941,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1019,7 +1019,7 @@
|
|||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1075,7 +1075,7 @@
|
|||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1129,7 +1129,7 @@
|
|||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1183,7 +1183,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -1705,7 +1705,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"description": "Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST \/account\/recovery](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createRecovery) endpoint.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Token",
|
||||
|
|
@ -1953,7 +1953,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Session",
|
||||
|
|
@ -2518,7 +2518,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2604,7 +2604,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\n",
|
||||
"description": "Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appwrite instance by default.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2699,7 +2699,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \n\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. \r\n\r\nIf authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"301": {
|
||||
"description": "No content"
|
||||
|
|
@ -2834,7 +2834,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\n\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"description": "Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST \/v1\/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.\r\n\r\nA user is limited to 10 active sessions at a time by default. [Learn more about session limits](https:\/\/appwrite.io\/docs\/authentication-security#limits).",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -2917,7 +2917,7 @@
|
|||
"tags": [
|
||||
"account"
|
||||
],
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\n\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\n",
|
||||
"description": "Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.\r\n\r\nPlease note that in order to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -3214,7 +3214,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"description": "You can use this endpoint to show different browser icons to your users. The code argument receives the browser code as it appears in your user [GET \/account\/sessions](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#getSessions) endpoint. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -3345,7 +3345,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "The credit card endpoint will return you the icon of the credit card provider you need. Use width, height and quality arguments to change the output settings.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -3480,7 +3480,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch the favorite icon (AKA favicon) of any remote website URL.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -3549,7 +3549,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "You can use this endpoint to show different country flags icons to your users. The code argument receives the 2 letter country code. Use width, height and quality arguments to change the output settings. Country codes follow the [ISO 3166-1](https:\/\/en.wikipedia.org\/wiki\/ISO_3166-1) standard.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4042,7 +4042,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\n\nThis endpoint does not follow HTTP redirects.",
|
||||
"description": "Use this endpoint to fetch a remote image URL and crop it to any image size you want. This endpoint is very useful if you need to crop and display remote images in your app or in case you want to make sure a 3rd party image is properly served using a TLS protocol.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 400x400px.\r\n\r\nThis endpoint does not follow HTTP redirects.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4131,7 +4131,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\n\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\n\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\n",
|
||||
"description": "Use this endpoint to show your user initials avatar icon on your website or app. By default, this route will try to print your logged-in user name or email initials. You can also overwrite the user name if you pass the 'name' parameter. If no name is given and no user is logged, an empty avatar will be returned.\r\n\r\nYou can use the color and background params to change the avatar colors. By default, a random theme will be selected. The random theme will persist for the user's initials when reloading the same theme will always return for the same initials.\r\n\r\nWhen one dimension is specified and the other is 0, the image is scaled with preserved aspect ratio. If both dimensions are 0, the API provides an image at source quality. If dimensions are not specified, the default size of image returned is 100x100px.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4228,7 +4228,7 @@
|
|||
"tags": [
|
||||
"avatars"
|
||||
],
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\n",
|
||||
"description": "Converts a given plain text to a QR code image. You can use the query parameters to change the size and style of the resulting image.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Image",
|
||||
|
|
@ -4400,7 +4400,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a new Database.\n",
|
||||
"description": "Create a new Database.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Database",
|
||||
|
|
@ -5217,7 +5217,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a boolean attribute.\n",
|
||||
"description": "Create a boolean attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeBoolean",
|
||||
|
|
@ -5653,7 +5653,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create an email attribute.\n",
|
||||
"description": "Create an email attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeEmail",
|
||||
|
|
@ -5760,7 +5760,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an email attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an email attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeEmail",
|
||||
|
|
@ -5871,7 +5871,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create an enumeration attribute. The `elements` param acts as a white-list of accepted values for this attribute. \n",
|
||||
"description": "Create an enumeration attribute. The `elements` param acts as a white-list of accepted values for this attribute. \r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeEnum",
|
||||
|
|
@ -5988,7 +5988,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an enum attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an enum attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeEnum",
|
||||
|
|
@ -6109,7 +6109,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a float attribute. Optionally, minimum and maximum values can be provided.\n",
|
||||
"description": "Create a float attribute. Optionally, minimum and maximum values can be provided.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeFloat",
|
||||
|
|
@ -6228,7 +6228,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update a float attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update a float attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeFloat",
|
||||
|
|
@ -6353,7 +6353,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create an integer attribute. Optionally, minimum and maximum values can be provided.\n",
|
||||
"description": "Create an integer attribute. Optionally, minimum and maximum values can be provided.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeInteger",
|
||||
|
|
@ -6472,7 +6472,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an integer attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an integer attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeInteger",
|
||||
|
|
@ -6597,7 +6597,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create IP address attribute.\n",
|
||||
"description": "Create IP address attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeIP",
|
||||
|
|
@ -6704,7 +6704,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an ip attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an ip attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeIP",
|
||||
|
|
@ -6815,7 +6815,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\n",
|
||||
"description": "Create relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeRelationship",
|
||||
|
|
@ -6951,7 +6951,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a string attribute.\n",
|
||||
"description": "Create a string attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeString",
|
||||
|
|
@ -7071,7 +7071,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update a string attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update a string attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeString",
|
||||
|
|
@ -7188,7 +7188,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Create a URL attribute.\n",
|
||||
"description": "Create a URL attribute.\r\n",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "AttributeURL",
|
||||
|
|
@ -7295,7 +7295,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update an url attribute. Changing the `default` value will not update already existing documents.\n",
|
||||
"description": "Update an url attribute. Changing the `default` value will not update already existing documents.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeURL",
|
||||
|
|
@ -7586,7 +7586,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Update relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\n",
|
||||
"description": "Update relationship attribute. [Learn more about relationship attributes](https:\/\/appwrite.io\/docs\/databases-relationships#relationship-attributes).\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "AttributeRelationship",
|
||||
|
|
@ -8250,7 +8250,7 @@
|
|||
"tags": [
|
||||
"databases"
|
||||
],
|
||||
"description": "Creates an index on the attributes listed. Your index should include all the attributes you will query in a single request.\nAttributes can be `key`, `fulltext`, and `unique`.",
|
||||
"description": "Creates an index on the attributes listed. Your index should include all the attributes you will query in a single request.\r\nAttributes can be `key`, `fulltext`, and `unique`.",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "Index",
|
||||
|
|
@ -8917,7 +8917,7 @@
|
|||
"tags": [
|
||||
"functions"
|
||||
],
|
||||
"description": "List allowed function specifications for this instance.\n",
|
||||
"description": "List allowed function specifications for this instance.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Specifications List",
|
||||
|
|
@ -9415,7 +9415,7 @@
|
|||
"tags": [
|
||||
"functions"
|
||||
],
|
||||
"description": "Create a new function code deployment. Use this endpoint to upload a new version of your code function. To execute your newly uploaded code, you'll need to update the function's deployment to use your new deployment UID.\n\nThis endpoint accepts a tar.gz file compressed with your code. Make sure to include any dependencies your code has within the compressed file. You can learn more about code packaging in the [Appwrite Cloud Functions tutorial](https:\/\/appwrite.io\/docs\/functions).\n\nUse the \"command\" param to set the entrypoint used to execute your code.",
|
||||
"description": "Create a new function code deployment. Use this endpoint to upload a new version of your code function. To execute your newly uploaded code, you'll need to update the function's deployment to use your new deployment UID.\r\n\r\nThis endpoint accepts a tar.gz file compressed with your code. Make sure to include any dependencies your code has within the compressed file. You can learn more about code packaging in the [Appwrite Cloud Functions tutorial](https:\/\/appwrite.io\/docs\/functions).\r\n\r\nUse the \"command\" param to set the entrypoint used to execute your code.",
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "Deployment",
|
||||
|
|
@ -10231,7 +10231,7 @@
|
|||
"tags": [
|
||||
"functions"
|
||||
],
|
||||
"description": "Delete a function execution by its unique ID.\n",
|
||||
"description": "Delete a function execution by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"204": {
|
||||
"description": "No content"
|
||||
|
|
@ -11494,7 +11494,7 @@
|
|||
"tags": [
|
||||
"health"
|
||||
],
|
||||
"description": "Returns the amount of failed jobs in a given queue.\n",
|
||||
"description": "Returns the amount of failed jobs in a given queue.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Health Queue",
|
||||
|
|
@ -12265,7 +12265,7 @@
|
|||
"tags": [
|
||||
"locale"
|
||||
],
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\n\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"description": "Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language.\r\n\r\n([IP Geolocation by DB-IP](https:\/\/db-ip.com))",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Locale",
|
||||
|
|
@ -12312,7 +12312,7 @@
|
|||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -12968,7 +12968,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update an email message by its unique ID.\n",
|
||||
"description": "Update an email message by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -13302,7 +13302,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update a push notification by its unique ID.\n",
|
||||
"description": "Update a push notification by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -13596,7 +13596,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update an email message by its unique ID.\n",
|
||||
"description": "Update an email message by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -13715,7 +13715,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a message by its unique ID.\n",
|
||||
"description": "Get a message by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Message",
|
||||
|
|
@ -16355,7 +16355,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a provider by its unique ID.\n",
|
||||
"description": "Get a provider by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Provider",
|
||||
|
|
@ -16803,7 +16803,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a topic by its unique ID.\n",
|
||||
"description": "Get a topic by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Topic",
|
||||
|
|
@ -16866,7 +16866,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Update a topic by its unique ID.\n",
|
||||
"description": "Update a topic by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Topic",
|
||||
|
|
@ -17270,7 +17270,7 @@
|
|||
"tags": [
|
||||
"messaging"
|
||||
],
|
||||
"description": "Get a subscriber by its unique ID.\n",
|
||||
"description": "Get a subscriber by its unique ID.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Subscriber",
|
||||
|
|
@ -17981,7 +17981,7 @@
|
|||
"tags": [
|
||||
"storage"
|
||||
],
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\n\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\n\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\n\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\n",
|
||||
"description": "Create a new file. Before using this route, you should create a new bucket resource using either a [server integration](https:\/\/appwrite.io\/docs\/server\/storage#storageCreateBucket) API or directly from your Appwrite console.\r\n\r\nLarger files should be uploaded using multiple requests with the [content-range](https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Range) header to send a partial request with a maximum supported chunk of `5MB`. The `content-range` header values should always be in bytes.\r\n\r\nWhen the first request is sent, the server will return the **File** object, and the subsequent part request must include the file's **id** in `x-appwrite-id` header to allow the server to know that the partial upload is for the existing file and not for a new one.\r\n\r\nIf you're creating a new file using one of the Appwrite SDKs, all the chunking logic will be managed by the SDK internally.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "File",
|
||||
|
|
@ -18238,7 +18238,7 @@
|
|||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -18575,7 +18575,8 @@
|
|||
"jpeg",
|
||||
"gif",
|
||||
"png",
|
||||
"webp"
|
||||
"webp",
|
||||
"avif"
|
||||
],
|
||||
"x-enum-name": "ImageFormat",
|
||||
"x-enum-keys": [],
|
||||
|
|
@ -19149,7 +19150,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\n\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\n\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \n\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\n",
|
||||
"description": "Invite a new member to join your team. Provide an ID for existing users, or invite unregistered users using an email or phone number. If initiated from a Client SDK, Appwrite will send an email or sms with a link to join the team to the invited user, and an account will be created for them if one doesn't exist. If initiated from a Server SDK, the new member will be added automatically to the team.\r\n\r\nYou only need to provide one of a user ID, email, or phone number. Appwrite will prioritize accepting the user ID > email > phone number if you provide more than one of these parameters.\r\n\r\nUse the `url` parameter to redirect the user from the invitation email to your app. After the user is redirected, use the [Update Team Membership Status](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/teams#updateMembershipStatus) endpoint to allow the user to accept the invitation to the team. \r\n\r\nPlease note that to avoid a [Redirect Attack](https:\/\/github.com\/OWASP\/CheatSheetSeries\/blob\/master\/cheatsheets\/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) Appwrite will accept the only redirect URLs under the domains you have added as a platform on the Appwrite Console.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Membership",
|
||||
|
|
@ -19342,7 +19343,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\n",
|
||||
"description": "Modify the roles of a team member. Only team members with the owner role have access to this endpoint. Learn more about [roles and permissions](https:\/\/appwrite.io\/docs\/permissions).\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -19508,7 +19509,7 @@
|
|||
"tags": [
|
||||
"teams"
|
||||
],
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\n\nIf the request is successful, a session for the user is automatically created.\n",
|
||||
"description": "Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email received by the user.\r\n\r\nIf the request is successful, a session for the user is automatically created.\r\n",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "Membership",
|
||||
|
|
@ -20105,7 +20106,7 @@
|
|||
},
|
||||
"\/users\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "usersListIdentities",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -21087,7 +21088,7 @@
|
|||
"tags": [
|
||||
"users"
|
||||
],
|
||||
"description": "Update the user labels by its unique ID. \n\nLabels can be used to grant access to resources. While teams are a way for user's to share access to a resource, labels can be defined by the developer to grant access without an invitation. See the [Permissions docs](https:\/\/appwrite.io\/docs\/permissions) for more info.",
|
||||
"description": "Update the user labels by its unique ID. \r\n\r\nLabels can be used to grant access to resources. While teams are a way for user's to share access to a resource, labels can be defined by the developer to grant access without an invitation. See the [Permissions docs](https:\/\/appwrite.io\/docs\/permissions) for more info.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "User",
|
||||
|
|
@ -21383,7 +21384,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/mfa\/authenticators\/{type}": {
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "usersDeleteMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -21460,7 +21461,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "usersListMfaFactors",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -21524,7 +21525,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "usersGetMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -21586,7 +21587,7 @@
|
|||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "usersUpdateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -21648,7 +21649,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "usersCreateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -22175,7 +22176,7 @@
|
|||
"tags": [
|
||||
"users"
|
||||
],
|
||||
"description": "Creates a session for a user. Returns an immediately usable session object.\n\nIf you want to generate a token for a custom authentication flow, use the [POST \/users\/{userId}\/tokens](https:\/\/appwrite.io\/docs\/server\/users#createToken) endpoint.",
|
||||
"description": "Creates a session for a user. Returns an immediately usable session object.\r\n\r\nIf you want to generate a token for a custom authentication flow, use the [POST \/users\/{userId}\/tokens](https:\/\/appwrite.io\/docs\/server\/users#createToken) endpoint.",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Session",
|
||||
|
|
@ -22434,7 +22435,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/targets": {
|
||||
"get": {
|
||||
"summary": "List User Targets",
|
||||
"summary": "List user targets",
|
||||
"operationId": "usersListTargets",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -22509,7 +22510,7 @@
|
|||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create User Target",
|
||||
"summary": "Create user target",
|
||||
"operationId": "usersCreateTarget",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -22625,7 +22626,7 @@
|
|||
},
|
||||
"\/users\/{userId}\/targets\/{targetId}": {
|
||||
"get": {
|
||||
"summary": "Get User Target",
|
||||
"summary": "Get user target",
|
||||
"operationId": "usersGetTarget",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -22696,7 +22697,7 @@
|
|||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Update User target",
|
||||
"summary": "Update user target",
|
||||
"operationId": "usersUpdateTarget",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
|
@ -22875,7 +22876,7 @@
|
|||
"tags": [
|
||||
"users"
|
||||
],
|
||||
"description": "Returns a token with a secret key for creating a session. Use the user ID and secret and submit a request to the [PUT \/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process.\n",
|
||||
"description": "Returns a token with a secret key for creating a session. Use the user ID and secret and submit a request to the [PUT \/account\/sessions\/token](https:\/\/appwrite.io\/docs\/references\/cloud\/client-web\/account#createSession) endpoint to complete the login process.\r\n",
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "Token",
|
||||
|
|
@ -24166,6 +24167,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"size": {
|
||||
"type": "integer",
|
||||
"description": "Attribute size.",
|
||||
|
|
@ -24185,6 +24196,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"size"
|
||||
]
|
||||
},
|
||||
|
|
@ -24223,6 +24236,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"min": {
|
||||
"type": "integer",
|
||||
"description": "Minimum value to enforce for new documents.",
|
||||
|
|
@ -24250,7 +24273,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"required"
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"attributeFloat": {
|
||||
|
|
@ -24288,6 +24313,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"min": {
|
||||
"type": "number",
|
||||
"description": "Minimum value to enforce for new documents.",
|
||||
|
|
@ -24315,7 +24350,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"required"
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"attributeBoolean": {
|
||||
|
|
@ -24353,6 +24390,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"default": {
|
||||
"type": "boolean",
|
||||
"description": "Default value for attribute when not provided. Cannot be set when attribute is required.",
|
||||
|
|
@ -24365,7 +24412,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"required"
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"attributeEmail": {
|
||||
|
|
@ -24403,6 +24452,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "String format.",
|
||||
|
|
@ -24421,6 +24480,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24459,6 +24520,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"elements": {
|
||||
"type": "array",
|
||||
"description": "Array of elements in enumerated type.",
|
||||
|
|
@ -24485,6 +24556,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"elements",
|
||||
"format"
|
||||
]
|
||||
|
|
@ -24524,6 +24597,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "String format.",
|
||||
|
|
@ -24542,6 +24625,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24580,6 +24665,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "String format.",
|
||||
|
|
@ -24598,6 +24693,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24636,6 +24733,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"format": {
|
||||
"type": "string",
|
||||
"description": "ISO 8601 format.",
|
||||
|
|
@ -24654,6 +24761,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"format"
|
||||
]
|
||||
},
|
||||
|
|
@ -24692,6 +24801,16 @@
|
|||
"x-example": false,
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Attribute update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"relatedCollection": {
|
||||
"type": "string",
|
||||
"description": "The ID of the related collection.",
|
||||
|
|
@ -24729,6 +24848,8 @@
|
|||
"status",
|
||||
"error",
|
||||
"required",
|
||||
"$createdAt",
|
||||
"$updatedAt",
|
||||
"relatedCollection",
|
||||
"relationType",
|
||||
"twoWay",
|
||||
|
|
@ -24777,6 +24898,16 @@
|
|||
},
|
||||
"x-example": [],
|
||||
"x-nullable": true
|
||||
},
|
||||
"$createdAt": {
|
||||
"type": "string",
|
||||
"description": "Index creation date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
},
|
||||
"$updatedAt": {
|
||||
"type": "string",
|
||||
"description": "Index update date in ISO 8601 format.",
|
||||
"x-example": "2020-10-15T06:38:00.000+00:00"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -24784,7 +24915,9 @@
|
|||
"type",
|
||||
"status",
|
||||
"error",
|
||||
"attributes"
|
||||
"attributes",
|
||||
"$createdAt",
|
||||
"$updatedAt"
|
||||
]
|
||||
},
|
||||
"document": {
|
||||
|
|
@ -26458,9 +26591,9 @@
|
|||
"format": "int32"
|
||||
},
|
||||
"responseBody": {
|
||||
"type": "string",
|
||||
"type": "payload",
|
||||
"description": "HTTP response body. This will return empty unless execution is created as synchronous.",
|
||||
"x-example": "Developers are awesome."
|
||||
"x-example": ""
|
||||
},
|
||||
"responseHeaders": {
|
||||
"type": "array",
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@ return [
|
|||
'image/gif',
|
||||
'image/png',
|
||||
'image/webp',
|
||||
// 'image/heic',
|
||||
'image/avif',
|
||||
|
||||
// Video Files
|
||||
'video/mp4',
|
||||
|
|
|
|||
|
|
@ -6,4 +6,7 @@ return [ // Accepted outputs files
|
|||
'gif' => 'image/gif',
|
||||
'png' => 'image/png',
|
||||
'webp' => 'image/webp',
|
||||
// 'heic' => 'image/heic',
|
||||
// 'heics' => 'image/heic',
|
||||
'avif' => 'image/avif'
|
||||
];
|
||||
|
|
|
|||
|
|
@ -3683,7 +3683,7 @@ App::patch('/v1/account/mfa')
|
|||
});
|
||||
|
||||
App::get('/v1/account/mfa/factors')
|
||||
->desc('List Factors')
|
||||
->desc('List factors')
|
||||
->groups(['api', 'account', 'mfa'])
|
||||
->label('scope', 'account')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT])
|
||||
|
|
@ -3715,7 +3715,7 @@ App::get('/v1/account/mfa/factors')
|
|||
});
|
||||
|
||||
App::post('/v1/account/mfa/authenticators/:type')
|
||||
->desc('Create Authenticator')
|
||||
->desc('Create authenticator')
|
||||
->groups(['api', 'account'])
|
||||
->label('event', 'users.[userId].update.mfa')
|
||||
->label('scope', 'account')
|
||||
|
|
@ -3787,7 +3787,7 @@ App::post('/v1/account/mfa/authenticators/:type')
|
|||
});
|
||||
|
||||
App::put('/v1/account/mfa/authenticators/:type')
|
||||
->desc('Verify Authenticator')
|
||||
->desc('Verify authenticator')
|
||||
->groups(['api', 'account'])
|
||||
->label('event', 'users.[userId].update.mfa')
|
||||
->label('scope', 'account')
|
||||
|
|
@ -3852,7 +3852,7 @@ App::put('/v1/account/mfa/authenticators/:type')
|
|||
});
|
||||
|
||||
App::post('/v1/account/mfa/recovery-codes')
|
||||
->desc('Create MFA Recovery Codes')
|
||||
->desc('Create MFA recovery codes')
|
||||
->groups(['api', 'account'])
|
||||
->label('event', 'users.[userId].update.mfa')
|
||||
->label('scope', 'account')
|
||||
|
|
@ -3894,7 +3894,7 @@ App::post('/v1/account/mfa/recovery-codes')
|
|||
});
|
||||
|
||||
App::patch('/v1/account/mfa/recovery-codes')
|
||||
->desc('Regenerate MFA Recovery Codes')
|
||||
->desc('Regenerate MFA recovery codes')
|
||||
->groups(['api', 'account', 'mfaProtected'])
|
||||
->label('event', 'users.[userId].update.mfa')
|
||||
->label('scope', 'account')
|
||||
|
|
@ -3935,7 +3935,7 @@ App::patch('/v1/account/mfa/recovery-codes')
|
|||
});
|
||||
|
||||
App::get('/v1/account/mfa/recovery-codes')
|
||||
->desc('Get MFA Recovery Codes')
|
||||
->desc('Get MFA recovery codes')
|
||||
->groups(['api', 'account', 'mfaProtected'])
|
||||
->label('scope', 'account')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT])
|
||||
|
|
@ -3965,7 +3965,7 @@ App::get('/v1/account/mfa/recovery-codes')
|
|||
});
|
||||
|
||||
App::delete('/v1/account/mfa/authenticators/:type')
|
||||
->desc('Delete Authenticator')
|
||||
->desc('Delete authenticator')
|
||||
->groups(['api', 'account', 'mfaProtected'])
|
||||
->label('event', 'users.[userId].delete.mfa')
|
||||
->label('scope', 'account')
|
||||
|
|
@ -4003,7 +4003,7 @@ App::delete('/v1/account/mfa/authenticators/:type')
|
|||
});
|
||||
|
||||
App::post('/v1/account/mfa/challenge')
|
||||
->desc('Create MFA Challenge')
|
||||
->desc('Create MFA challenge')
|
||||
->groups(['api', 'account', 'mfa'])
|
||||
->label('scope', 'account')
|
||||
->label('event', 'users.[userId].challenges.[challengeId].create')
|
||||
|
|
@ -4191,7 +4191,7 @@ App::post('/v1/account/mfa/challenge')
|
|||
});
|
||||
|
||||
App::put('/v1/account/mfa/challenge')
|
||||
->desc('Create MFA Challenge (confirmation)')
|
||||
->desc('Create MFA challenge (confirmation)')
|
||||
->groups(['api', 'account', 'mfa'])
|
||||
->label('scope', 'account')
|
||||
->label('event', 'users.[userId].sessions.[sessionId].create')
|
||||
|
|
@ -4452,7 +4452,7 @@ App::delete('/v1/account/targets/:targetId/push')
|
|||
$response->noContent();
|
||||
});
|
||||
App::get('/v1/account/identities')
|
||||
->desc('List Identities')
|
||||
->desc('List identities')
|
||||
->groups(['api', 'account'])
|
||||
->label('scope', 'account')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT])
|
||||
|
|
|
|||
|
|
@ -550,7 +550,7 @@ App::get('/v1/avatars/initials')
|
|||
});
|
||||
|
||||
App::get('/v1/cards/cloud')
|
||||
->desc('Get Front Of Cloud Card')
|
||||
->desc('Get front Of Cloud Card')
|
||||
->groups(['api', 'avatars'])
|
||||
->label('scope', 'avatars.read')
|
||||
->label('cache', true)
|
||||
|
|
@ -757,7 +757,7 @@ App::get('/v1/cards/cloud')
|
|||
});
|
||||
|
||||
App::get('/v1/cards/cloud-back')
|
||||
->desc('Get Back Of Cloud Card')
|
||||
->desc('Get back Of Cloud Card')
|
||||
->groups(['api', 'avatars'])
|
||||
->label('scope', 'avatars.read')
|
||||
->label('cache', true)
|
||||
|
|
@ -835,7 +835,7 @@ App::get('/v1/cards/cloud-back')
|
|||
});
|
||||
|
||||
App::get('/v1/cards/cloud-og')
|
||||
->desc('Get OG Image From Cloud Card')
|
||||
->desc('Get OG image From Cloud Card')
|
||||
->groups(['api', 'avatars'])
|
||||
->label('scope', 'avatars.read')
|
||||
->label('cache', true)
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ App::get('/v1/console/variables')
|
|||
});
|
||||
|
||||
App::post('/v1/console/assistant')
|
||||
->desc('Ask Query')
|
||||
->desc('Ask query')
|
||||
->groups(['api', 'assistant'])
|
||||
->label('scope', 'assistant.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
|
|||
|
|
@ -2509,7 +2509,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/indexes')
|
|||
'required' => true,
|
||||
'array' => false,
|
||||
'default' => null,
|
||||
'size' => 36
|
||||
'size' => Database::LENGTH_KEY
|
||||
];
|
||||
|
||||
$oldAttributes[] = [
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ App::get('/v1/locale')
|
|||
});
|
||||
|
||||
App::get('/v1/locale/codes')
|
||||
->desc('List Locale Codes')
|
||||
->desc('List locale codes')
|
||||
->groups(['api', 'locale'])
|
||||
->label('scope', 'locale.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT])
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ include_once __DIR__ . '/../shared/api.php';
|
|||
|
||||
App::post('/v1/migrations/appwrite')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Migrate Appwrite Data')
|
||||
->desc('Migrate Appwrite data')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].create')
|
||||
->label('audits.event', 'migration.create')
|
||||
|
|
@ -60,6 +60,7 @@ App::post('/v1/migrations/appwrite')
|
|||
'status' => 'pending',
|
||||
'stage' => 'init',
|
||||
'source' => Appwrite::getName(),
|
||||
'destination' => Appwrite::getName(),
|
||||
'credentials' => [
|
||||
'endpoint' => $endpoint,
|
||||
'projectId' => $projectId,
|
||||
|
|
@ -87,7 +88,7 @@ App::post('/v1/migrations/appwrite')
|
|||
|
||||
App::post('/v1/migrations/firebase/oauth')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Migrate Firebase Data (OAuth)')
|
||||
->desc('Migrate Firebase data (OAuth)')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].create')
|
||||
->label('audits.event', 'migration.create')
|
||||
|
|
@ -164,6 +165,7 @@ App::post('/v1/migrations/firebase/oauth')
|
|||
'status' => 'pending',
|
||||
'stage' => 'init',
|
||||
'source' => Firebase::getName(),
|
||||
'destination' => Appwrite::getName(),
|
||||
'credentials' => [
|
||||
'serviceAccount' => json_encode($serviceAccount),
|
||||
],
|
||||
|
|
@ -189,7 +191,7 @@ App::post('/v1/migrations/firebase/oauth')
|
|||
|
||||
App::post('/v1/migrations/firebase')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Migrate Firebase Data (Service Account)')
|
||||
->desc('Migrate Firebase data (Service Account)')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].create')
|
||||
->label('audits.event', 'migration.create')
|
||||
|
|
@ -224,6 +226,7 @@ App::post('/v1/migrations/firebase')
|
|||
'status' => 'pending',
|
||||
'stage' => 'init',
|
||||
'source' => Firebase::getName(),
|
||||
'destination' => Appwrite::getName(),
|
||||
'credentials' => [
|
||||
'serviceAccount' => $serviceAccount,
|
||||
],
|
||||
|
|
@ -249,7 +252,7 @@ App::post('/v1/migrations/firebase')
|
|||
|
||||
App::post('/v1/migrations/supabase')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Migrate Supabase Data')
|
||||
->desc('Migrate Supabase data')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].create')
|
||||
->label('audits.event', 'migration.create')
|
||||
|
|
@ -279,6 +282,7 @@ App::post('/v1/migrations/supabase')
|
|||
'status' => 'pending',
|
||||
'stage' => 'init',
|
||||
'source' => Supabase::getName(),
|
||||
'destination' => Appwrite::getName(),
|
||||
'credentials' => [
|
||||
'endpoint' => $endpoint,
|
||||
'apiKey' => $apiKey,
|
||||
|
|
@ -309,7 +313,7 @@ App::post('/v1/migrations/supabase')
|
|||
|
||||
App::post('/v1/migrations/nhost')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Migrate NHost Data')
|
||||
->desc('Migrate NHost data')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].create')
|
||||
->label('audits.event', 'migration.create')
|
||||
|
|
@ -340,6 +344,7 @@ App::post('/v1/migrations/nhost')
|
|||
'status' => 'pending',
|
||||
'stage' => 'init',
|
||||
'source' => NHost::getName(),
|
||||
'destination' => Appwrite::getName(),
|
||||
'credentials' => [
|
||||
'subdomain' => $subdomain,
|
||||
'region' => $region,
|
||||
|
|
@ -371,7 +376,7 @@ App::post('/v1/migrations/nhost')
|
|||
|
||||
App::get('/v1/migrations')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('List Migrations')
|
||||
->desc('List migrations')
|
||||
->label('scope', 'migrations.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'migrations')
|
||||
|
|
@ -424,7 +429,7 @@ App::get('/v1/migrations')
|
|||
|
||||
App::get('/v1/migrations/:migrationId')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Get Migration')
|
||||
->desc('Get migration')
|
||||
->label('scope', 'migrations.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'migrations')
|
||||
|
|
@ -448,7 +453,7 @@ App::get('/v1/migrations/:migrationId')
|
|||
|
||||
App::get('/v1/migrations/appwrite/report')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Generate a report on Appwrite Data')
|
||||
->desc('Generate a report on Appwrite data')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'migrations')
|
||||
|
|
@ -490,7 +495,7 @@ App::get('/v1/migrations/appwrite/report')
|
|||
|
||||
App::get('/v1/migrations/firebase/report')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Generate a report on Firebase Data')
|
||||
->desc('Generate a report on Firebase data')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'migrations')
|
||||
|
|
@ -537,7 +542,7 @@ App::get('/v1/migrations/firebase/report')
|
|||
|
||||
App::get('/v1/migrations/firebase/report/oauth')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Generate a report on Firebase Data using OAuth')
|
||||
->desc('Generate a report on Firebase data using OAuth')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'migrations')
|
||||
|
|
@ -627,7 +632,7 @@ App::get('/v1/migrations/firebase/report/oauth')
|
|||
});
|
||||
|
||||
App::get('/v1/migrations/firebase/connect')
|
||||
->desc('Authorize with firebase')
|
||||
->desc('Authorize with Firebase')
|
||||
->groups(['api', 'migrations'])
|
||||
->label('scope', 'migrations.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
@ -781,7 +786,7 @@ App::get('/v1/migrations/firebase/redirect')
|
|||
});
|
||||
|
||||
App::get('/v1/migrations/firebase/projects')
|
||||
->desc('List Firebase Projects')
|
||||
->desc('List Firebase projects')
|
||||
->groups(['api', 'migrations'])
|
||||
->label('scope', 'migrations.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
@ -870,7 +875,7 @@ App::get('/v1/migrations/firebase/projects')
|
|||
});
|
||||
|
||||
App::get('/v1/migrations/firebase/deauthorize')
|
||||
->desc('Revoke Appwrite\'s authorization to access Firebase Projects')
|
||||
->desc('Revoke Appwrite\'s authorization to access Firebase projects')
|
||||
->groups(['api', 'migrations'])
|
||||
->label('scope', 'migrations.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
@ -985,7 +990,7 @@ App::get('/v1/migrations/nhost/report')
|
|||
|
||||
App::patch('/v1/migrations/:migrationId')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Retry Migration')
|
||||
->desc('Retry migration')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].retry')
|
||||
->label('audits.event', 'migration.retry')
|
||||
|
|
@ -1030,7 +1035,7 @@ App::patch('/v1/migrations/:migrationId')
|
|||
|
||||
App::delete('/v1/migrations/:migrationId')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Delete Migration')
|
||||
->desc('Delete migration')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].delete')
|
||||
->label('audits.event', 'migrationId.delete')
|
||||
|
|
|
|||
|
|
@ -309,7 +309,7 @@ App::get('/v1/project/usage')
|
|||
|
||||
// Variables
|
||||
App::post('/v1/project/variables')
|
||||
->desc('Create Variable')
|
||||
->desc('Create variable')
|
||||
->groups(['api'])
|
||||
->label('scope', 'projects.write')
|
||||
->label('audits.event', 'variable.create')
|
||||
|
|
@ -364,7 +364,7 @@ App::post('/v1/project/variables')
|
|||
});
|
||||
|
||||
App::get('/v1/project/variables')
|
||||
->desc('List Variables')
|
||||
->desc('List variables')
|
||||
->groups(['api'])
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
@ -389,7 +389,7 @@ App::get('/v1/project/variables')
|
|||
});
|
||||
|
||||
App::get('/v1/project/variables/:variableId')
|
||||
->desc('Get Variable')
|
||||
->desc('Get variable')
|
||||
->groups(['api'])
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
@ -413,7 +413,7 @@ App::get('/v1/project/variables/:variableId')
|
|||
});
|
||||
|
||||
App::put('/v1/project/variables/:variableId')
|
||||
->desc('Update Variable')
|
||||
->desc('Update variable')
|
||||
->groups(['api'])
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
@ -459,7 +459,7 @@ App::put('/v1/project/variables/:variableId')
|
|||
});
|
||||
|
||||
App::delete('/v1/project/variables/:variableId')
|
||||
->desc('Delete Variable')
|
||||
->desc('Delete variable')
|
||||
->groups(['api'])
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
|
|||
|
|
@ -932,6 +932,7 @@ App::delete('/v1/projects/:projectId')
|
|||
}
|
||||
|
||||
$queueForDeletes
|
||||
->setProject($project)
|
||||
->setType(DELETE_TYPE_DOCUMENT)
|
||||
->setDocument($project);
|
||||
|
||||
|
|
@ -1208,7 +1209,7 @@ App::delete('/v1/projects/:projectId/webhooks/:webhookId')
|
|||
App::post('/v1/projects/:projectId/keys')
|
||||
->desc('Create key')
|
||||
->groups(['api', 'projects'])
|
||||
->label('scope', 'projects.write')
|
||||
->label('scope', 'keys.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'createKey')
|
||||
|
|
@ -1258,7 +1259,7 @@ App::post('/v1/projects/:projectId/keys')
|
|||
App::get('/v1/projects/:projectId/keys')
|
||||
->desc('List keys')
|
||||
->groups(['api', 'projects'])
|
||||
->label('scope', 'projects.read')
|
||||
->label('scope', 'keys.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'listKeys')
|
||||
|
|
@ -1290,7 +1291,7 @@ App::get('/v1/projects/:projectId/keys')
|
|||
App::get('/v1/projects/:projectId/keys/:keyId')
|
||||
->desc('Get key')
|
||||
->groups(['api', 'projects'])
|
||||
->label('scope', 'projects.read')
|
||||
->label('scope', 'keys.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'getKey')
|
||||
|
|
@ -1324,7 +1325,7 @@ App::get('/v1/projects/:projectId/keys/:keyId')
|
|||
App::put('/v1/projects/:projectId/keys/:keyId')
|
||||
->desc('Update key')
|
||||
->groups(['api', 'projects'])
|
||||
->label('scope', 'projects.write')
|
||||
->label('scope', 'keys.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'updateKey')
|
||||
|
|
@ -1370,7 +1371,7 @@ App::put('/v1/projects/:projectId/keys/:keyId')
|
|||
App::delete('/v1/projects/:projectId/keys/:keyId')
|
||||
->desc('Delete key')
|
||||
->groups(['api', 'projects'])
|
||||
->label('scope', 'projects.write')
|
||||
->label('scope', 'keys.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'deleteKey')
|
||||
|
|
@ -1445,7 +1446,7 @@ App::post('/v1/projects/:projectId/platforms')
|
|||
->desc('Create platform')
|
||||
->groups(['api', 'projects'])
|
||||
->label('audits.event', 'platforms.create')
|
||||
->label('scope', 'projects.write')
|
||||
->label('scope', 'platforms.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'createPlatform')
|
||||
|
|
@ -1495,7 +1496,7 @@ App::post('/v1/projects/:projectId/platforms')
|
|||
App::get('/v1/projects/:projectId/platforms')
|
||||
->desc('List platforms')
|
||||
->groups(['api', 'projects'])
|
||||
->label('scope', 'projects.read')
|
||||
->label('scope', 'platforms.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'listPlatforms')
|
||||
|
|
@ -1527,7 +1528,7 @@ App::get('/v1/projects/:projectId/platforms')
|
|||
App::get('/v1/projects/:projectId/platforms/:platformId')
|
||||
->desc('Get platform')
|
||||
->groups(['api', 'projects'])
|
||||
->label('scope', 'projects.read')
|
||||
->label('scope', 'platforms.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'getPlatform')
|
||||
|
|
@ -1561,7 +1562,7 @@ App::get('/v1/projects/:projectId/platforms/:platformId')
|
|||
App::put('/v1/projects/:projectId/platforms/:platformId')
|
||||
->desc('Update platform')
|
||||
->groups(['api', 'projects'])
|
||||
->label('scope', 'projects.write')
|
||||
->label('scope', 'platforms.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'updatePlatform')
|
||||
|
|
@ -1609,7 +1610,7 @@ App::delete('/v1/projects/:projectId/platforms/:platformId')
|
|||
->desc('Delete platform')
|
||||
->groups(['api', 'projects'])
|
||||
->label('audits.event', 'platforms.delete')
|
||||
->label('scope', 'projects.write')
|
||||
->label('scope', 'platforms.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'projects')
|
||||
->label('sdk.method', 'deletePlatform')
|
||||
|
|
@ -1753,7 +1754,7 @@ App::post('/v1/projects/:projectId/smtp/tests')
|
|||
->param('port', 587, new Integer(), 'SMTP server port', true)
|
||||
->param('username', '', new Text(0, 0), 'SMTP server username', true)
|
||||
->param('password', '', new Text(0, 0), 'SMTP server password', true)
|
||||
->param('secure', '', new WhiteList(['tls'], true), 'Does SMTP server use secure connection', true)
|
||||
->param('secure', '', new WhiteList(['tls', 'ssl'], true), 'Does SMTP server use secure connection', true)
|
||||
->inject('response')
|
||||
->inject('dbForConsole')
|
||||
->inject('queueForMails')
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ use Utopia\Validator\WhiteList;
|
|||
|
||||
App::post('/v1/proxy/rules')
|
||||
->groups(['api', 'proxy'])
|
||||
->desc('Create Rule')
|
||||
->desc('Create rule')
|
||||
->label('scope', 'rules.write')
|
||||
->label('event', 'rules.[ruleId].create')
|
||||
->label('audits.event', 'rule.create')
|
||||
|
|
@ -149,7 +149,7 @@ App::post('/v1/proxy/rules')
|
|||
|
||||
App::get('/v1/proxy/rules')
|
||||
->groups(['api', 'proxy'])
|
||||
->desc('List Rules')
|
||||
->desc('List rules')
|
||||
->label('scope', 'rules.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'proxy')
|
||||
|
|
@ -212,7 +212,7 @@ App::get('/v1/proxy/rules')
|
|||
|
||||
App::get('/v1/proxy/rules/:ruleId')
|
||||
->groups(['api', 'proxy'])
|
||||
->desc('Get Rule')
|
||||
->desc('Get rule')
|
||||
->label('scope', 'rules.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'proxy')
|
||||
|
|
@ -241,7 +241,7 @@ App::get('/v1/proxy/rules/:ruleId')
|
|||
|
||||
App::delete('/v1/proxy/rules/:ruleId')
|
||||
->groups(['api', 'proxy'])
|
||||
->desc('Delete Rule')
|
||||
->desc('Delete rule')
|
||||
->label('scope', 'rules.write')
|
||||
->label('event', 'rules.[ruleId].delete')
|
||||
->label('audits.event', 'rules.delete')
|
||||
|
|
@ -277,7 +277,7 @@ App::delete('/v1/proxy/rules/:ruleId')
|
|||
});
|
||||
|
||||
App::patch('/v1/proxy/rules/:ruleId/verification')
|
||||
->desc('Update Rule Verification Status')
|
||||
->desc('Update rule verification status')
|
||||
->groups(['api', 'proxy'])
|
||||
->label('scope', 'rules.write')
|
||||
->label('event', 'rules.[ruleId].update')
|
||||
|
|
|
|||
|
|
@ -889,10 +889,6 @@ App::get('/v1/storage/buckets/:bucketId/files/:fileId/preview')
|
|||
throw new Exception(Exception::STORAGE_FILE_NOT_FOUND);
|
||||
}
|
||||
|
||||
if ((\strpos($request->getAccept(), 'image/webp') === false) && ('webp' === $output)) { // Fallback webp to jpeg when no browser support
|
||||
$output = 'jpg';
|
||||
}
|
||||
|
||||
$inputs = Config::getParam('storage-inputs');
|
||||
$outputs = Config::getParam('storage-outputs');
|
||||
$fileLogos = Config::getParam('storage-logos');
|
||||
|
|
@ -1549,7 +1545,7 @@ App::put('/v1/storage/buckets/:bucketId/files/:fileId')
|
|||
});
|
||||
|
||||
App::delete('/v1/storage/buckets/:bucketId/files/:fileId')
|
||||
->desc('Delete File')
|
||||
->desc('Delete file')
|
||||
->groups(['api', 'storage'])
|
||||
->label('scope', 'files.write')
|
||||
->label('event', 'buckets.[bucketId].files.[fileId].delete')
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ use Utopia\Validator\ArrayList;
|
|||
use Utopia\Validator\Assoc;
|
||||
use Utopia\Validator\Host;
|
||||
use Utopia\Validator\Text;
|
||||
use Utopia\Validator\WhiteList;
|
||||
|
||||
App::post('/v1/teams')
|
||||
->desc('Create team')
|
||||
|
|
@ -394,7 +395,17 @@ App::post('/v1/teams/:teamId/memberships')
|
|||
->param('email', '', new Email(), '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', [], 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.')
|
||||
->param('roles', [], function (Document $project) {
|
||||
if ($project->getId() === 'console') {
|
||||
;
|
||||
$roles = array_keys(Config::getParam('roles', []));
|
||||
array_filter($roles, function ($role) {
|
||||
return !in_array($role, [Auth::USER_ROLE_APPS, Auth::USER_ROLE_GUESTS, Auth::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('url', '', fn ($clients) => new Host($clients), '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, ['clients']) // 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')
|
||||
|
|
@ -868,7 +879,17 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId')
|
|||
->label('sdk.response.model', Response::MODEL_MEMBERSHIP)
|
||||
->param('teamId', '', new UID(), 'Team ID.')
|
||||
->param('membershipId', '', new UID(), 'Membership ID.')
|
||||
->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.')
|
||||
->param('roles', [], function (Document $project) {
|
||||
if ($project->getId() === 'console') {
|
||||
;
|
||||
$roles = array_keys(Config::getParam('roles', []));
|
||||
array_filter($roles, function ($role) {
|
||||
return !in_array($role, [Auth::USER_ROLE_APPS, Auth::USER_ROLE_GUESTS, Auth::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'])
|
||||
->inject('request')
|
||||
->inject('response')
|
||||
->inject('user')
|
||||
|
|
|
|||
|
|
@ -452,7 +452,7 @@ App::post('/v1/users/scrypt-modified')
|
|||
});
|
||||
|
||||
App::post('/v1/users/:userId/targets')
|
||||
->desc('Create User Target')
|
||||
->desc('Create user target')
|
||||
->groups(['api', 'users'])
|
||||
->label('audits.event', 'target.create')
|
||||
->label('audits.resource', 'target/response.$id')
|
||||
|
|
@ -647,7 +647,7 @@ App::get('/v1/users/:userId/prefs')
|
|||
});
|
||||
|
||||
App::get('/v1/users/:userId/targets/:targetId')
|
||||
->desc('Get User Target')
|
||||
->desc('Get user target')
|
||||
->groups(['api', 'users'])
|
||||
->label('scope', 'targets.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_ADMIN])
|
||||
|
|
@ -848,7 +848,7 @@ App::get('/v1/users/:userId/logs')
|
|||
});
|
||||
|
||||
App::get('/v1/users/:userId/targets')
|
||||
->desc('List User Targets')
|
||||
->desc('List user targets')
|
||||
->groups(['api', 'users'])
|
||||
->label('scope', 'targets.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_ADMIN])
|
||||
|
|
@ -903,7 +903,7 @@ App::get('/v1/users/:userId/targets')
|
|||
});
|
||||
|
||||
App::get('/v1/users/identities')
|
||||
->desc('List Identities')
|
||||
->desc('List identities')
|
||||
->groups(['api', 'users'])
|
||||
->label('scope', 'users.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
|
|
@ -1425,7 +1425,7 @@ App::patch('/v1/users/:userId/prefs')
|
|||
});
|
||||
|
||||
App::patch('/v1/users/:userId/targets/:targetId')
|
||||
->desc('Update User target')
|
||||
->desc('Update user target')
|
||||
->groups(['api', 'users'])
|
||||
->label('audits.event', 'target.update')
|
||||
->label('audits.resource', 'target/{response.$id}')
|
||||
|
|
@ -1557,7 +1557,7 @@ App::patch('/v1/users/:userId/mfa')
|
|||
});
|
||||
|
||||
App::get('/v1/users/:userId/mfa/factors')
|
||||
->desc('List Factors')
|
||||
->desc('List factors')
|
||||
->groups(['api', 'users'])
|
||||
->label('scope', 'users.read')
|
||||
->label('usage.metric', 'users.{scope}.requests.read')
|
||||
|
|
@ -1590,7 +1590,7 @@ App::get('/v1/users/:userId/mfa/factors')
|
|||
});
|
||||
|
||||
App::get('/v1/users/:userId/mfa/recovery-codes')
|
||||
->desc('Get MFA Recovery Codes')
|
||||
->desc('Get MFA recovery codes')
|
||||
->groups(['api', 'users'])
|
||||
->label('scope', 'users.read')
|
||||
->label('usage.metric', 'users.{scope}.requests.read')
|
||||
|
|
@ -1625,7 +1625,7 @@ App::get('/v1/users/:userId/mfa/recovery-codes')
|
|||
});
|
||||
|
||||
App::patch('/v1/users/:userId/mfa/recovery-codes')
|
||||
->desc('Create MFA Recovery Codes')
|
||||
->desc('Create MFA recovery codes')
|
||||
->groups(['api', 'users'])
|
||||
->label('event', 'users.[userId].create.mfa.recovery-codes')
|
||||
->label('scope', 'users.write')
|
||||
|
|
@ -1671,7 +1671,7 @@ App::patch('/v1/users/:userId/mfa/recovery-codes')
|
|||
});
|
||||
|
||||
App::put('/v1/users/:userId/mfa/recovery-codes')
|
||||
->desc('Regenerate MFA Recovery Codes')
|
||||
->desc('Regenerate MFA recovery codes')
|
||||
->groups(['api', 'users'])
|
||||
->label('event', 'users.[userId].update.mfa.recovery-codes')
|
||||
->label('scope', 'users.write')
|
||||
|
|
@ -1716,7 +1716,7 @@ App::put('/v1/users/:userId/mfa/recovery-codes')
|
|||
});
|
||||
|
||||
App::delete('/v1/users/:userId/mfa/authenticators/:type')
|
||||
->desc('Delete Authenticator')
|
||||
->desc('Delete authenticator')
|
||||
->groups(['api', 'users'])
|
||||
->label('event', 'users.[userId].delete.mfa')
|
||||
->label('scope', 'users.write')
|
||||
|
|
|
|||
|
|
@ -263,7 +263,7 @@ $createGitDeployments = function (GitHub $github, string $providerInstallationId
|
|||
};
|
||||
|
||||
App::get('/v1/vcs/github/authorize')
|
||||
->desc('Install GitHub App')
|
||||
->desc('Install GitHub app')
|
||||
->groups(['api', 'vcs'])
|
||||
->label('scope', 'vcs.read')
|
||||
->label('sdk.namespace', 'vcs')
|
||||
|
|
@ -305,7 +305,7 @@ App::get('/v1/vcs/github/authorize')
|
|||
});
|
||||
|
||||
App::get('/v1/vcs/github/callback')
|
||||
->desc('Capture installation and authorization from GitHub App')
|
||||
->desc('Capture installation and authorization from GitHub app')
|
||||
->groups(['api', 'vcs'])
|
||||
->label('scope', 'public')
|
||||
->label('error', __DIR__ . '/../../views/general/error.phtml')
|
||||
|
|
@ -598,7 +598,7 @@ App::post('/v1/vcs/github/installations/:installationId/providerRepositories/:pr
|
|||
});
|
||||
|
||||
App::get('/v1/vcs/github/installations/:installationId/providerRepositories')
|
||||
->desc('List Repositories')
|
||||
->desc('List repositories')
|
||||
->groups(['api', 'vcs'])
|
||||
->label('scope', 'vcs.read')
|
||||
->label('sdk.namespace', 'vcs')
|
||||
|
|
@ -843,7 +843,7 @@ App::get('/v1/vcs/github/installations/:installationId/providerRepositories/:pro
|
|||
});
|
||||
|
||||
App::get('/v1/vcs/github/installations/:installationId/providerRepositories/:providerRepositoryId/branches')
|
||||
->desc('List Repository Branches')
|
||||
->desc('List repository branches')
|
||||
->groups(['api', 'vcs'])
|
||||
->label('scope', 'vcs.read')
|
||||
->label('sdk.namespace', 'vcs')
|
||||
|
|
@ -892,7 +892,7 @@ App::get('/v1/vcs/github/installations/:installationId/providerRepositories/:pro
|
|||
});
|
||||
|
||||
App::post('/v1/vcs/github/events')
|
||||
->desc('Create Event')
|
||||
->desc('Create event')
|
||||
->groups(['api', 'vcs'])
|
||||
->label('scope', 'public')
|
||||
->inject('gitHub')
|
||||
|
|
@ -1120,7 +1120,7 @@ App::get('/v1/vcs/installations/:installationId')
|
|||
});
|
||||
|
||||
App::delete('/v1/vcs/installations/:installationId')
|
||||
->desc('Delete Installation')
|
||||
->desc('Delete installation')
|
||||
->groups(['api', 'vcs'])
|
||||
->label('scope', 'vcs.write')
|
||||
->label('sdk.namespace', 'vcs')
|
||||
|
|
|
|||
|
|
@ -869,8 +869,12 @@ App::error()
|
|||
$isProduction = System::getEnv('_APP_ENV', 'development') === 'production';
|
||||
$log->setEnvironment($isProduction ? Log::ENVIRONMENT_PRODUCTION : Log::ENVIRONMENT_STAGING);
|
||||
|
||||
$responseCode = $logger->addLog($log);
|
||||
Console::info('Log pushed with status code: ' . $responseCode);
|
||||
try {
|
||||
$responseCode = $logger->addLog($log);
|
||||
Console::info('Error log pushed with status code: ' . $responseCode);
|
||||
} catch (Throwable $th) {
|
||||
Console::error('Error pushing log: ' . $th->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/** Wrap all exceptions inside Appwrite\Extend\Exception */
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ App::patch('/v1/mock/functions-v2')
|
|||
App::post('/v1/mock/api-key-unprefixed')
|
||||
->desc('Create API Key (without standard prefix)')
|
||||
->groups(['mock', 'api', 'projects'])
|
||||
->label('scope', 'projects.write')
|
||||
->label('scope', 'public')
|
||||
->label('docs', false)
|
||||
->param('projectId', '', new UID(), 'Project ID.')
|
||||
->inject('response')
|
||||
|
|
|
|||
|
|
@ -160,42 +160,22 @@ App::init()
|
|||
->inject('session')
|
||||
->inject('servers')
|
||||
->inject('mode')
|
||||
->action(function (App $utopia, Request $request, Database $dbForConsole, Document $project, Document $user, ?Document $session, array $servers, string $mode) {
|
||||
->inject('team')
|
||||
->action(function (App $utopia, Request $request, Database $dbForConsole, Document $project, Document $user, ?Document $session, array $servers, string $mode, Document $team) {
|
||||
$route = $utopia->getRoute();
|
||||
|
||||
if ($project->isEmpty()) {
|
||||
throw new Exception(Exception::PROJECT_NOT_FOUND);
|
||||
}
|
||||
|
||||
/**
|
||||
* ACL Check
|
||||
*/
|
||||
/** Default role */
|
||||
$roles = Config::getParam('roles', []);
|
||||
$role = ($user->isEmpty())
|
||||
? Role::guests()->toString()
|
||||
: Role::users()->toString();
|
||||
|
||||
// Add user roles
|
||||
$memberships = $user->find('teamId', $project->getAttribute('teamId'), 'memberships');
|
||||
|
||||
if ($memberships) {
|
||||
foreach ($memberships->getAttribute('roles', []) as $memberRole) {
|
||||
switch ($memberRole) {
|
||||
case 'owner':
|
||||
$role = Auth::USER_ROLE_OWNER;
|
||||
break;
|
||||
case 'admin':
|
||||
$role = Auth::USER_ROLE_ADMIN;
|
||||
break;
|
||||
case 'developer':
|
||||
$role = Auth::USER_ROLE_DEVELOPER;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$roles = Config::getParam('roles', []);
|
||||
$scope = $route->getLabel('scope', 'none'); // Allowed scope for chosen route
|
||||
$scopes = $roles[$role]['scopes']; // Allowed scopes for user role
|
||||
/** Allowed Scopes for the role */
|
||||
$scopes = $roles[$role]['scopes'];
|
||||
|
||||
$apiKey = $request->getHeader('x-appwrite-key', '');
|
||||
|
||||
|
|
@ -294,13 +274,38 @@ App::init()
|
|||
}
|
||||
}
|
||||
}
|
||||
// Admin User Authentication
|
||||
elseif (($project->getId() === 'console' && !$team->isEmpty() && !$user->isEmpty()) || ($project->getId() !== 'console' && !$user->isEmpty() && $mode === APP_MODE_ADMIN)) {
|
||||
$teamId = $team->getId();
|
||||
$adminRoles = [];
|
||||
$memberships = $user->getAttribute('memberships', []);
|
||||
foreach ($memberships as $membership) {
|
||||
if ($membership->getAttribute('confirm', false) === true && $membership->getAttribute('teamId') === $teamId) {
|
||||
$adminRoles = $membership->getAttribute('roles', []);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($adminRoles)) {
|
||||
throw new Exception(Exception::USER_UNAUTHORIZED);
|
||||
}
|
||||
|
||||
$scopes = []; // reset scope if admin
|
||||
foreach ($adminRoles as $role) {
|
||||
$scopes = \array_merge($scopes, $roles[$role]['scopes']);
|
||||
}
|
||||
|
||||
Authorization::setDefaultStatus(false); // Cancel security segmentation for admin users.
|
||||
}
|
||||
|
||||
$scopes = \array_unique($scopes);
|
||||
|
||||
Authorization::setRole($role);
|
||||
|
||||
foreach (Auth::getRoles($user) as $authRole) {
|
||||
Authorization::setRole($authRole);
|
||||
}
|
||||
|
||||
/** Do not allow access to disabled services */
|
||||
$service = $route->getLabel('sdk.namespace', '');
|
||||
if (!empty($service)) {
|
||||
if (
|
||||
|
|
@ -311,14 +316,14 @@ App::init()
|
|||
throw new Exception(Exception::GENERAL_SERVICE_DISABLED);
|
||||
}
|
||||
}
|
||||
if (!\in_array($scope, $scopes)) {
|
||||
if ($project->isEmpty()) { // Check if permission is denied because project is missing
|
||||
throw new Exception(Exception::PROJECT_NOT_FOUND);
|
||||
}
|
||||
|
||||
/** Do now allow access if scope is not allowed */
|
||||
$scope = $route->getLabel('scope', 'none');
|
||||
if (!\in_array($scope, $scopes)) {
|
||||
throw new Exception(Exception::GENERAL_UNAUTHORIZED_SCOPE, $user->getAttribute('email', 'User') . ' (role: ' . \strtolower($roles[$role]['label']) . ') missing scope (' . $scope . ')');
|
||||
}
|
||||
|
||||
/** Do not allow access to blocked accounts */
|
||||
if (false === $user->getAttribute('status')) { // Account is blocked
|
||||
throw new Exception(Exception::USER_BLOCKED);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -298,8 +298,12 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo
|
|||
$isProduction = System::getEnv('_APP_ENV', 'development') === 'production';
|
||||
$log->setEnvironment($isProduction ? Log::ENVIRONMENT_PRODUCTION : Log::ENVIRONMENT_STAGING);
|
||||
|
||||
$responseCode = $logger->addLog($log);
|
||||
Console::info('Log pushed with status code: ' . $responseCode);
|
||||
try {
|
||||
$responseCode = $logger->addLog($log);
|
||||
Console::info('Error log pushed with status code: ' . $responseCode);
|
||||
} catch (Throwable $th) {
|
||||
Console::error('Error pushing log: ' . $th->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
Console::error('[Error] Type: ' . get_class($th));
|
||||
|
|
|
|||
55
app/init.php
55
app/init.php
|
|
@ -41,6 +41,7 @@ use Appwrite\Network\Validator\Email;
|
|||
use Appwrite\Network\Validator\Origin;
|
||||
use Appwrite\OpenSSL\OpenSSL;
|
||||
use Appwrite\URL\URL as AppwriteURL;
|
||||
use Appwrite\Utopia\Request;
|
||||
use MaxMind\Db\Reader;
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use Swoole\Database\PDOProxy;
|
||||
|
|
@ -155,6 +156,9 @@ const APP_HOSTNAME_INTERNAL = 'appwrite';
|
|||
const APP_FUNCTION_SPECIFICATION_DEFAULT = Specification::S_05VCPU_512MB;
|
||||
const APP_FUNCTION_CPUS_DEFAULT = 0.5;
|
||||
const APP_FUNCTION_MEMORY_DEFAULT = 512;
|
||||
const APP_PLATFORM_SERVER = 'server';
|
||||
const APP_PLATFORM_CLIENT = 'client';
|
||||
const APP_PLATFORM_CONSOLE = 'console';
|
||||
|
||||
// Database Reconnect
|
||||
const DATABASE_RECONNECT_SLEEP = 2;
|
||||
|
|
@ -243,15 +247,12 @@ const METRIC_SESSIONS = 'sessions';
|
|||
const METRIC_DATABASES = 'databases';
|
||||
const METRIC_COLLECTIONS = 'collections';
|
||||
const METRIC_DATABASES_STORAGE = 'databases.storage';
|
||||
const METRIC_DATABASES_STORAGE_DISK = 'databases.storage_disk';
|
||||
const METRIC_DATABASE_ID_COLLECTIONS = '{databaseInternalId}.collections';
|
||||
const METRIC_DATABASE_ID_STORAGE = '{databaseInternalId}.databases.storage';
|
||||
const METRIC_DATABASE_ID_STORAGE_DISK = '{databaseInternalId}.databases.storage_disk';
|
||||
const METRIC_DOCUMENTS = 'documents';
|
||||
const METRIC_DATABASE_ID_DOCUMENTS = '{databaseInternalId}.documents';
|
||||
const METRIC_DATABASE_ID_COLLECTION_ID_DOCUMENTS = '{databaseInternalId}.{collectionInternalId}.documents';
|
||||
const METRIC_DATABASE_ID_COLLECTION_ID_STORAGE = '{databaseInternalId}.{collectionInternalId}.databases.storage';
|
||||
const METRIC_DATABASE_ID_COLLECTION_ID_STORAGE_DISK = '{databaseInternalId}.{collectionInternalId}.databases.storage_disk';
|
||||
const METRIC_BUCKETS = 'buckets';
|
||||
const METRIC_FILES = 'files';
|
||||
const METRIC_FILES_STORAGE = 'files.storage';
|
||||
|
|
@ -1262,13 +1263,13 @@ App::setResource('user', function ($mode, $project, $console, $request, $respons
|
|||
$user = new Document([]);
|
||||
}
|
||||
|
||||
if (APP_MODE_ADMIN === $mode) {
|
||||
if ($user->find('teamInternalId', $project->getAttribute('teamInternalId'), 'memberships')) {
|
||||
Authorization::setDefaultStatus(false); // Cancel security segmentation for admin users.
|
||||
} else {
|
||||
$user = new Document([]);
|
||||
}
|
||||
}
|
||||
// if (APP_MODE_ADMIN === $mode) {
|
||||
// if ($user->find('teamInternalId', $project->getAttribute('teamInternalId'), 'memberships')) {
|
||||
// Authorization::setDefaultStatus(false); // Cancel security segmentation for admin users.
|
||||
// } else {
|
||||
// $user = new Document([]);
|
||||
// }
|
||||
// }
|
||||
|
||||
$authJWT = $request->getHeader('x-appwrite-jwt', '');
|
||||
|
||||
|
|
@ -1345,7 +1346,7 @@ App::setResource('console', function () {
|
|||
'$collection' => ID::custom('projects'),
|
||||
'description' => 'Appwrite core engine',
|
||||
'logo' => '',
|
||||
'teamId' => -1,
|
||||
'teamId' => null,
|
||||
'webhooks' => [],
|
||||
'keys' => [],
|
||||
'platforms' => [
|
||||
|
|
@ -1783,3 +1784,35 @@ App::setResource('requestTimestamp', function ($request) {
|
|||
App::setResource('plan', function (array $plan = []) {
|
||||
return [];
|
||||
});
|
||||
|
||||
|
||||
App::setResource('team', function (Document $project, Database $dbForConsole, App $utopia, Request $request) {
|
||||
$teamInternalId = '';
|
||||
if ($project->getId() !== 'console') {
|
||||
$teamInternalId = $project->getAttribute('teamInternalId', '');
|
||||
} else {
|
||||
$route = $utopia->match($request);
|
||||
$path = $route->getPath();
|
||||
if (str_starts_with($path, '/v1/projects/:projectId')) {
|
||||
$uri = $request->getURI();
|
||||
$pid = explode('/', $uri)[3];
|
||||
$p = Authorization::skip(fn () => $dbForConsole->getDocument('projects', $pid));
|
||||
$teamInternalId = $p->getAttribute('teamInternalId', '');
|
||||
} elseif ($path === '/v1/projects') {
|
||||
$teamId = $request->getParam('teamId', '');
|
||||
$team = Authorization::skip(fn () => $dbForConsole->getDocument('teams', $teamId));
|
||||
return $team;
|
||||
}
|
||||
}
|
||||
|
||||
$team = Authorization::skip(function () use ($dbForConsole, $teamInternalId) {
|
||||
return $dbForConsole->findOne('teams', [
|
||||
Query::equal('$internalId', [$teamInternalId]),
|
||||
]);
|
||||
});
|
||||
|
||||
if (!$team) {
|
||||
$team = new Document([]);
|
||||
}
|
||||
return $team;
|
||||
}, ['project', 'dbForConsole', 'utopia', 'request']);
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ require_once __DIR__ . '/init.php';
|
|||
Runtime::enableCoroutine(SWOOLE_HOOK_ALL);
|
||||
|
||||
// Allows overriding
|
||||
if (!function_exists("getConsoleDB")) {
|
||||
if (!function_exists('getConsoleDB')) {
|
||||
function getConsoleDB(): Database
|
||||
{
|
||||
global $register;
|
||||
|
|
@ -66,7 +66,7 @@ if (!function_exists("getConsoleDB")) {
|
|||
}
|
||||
|
||||
// Allows overriding
|
||||
if (!function_exists("getProjectDB")) {
|
||||
if (!function_exists('getProjectDB')) {
|
||||
function getProjectDB(Document $project): Database
|
||||
{
|
||||
global $register;
|
||||
|
|
@ -113,7 +113,7 @@ if (!function_exists("getProjectDB")) {
|
|||
}
|
||||
|
||||
// Allows overriding
|
||||
if (!function_exists("getCache")) {
|
||||
if (!function_exists('getCache')) {
|
||||
function getCache(): Cache
|
||||
{
|
||||
global $register;
|
||||
|
|
@ -194,8 +194,12 @@ $logError = function (Throwable $error, string $action) use ($register) {
|
|||
$isProduction = System::getEnv('_APP_ENV', 'development') === 'production';
|
||||
$log->setEnvironment($isProduction ? Log::ENVIRONMENT_PRODUCTION : Log::ENVIRONMENT_STAGING);
|
||||
|
||||
$responseCode = $logger->addLog($log);
|
||||
Console::info('Realtime log pushed with status code: ' . $responseCode);
|
||||
try {
|
||||
$responseCode = $logger->addLog($log);
|
||||
Console::info('Error log pushed with status code: ' . $responseCode);
|
||||
} catch (Throwable $th) {
|
||||
Console::error('Error pushing log: ' . $th->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
Console::error('[Error] Type: ' . get_class($error));
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ Server::setResource('project', function (Message $message, Database $dbForConsol
|
|||
$payload = $message->getPayload() ?? [];
|
||||
$project = new Document($payload['project'] ?? []);
|
||||
|
||||
if ($project->getId() === 'console') {
|
||||
if ($project->getId() === 'console' || $project->isEmpty() || ! empty($project->getInternalId())) {
|
||||
return $project;
|
||||
}
|
||||
|
||||
|
|
@ -351,8 +351,12 @@ $worker
|
|||
$isProduction = System::getEnv('_APP_ENV', 'development') === 'production';
|
||||
$log->setEnvironment($isProduction ? Log::ENVIRONMENT_PRODUCTION : Log::ENVIRONMENT_STAGING);
|
||||
|
||||
$responseCode = $logger->addLog($log);
|
||||
Console::info('Usage stats log pushed with status code: ' . $responseCode);
|
||||
try {
|
||||
$responseCode = $logger->addLog($log);
|
||||
Console::info('Error log pushed with status code: ' . $responseCode);
|
||||
} catch (Throwable $th) {
|
||||
Console::error('Error pushing log: ' . $th->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
Console::error('[Error] Type: ' . get_class($error));
|
||||
|
|
|
|||
|
|
@ -51,16 +51,16 @@
|
|||
"utopia-php/cache": "0.10.*",
|
||||
"utopia-php/cli": "0.15.*",
|
||||
"utopia-php/config": "0.2.*",
|
||||
"utopia-php/database": "0.53.*",
|
||||
"utopia-php/database": "0.53.5",
|
||||
"utopia-php/domains": "0.5.*",
|
||||
"utopia-php/dsn": "0.2.1",
|
||||
"utopia-php/framework": "0.33.*",
|
||||
"utopia-php/fetch": "0.2.*",
|
||||
"utopia-php/image": "0.6.*",
|
||||
"utopia-php/image": "0.7.*",
|
||||
"utopia-php/locale": "0.4.*",
|
||||
"utopia-php/logger": "0.6.*",
|
||||
"utopia-php/messaging": "0.12.*",
|
||||
"utopia-php/migration": "0.5.*",
|
||||
"utopia-php/migration": "0.6.*",
|
||||
"utopia-php/orchestration": "0.9.*",
|
||||
"utopia-php/platform": "0.7.*",
|
||||
"utopia-php/pools": "0.5.*",
|
||||
|
|
@ -97,11 +97,5 @@
|
|||
"platform": {
|
||||
"php": "8.3"
|
||||
}
|
||||
},
|
||||
"repositories": {
|
||||
"utopia-php/database": {
|
||||
"type": "vcs",
|
||||
"url": "https://github.com/utopia-php/database"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
152
composer.lock
generated
152
composer.lock
generated
|
|
@ -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": "7066d9ca32e7a1a60614effdc4701970",
|
||||
"content-hash": "1884e3a2966762c4a955842426b64f6c",
|
||||
"packages": [
|
||||
{
|
||||
"name": "adhocore/jwt",
|
||||
|
|
@ -65,16 +65,16 @@
|
|||
},
|
||||
{
|
||||
"name": "appwrite/appwrite",
|
||||
"version": "10.1.0",
|
||||
"version": "11.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/appwrite/sdk-for-php.git",
|
||||
"reference": "da579af70723cfc117b5af84375bdef117e27312"
|
||||
"reference": "1d043f543acdb17b9fdb440b1b2dd208e400bad3"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/appwrite/sdk-for-php/zipball/da579af70723cfc117b5af84375bdef117e27312",
|
||||
"reference": "da579af70723cfc117b5af84375bdef117e27312",
|
||||
"url": "https://api.github.com/repos/appwrite/sdk-for-php/zipball/1d043f543acdb17b9fdb440b1b2dd208e400bad3",
|
||||
"reference": "1d043f543acdb17b9fdb440b1b2dd208e400bad3",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -83,7 +83,8 @@
|
|||
"php": ">=7.1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "3.7.35"
|
||||
"mockery/mockery": "^1.6.6",
|
||||
"phpunit/phpunit": "^10"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
|
|
@ -99,10 +100,10 @@
|
|||
"support": {
|
||||
"email": "team@appwrite.io",
|
||||
"issues": "https://github.com/appwrite/sdk-for-php/issues",
|
||||
"source": "https://github.com/appwrite/sdk-for-php/tree/10.1.0",
|
||||
"source": "https://github.com/appwrite/sdk-for-php/tree/11.1.0",
|
||||
"url": "https://appwrite.io/support"
|
||||
},
|
||||
"time": "2023-11-20T09:56:12+00:00"
|
||||
"time": "2024-06-26T07:03:23+00:00"
|
||||
},
|
||||
{
|
||||
"name": "appwrite/php-clamav",
|
||||
|
|
@ -1723,7 +1724,7 @@
|
|||
},
|
||||
{
|
||||
"name": "utopia-php/database",
|
||||
"version": "0.53.5-rc1",
|
||||
"version": "0.53.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/utopia-php/database.git",
|
||||
|
|
@ -1759,38 +1760,7 @@
|
|||
"Utopia\\Database\\": "src/Database"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Tests\\E2E\\": "tests/e2e",
|
||||
"Tests\\Unit\\": "tests/unit"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"build": [
|
||||
"Composer\\Config::disableProcessTimeout",
|
||||
"docker compose build"
|
||||
],
|
||||
"start": [
|
||||
"Composer\\Config::disableProcessTimeout",
|
||||
"docker compose up -d"
|
||||
],
|
||||
"test": [
|
||||
"Composer\\Config::disableProcessTimeout",
|
||||
"docker compose exec tests vendor/bin/phpunit --configuration phpunit.xml"
|
||||
],
|
||||
"lint": [
|
||||
"./vendor/bin/pint --test"
|
||||
],
|
||||
"format": [
|
||||
"./vendor/bin/pint"
|
||||
],
|
||||
"check": [
|
||||
"./vendor/bin/phpstan analyse --level 7 src tests --memory-limit 512M"
|
||||
],
|
||||
"coverage": [
|
||||
"./vendor/bin/coverage-check ./tmp/clover.xml 90"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
|
|
@ -1803,8 +1773,8 @@
|
|||
"utopia"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/utopia-php/database/tree/0.53.5-rc1",
|
||||
"issues": "https://github.com/utopia-php/database/issues"
|
||||
"issues": "https://github.com/utopia-php/database/issues",
|
||||
"source": "https://github.com/utopia-php/database/tree/0.53.5"
|
||||
},
|
||||
"time": "2024-09-24T08:43:10+00:00"
|
||||
},
|
||||
|
|
@ -2001,21 +1971,21 @@
|
|||
},
|
||||
{
|
||||
"name": "utopia-php/image",
|
||||
"version": "0.6.1",
|
||||
"version": "0.7.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/utopia-php/image.git",
|
||||
"reference": "2d74c27e69e65a93cf94a16586598a04fe435bf0"
|
||||
"reference": "fcea143edbad524bf871ddbebe801d981f91f181"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/utopia-php/image/zipball/2d74c27e69e65a93cf94a16586598a04fe435bf0",
|
||||
"reference": "2d74c27e69e65a93cf94a16586598a04fe435bf0",
|
||||
"url": "https://api.github.com/repos/utopia-php/image/zipball/fcea143edbad524bf871ddbebe801d981f91f181",
|
||||
"reference": "fcea143edbad524bf871ddbebe801d981f91f181",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-imagick": "*",
|
||||
"php": ">=8.0"
|
||||
"php": ">=8.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"laravel/pint": "1.2.*",
|
||||
|
|
@ -2043,9 +2013,9 @@
|
|||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/utopia-php/image/issues",
|
||||
"source": "https://github.com/utopia-php/image/tree/0.6.1"
|
||||
"source": "https://github.com/utopia-php/image/tree/0.7.0"
|
||||
},
|
||||
"time": "2024-02-05T13:31:44+00:00"
|
||||
"time": "2024-10-02T05:45:38+00:00"
|
||||
},
|
||||
{
|
||||
"name": "utopia-php/locale",
|
||||
|
|
@ -2205,27 +2175,35 @@
|
|||
},
|
||||
{
|
||||
"name": "utopia-php/migration",
|
||||
"version": "0.5.2",
|
||||
"version": "0.6.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/utopia-php/migration.git",
|
||||
"reference": "f18d44d4459f78c292dac9edde856fd156fe497a"
|
||||
"reference": "e43ef283f1386084e11d1ffe093fb6c6d7a6ce6c"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/utopia-php/migration/zipball/f18d44d4459f78c292dac9edde856fd156fe497a",
|
||||
"reference": "f18d44d4459f78c292dac9edde856fd156fe497a",
|
||||
"url": "https://api.github.com/repos/utopia-php/migration/zipball/e43ef283f1386084e11d1ffe093fb6c6d7a6ce6c",
|
||||
"reference": "e43ef283f1386084e11d1ffe093fb6c6d7a6ce6c",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"appwrite/appwrite": "10.1.0",
|
||||
"php": "8.*"
|
||||
"appwrite/appwrite": "11.1.*",
|
||||
"ext-curl": "*",
|
||||
"ext-openssl": "*",
|
||||
"php": "8.3.*",
|
||||
"utopia-php/database": "0.53.*",
|
||||
"utopia-php/dsn": "0.2.*",
|
||||
"utopia-php/framework": "0.33.*",
|
||||
"utopia-php/storage": "0.18.*"
|
||||
},
|
||||
"require-dev": {
|
||||
"laravel/pint": "1.*",
|
||||
"phpunit/phpunit": "9.*",
|
||||
"utopia-php/cli": "^0.18.0",
|
||||
"vlucas/phpdotenv": "5.*"
|
||||
"ext-pdo": "*",
|
||||
"laravel/pint": "1.17.*",
|
||||
"phpstan/phpstan": "1.11.*",
|
||||
"phpunit/phpunit": "11.2.*",
|
||||
"utopia-php/cli": "0.16.*",
|
||||
"vlucas/phpdotenv": "5.6.*"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
|
|
@ -2247,9 +2225,9 @@
|
|||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/utopia-php/migration/issues",
|
||||
"source": "https://github.com/utopia-php/migration/tree/0.5.2"
|
||||
"source": "https://github.com/utopia-php/migration/tree/0.6.4"
|
||||
},
|
||||
"time": "2024-07-22T09:27:07+00:00"
|
||||
"time": "2024-10-02T15:16:36+00:00"
|
||||
},
|
||||
{
|
||||
"name": "utopia-php/mongo",
|
||||
|
|
@ -3024,16 +3002,16 @@
|
|||
"packages-dev": [
|
||||
{
|
||||
"name": "appwrite/sdk-generator",
|
||||
"version": "0.39.21",
|
||||
"version": "0.39.22",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/appwrite/sdk-generator.git",
|
||||
"reference": "9754b190d33aaad56fdb8defc94f90248184c5ac"
|
||||
"reference": "bdbb1607527550e67283ff0533522d1410c2c0df"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/9754b190d33aaad56fdb8defc94f90248184c5ac",
|
||||
"reference": "9754b190d33aaad56fdb8defc94f90248184c5ac",
|
||||
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/bdbb1607527550e67283ff0533522d1410c2c0df",
|
||||
"reference": "bdbb1607527550e67283ff0533522d1410c2c0df",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3069,9 +3047,9 @@
|
|||
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
|
||||
"support": {
|
||||
"issues": "https://github.com/appwrite/sdk-generator/issues",
|
||||
"source": "https://github.com/appwrite/sdk-generator/tree/0.39.21"
|
||||
"source": "https://github.com/appwrite/sdk-generator/tree/0.39.22"
|
||||
},
|
||||
"time": "2024-09-10T08:49:29+00:00"
|
||||
"time": "2024-10-01T16:16:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "doctrine/annotations",
|
||||
|
|
@ -3345,16 +3323,16 @@
|
|||
},
|
||||
{
|
||||
"name": "laravel/pint",
|
||||
"version": "v1.17.3",
|
||||
"version": "v1.18.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/laravel/pint.git",
|
||||
"reference": "9d77be916e145864f10788bb94531d03e1f7b482"
|
||||
"reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/laravel/pint/zipball/9d77be916e145864f10788bb94531d03e1f7b482",
|
||||
"reference": "9d77be916e145864f10788bb94531d03e1f7b482",
|
||||
"url": "https://api.github.com/repos/laravel/pint/zipball/35c00c05ec43e6b46d295efc0f4386ceb30d50d9",
|
||||
"reference": "35c00c05ec43e6b46d295efc0f4386ceb30d50d9",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3407,7 +3385,7 @@
|
|||
"issues": "https://github.com/laravel/pint/issues",
|
||||
"source": "https://github.com/laravel/pint"
|
||||
},
|
||||
"time": "2024-09-03T15:00:28+00:00"
|
||||
"time": "2024-09-24T17:22:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "matthiasmullie/minify",
|
||||
|
|
@ -3595,16 +3573,16 @@
|
|||
},
|
||||
{
|
||||
"name": "nikic/php-parser",
|
||||
"version": "v5.2.0",
|
||||
"version": "v5.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nikic/PHP-Parser.git",
|
||||
"reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb"
|
||||
"reference": "3abf7425cd284141dc5d8d14a9ee444de3345d1a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb",
|
||||
"reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3abf7425cd284141dc5d8d14a9ee444de3345d1a",
|
||||
"reference": "3abf7425cd284141dc5d8d14a9ee444de3345d1a",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -3647,9 +3625,9 @@
|
|||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/nikic/PHP-Parser/issues",
|
||||
"source": "https://github.com/nikic/PHP-Parser/tree/v5.2.0"
|
||||
"source": "https://github.com/nikic/PHP-Parser/tree/v5.3.0"
|
||||
},
|
||||
"time": "2024-09-15T16:40:33+00:00"
|
||||
"time": "2024-09-29T13:56:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phar-io/manifest",
|
||||
|
|
@ -4216,16 +4194,16 @@
|
|||
},
|
||||
{
|
||||
"name": "phpstan/phpdoc-parser",
|
||||
"version": "1.31.0",
|
||||
"version": "1.32.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpstan/phpdoc-parser.git",
|
||||
"reference": "249f15fb843bf240cf058372dad29e100cee6c17"
|
||||
"reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/249f15fb843bf240cf058372dad29e100cee6c17",
|
||||
"reference": "249f15fb843bf240cf058372dad29e100cee6c17",
|
||||
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4",
|
||||
"reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
|
@ -4257,9 +4235,9 @@
|
|||
"description": "PHPDoc parser with support for nullable, intersection and generic types",
|
||||
"support": {
|
||||
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
|
||||
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.31.0"
|
||||
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.32.0"
|
||||
},
|
||||
"time": "2024-09-22T11:32:18+00:00"
|
||||
"time": "2024-09-26T07:23:32+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-code-coverage",
|
||||
|
|
@ -7026,9 +7004,7 @@
|
|||
],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": {
|
||||
"utopia-php/database": 5
|
||||
},
|
||||
"stability-flags": [],
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ class Migration extends Event
|
|||
'sourceRegion' => $this->getSourceRegion(),
|
||||
'project' => $this->project,
|
||||
'user' => $this->user,
|
||||
'migration' => $this->migration
|
||||
'migration' => $this->migration,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ class Mapper
|
|||
$defaults = [
|
||||
'boolean' => Type::boolean(),
|
||||
'string' => Type::string(),
|
||||
'payload' => Type::string(),
|
||||
'integer' => Type::int(),
|
||||
'double' => Type::float(),
|
||||
'datetime' => Type::string(),
|
||||
|
|
|
|||
|
|
@ -243,7 +243,11 @@ class Realtime extends Adapter
|
|||
* @param string $event
|
||||
* @param Document $payload
|
||||
* @param Document|null $project
|
||||
* @param Document|null $database
|
||||
* @param Document|null $collection
|
||||
* @param Document|null $bucket
|
||||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function fromPayload(string $event, Document $payload, Document $project = null, Document $database = null, Document $collection = null, Document $bucket = null): array
|
||||
{
|
||||
|
|
@ -262,6 +266,7 @@ class Realtime extends Adapter
|
|||
break;
|
||||
case 'rules':
|
||||
$channels[] = 'console';
|
||||
$channels[] = 'projects.' . $project->getId();
|
||||
$projectId = 'console';
|
||||
$roles = [Role::team($project->getAttribute('teamId'))->toString()];
|
||||
break;
|
||||
|
|
@ -280,6 +285,7 @@ class Realtime extends Adapter
|
|||
case 'databases':
|
||||
if (in_array($parts[4] ?? [], ['attributes', 'indexes'])) {
|
||||
$channels[] = 'console';
|
||||
$channels[] = 'projects.' . $project->getId();
|
||||
$projectId = 'console';
|
||||
$roles = [Role::team($project->getAttribute('teamId'))->toString()];
|
||||
} elseif (($parts[4] ?? '') === 'documents') {
|
||||
|
|
@ -319,6 +325,7 @@ class Realtime extends Adapter
|
|||
if ($parts[2] === 'executions') {
|
||||
if (!empty($payload->getRead())) {
|
||||
$channels[] = 'console';
|
||||
$channels[] = 'projects.' . $project->getId();
|
||||
$channels[] = 'executions';
|
||||
$channels[] = 'executions.' . $payload->getId();
|
||||
$channels[] = 'functions.' . $payload->getAttribute('functionId');
|
||||
|
|
@ -326,6 +333,7 @@ class Realtime extends Adapter
|
|||
}
|
||||
} elseif ($parts[2] === 'deployments') {
|
||||
$channels[] = 'console';
|
||||
$channels[] = 'projects.' . $project->getId();
|
||||
$projectId = 'console';
|
||||
$roles = [Role::team($project->getAttribute('teamId'))->toString()];
|
||||
}
|
||||
|
|
@ -333,6 +341,7 @@ class Realtime extends Adapter
|
|||
break;
|
||||
case 'migrations':
|
||||
$channels[] = 'console';
|
||||
$channels[] = 'projects.' . $project->getId();
|
||||
$projectId = 'console';
|
||||
$roles = [Role::team($project->getAttribute('teamId'))->toString()];
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -49,12 +49,7 @@ class Maintenance extends Action
|
|||
$this->foreachProject($dbForConsole, function (Document $project) use ($queueForDeletes, $usageStatsRetentionHourly) {
|
||||
$queueForDeletes->setProject($project);
|
||||
|
||||
$this->notifyDeleteTargets($queueForDeletes);
|
||||
$this->notifyDeleteExecutionLogs($queueForDeletes);
|
||||
$this->notifyDeleteAbuseLogs($queueForDeletes);
|
||||
$this->notifyDeleteAuditLogs($queueForDeletes);
|
||||
$this->notifyDeleteUsageStats($usageStatsRetentionHourly, $queueForDeletes);
|
||||
$this->notifyDeleteExpiredSessions($queueForDeletes);
|
||||
$this->notifyProjects($queueForDeletes, $usageStatsRetentionHourly);
|
||||
});
|
||||
|
||||
$this->notifyDeleteConnections($queueForDeletes);
|
||||
|
|
@ -64,6 +59,19 @@ class Maintenance extends Action
|
|||
}, $interval, $delay);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hook to allow sub-classes to extend project-level maintenance functionality.
|
||||
*/
|
||||
protected function notifyProjects(Delete $queueForDeletes, int $usageStatsRetentionHourly): void
|
||||
{
|
||||
$this->notifyDeleteTargets($queueForDeletes);
|
||||
$this->notifyDeleteExecutionLogs($queueForDeletes);
|
||||
$this->notifyDeleteAbuseLogs($queueForDeletes);
|
||||
$this->notifyDeleteAuditLogs($queueForDeletes);
|
||||
$this->notifyDeleteUsageStats($usageStatsRetentionHourly, $queueForDeletes);
|
||||
$this->notifyDeleteExpiredSessions($queueForDeletes);
|
||||
}
|
||||
|
||||
protected function foreachProject(Database $dbForConsole, callable $callback): void
|
||||
{
|
||||
// TODO: @Meldiron name of this method no longer matches. It does not delete, and it gives whole document
|
||||
|
|
|
|||
|
|
@ -25,11 +25,8 @@ abstract class ScheduleBase extends Action
|
|||
|
||||
abstract public static function getName(): string;
|
||||
abstract public static function getSupportedResource(): string;
|
||||
|
||||
abstract protected function enqueueResources(
|
||||
Connection $queue,
|
||||
Database $dbForConsole
|
||||
);
|
||||
abstract public static function getCollectionId(): string;
|
||||
abstract protected function enqueueResources(Connection $queue, Database $dbForConsole);
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
|
|
@ -63,14 +60,8 @@ abstract class ScheduleBase extends Action
|
|||
$getSchedule = function (Document $schedule) use ($dbForConsole, $getProjectDB): array {
|
||||
$project = $dbForConsole->getDocument('projects', $schedule->getAttribute('projectId'));
|
||||
|
||||
$collectionId = match ($schedule->getAttribute('resourceType')) {
|
||||
'function' => 'functions',
|
||||
'message' => 'messages',
|
||||
'execution' => 'executions'
|
||||
};
|
||||
|
||||
$resource = $getProjectDB($project)->getDocument(
|
||||
$collectionId,
|
||||
static::getCollectionId(),
|
||||
$schedule->getAttribute('resourceId')
|
||||
);
|
||||
|
||||
|
|
@ -114,12 +105,7 @@ abstract class ScheduleBase extends Action
|
|||
try {
|
||||
$this->schedules[$document->getInternalId()] = $getSchedule($document);
|
||||
} catch (\Throwable $th) {
|
||||
$collectionId = match ($document->getAttribute('resourceType')) {
|
||||
'function' => 'functions',
|
||||
'message' => 'messages',
|
||||
'execution' => 'executions'
|
||||
};
|
||||
|
||||
$collectionId = static::getCollectionId();
|
||||
Console::error("Failed to load schedule for project {$document['projectId']} {$collectionId} {$document['resourceId']}");
|
||||
Console::error($th->getMessage());
|
||||
}
|
||||
|
|
@ -171,10 +157,10 @@ abstract class ScheduleBase extends Action
|
|||
$new = \strtotime($document['resourceUpdatedAt']);
|
||||
|
||||
if (!$document['active']) {
|
||||
Console::info("Removing: {$document['resourceId']}");
|
||||
Console::info("Removing: {$document['resourceType']}::{$document['resourceId']}");
|
||||
unset($this->schedules[$document->getInternalId()]);
|
||||
} elseif ($new !== $org) {
|
||||
Console::info("Updating: {$document['resourceId']}");
|
||||
Console::info("Updating: {$document['resourceType']}::{$document['resourceId']}");
|
||||
$this->schedules[$document->getInternalId()] = $getSchedule($document);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,6 +23,11 @@ class ScheduleExecutions extends ScheduleBase
|
|||
return 'execution';
|
||||
}
|
||||
|
||||
public static function getCollectionId(): string
|
||||
{
|
||||
return 'executions';
|
||||
}
|
||||
|
||||
protected function enqueueResources(Connection $queue, Database $dbForConsole): void
|
||||
{
|
||||
|
||||
|
|
|
|||
|
|
@ -27,6 +27,11 @@ class ScheduleFunctions extends ScheduleBase
|
|||
return 'function';
|
||||
}
|
||||
|
||||
public static function getCollectionId(): string
|
||||
{
|
||||
return 'functions';
|
||||
}
|
||||
|
||||
protected function enqueueResources(Connection $queue, Database $dbForConsole): void
|
||||
{
|
||||
$timerStart = \microtime(true);
|
||||
|
|
|
|||
|
|
@ -22,6 +22,11 @@ class ScheduleMessages extends ScheduleBase
|
|||
return 'message';
|
||||
}
|
||||
|
||||
public static function getCollectionId(): string
|
||||
{
|
||||
return 'messages';
|
||||
}
|
||||
|
||||
protected function enqueueResources(Connection $queue, Database $dbForConsole): void
|
||||
{
|
||||
foreach ($this->schedules as $schedule) {
|
||||
|
|
|
|||
|
|
@ -5,9 +5,11 @@ namespace Appwrite\Platform\Tasks;
|
|||
use Appwrite\Specification\Format\OpenAPI3;
|
||||
use Appwrite\Specification\Format\Swagger2;
|
||||
use Appwrite\Specification\Specification;
|
||||
use Appwrite\Utopia\Response;
|
||||
use Appwrite\Utopia\Request as AppwriteRequest;
|
||||
use Appwrite\Utopia\Response as AppwriteResponse;
|
||||
use Exception;
|
||||
use Swoole\Http\Response as HttpResponse;
|
||||
use Swoole\Http\Request as SwooleRequest;
|
||||
use Swoole\Http\Response as SwooleResponse;
|
||||
use Utopia\App;
|
||||
use Utopia\Cache\Adapter\None;
|
||||
use Utopia\Cache\Cache;
|
||||
|
|
@ -17,7 +19,8 @@ use Utopia\Database\Adapter\MySQL;
|
|||
use Utopia\Database\Database;
|
||||
use Utopia\Platform\Action;
|
||||
use Utopia\Registry\Registry;
|
||||
use Utopia\Request;
|
||||
use Utopia\Request as UtopiaRequest;
|
||||
use Utopia\Response as UtopiaResponse;
|
||||
use Utopia\System\System;
|
||||
use Utopia\Validator\Text;
|
||||
use Utopia\Validator\WhiteList;
|
||||
|
|
@ -29,6 +32,16 @@ class Specs extends Action
|
|||
return 'specs';
|
||||
}
|
||||
|
||||
public function getRequest(): UtopiaRequest
|
||||
{
|
||||
return new AppwriteRequest(new SwooleRequest());
|
||||
}
|
||||
|
||||
public function getResponse(): UtopiaResponse
|
||||
{
|
||||
return new AppwriteResponse(new SwooleResponse());
|
||||
}
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this
|
||||
|
|
@ -42,11 +55,11 @@ class Specs extends Action
|
|||
public function action(string $version, string $mode, Registry $register): void
|
||||
{
|
||||
$appRoutes = App::getRoutes();
|
||||
$response = new Response(new HttpResponse());
|
||||
$response = $this->getResponse();
|
||||
$mocks = ($mode === 'mocks');
|
||||
|
||||
// Mock dependencies
|
||||
App::setResource('request', fn () => new Request());
|
||||
App::setResource('request', fn () => $this->getRequest());
|
||||
App::setResource('response', fn () => $response);
|
||||
App::setResource('dbForConsole', fn () => new Database(new MySQL(''), new Cache(new None())));
|
||||
App::setResource('dbForProject', fn () => new Database(new MySQL(''), new Cache(new None())));
|
||||
|
|
@ -183,10 +196,8 @@ class Specs extends Action
|
|||
case APP_AUTH_TYPE_SESSION:
|
||||
$sdkPlatforms[] = APP_PLATFORM_CLIENT;
|
||||
break;
|
||||
case APP_AUTH_TYPE_KEY:
|
||||
$sdkPlatforms[] = APP_PLATFORM_SERVER;
|
||||
break;
|
||||
case APP_AUTH_TYPE_JWT:
|
||||
case APP_AUTH_TYPE_KEY:
|
||||
$sdkPlatforms[] = APP_PLATFORM_SERVER;
|
||||
break;
|
||||
case APP_AUTH_TYPE_ADMIN:
|
||||
|
|
|
|||
|
|
@ -480,6 +480,7 @@ class Deletes extends Action
|
|||
private function deleteProject(Database $dbForConsole, callable $getProjectDB, Device $deviceForFiles, Device $deviceForFunctions, Device $deviceForBuilds, Device $deviceForCache, Document $document): void
|
||||
{
|
||||
$projectInternalId = $document->getInternalId();
|
||||
$projectId = $document->getId();
|
||||
|
||||
try {
|
||||
$dsn = new DSN($document->getAttribute('database', 'console'));
|
||||
|
|
@ -504,8 +505,18 @@ class Deletes extends Action
|
|||
|
||||
foreach ($collections as $collection) {
|
||||
if (! in_array($dsn->getHost(), $sharedTablesKeys) || !\in_array($collection->getId(), $projectCollectionIds)) {
|
||||
$dbForProject->deleteCollection($collection->getId()); $dbForProject->deleteCollection($collection->getId());
|
||||
} else {
|
||||
try {
|
||||
$dbForProject->deleteCollection($collection->getId());
|
||||
} catch (Throwable $e) {
|
||||
Console::error('Error deleting '.$collection->getId().' '.$e->getMessage());
|
||||
|
||||
/**
|
||||
* Ignore junction tables;
|
||||
*/
|
||||
if (!preg_match('/^_\d+_\d+$/', $collection->getId())) {
|
||||
throw $e;
|
||||
}
|
||||
} } else {
|
||||
$this->deleteByGroup($collection->getId(), [], database: $dbForProject);
|
||||
}
|
||||
}
|
||||
|
|
@ -558,6 +569,11 @@ class Deletes extends Action
|
|||
Query::equal('projectInternalId', [$projectInternalId]),
|
||||
], $dbForConsole);
|
||||
|
||||
// Delete Schedules (No projectInternalId in this collection)
|
||||
$this->deleteByGroup('schedules', [
|
||||
Query::equal('projectId', [$projectId]),
|
||||
], $dbForConsole);
|
||||
|
||||
// Delete metadata table
|
||||
System::getEnv('_APP_DATABASE_SHARED_TABLES', '');
|
||||
if (! in_array($dsn, $sharedTablesKeys)) {
|
||||
|
|
@ -957,7 +973,7 @@ class Deletes extends Action
|
|||
* @return void
|
||||
* @throws Exception
|
||||
*/
|
||||
private function deleteByGroup(string $collection, array $queries, Database $database, callable $callback = null): void
|
||||
protected function deleteByGroup(string $collection, array $queries, Database $database, callable $callback = null): void
|
||||
{
|
||||
$count = 0;
|
||||
$chunk = 0;
|
||||
|
|
@ -999,7 +1015,7 @@ class Deletes extends Action
|
|||
* @return void
|
||||
* @throws Exception
|
||||
*/
|
||||
private function listByGroup(string $collection, array $queries, Database $database, callable $callback = null): void
|
||||
protected function listByGroup(string $collection, array $queries, Database $database, callable $callback = null): void
|
||||
{
|
||||
$count = 0;
|
||||
$chunk = 0;
|
||||
|
|
|
|||
|
|
@ -599,7 +599,8 @@ class Functions extends Action
|
|||
$target = Realtime::fromPayload(
|
||||
// Pass first, most verbose event pattern
|
||||
event: $allEvents[0],
|
||||
payload: $execution
|
||||
payload: $execution,
|
||||
project: $project
|
||||
);
|
||||
Realtime::send(
|
||||
redis: $realtimeConnection($this->sourceRegion),
|
||||
|
|
|
|||
|
|
@ -489,11 +489,29 @@ class Messaging extends Action
|
|||
|
||||
return match ($provider->getAttribute('provider')) {
|
||||
'mock' => new Mock('username', 'password'),
|
||||
'twilio' => new Twilio($credentials['accountSid'], $credentials['authToken'], null, isset($credentials['messagingServiceSid']) ? $credentials['messagingServiceSid'] : null),
|
||||
'textmagic' => new TextMagic($credentials['username'], $credentials['apiKey']),
|
||||
'telesign' => new Telesign($credentials['customerId'], $credentials['apiKey']),
|
||||
'msg91' => new Msg91($credentials['senderId'], $credentials['authKey'], $credentials['templateId']),
|
||||
'vonage' => new Vonage($credentials['apiKey'], $credentials['apiSecret']),
|
||||
'twilio' => new Twilio(
|
||||
$credentials['accountSid'] ?? '',
|
||||
$credentials['authToken'] ?? '',
|
||||
null,
|
||||
$credentials['messagingServiceSid'] ?? null
|
||||
),
|
||||
'textmagic' => new TextMagic(
|
||||
$credentials['username'] ?? '',
|
||||
$credentials['apiKey'] ?? ''
|
||||
),
|
||||
'telesign' => new Telesign(
|
||||
$credentials['customerId'] ?? '',
|
||||
$credentials['apiKey'] ?? ''
|
||||
),
|
||||
'msg91' => new Msg91(
|
||||
$credentials['senderId'] ?? '',
|
||||
$credentials['authKey'] ?? '',
|
||||
$credentials['templateId'] ?? ''
|
||||
),
|
||||
'vonage' => new Vonage(
|
||||
$credentials['apiKey'] ?? '',
|
||||
$credentials['apiSecret'] ?? ''
|
||||
),
|
||||
default => null
|
||||
};
|
||||
}
|
||||
|
|
@ -506,11 +524,11 @@ class Messaging extends Action
|
|||
return match ($provider->getAttribute('provider')) {
|
||||
'mock' => new Mock('username', 'password'),
|
||||
'apns' => new APNS(
|
||||
$credentials['authKey'],
|
||||
$credentials['authKeyId'],
|
||||
$credentials['teamId'],
|
||||
$credentials['bundleId'],
|
||||
$options['sandbox']
|
||||
$credentials['authKey'] ?? '',
|
||||
$credentials['authKeyId'] ?? '',
|
||||
$credentials['teamId'] ?? '',
|
||||
$credentials['bundleId'] ?? '',
|
||||
$options['sandbox'] ?? false
|
||||
),
|
||||
'fcm' => new FCM(\json_encode($credentials['serviceAccountJSON'])),
|
||||
default => null
|
||||
|
|
@ -521,24 +539,25 @@ class Messaging extends Action
|
|||
{
|
||||
$credentials = $provider->getAttribute('credentials', []);
|
||||
$options = $provider->getAttribute('options', []);
|
||||
$apiKey = $credentials['apiKey'] ?? '';
|
||||
|
||||
return match ($provider->getAttribute('provider')) {
|
||||
'mock' => new Mock('username', 'password'),
|
||||
'smtp' => new SMTP(
|
||||
$credentials['host'],
|
||||
$credentials['port'],
|
||||
$credentials['username'],
|
||||
$credentials['password'],
|
||||
$options['encryption'],
|
||||
$options['autoTLS'],
|
||||
$options['mailer'],
|
||||
$credentials['host'] ?? '',
|
||||
$credentials['port'] ?? 25,
|
||||
$credentials['username'] ?? '',
|
||||
$credentials['password'] ?? '',
|
||||
$options['encryption'] ?? '',
|
||||
$options['autoTLS'] ?? false,
|
||||
$options['mailer'] ?? '',
|
||||
),
|
||||
'mailgun' => new Mailgun(
|
||||
$credentials['apiKey'],
|
||||
$credentials['domain'],
|
||||
$credentials['isEuRegion']
|
||||
$apiKey,
|
||||
$credentials['domain'] ?? '',
|
||||
$credentials['isEuRegion'] ?? false
|
||||
),
|
||||
'sendgrid' => new Sendgrid($credentials['apiKey']),
|
||||
'sendgrid' => new Sendgrid($apiKey),
|
||||
default => null
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ use Appwrite\Permission;
|
|||
use Appwrite\Role;
|
||||
use Exception;
|
||||
use Utopia\CLI\Console;
|
||||
use Utopia\Config\Config;
|
||||
use Utopia\Database\Database;
|
||||
use Utopia\Database\Document;
|
||||
use Utopia\Database\Exception\Authorization;
|
||||
|
|
@ -16,11 +17,11 @@ use Utopia\Database\Exception\Restricted;
|
|||
use Utopia\Database\Exception\Structure;
|
||||
use Utopia\Database\Helpers\ID;
|
||||
use Utopia\Logger\Log;
|
||||
use Utopia\Logger\Log\Breadcrumb;
|
||||
use Utopia\Migration\Destinations\Appwrite as DestinationsAppwrite;
|
||||
use Utopia\Migration\Destination;
|
||||
use Utopia\Migration\Destinations\Appwrite as DestinationAppwrite;
|
||||
use Utopia\Migration\Exception as MigrationException;
|
||||
use Utopia\Migration\Source;
|
||||
use Utopia\Migration\Sources\Appwrite;
|
||||
use Utopia\Migration\Sources\Appwrite as SourceAppwrite;
|
||||
use Utopia\Migration\Sources\Firebase;
|
||||
use Utopia\Migration\Sources\NHost;
|
||||
use Utopia\Migration\Sources\Supabase;
|
||||
|
|
@ -30,8 +31,11 @@ use Utopia\Queue\Message;
|
|||
|
||||
class Migrations extends Action
|
||||
{
|
||||
private ?Database $dbForProject = null;
|
||||
private ?Database $dbForConsole = null;
|
||||
protected Database $dbForProject;
|
||||
|
||||
protected Database $dbForConsole;
|
||||
|
||||
protected Document $project;
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
|
|
@ -58,11 +62,6 @@ class Migrations extends Action
|
|||
}
|
||||
|
||||
/**
|
||||
* @param Message $message
|
||||
* @param Database $dbForProject
|
||||
* @param Database $dbForConsole
|
||||
* @param Log $log
|
||||
* @return void
|
||||
* @throws Exception
|
||||
*/
|
||||
public function action(Message $message, Database $dbForProject, Database $dbForConsole, Log $log, Callable $realtimeConnection): void
|
||||
|
|
@ -84,6 +83,7 @@ class Migrations extends Action
|
|||
$this->sourceRegion = $payload['sourceRegion'] ?? 'default';
|
||||
$this->dbForProject = $dbForProject;
|
||||
$this->dbForConsole = $dbForConsole;
|
||||
$this->project = $project;
|
||||
|
||||
/**
|
||||
* Handle Event execution.
|
||||
|
|
@ -95,17 +95,17 @@ class Migrations extends Action
|
|||
$log->addTag('migrationId', $migration->getId());
|
||||
$log->addTag('projectId', $project->getId());
|
||||
|
||||
$this->processMigration($project, $migration, $log, $realtimeConnection);
|
||||
$this->processMigration($migration, $log, $realtimeConnection);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $source
|
||||
* @param array $credentials
|
||||
* @return Source
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function processSource(string $source, array $credentials): Source
|
||||
protected function processSource(Document $migration): Source
|
||||
{
|
||||
$source = $migration->getAttribute('source');
|
||||
$credentials = $migration->getAttribute('credentials');
|
||||
|
||||
return match ($source) {
|
||||
Firebase::getName() => new Firebase(
|
||||
json_decode($credentials['serviceAccount'], true),
|
||||
|
|
@ -128,11 +128,35 @@ class Migrations extends Action
|
|||
$credentials['password'],
|
||||
$credentials['port'],
|
||||
),
|
||||
Appwrite::getName() => new Appwrite($credentials['projectId'], str_starts_with($credentials['endpoint'], 'http://localhost/v1') ? 'http://appwrite/v1' : $credentials['endpoint'], $credentials['apiKey']),
|
||||
SourceAppwrite::getName() => new SourceAppwrite(
|
||||
$credentials['projectId'],
|
||||
$credentials['endpoint'],
|
||||
$credentials['apiKey'],
|
||||
),
|
||||
default => throw new \Exception('Invalid source type'),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function processDestination(Document $migration): Destination
|
||||
{
|
||||
$destination = $migration->getAttribute('destination');
|
||||
$credentials = $migration->getAttribute('credentials');
|
||||
|
||||
return match ($destination) {
|
||||
DestinationAppwrite::getName() => new DestinationAppwrite(
|
||||
$credentials['projectId'],
|
||||
$credentials['endpoint'],
|
||||
$credentials['apiKey'],
|
||||
$this->dbForProject,
|
||||
Config::getParam('collections', [])['databases']['collections'],
|
||||
),
|
||||
default => throw new \Exception('Invalid destination type'),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Authorization
|
||||
* @throws Structure
|
||||
|
|
@ -175,8 +199,6 @@ class Migrations extends Action
|
|||
}
|
||||
|
||||
/**
|
||||
* @param Document $apiKey
|
||||
* @return void
|
||||
* @throws \Utopia\Database\Exception
|
||||
* @throws Authorization
|
||||
* @throws Conflict
|
||||
|
|
@ -189,8 +211,6 @@ class Migrations extends Action
|
|||
}
|
||||
|
||||
/**
|
||||
* @param Document $project
|
||||
* @return Document
|
||||
* @throws Authorization
|
||||
* @throws Structure
|
||||
* @throws \Utopia\Database\Exception
|
||||
|
|
@ -251,90 +271,111 @@ class Migrations extends Action
|
|||
* @throws Restricted
|
||||
* @throws Structure
|
||||
* @throws \Utopia\Database\Exception
|
||||
* @throws Exception
|
||||
*/
|
||||
protected function processMigration(Document $project, Document $migration, Log $log, Callable $realtimeConnection): void
|
||||
protected function processMigration(Document $migration, Log $log, Callable $realtimeConnection): void
|
||||
{
|
||||
/**
|
||||
* @var Document $migrationDocument
|
||||
* @var Transfer $transfer
|
||||
*/
|
||||
$migrationDocument = null;
|
||||
$transfer = null;
|
||||
$project = $this->project;
|
||||
$projectDocument = $this->dbForConsole->getDocument('projects', $project->getId());
|
||||
$tempAPIKey = $this->generateAPIKey($projectDocument);
|
||||
|
||||
$transfer = $source = $destination = null;
|
||||
|
||||
try {
|
||||
$migrationDocument = $this->dbForProject->getDocument('migrations', $migration->getId());
|
||||
$migrationDocument->setAttribute('stage', 'processing');
|
||||
$migrationDocument->setAttribute('status', 'processing');
|
||||
$log->addBreadcrumb(new Breadcrumb("debug", "migration", "Migration hit stage 'processing'", \microtime(true)));
|
||||
$this->updateMigrationDocument($migrationDocument, $projectDocument, $realtimeConnection);
|
||||
$migration = $this->dbForProject->getDocument('migrations', $migration->getId());
|
||||
|
||||
$log->addTag('type', $migrationDocument->getAttribute('source'));
|
||||
if (
|
||||
$migration->getAttribute('source') === SourceAppwrite::getName() ||
|
||||
$migration->getAttribute('destination') === DestinationAppwrite::getName()
|
||||
) {
|
||||
$credentials = $migration->getAttribute('credentials', []);
|
||||
|
||||
$source = $this->processSource($migrationDocument->getAttribute('source'), $migrationDocument->getAttribute('credentials'));
|
||||
$credentials['projectId'] = $credentials['projectId'] ?? $projectDocument->getId();
|
||||
$credentials['endpoint'] = $credentials['endpoint'] ?? 'http://appwrite/v1';
|
||||
$credentials['apiKey'] = $credentials['apiKey'] ?? $tempAPIKey['secret'];
|
||||
|
||||
$migration->setAttribute('credentials', $credentials);
|
||||
}
|
||||
|
||||
$migration->setAttribute('stage', 'processing');
|
||||
$migration->setAttribute('status', 'processing');
|
||||
$this->updateMigrationDocument($migration, $projectDocument, $realtimeConnection);
|
||||
|
||||
$log->addTag('type', $migration->getAttribute('source'));
|
||||
|
||||
$source = $this->processSource($migration);
|
||||
$destination = $this->processDestination($migration);
|
||||
|
||||
$source->report();
|
||||
|
||||
$destination = new DestinationsAppwrite(
|
||||
$projectDocument->getId(),
|
||||
'http://appwrite/v1',
|
||||
$tempAPIKey['secret'],
|
||||
);
|
||||
|
||||
$transfer = new Transfer(
|
||||
$source,
|
||||
$destination
|
||||
);
|
||||
|
||||
/** Start Transfer */
|
||||
$migrationDocument->setAttribute('stage', 'migrating');
|
||||
$log->addBreadcrumb(new Breadcrumb("debug", "migration", "Migration hit stage 'migrating'", \microtime(true)));
|
||||
$this->updateMigrationDocument($migrationDocument, $projectDocument, $realtimeConnection);
|
||||
$transfer->run($migrationDocument->getAttribute('resources'), function () use ($realtimeConnection, $migrationDocument, $transfer, $projectDocument) {
|
||||
$migrationDocument->setAttribute('resourceData', json_encode($transfer->getCache()));
|
||||
$migrationDocument->setAttribute('statusCounters', json_encode($transfer->getStatusCounters()));
|
||||
$migration->setAttribute('stage', 'migrating');
|
||||
$this->updateMigrationDocument($migration, $projectDocument, $realtimeConnection);
|
||||
|
||||
$this->updateMigrationDocument($migrationDocument, $projectDocument, $realtimeConnection);
|
||||
});
|
||||
$transfer->run(
|
||||
$migration->getAttribute('resources'),
|
||||
function () use ($migration, $transfer, $projectDocument) {
|
||||
$migration->setAttribute('resourceData', json_encode($transfer->getCache()));
|
||||
$migration->setAttribute('statusCounters', json_encode($transfer->getStatusCounters()));
|
||||
$this->updateMigrationDocument($migration, $projectDocument, $realtimeConnection);
|
||||
},
|
||||
$migration->getAttribute('resourceId'),
|
||||
$migration->getAttribute('resourceType')
|
||||
);
|
||||
|
||||
$destination->shutDown();
|
||||
$source->shutDown();
|
||||
|
||||
$sourceErrors = $source->getErrors();
|
||||
$destinationErrors = $destination->getErrors();
|
||||
|
||||
if (!empty($sourceErrors) || !empty($destinationErrors)) {
|
||||
$migrationDocument->setAttribute('status', 'failed');
|
||||
$migrationDocument->setAttribute('stage', 'finished');
|
||||
$log->addBreadcrumb(new Breadcrumb("debug", "migration", "Migration hit stage 'finished' and failed", \microtime(true)));
|
||||
if (! empty($sourceErrors) || ! empty($destinationErrors)) {
|
||||
$migration->setAttribute('status', 'failed');
|
||||
$migration->setAttribute('stage', 'finished');
|
||||
|
||||
$errorMessages = [];
|
||||
foreach ($sourceErrors as $error) {
|
||||
/** @var MigrationException $error */
|
||||
$errorMessages[] = "Error occurred while fetching '{$error->getResourceGroup()}:{$error->getResourceId()}' from source with message: '{$error->getMessage()}'";
|
||||
/** @var $sourceErrors $error */
|
||||
$message = "Error occurred while fetching '{$error->getResourceName()}:{$error->getResourceId()}' from source with message: '{$error->getMessage()}'";
|
||||
if ($error->getPrevious()) {
|
||||
$message .= " Message: ".$error->getPrevious()->getMessage() . " File: ".$error->getPrevious()->getFile() . " Line: ".$error->getPrevious()->getLine();
|
||||
}
|
||||
|
||||
$errorMessages[] = $message;
|
||||
}
|
||||
foreach ($destinationErrors as $error) {
|
||||
$message = "Error occurred while pushing '{$error->getResourceName()}:{$error->getResourceId()}' to destination with message: '{$error->getMessage()}'";
|
||||
|
||||
if ($error->getPrevious()) {
|
||||
$message .= " Message: ".$error->getPrevious()->getMessage() . " File: ".$error->getPrevious()->getFile() . " Line: ".$error->getPrevious()->getLine();
|
||||
}
|
||||
|
||||
/** @var MigrationException $error */
|
||||
$errorMessages[] = "Error occurred while pushing '{$error->getResourceGroup()}:{$error->getResourceId()}' to destination with message: '{$error->getMessage()}'";
|
||||
$errorMessages[] = $message;
|
||||
}
|
||||
|
||||
$migrationDocument->setAttribute('errors', $errorMessages);
|
||||
$migration->setAttribute('errors', $errorMessages);
|
||||
$log->addExtra('migrationErrors', json_encode($errorMessages));
|
||||
$this->updateMigrationDocument($migrationDocument, $projectDocument, $realtimeConnection);
|
||||
$this->updateMigrationDocument($migration, $projectDocument, $realtimeConnection);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$migrationDocument->setAttribute('status', 'completed');
|
||||
$migrationDocument->setAttribute('stage', 'finished');
|
||||
$log->addBreadcrumb(new Breadcrumb("debug", "migration", "Migration hit stage 'finished' and succeeded", \microtime(true)));
|
||||
$migration->setAttribute('status', 'completed');
|
||||
$migration->setAttribute('stage', 'finished');
|
||||
} catch (\Throwable $th) {
|
||||
Console::error($th->getMessage());
|
||||
Console::error($th->getTraceAsString());
|
||||
|
||||
if ($migrationDocument) {
|
||||
Console::error($th->getMessage());
|
||||
Console::error($th->getTraceAsString());
|
||||
$migrationDocument->setAttribute('status', 'failed');
|
||||
$migrationDocument->setAttribute('stage', 'finished');
|
||||
$migrationDocument->setAttribute('errors', [$th->getMessage()]);
|
||||
if (! $migration->isEmpty()) {
|
||||
$migration->setAttribute('status', 'failed');
|
||||
$migration->setAttribute('stage', 'finished');
|
||||
$migration->setAttribute('errors', [$th->getMessage()]);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
@ -346,26 +387,30 @@ class Migrations extends Action
|
|||
$errorMessages = [];
|
||||
foreach ($sourceErrors as $error) {
|
||||
/** @var MigrationException $error */
|
||||
$errorMessages[] = "Error occurred while fetching '{$error->getResourceGroup()}:{$error->getResourceId()}' from source with message '{$error->getMessage()}'";
|
||||
$errorMessages[] = "Error occurred while fetching '{$error->getResourceName()}:{$error->getResourceId()}' from source with message '{$error->getMessage()}'";
|
||||
}
|
||||
foreach ($destinationErrors as $error) {
|
||||
/** @var MigrationException $error */
|
||||
$errorMessages[] = "Error occurred while pushing '{$error->getResourceGroup()}:{$error->getResourceId()}' to destination with message '{$error->getMessage()}'";
|
||||
$errorMessages[] = "Error occurred while pushing '{$error->getResourceName()}:{$error->getResourceId()}' to destination with message '{$error->getMessage()}'";
|
||||
}
|
||||
|
||||
$migrationDocument->setAttribute('errors', $errorMessages);
|
||||
$migration->setAttribute('errors', $errorMessages);
|
||||
$log->addTag('migrationErrors', json_encode($errorMessages));
|
||||
}
|
||||
} finally {
|
||||
if ($tempAPIKey) {
|
||||
if (! $tempAPIKey->isEmpty()) {
|
||||
$this->removeAPIKey($tempAPIKey);
|
||||
}
|
||||
if ($migrationDocument) {
|
||||
$this->updateMigrationDocument($migrationDocument, $projectDocument, $realtimeConnection);
|
||||
|
||||
if ($migrationDocument->getAttribute('status', '') == 'failed') {
|
||||
throw new Exception("Migration failed");
|
||||
}
|
||||
$this->updateMigrationDocument($migration, $projectDocument, $realtimeConnection);
|
||||
|
||||
if ($migration->getAttribute('status', '') === 'failed') {
|
||||
Console::error('Migration('.$migration->getInternalId().':'.$migration->getId().') failed, Project('.$this->project->getInternalId().':'.$this->project->getId().')');
|
||||
|
||||
$destination->error();
|
||||
$source->error();
|
||||
|
||||
throw new Exception('Migration failed');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -163,7 +163,6 @@ class UsageDump extends Action
|
|||
$id = \md5("{$time}_{$period}_{$key}");
|
||||
|
||||
$value = 0;
|
||||
$diskValue = 0;
|
||||
$previousValue = 0;
|
||||
try {
|
||||
$previousValue = ($dbForProject->getDocument('stats', $id))->getAttribute('value', 0);
|
||||
|
|
@ -179,8 +178,7 @@ class UsageDump extends Action
|
|||
$collectionInternalId = $data[1];
|
||||
|
||||
try {
|
||||
$value = $dbForProject->getSizeOfCollection('database_'.$databaseInternalId.'_collection_'.$collectionInternalId);
|
||||
$diskValue = $dbForProject->getSizeOfCollectionOnDisk('database_'.$databaseInternalId.'_collection_'.$collectionInternalId);
|
||||
$value = $dbForProject->getSizeOfCollection('database_' . $databaseInternalId . '_collection_' . $collectionInternalId);
|
||||
} catch (\Exception $e) {
|
||||
// Collection not found
|
||||
if ($e->getMessage() !== 'Collection not found') {
|
||||
|
|
@ -190,25 +188,21 @@ class UsageDump extends Action
|
|||
|
||||
// Compare with previous value
|
||||
$diff = $value - $previousValue;
|
||||
$diskDiff = $diskValue - $previousValue;
|
||||
|
||||
if ($diff === 0 && $diskDiff === 0) {
|
||||
if ($diff === 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Update Collection
|
||||
$updateMetric($dbForProject, $diff, $key, $period, $time);
|
||||
$updateMetric($dbForProject, $diskDiff, $key . '_disk', $period, $time);
|
||||
|
||||
// Update Database
|
||||
$databaseKey = str_replace(['{databaseInternalId}'], [$data[0]], METRIC_DATABASE_ID_STORAGE);
|
||||
$updateMetric($dbForProject, $diff, $databaseKey, $period, $time);
|
||||
$updateMetric($dbForProject, $diskDiff, $databaseKey . '_disk', $period, $time);
|
||||
|
||||
// Update Project
|
||||
$projectKey = METRIC_DATABASES_STORAGE;
|
||||
$updateMetric($dbForProject, $diff, $projectKey, $period, $time);
|
||||
$updateMetric($dbForProject, $diskDiff, $projectKey . '_disk', $period, $time);
|
||||
break;
|
||||
// Database Level
|
||||
case METRIC_DATABASE_LEVEL_STORAGE:
|
||||
|
|
@ -227,8 +221,7 @@ class UsageDump extends Action
|
|||
|
||||
foreach ($collections as $collection) {
|
||||
try {
|
||||
$value += $dbForProject->getSizeOfCollection('database_'.$databaseInternalId.'_collection_'.$collection->getInternalId());
|
||||
$diskValue += $dbForProject->getSizeOfCollectionOnDisk('database_'.$databaseInternalId.'_collection_'.$collection->getInternalId());
|
||||
$value += $dbForProject->getSizeOfCollection('database_' . $databaseInternalId . '_collection_' . $collection->getInternalId());
|
||||
} catch (\Exception $e) {
|
||||
// Collection not found
|
||||
if ($e->getMessage() !== 'Collection not found') {
|
||||
|
|
@ -238,21 +231,18 @@ class UsageDump extends Action
|
|||
}
|
||||
|
||||
$diff = $value - $previousValue;
|
||||
$diskDiff = $diskValue - $previousValue;
|
||||
|
||||
if ($diff === 0 && $diskDiff === 0) {
|
||||
if ($diff === 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Update Database
|
||||
$databaseKey = str_replace(['{databaseInternalId}'], [$data[0]], METRIC_DATABASE_ID_STORAGE);
|
||||
$updateMetric($dbForProject, $diff, $databaseKey, $period, $time);
|
||||
$updateMetric($dbForProject, $diskDiff, $databaseKey . '_disk', $period, $time);
|
||||
|
||||
// Update Project
|
||||
$projectKey = METRIC_DATABASES_STORAGE;
|
||||
$updateMetric($dbForProject, $diff, $projectKey, $period, $time);
|
||||
$updateMetric($dbForProject, $diskDiff, $projectKey . '_disk', $period, $time);
|
||||
break;
|
||||
// Project Level
|
||||
case METRIC_PROJECT_LEVEL_STORAGE:
|
||||
|
|
@ -266,8 +256,7 @@ class UsageDump extends Action
|
|||
|
||||
foreach ($collections as $collection) {
|
||||
try {
|
||||
$value += $dbForProject->getSizeOfCollection('database_'.$database->getInternalId().'_collection_'.$collection->getInternalId());
|
||||
$diskValue += $dbForProject->getSizeOfCollectionOnDisk('database_'.$database->getInternalId().'_collection_'.$collection->getInternalId());
|
||||
$value += $dbForProject->getSizeOfCollection('database_' . $database->getInternalId() . '_collection_' . $collection->getInternalId());
|
||||
} catch (\Exception $e) {
|
||||
// Collection not found
|
||||
if ($e->getMessage() !== 'Collection not found') {
|
||||
|
|
@ -278,12 +267,10 @@ class UsageDump extends Action
|
|||
}
|
||||
|
||||
$diff = $value - $previousValue;
|
||||
$diskDiff = $diskValue - $previousValue;
|
||||
|
||||
// Update Project
|
||||
$projectKey = METRIC_DATABASES_STORAGE;
|
||||
$updateMetric($dbForProject, $diff, $projectKey, $period, $time);
|
||||
$updateMetric($dbForProject, $diskDiff, $projectKey . '_disk', $period, $time);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -549,6 +549,7 @@ class OpenAPI3 extends Format
|
|||
switch ($rule['type']) {
|
||||
case 'string':
|
||||
case 'datetime':
|
||||
case 'payload':
|
||||
$type = 'string';
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -286,13 +286,26 @@ class Swagger2 extends Format
|
|||
$validator = $validator->getValidator();
|
||||
}
|
||||
|
||||
$validatorClass = (!empty($validator)) ? \get_class($validator) : '';
|
||||
if ($validatorClass === 'Utopia\Validator\AnyOf') {
|
||||
$validator = $param['validator']->getValidators()[0];
|
||||
$validatorClass = \get_class($validator);
|
||||
$class = !empty($validator)
|
||||
? \get_class($validator)
|
||||
: '';
|
||||
|
||||
$base = !empty($class)
|
||||
? \get_parent_class($class)
|
||||
: '';
|
||||
|
||||
switch ($base) {
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Base':
|
||||
$class = $base;
|
||||
break;
|
||||
}
|
||||
|
||||
switch ($validatorClass) {
|
||||
if ($class === 'Utopia\Validator\AnyOf') {
|
||||
$validator = $param['validator']->getValidators()[0];
|
||||
$class = \get_class($validator);
|
||||
}
|
||||
|
||||
switch ($class) {
|
||||
case 'Utopia\Validator\Text':
|
||||
case 'Utopia\Database\Validator\UID':
|
||||
$node['type'] = $validator->getType();
|
||||
|
|
@ -348,29 +361,7 @@ class Swagger2 extends Format
|
|||
$consumes = ['multipart/form-data'];
|
||||
$node['type'] = 'payload';
|
||||
break;
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Attributes':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Buckets':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Collections':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Databases':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Deployments':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Executions':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Files':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Functions':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Identities':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Indexes':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Installations':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Memberships':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Messages':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Migrations':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Projects':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Providers':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Rules':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Subscribers':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Targets':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Teams':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Topics':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Users':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Variables':
|
||||
case 'Appwrite\Utopia\Database\Validator\Queries\Base':
|
||||
case 'Utopia\Database\Validator\Queries':
|
||||
case 'Utopia\Database\Validator\Queries\Document':
|
||||
case 'Utopia\Database\Validator\Queries\Documents':
|
||||
|
|
@ -585,6 +576,10 @@ class Swagger2 extends Format
|
|||
$type = 'boolean';
|
||||
break;
|
||||
|
||||
case 'payload':
|
||||
$type = 'payload';
|
||||
break;
|
||||
|
||||
default:
|
||||
$type = 'object';
|
||||
$rule['type'] = ($rule['type']) ?: 'none';
|
||||
|
|
|
|||
|
|
@ -122,7 +122,11 @@ class Request extends UtopiaRequest
|
|||
*/
|
||||
public function getHeaders(): array
|
||||
{
|
||||
$headers = $this->generateHeaders();
|
||||
try {
|
||||
$headers = $this->generateHeaders();
|
||||
} catch (\Throwable) {
|
||||
$headers = [];
|
||||
}
|
||||
|
||||
if (empty($this->swoole->cookie)) {
|
||||
return $headers;
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ abstract class Model
|
|||
public const TYPE_DATETIME = 'datetime';
|
||||
public const TYPE_DATETIME_EXAMPLE = '2020-10-15T06:38:00.000+00:00';
|
||||
public const TYPE_RELATIONSHIP = 'relationship';
|
||||
public const TYPE_PAYLOAD = 'payload';
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
|
|
|
|||
|
|
@ -47,7 +47,18 @@ class Attribute extends Model
|
|||
'required' => false,
|
||||
'example' => false,
|
||||
])
|
||||
;
|
||||
->addRule('$createdAt', [
|
||||
'type' => self::TYPE_DATETIME,
|
||||
'description' => 'Attribute creation date in ISO 8601 format.',
|
||||
'default' => '',
|
||||
'example' => self::TYPE_DATETIME_EXAMPLE,
|
||||
])
|
||||
->addRule('$updatedAt', [
|
||||
'type' => self::TYPE_DATETIME,
|
||||
'description' => 'Attribute update date in ISO 8601 format.',
|
||||
'default' => '',
|
||||
'example' => self::TYPE_DATETIME_EXAMPLE,
|
||||
]);
|
||||
}
|
||||
|
||||
public array $conditions = [];
|
||||
|
|
|
|||
|
|
@ -81,10 +81,9 @@ class Execution extends Model
|
|||
'example' => 200,
|
||||
])
|
||||
->addRule('responseBody', [
|
||||
'type' => self::TYPE_STRING,
|
||||
'type' => self::TYPE_PAYLOAD,
|
||||
'description' => 'HTTP response body. This will return empty unless execution is created as synchronous.',
|
||||
'default' => '',
|
||||
'example' => 'Developers are awesome.',
|
||||
])
|
||||
->addRule('responseHeaders', [
|
||||
'type' => Response::MODEL_HEADERS,
|
||||
|
|
|
|||
|
|
@ -49,13 +49,22 @@ class Index extends Model
|
|||
'array' => true,
|
||||
'required' => false,
|
||||
])
|
||||
;
|
||||
->addRule('$createdAt', [
|
||||
'type' => self::TYPE_DATETIME,
|
||||
'description' => 'Index creation date in ISO 8601 format.',
|
||||
'default' => '',
|
||||
'example' => self::TYPE_DATETIME_EXAMPLE,
|
||||
])
|
||||
->addRule('$updatedAt', [
|
||||
'type' => self::TYPE_DATETIME,
|
||||
'description' => 'Index update date in ISO 8601 format.',
|
||||
'default' => '',
|
||||
'example' => self::TYPE_DATETIME_EXAMPLE,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName(): string
|
||||
{
|
||||
|
|
@ -64,8 +73,6 @@ class Index extends Model
|
|||
|
||||
/**
|
||||
* Get Collection
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getType(): string
|
||||
{
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ class HTTPTest extends Scope
|
|||
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
// looks like recent change in the validator
|
||||
$this->assertTrue(empty($response['body']['schemaValidationMessages']));
|
||||
$this->assertEmpty($response['body']['schemaValidationMessages'], 'Schema validation failed for ' . $file . ': ' . json_encode($response['body']['schemaValidationMessages'], JSON_PRETTY_PRINT));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -883,9 +883,6 @@ class UsageTest extends Scope
|
|||
$this->assertEquals(201, $response['headers']['status-code']);
|
||||
$this->assertNotEmpty($response['body']['$id']);
|
||||
|
||||
$code = realpath(__DIR__ . '/../../resources/functions') . "/php/code.tar.gz";
|
||||
$this->packageCode('php');
|
||||
|
||||
$response = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/functions/' . $functionId . '/deployments',
|
||||
|
|
@ -895,8 +892,8 @@ class UsageTest extends Scope
|
|||
], $this->getHeaders()),
|
||||
[
|
||||
'entrypoint' => 'index.php',
|
||||
'code' => new CURLFile($code, 'application/x-gzip', \basename($code)),
|
||||
'activate' => true
|
||||
'code' => $this->packageFunction('php'),
|
||||
'activate' => true,
|
||||
]
|
||||
);
|
||||
|
||||
|
|
@ -934,7 +931,7 @@ class UsageTest extends Scope
|
|||
'x-appwrite-project' => $this->getProject()['$id']
|
||||
], $this->getHeaders()),
|
||||
[
|
||||
'async' => false,
|
||||
'async' => 'false',
|
||||
]
|
||||
);
|
||||
|
||||
|
|
@ -958,7 +955,7 @@ class UsageTest extends Scope
|
|||
'x-appwrite-project' => $this->getProject()['$id']
|
||||
], $this->getHeaders()),
|
||||
[
|
||||
'async' => false,
|
||||
'async' => 'false',
|
||||
]
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,234 +2,207 @@
|
|||
|
||||
namespace Tests\E2E\Services\Functions;
|
||||
|
||||
use Appwrite\Tests\Async;
|
||||
use CURLFile;
|
||||
use Tests\E2E\Client;
|
||||
use Utopia\CLI\Console;
|
||||
|
||||
trait FunctionsBase
|
||||
{
|
||||
use Async;
|
||||
|
||||
protected string $stdout = '';
|
||||
protected string $stderr = '';
|
||||
|
||||
protected function packageCode($folder)
|
||||
protected function setupFunction(mixed $params): string
|
||||
{
|
||||
Console::execute('cd ' . realpath(__DIR__ . "/../../../resources/functions") . "/$folder && tar --exclude code.tar.gz -czf code.tar.gz .", '', $this->stdout, $this->stderr);
|
||||
$function = $this->client->call(Client::METHOD_POST, '/functions', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey'],
|
||||
]), $params);
|
||||
|
||||
$this->assertEquals($function['headers']['status-code'], 201, 'Setup function failed with status code: ' . $function['headers']['status-code'] . ' and response: ' . json_encode($function['body'], JSON_PRETTY_PRINT));
|
||||
|
||||
$functionId = $function['body']['$id'];
|
||||
|
||||
return $functionId;
|
||||
}
|
||||
|
||||
protected function awaitDeploymentIsBuilt($functionId, $deploymentId, $checkForSuccess = true): void
|
||||
protected function setupDeployment(string $functionId, mixed $params): string
|
||||
{
|
||||
while (true) {
|
||||
$deployment = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/deployments/' . $deploymentId, [
|
||||
$deployment = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/deployments', array_merge([
|
||||
'content-type' => 'multipart/form-data',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey'],
|
||||
]), $params);
|
||||
$this->assertEquals($deployment['headers']['status-code'], 202, 'Setup deployment failed with status code: ' . $deployment['headers']['status-code'] . ' and response: ' . json_encode($deployment['body'], JSON_PRETTY_PRINT));
|
||||
$deploymentId = $deployment['body']['$id'] ?? '';
|
||||
|
||||
$this->assertEventually(function () use ($functionId, $deploymentId) {
|
||||
$deployment = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/deployments/' . $deploymentId, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey'],
|
||||
]);
|
||||
]));
|
||||
$this->assertEquals('ready', $deployment['body']['status'], 'Deployment status is not ready, deployment: ' . json_encode($deployment['body'], JSON_PRETTY_PRINT));
|
||||
}, 50000, 500);
|
||||
|
||||
if (
|
||||
$deployment['headers']['status-code'] >= 400
|
||||
|| \in_array($deployment['body']['status'], ['ready', 'failed'])
|
||||
) {
|
||||
break;
|
||||
}
|
||||
|
||||
\sleep(1);
|
||||
}
|
||||
|
||||
if ($checkForSuccess) {
|
||||
$this->assertEquals(200, $deployment['headers']['status-code']);
|
||||
$this->assertEquals('ready', $deployment['body']['status'], \json_encode($deployment['body']));
|
||||
}
|
||||
return $deploymentId;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @depends testCreateTeam
|
||||
// */
|
||||
// public function testGetTeam($data):array
|
||||
// {
|
||||
// $id = $data['teamUid'] ?? '';
|
||||
protected function cleanupFunction(string $functionId): void
|
||||
{
|
||||
$function = $this->client->call(Client::METHOD_DELETE, '/functions/' . $functionId, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey'],
|
||||
]));
|
||||
|
||||
// /**
|
||||
// * Test for SUCCESS
|
||||
// */
|
||||
// $response = $this->client->call(Client::METHOD_GET, '/teams/'.$id, array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id'],
|
||||
// ], $this->getHeaders()));
|
||||
$this->assertEquals($function['headers']['status-code'], 204);
|
||||
}
|
||||
|
||||
// $this->assertEquals(200, $response['headers']['status-code']);
|
||||
// $this->assertNotEmpty($response['body']['$id']);
|
||||
// $this->assertEquals('Arsenal', $response['body']['name']);
|
||||
// $this->assertGreaterThan(-1, $response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['dateCreated']);
|
||||
protected function createFunction(mixed $params): mixed
|
||||
{
|
||||
$function = $this->client->call(Client::METHOD_POST, '/functions', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), $params);
|
||||
|
||||
// /**
|
||||
// * Test for FAILURE
|
||||
// */
|
||||
return $function;
|
||||
}
|
||||
|
||||
// return [];
|
||||
// }
|
||||
protected function createVariable(string $functionId, mixed $params): mixed
|
||||
{
|
||||
$variable = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/variables', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), $params);
|
||||
|
||||
// /**
|
||||
// * @depends testCreateTeam
|
||||
// */
|
||||
// public function testListTeams($data):array
|
||||
// {
|
||||
// /**
|
||||
// * Test for SUCCESS
|
||||
// */
|
||||
// $response = $this->client->call(Client::METHOD_GET, '/teams', array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id'],
|
||||
// ], $this->getHeaders()));
|
||||
return $variable;
|
||||
}
|
||||
|
||||
// $this->assertEquals(200, $response['headers']['status-code']);
|
||||
// $this->assertGreaterThan(0, $response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['total']);
|
||||
// $this->assertCount(3, $response['body']['teams']);
|
||||
protected function getFunction(string $functionId): mixed
|
||||
{
|
||||
$function = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()));
|
||||
|
||||
// $response = $this->client->call(Client::METHOD_GET, '/teams', array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id'],
|
||||
// ], $this->getHeaders()), [
|
||||
// 'limit' => 2,
|
||||
// ]);
|
||||
return $function;
|
||||
}
|
||||
|
||||
// $this->assertEquals(200, $response['headers']['status-code']);
|
||||
// $this->assertGreaterThan(0, $response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['total']);
|
||||
// $this->assertCount(2, $response['body']['teams']);
|
||||
protected function getDeployment(string $functionId, string $deploymentId): mixed
|
||||
{
|
||||
$deployment = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/deployments/' . $deploymentId, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()));
|
||||
|
||||
// $response = $this->client->call(Client::METHOD_GET, '/teams', array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id'],
|
||||
// ], $this->getHeaders()), [
|
||||
// 'offset' => 1,
|
||||
// ]);
|
||||
return $deployment;
|
||||
}
|
||||
|
||||
// $this->assertEquals(200, $response['headers']['status-code']);
|
||||
// $this->assertGreaterThan(0, $response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['total']);
|
||||
// $this->assertCount(2, $response['body']['teams']);
|
||||
protected function getExecution(string $functionId, $executionId): mixed
|
||||
{
|
||||
$execution = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/executions/' . $executionId, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()));
|
||||
|
||||
// $response = $this->client->call(Client::METHOD_GET, '/teams', array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id'],
|
||||
// ], $this->getHeaders()), [
|
||||
// 'search' => 'Manchester',
|
||||
// ]);
|
||||
return $execution;
|
||||
}
|
||||
|
||||
// $this->assertEquals(200, $response['headers']['status-code']);
|
||||
// $this->assertGreaterThan(0, $response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['total']);
|
||||
// $this->assertCount(1, $response['body']['teams']);
|
||||
// $this->assertEquals('Manchester United', $response['body']['teams'][0]['name']);
|
||||
protected function listFunctions(mixed $params = []): mixed
|
||||
{
|
||||
$functions = $this->client->call(Client::METHOD_GET, '/functions', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), $params);
|
||||
|
||||
// $response = $this->client->call(Client::METHOD_GET, '/teams', array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id'],
|
||||
// ], $this->getHeaders()), [
|
||||
// 'search' => 'United',
|
||||
// ]);
|
||||
return $functions;
|
||||
}
|
||||
|
||||
// $this->assertEquals(200, $response['headers']['status-code']);
|
||||
// $this->assertGreaterThan(0, $response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['total']);
|
||||
// $this->assertCount(1, $response['body']['teams']);
|
||||
// $this->assertEquals('Manchester United', $response['body']['teams'][0]['name']);
|
||||
protected function listDeployments(string $functionId, $params = []): mixed
|
||||
{
|
||||
$deployments = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/deployments', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), $params);
|
||||
|
||||
// /**
|
||||
// * Test for FAILURE
|
||||
// */
|
||||
return $deployments;
|
||||
}
|
||||
|
||||
// return [];
|
||||
// }
|
||||
protected function listExecutions(string $functionId, mixed $params = []): mixed
|
||||
{
|
||||
$executions = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/executions', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), $params);
|
||||
|
||||
// public function testUpdateTeam():array
|
||||
// {
|
||||
// /**
|
||||
// * Test for SUCCESS
|
||||
// */
|
||||
// $response = $this->client->call(Client::METHOD_POST, '/teams', array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id'],
|
||||
// ], $this->getHeaders()), [
|
||||
// 'name' => 'Demo'
|
||||
// ]);
|
||||
return $executions;
|
||||
}
|
||||
|
||||
// $this->assertEquals(201, $response['headers']['status-code']);
|
||||
// $this->assertNotEmpty($response['body']['$id']);
|
||||
// $this->assertEquals('Demo', $response['body']['name']);
|
||||
// $this->assertGreaterThan(-1, $response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['dateCreated']);
|
||||
protected function packageFunction(string $function): CURLFile
|
||||
{
|
||||
$folderPath = realpath(__DIR__ . '/../../../resources/functions') . "/$function";
|
||||
$tarPath = "$folderPath/code.tar.gz";
|
||||
|
||||
// $response = $this->client->call(Client::METHOD_PUT, '/teams/'.$response['body']['$id'], array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id'],
|
||||
// ], $this->getHeaders()), [
|
||||
// 'name' => 'Demo New'
|
||||
// ]);
|
||||
Console::execute("cd $folderPath && tar --exclude code.tar.gz -czf code.tar.gz .", '', $this->stdout, $this->stderr);
|
||||
|
||||
// $this->assertEquals(200, $response['headers']['status-code']);
|
||||
// $this->assertNotEmpty($response['body']['$id']);
|
||||
// $this->assertEquals('Demo New', $response['body']['name']);
|
||||
// $this->assertGreaterThan(-1, $response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['dateCreated']);
|
||||
if (filesize($tarPath) > 1024 * 1024 * 5) {
|
||||
throw new \Exception('Code package is too large. Use the chunked upload method instead.');
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Test for FAILURE
|
||||
// */
|
||||
// $response = $this->client->call(Client::METHOD_PUT, '/teams/'.$response['body']['$id'], array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id'],
|
||||
// ], $this->getHeaders()), [
|
||||
// ]);
|
||||
return new CURLFile($tarPath, 'application/x-gzip', \basename($tarPath));
|
||||
}
|
||||
|
||||
// $this->assertEquals(400, $response['headers']['status-code']);
|
||||
protected function createDeployment(string $functionId, mixed $params = []): mixed
|
||||
{
|
||||
$deployment = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/deployments', array_merge([
|
||||
'content-type' => 'multipart/form-data',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), $params);
|
||||
|
||||
// return [];
|
||||
// }
|
||||
return $deployment;
|
||||
}
|
||||
|
||||
// public function testDeleteTeam():array
|
||||
// {
|
||||
// /**
|
||||
// * Test for SUCCESS
|
||||
// */
|
||||
// $response = $this->client->call(Client::METHOD_POST, '/teams', array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id'],
|
||||
// ], $this->getHeaders()), [
|
||||
// 'name' => 'Demo'
|
||||
// ]);
|
||||
protected function getFunctionUsage(string $functionId, mixed $params): mixed
|
||||
{
|
||||
$usage = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/usage', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), $params);
|
||||
|
||||
// $teamUid = $response['body']['$id'];
|
||||
return $usage;
|
||||
}
|
||||
|
||||
// $this->assertEquals(201, $response['headers']['status-code']);
|
||||
// $this->assertNotEmpty($response['body']['$id']);
|
||||
// $this->assertEquals('Demo', $response['body']['name']);
|
||||
// $this->assertGreaterThan(-1, $response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['total']);
|
||||
// $this->assertIsInt($response['body']['dateCreated']);
|
||||
protected function getTemplate(string $templateId)
|
||||
{
|
||||
$template = $this->client->call(Client::METHOD_GET, '/functions/templates/' . $templateId, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()));
|
||||
|
||||
// $response = $this->client->call(Client::METHOD_DELETE, '/teams/'.$teamUid, array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id'],
|
||||
// ], $this->getHeaders()));
|
||||
return $template;
|
||||
}
|
||||
|
||||
// $this->assertEquals(204, $response['headers']['status-code']);
|
||||
// $this->assertEmpty($response['body']);
|
||||
protected function createExecution(string $functionId, mixed $params = []): mixed
|
||||
{
|
||||
$execution = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/executions', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), $params);
|
||||
|
||||
// /**
|
||||
// * Test for FAILURE
|
||||
// */
|
||||
// $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid, array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id'],
|
||||
// ], $this->getHeaders()));
|
||||
return $execution;
|
||||
}
|
||||
|
||||
// $this->assertEquals(404, $response['headers']['status-code']);
|
||||
protected function deleteFunction(string $functionId): mixed
|
||||
{
|
||||
$function = $this->client->call(Client::METHOD_DELETE, '/functions/' . $functionId, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()));
|
||||
|
||||
// return [];
|
||||
// }
|
||||
return $function;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,13 +13,11 @@ class FunctionsConsoleClientTest extends Scope
|
|||
{
|
||||
use ProjectCustom;
|
||||
use SideConsole;
|
||||
use FunctionsBase;
|
||||
|
||||
public function testCreateFunction(): array
|
||||
{
|
||||
$function = $this->client->call(Client::METHOD_POST, '/functions', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
$function = $this->createFunction([
|
||||
'functionId' => ID::unique(),
|
||||
'name' => 'Test',
|
||||
'execute' => [Role::user($this->getUser()['$id'])->toString()],
|
||||
|
|
@ -35,10 +33,9 @@ class FunctionsConsoleClientTest extends Scope
|
|||
|
||||
$this->assertEquals(201, $function['headers']['status-code']);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_POST, '/functions', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
$functionId = $function['body']['$id'];
|
||||
|
||||
$function2 = $this->createFunction([
|
||||
'functionId' => ID::unique(),
|
||||
'name' => 'Test Failure',
|
||||
'execute' => ['some-random-string'],
|
||||
|
|
@ -46,73 +43,59 @@ class FunctionsConsoleClientTest extends Scope
|
|||
'entrypoint' => 'index.php',
|
||||
]);
|
||||
|
||||
$this->assertEquals(400, $response['headers']['status-code']);
|
||||
$this->assertEquals(400, $function2['headers']['status-code']);
|
||||
|
||||
return [
|
||||
'functionId' => $function['body']['$id']
|
||||
'functionId' => $functionId,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testCreateFunction
|
||||
*/
|
||||
public function testGetCollectionUsage(array $data)
|
||||
public function testFunctionUsage(array $data)
|
||||
{
|
||||
/**
|
||||
* Test for FAILURE
|
||||
*/
|
||||
|
||||
$response = $this->client->call(Client::METHOD_GET, '/functions/' . $data['functionId'] . '/usage', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id']
|
||||
], $this->getHeaders()), [
|
||||
'range' => '232h'
|
||||
]);
|
||||
|
||||
$this->assertEquals(400, $response['headers']['status-code']);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_GET, '/functions/randomFunctionId/usage', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id']
|
||||
], $this->getHeaders()), [
|
||||
'range' => '24h'
|
||||
]);
|
||||
|
||||
$this->assertEquals(404, $response['headers']['status-code']);
|
||||
|
||||
/**
|
||||
* Test for SUCCESS
|
||||
*/
|
||||
|
||||
$response = $this->client->call(Client::METHOD_GET, '/functions/' . $data['functionId'] . '/usage', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id']
|
||||
], $this->getHeaders()), [
|
||||
$usage = $this->getFunctionUsage($data['functionId'], [
|
||||
'range' => '24h'
|
||||
]);
|
||||
$this->assertEquals(200, $usage['headers']['status-code']);
|
||||
$this->assertEquals(19, count($usage['body']));
|
||||
$this->assertEquals('24h', $usage['body']['range']);
|
||||
$this->assertIsNumeric($usage['body']['deploymentsTotal']);
|
||||
$this->assertIsNumeric($usage['body']['deploymentsStorageTotal']);
|
||||
$this->assertIsNumeric($usage['body']['buildsTotal']);
|
||||
$this->assertIsNumeric($usage['body']['buildsStorageTotal']);
|
||||
$this->assertIsNumeric($usage['body']['buildsTimeTotal']);
|
||||
$this->assertIsNumeric($usage['body']['buildsMbSecondsTotal']);
|
||||
$this->assertIsNumeric($usage['body']['executionsTotal']);
|
||||
$this->assertIsNumeric($usage['body']['executionsTimeTotal']);
|
||||
$this->assertIsNumeric($usage['body']['executionsMbSecondsTotal']);
|
||||
$this->assertIsArray($usage['body']['deployments']);
|
||||
$this->assertIsArray($usage['body']['deploymentsStorage']);
|
||||
$this->assertIsArray($usage['body']['builds']);
|
||||
$this->assertIsArray($usage['body']['buildsTime']);
|
||||
$this->assertIsArray($usage['body']['buildsStorage']);
|
||||
$this->assertIsArray($usage['body']['buildsTime']);
|
||||
$this->assertIsArray($usage['body']['buildsMbSeconds']);
|
||||
$this->assertIsArray($usage['body']['executions']);
|
||||
$this->assertIsArray($usage['body']['executionsTime']);
|
||||
$this->assertIsArray($usage['body']['executionsMbSeconds']);
|
||||
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertEquals(19, count($response['body']));
|
||||
$this->assertEquals('24h', $response['body']['range']);
|
||||
$this->assertIsNumeric($response['body']['deploymentsTotal']);
|
||||
$this->assertIsNumeric($response['body']['deploymentsStorageTotal']);
|
||||
$this->assertIsNumeric($response['body']['buildsTotal']);
|
||||
$this->assertIsNumeric($response['body']['buildsStorageTotal']);
|
||||
$this->assertIsNumeric($response['body']['buildsTimeTotal']);
|
||||
$this->assertIsNumeric($response['body']['buildsMbSecondsTotal']);
|
||||
$this->assertIsNumeric($response['body']['executionsTotal']);
|
||||
$this->assertIsNumeric($response['body']['executionsTimeTotal']);
|
||||
$this->assertIsNumeric($response['body']['executionsMbSecondsTotal']);
|
||||
$this->assertIsArray($response['body']['deployments']);
|
||||
$this->assertIsArray($response['body']['deploymentsStorage']);
|
||||
$this->assertIsArray($response['body']['builds']);
|
||||
$this->assertIsArray($response['body']['buildsTime']);
|
||||
$this->assertIsArray($response['body']['buildsStorage']);
|
||||
$this->assertIsArray($response['body']['buildsTime']);
|
||||
$this->assertIsArray($response['body']['buildsMbSeconds']);
|
||||
$this->assertIsArray($response['body']['executions']);
|
||||
$this->assertIsArray($response['body']['executionsTime']);
|
||||
$this->assertIsArray($response['body']['executionsMbSeconds']);
|
||||
/**
|
||||
* Test for FAILURE
|
||||
*/
|
||||
$usage = $this->getFunctionUsage($data['functionId'], [
|
||||
'range' => '232h'
|
||||
]);
|
||||
$this->assertEquals(400, $usage['headers']['status-code']);
|
||||
|
||||
$usage = $this->getFunctionUsage('randomFunctionId', [
|
||||
'range' => '24h'
|
||||
]);
|
||||
$this->assertEquals(404, $usage['headers']['status-code']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -123,31 +106,53 @@ class FunctionsConsoleClientTest extends Scope
|
|||
/**
|
||||
* Test for SUCCESS
|
||||
*/
|
||||
$variable = $this->createVariable(
|
||||
$data['functionId'],
|
||||
[
|
||||
'key' => 'APP_TEST',
|
||||
'value' => 'TESTINGVALUE'
|
||||
]
|
||||
);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_POST, '/functions/' . $data['functionId'] . '/variables', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'key' => 'APP_TEST',
|
||||
'value' => 'TESTINGVALUE'
|
||||
]);
|
||||
$this->assertEquals(201, $variable['headers']['status-code']);
|
||||
|
||||
$this->assertEquals(201, $response['headers']['status-code']);
|
||||
$variableId = $response['body']['$id'];
|
||||
$variableId = $variable['body']['$id'];
|
||||
|
||||
/**
|
||||
* Test for FAILURE
|
||||
*/
|
||||
// Test for duplicate key
|
||||
$variable = $this->createVariable(
|
||||
$data['functionId'],
|
||||
[
|
||||
'key' => 'APP_TEST',
|
||||
'value' => 'ANOTHERTESTINGVALUE'
|
||||
]
|
||||
);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_POST, '/functions/' . $data['functionId'] . '/variables', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'key' => 'APP_TEST',
|
||||
'value' => 'ANOTHER_TESTINGVALUE'
|
||||
]);
|
||||
$this->assertEquals(409, $variable['headers']['status-code']);
|
||||
|
||||
$this->assertEquals(409, $response['headers']['status-code']);
|
||||
// Test for invalid key
|
||||
$variable = $this->createVariable(
|
||||
$data['functionId'],
|
||||
[
|
||||
'key' => str_repeat("A", 256),
|
||||
'value' => 'TESTINGVALUE'
|
||||
]
|
||||
);
|
||||
|
||||
$this->assertEquals(400, $variable['headers']['status-code']);
|
||||
|
||||
// Test for invalid value
|
||||
$variable = $this->createVariable(
|
||||
$data['functionId'],
|
||||
[
|
||||
'key' => 'LONGKEY',
|
||||
'value' => str_repeat("#", 8193),
|
||||
]
|
||||
);
|
||||
|
||||
$this->assertEquals(400, $variable['headers']['status-code']);
|
||||
|
||||
return array_merge(
|
||||
$data,
|
||||
|
|
@ -155,28 +160,6 @@ class FunctionsConsoleClientTest extends Scope
|
|||
'variableId' => $variableId
|
||||
]
|
||||
);
|
||||
|
||||
$longKey = str_repeat("A", 256);
|
||||
$response = $this->client->call(Client::METHOD_POST, '/functions/' . $data['functionId'] . '/variables', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'key' => $longKey,
|
||||
'value' => 'TESTINGVALUE'
|
||||
]);
|
||||
|
||||
$this->assertEquals(400, $response['headers']['status-code']);
|
||||
|
||||
$longValue = str_repeat("#", 8193);
|
||||
$response = $this->client->call(Client::METHOD_POST, '/functions/' . $data['functionId'] . '/variables', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'key' => 'LONGKEY',
|
||||
'value' => $longValue
|
||||
]);
|
||||
|
||||
$this->assertEquals(400, $response['headers']['status-code']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
214
tests/e2e/Services/FunctionsSchedule/FunctionsScheduleTest.php
Normal file
214
tests/e2e/Services/FunctionsSchedule/FunctionsScheduleTest.php
Normal file
|
|
@ -0,0 +1,214 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\E2E\Services\Functions;
|
||||
|
||||
use Appwrite\ID;
|
||||
use Tests\E2E\Client;
|
||||
use Tests\E2E\Scopes\ProjectCustom;
|
||||
use Tests\E2E\Scopes\Scope;
|
||||
use Tests\E2E\Scopes\SideServer;
|
||||
use Utopia\Database\Helpers\Role;
|
||||
|
||||
class FunctionsScheduleTest extends Scope
|
||||
{
|
||||
use FunctionsBase;
|
||||
use ProjectCustom;
|
||||
use SideServer;
|
||||
|
||||
public function testCreateScheduledExecution()
|
||||
{
|
||||
/**
|
||||
* Test for SUCCESS
|
||||
*/
|
||||
$functionId = $this->setupFunction([
|
||||
'functionId' => ID::unique(),
|
||||
'name' => 'Test',
|
||||
'execute' => [Role::user($this->getUser()['$id'])->toString()],
|
||||
'runtime' => 'php-8.0',
|
||||
'entrypoint' => 'index.php',
|
||||
'events' => [
|
||||
'users.*.create',
|
||||
'users.*.delete',
|
||||
],
|
||||
'schedule' => '* * * * *', // Execute every 60 seconds
|
||||
'timeout' => 10,
|
||||
]);
|
||||
|
||||
$this->setupDeployment($functionId, [
|
||||
'entrypoint' => 'index.php',
|
||||
'code' => $this->packageFunction('php'),
|
||||
'activate' => true
|
||||
]);
|
||||
|
||||
// Wait for scheduled execution
|
||||
\sleep(60);
|
||||
|
||||
$this->assertEventually(function () use ($functionId) {
|
||||
$executions = $this->client->call(Client::METHOD_GET, '/functions/' . $functionId . '/executions', [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey'],
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $executions['headers']['status-code']);
|
||||
$this->assertCount(1, $executions['body']['executions']);
|
||||
|
||||
$asyncExecution = $executions['body']['executions'][0];
|
||||
|
||||
$this->assertEquals('schedule', $asyncExecution['trigger']);
|
||||
$this->assertEquals('completed', $asyncExecution['status']);
|
||||
$this->assertEquals(200, $asyncExecution['responseStatusCode']);
|
||||
$this->assertEquals('', $asyncExecution['responseBody']);
|
||||
$this->assertNotEmpty($asyncExecution['logs']);
|
||||
$this->assertNotEmpty($asyncExecution['errors']);
|
||||
$this->assertGreaterThan(0, $asyncExecution['duration']);
|
||||
}, 60000, 500);
|
||||
|
||||
$this->cleanupFunction($functionId);
|
||||
}
|
||||
|
||||
public function testCreateScheduledAtExecution(): void
|
||||
{
|
||||
/**
|
||||
* Test for SUCCESS
|
||||
*/
|
||||
$functionId = $this->setupFunction([
|
||||
'functionId' => ID::unique(),
|
||||
'name' => 'Test',
|
||||
'execute' => [Role::user($this->getUser()['$id'])->toString()],
|
||||
'runtime' => 'php-8.0',
|
||||
'entrypoint' => 'index.php',
|
||||
'timeout' => 10,
|
||||
'logging' => true,
|
||||
]);
|
||||
$this->setupDeployment($functionId, [
|
||||
'entrypoint' => 'index.php',
|
||||
'code' => $this->packageFunction('php'),
|
||||
'activate' => true
|
||||
]);
|
||||
|
||||
// Schedule execution for the future
|
||||
\date_default_timezone_set('UTC');
|
||||
$futureTime = (new \DateTime())->add(new \DateInterval('PT2M')); // 2 minute in the future
|
||||
$futureTime->setTime($futureTime->format('H'), $futureTime->format('i'), 0, 0);
|
||||
|
||||
|
||||
$execution = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/functions/' . $functionId . '/executions',
|
||||
[
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'origin' => 'http://localhost',
|
||||
'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $this->getUser()['session'],
|
||||
],
|
||||
[
|
||||
'async' => true,
|
||||
'scheduledAt' => $futureTime->format(\DateTime::ATOM),
|
||||
'path' => '/custom-path',
|
||||
'method' => 'PATCH',
|
||||
'body' => 'custom-body',
|
||||
'headers' => [
|
||||
'x-custom-header' => 'custom-value'
|
||||
]
|
||||
]
|
||||
);
|
||||
$executionId = $execution['body']['$id'];
|
||||
|
||||
$this->assertEquals(202, $execution['headers']['status-code']);
|
||||
$this->assertEquals('scheduled', $execution['body']['status']);
|
||||
$this->assertEquals('PATCH', $execution['body']['requestMethod']);
|
||||
$this->assertEquals('/custom-path', $execution['body']['requestPath']);
|
||||
$this->assertCount(0, $execution['body']['requestHeaders']);
|
||||
|
||||
\sleep(120);
|
||||
|
||||
$this->assertEventually(function () use ($functionId, $executionId) {
|
||||
$execution = $this->getExecution($functionId, $executionId);
|
||||
|
||||
$this->assertEquals(200, $execution['headers']['status-code']);
|
||||
$this->assertEquals(200, $execution['body']['responseStatusCode']);
|
||||
$this->assertEquals('completed', $execution['body']['status']);
|
||||
$this->assertEquals('/custom-path', $execution['body']['requestPath']);
|
||||
$this->assertEquals('PATCH', $execution['body']['requestMethod']);
|
||||
$this->assertStringContainsString('body-is-custom-body', $execution['body']['logs']);
|
||||
$this->assertStringContainsString('custom-header-is-custom-value', $execution['body']['logs']);
|
||||
$this->assertStringContainsString('method-is-patch', $execution['body']['logs']);
|
||||
$this->assertStringContainsString('path-is-/custom-path', $execution['body']['logs']);
|
||||
$this->assertStringContainsString('user-is-' . $this->getUser()['$id'], $execution['body']['logs']);
|
||||
$this->assertStringContainsString('jwt-is-valid', $execution['body']['logs']);
|
||||
$this->assertGreaterThan(0, $execution['body']['duration']);
|
||||
}, 10000, 500);
|
||||
|
||||
/* Test for FAILURE */
|
||||
// Schedule synchronous execution
|
||||
$execution = $this->createExecution($functionId, [
|
||||
'async' => 'false',
|
||||
'scheduledAt' => $futureTime->format(\DateTime::ATOM),
|
||||
]);
|
||||
$this->assertEquals(400, $execution['headers']['status-code']);
|
||||
|
||||
// Execution with seconds precision
|
||||
$execution = $this->createExecution($functionId, [
|
||||
'async' => true,
|
||||
'scheduledAt' => (new \DateTime("2100-12-08 16:12:02"))->format(\DateTime::ATOM)
|
||||
]);
|
||||
$this->assertEquals(400, $execution['headers']['status-code']);
|
||||
|
||||
// Execution with milliseconds precision
|
||||
$execution = $this->createExecution($functionId, [
|
||||
'async' => true,
|
||||
'scheduledAt' => (new \DateTime("2100-12-08 16:12:02.255"))->format(\DateTime::ATOM)
|
||||
]);
|
||||
$this->assertEquals(400, $execution['headers']['status-code']);
|
||||
|
||||
// Execution too soon
|
||||
$execution = $this->createExecution($functionId, [
|
||||
'async' => true,
|
||||
'scheduledAt' => (new \DateTime())->add(new \DateInterval('PT1S'))->format(\DateTime::ATOM)
|
||||
]);
|
||||
$this->assertEquals(400, $execution['headers']['status-code']);
|
||||
|
||||
$this->cleanupFunction($functionId, $executionId);
|
||||
}
|
||||
|
||||
public function testDeleteScheduledExecution()
|
||||
{
|
||||
$functionId = $this->setupFunction([
|
||||
'functionId' => ID::unique(),
|
||||
'name' => 'Test',
|
||||
'execute' => [Role::user($this->getUser()['$id'])->toString()],
|
||||
'runtime' => 'php-8.0',
|
||||
'entrypoint' => 'index.php',
|
||||
'timeout' => 10,
|
||||
'logging' => true,
|
||||
]);
|
||||
|
||||
$this->setupDeployment($functionId, [
|
||||
'entrypoint' => 'index.php',
|
||||
'code' => $this->packageFunction('php'),
|
||||
'activate' => true
|
||||
]);
|
||||
|
||||
$futureTime = (new \DateTime())->add(new \DateInterval('PT10H'));
|
||||
$futureTime->setTime($futureTime->format('H'), $futureTime->format('i'), 0, 0);
|
||||
|
||||
$execution = $this->createExecution($functionId, [
|
||||
'async' => true,
|
||||
'scheduledAt' => $futureTime->format('Y-m-d H:i:s'),
|
||||
]);
|
||||
|
||||
$this->assertEquals(202, $execution['headers']['status-code']);
|
||||
|
||||
$executionId = $execution['body']['$id'] ?? '';
|
||||
|
||||
$execution = $this->client->call(Client::METHOD_DELETE, '/functions/' . $functionId . '/executions/' . $executionId, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()));
|
||||
|
||||
$this->assertEquals(204, $execution['headers']['status-code']);
|
||||
|
||||
$this->cleanupFunction($functionId);
|
||||
}
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace Tests\E2E\Services\GraphQL;
|
||||
|
||||
use CURLFile;
|
||||
use Utopia\CLI\Console;
|
||||
|
||||
trait Base
|
||||
|
|
@ -2496,8 +2497,17 @@ trait Base
|
|||
protected string $stdout = '';
|
||||
protected string $stderr = '';
|
||||
|
||||
protected function packageCode($folder): void
|
||||
protected function packageFunction(string $function): CURLFile
|
||||
{
|
||||
Console::execute('cd ' . realpath(__DIR__ . "/../../../resources/functions") . "/$folder && tar --exclude code.tar.gz -czf code.tar.gz .", '', $this->stdout, $this->stderr);
|
||||
$folderPath = realpath(__DIR__ . '/../../../resources/functions') . "/$function";
|
||||
$tarPath = "$folderPath/code.tar.gz";
|
||||
|
||||
Console::execute("cd $folderPath && tar --exclude code.tar.gz -czf code.tar.gz .", '', $this->stdout, $this->stderr);
|
||||
|
||||
if (filesize($tarPath) > 1024 * 1024 * 5) {
|
||||
throw new \Exception('Code package is too large. Use the chunked upload method instead.');
|
||||
}
|
||||
|
||||
return new CURLFile($tarPath, 'application/x-gzip', \basename($tarPath));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
namespace Tests\E2E\Services\GraphQL;
|
||||
|
||||
use CURLFile;
|
||||
use Tests\E2E\Client;
|
||||
use Tests\E2E\Scopes\ProjectCustom;
|
||||
use Tests\E2E\Scopes\Scope;
|
||||
|
|
@ -83,10 +82,6 @@ class FunctionsClientTest extends Scope
|
|||
$projectId = $this->getProject()['$id'];
|
||||
$query = $this->getQuery(self::$CREATE_DEPLOYMENT);
|
||||
|
||||
$folder = 'php';
|
||||
$code = realpath(__DIR__ . '/../../../resources/functions') . "/$folder/code.tar.gz";
|
||||
$this->packageCode($folder);
|
||||
|
||||
$gqlPayload = [
|
||||
'operations' => \json_encode([
|
||||
'query' => $query,
|
||||
|
|
@ -99,7 +94,7 @@ class FunctionsClientTest extends Scope
|
|||
'map' => \json_encode([
|
||||
'code' => ["variables.code"]
|
||||
]),
|
||||
'code' => new CURLFile($code, 'application/gzip', 'code.tar.gz'),
|
||||
'code' => $this->packageFunction('php')
|
||||
];
|
||||
|
||||
$deployment = $this->client->call(Client::METHOD_POST, '/graphql', [
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
namespace Tests\E2E\Services\GraphQL;
|
||||
|
||||
use CURLFile;
|
||||
use Tests\E2E\Client;
|
||||
use Tests\E2E\Scopes\ProjectCustom;
|
||||
use Tests\E2E\Scopes\Scope;
|
||||
|
|
@ -82,10 +81,6 @@ class FunctionsServerTest extends Scope
|
|||
$projectId = $this->getProject()['$id'];
|
||||
$query = $this->getQuery(self::$CREATE_DEPLOYMENT);
|
||||
|
||||
$folder = 'php';
|
||||
$code = realpath(__DIR__ . '/../../../resources/functions') . "/$folder/code.tar.gz";
|
||||
$this->packageCode($folder);
|
||||
|
||||
$gqlPayload = [
|
||||
'operations' => \json_encode([
|
||||
'query' => $query,
|
||||
|
|
@ -98,7 +93,7 @@ class FunctionsServerTest extends Scope
|
|||
'map' => \json_encode([
|
||||
'code' => ["variables.code"]
|
||||
]),
|
||||
'code' => new CURLFile($code, 'application/gzip', 'code.tar.gz'),
|
||||
'code' => $this->packageFunction('php'),
|
||||
];
|
||||
|
||||
$deployment = $this->client->call(Client::METHOD_POST, '/graphql', \array_merge([
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ class ProjectsConsoleClientTest extends Scope
|
|||
'region' => 'default'
|
||||
]);
|
||||
|
||||
$this->assertEquals(400, $response['headers']['status-code']);
|
||||
$this->assertEquals(401, $response['headers']['status-code']);
|
||||
|
||||
return [
|
||||
'projectId' => $projectId,
|
||||
|
|
@ -546,7 +546,7 @@ class ProjectsConsoleClientTest extends Scope
|
|||
'name' => '',
|
||||
]);
|
||||
|
||||
$this->assertEquals(400, $response['headers']['status-code']);
|
||||
$this->assertEquals(401, $response['headers']['status-code']);
|
||||
|
||||
return ['projectId' => $projectId];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,25 +7,34 @@ use WebSocket\ConnectionException;
|
|||
|
||||
trait RealtimeBase
|
||||
{
|
||||
private function getWebsocket($channels = [], $headers = [], $projectId = null): WebSocketClient
|
||||
{
|
||||
private function getWebsocket(
|
||||
array $channels = [],
|
||||
array $headers = [],
|
||||
string $projectId = null
|
||||
): WebSocketClient {
|
||||
if (is_null($projectId)) {
|
||||
$projectId = $this->getProject()['$id'];
|
||||
}
|
||||
|
||||
$headers = array_merge([
|
||||
'Origin' => 'appwrite.test'
|
||||
], $headers);
|
||||
$headers = array_merge(
|
||||
[
|
||||
"Origin" => "appwrite.test",
|
||||
],
|
||||
$headers
|
||||
);
|
||||
|
||||
$query = [
|
||||
'project' => $projectId,
|
||||
'channels' => $channels
|
||||
"project" => $projectId,
|
||||
"channels" => $channels,
|
||||
];
|
||||
|
||||
return new WebSocketClient('ws://appwrite-traefik/v1/realtime?' . http_build_query($query), [
|
||||
'headers' => $headers,
|
||||
'timeout' => 30,
|
||||
]);
|
||||
return new WebSocketClient(
|
||||
"ws://appwrite-traefik/v1/realtime?" . http_build_query($query),
|
||||
[
|
||||
"headers" => $headers,
|
||||
"timeout" => 30,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
public function testConnection(): void
|
||||
|
|
@ -33,7 +42,7 @@ trait RealtimeBase
|
|||
/**
|
||||
* Test for SUCCESS
|
||||
*/
|
||||
$client = $this->getWebsocket(['documents']);
|
||||
$client = $this->getWebsocket(["documents"]);
|
||||
$this->assertNotEmpty($client->receive());
|
||||
$client->close();
|
||||
}
|
||||
|
|
@ -43,11 +52,11 @@ trait RealtimeBase
|
|||
$client = $this->getWebsocket();
|
||||
$payload = json_decode($client->receive(), true);
|
||||
|
||||
$this->assertArrayHasKey('type', $payload);
|
||||
$this->assertArrayHasKey('data', $payload);
|
||||
$this->assertEquals('error', $payload['type']);
|
||||
$this->assertEquals(1008, $payload['data']['code']);
|
||||
$this->assertEquals('Missing channels', $payload['data']['message']);
|
||||
$this->assertArrayHasKey("type", $payload);
|
||||
$this->assertArrayHasKey("data", $payload);
|
||||
$this->assertEquals("error", $payload["type"]);
|
||||
$this->assertEquals(1008, $payload["data"]["code"]);
|
||||
$this->assertEquals("Missing channels", $payload["data"]["message"]);
|
||||
\usleep(250000); // 250ms
|
||||
$this->expectException(ConnectionException::class); // Check if server disconnnected client
|
||||
$client->close();
|
||||
|
|
@ -55,18 +64,24 @@ trait RealtimeBase
|
|||
|
||||
public function testConnectionFailureUnknownProject(): void
|
||||
{
|
||||
$client = new WebSocketClient('ws://appwrite-traefik/v1/realtime?project=123', [
|
||||
'headers' => [
|
||||
'Origin' => 'appwrite.test'
|
||||
$client = new WebSocketClient(
|
||||
"ws://appwrite-traefik/v1/realtime?project=123",
|
||||
[
|
||||
"headers" => [
|
||||
"Origin" => "appwrite.test",
|
||||
],
|
||||
]
|
||||
]);
|
||||
);
|
||||
$payload = json_decode($client->receive(), true);
|
||||
|
||||
$this->assertArrayHasKey('type', $payload);
|
||||
$this->assertArrayHasKey('data', $payload);
|
||||
$this->assertEquals('error', $payload['type']);
|
||||
$this->assertEquals(1008, $payload['data']['code']);
|
||||
$this->assertEquals('Missing or unknown project ID', $payload['data']['message']);
|
||||
$this->assertArrayHasKey("type", $payload);
|
||||
$this->assertArrayHasKey("data", $payload);
|
||||
$this->assertEquals("error", $payload["type"]);
|
||||
$this->assertEquals(1008, $payload["data"]["code"]);
|
||||
$this->assertEquals(
|
||||
"Missing or unknown project ID",
|
||||
$payload["data"]["message"]
|
||||
);
|
||||
\usleep(250000); // 250ms
|
||||
$this->expectException(ConnectionException::class); // Check if server disconnnected client
|
||||
$client->close();
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
namespace Tests\E2E\Services\Realtime;
|
||||
|
||||
use CURLFile;
|
||||
use Tests\E2E\Client;
|
||||
use Tests\E2E\Scopes\ProjectCustom;
|
||||
use Tests\E2E\Scopes\Scope;
|
||||
|
|
@ -19,7 +18,7 @@ class RealtimeConsoleClientTest extends Scope
|
|||
use ProjectCustom;
|
||||
use SideConsole;
|
||||
|
||||
public function testManualAuthentication()
|
||||
public function testManualAuthentication(): void
|
||||
{
|
||||
$user = $this->getUser();
|
||||
$userId = $user['$id'] ?? '';
|
||||
|
|
@ -124,7 +123,7 @@ class RealtimeConsoleClientTest extends Scope
|
|||
$client->close();
|
||||
}
|
||||
|
||||
public function testAttributes()
|
||||
public function testAttributes(): array
|
||||
{
|
||||
$user = $this->getUser();
|
||||
$projectId = 'console';
|
||||
|
|
@ -184,6 +183,7 @@ class RealtimeConsoleClientTest extends Scope
|
|||
'required' => true,
|
||||
]);
|
||||
|
||||
$projectId = $this->getProject()['$id'];
|
||||
$attributeKey = $name['body']['key'];
|
||||
|
||||
$this->assertEquals($name['headers']['status-code'], 202);
|
||||
|
|
@ -198,8 +198,9 @@ class RealtimeConsoleClientTest extends Scope
|
|||
$this->assertEquals('event', $response['type']);
|
||||
$this->assertNotEmpty($response['data']);
|
||||
$this->assertArrayHasKey('timestamp', $response['data']);
|
||||
$this->assertCount(1, $response['data']['channels']);
|
||||
$this->assertCount(2, $response['data']['channels']);
|
||||
$this->assertContains('console', $response['data']['channels']);
|
||||
$this->assertContains("projects.{$projectId}", $response['data']['channels']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.attributes.*.create", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.attributes.*", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}", $response['data']['events']);
|
||||
|
|
@ -218,8 +219,9 @@ class RealtimeConsoleClientTest extends Scope
|
|||
$this->assertEquals('event', $response['type']);
|
||||
$this->assertNotEmpty($response['data']);
|
||||
$this->assertArrayHasKey('timestamp', $response['data']);
|
||||
$this->assertCount(1, $response['data']['channels']);
|
||||
$this->assertCount(2, $response['data']['channels']);
|
||||
$this->assertContains('console', $response['data']['channels']);
|
||||
$this->assertContains("projects.{$projectId}", $response['data']['channels']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.attributes.*.update", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.attributes.*", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}", $response['data']['events']);
|
||||
|
|
@ -276,6 +278,8 @@ class RealtimeConsoleClientTest extends Scope
|
|||
]);
|
||||
|
||||
$this->assertEquals($index['headers']['status-code'], 202);
|
||||
|
||||
$projectId = $this->getProject()['$id'];
|
||||
$indexKey = $index['body']['key'];
|
||||
|
||||
$response = json_decode($client->receive(), true);
|
||||
|
|
@ -285,8 +289,9 @@ class RealtimeConsoleClientTest extends Scope
|
|||
$this->assertEquals('event', $response['type']);
|
||||
$this->assertNotEmpty($response['data']);
|
||||
$this->assertArrayHasKey('timestamp', $response['data']);
|
||||
$this->assertCount(1, $response['data']['channels']);
|
||||
$this->assertCount(2, $response['data']['channels']);
|
||||
$this->assertContains('console', $response['data']['channels']);
|
||||
$this->assertContains("projects.{$projectId}", $response['data']['channels']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.indexes.*.create", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.indexes.*", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}", $response['data']['events']);
|
||||
|
|
@ -303,8 +308,9 @@ class RealtimeConsoleClientTest extends Scope
|
|||
$this->assertEquals('event', $response['type']);
|
||||
$this->assertNotEmpty($response['data']);
|
||||
$this->assertArrayHasKey('timestamp', $response['data']);
|
||||
$this->assertCount(1, $response['data']['channels']);
|
||||
$this->assertCount(2, $response['data']['channels']);
|
||||
$this->assertContains('console', $response['data']['channels']);
|
||||
$this->assertContains("projects.{$projectId}", $response['data']['channels']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.indexes.*.update", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.indexes.*", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}", $response['data']['events']);
|
||||
|
|
@ -343,6 +349,8 @@ class RealtimeConsoleClientTest extends Scope
|
|||
$this->assertContains('console', $response['data']['channels']);
|
||||
$this->assertNotEmpty($response['data']['user']);
|
||||
|
||||
$projectId = $this->getProject()['$id'];
|
||||
|
||||
/**
|
||||
* Test Delete Index
|
||||
*/
|
||||
|
|
@ -353,6 +361,7 @@ class RealtimeConsoleClientTest extends Scope
|
|||
], $this->getHeaders()));
|
||||
|
||||
$this->assertEquals($attribute['headers']['status-code'], 204);
|
||||
|
||||
$response = json_decode($client->receive(), true);
|
||||
|
||||
$this->assertArrayHasKey('type', $response);
|
||||
|
|
@ -360,8 +369,9 @@ class RealtimeConsoleClientTest extends Scope
|
|||
$this->assertEquals('event', $response['type']);
|
||||
$this->assertNotEmpty($response['data']);
|
||||
$this->assertArrayHasKey('timestamp', $response['data']);
|
||||
$this->assertCount(1, $response['data']['channels']);
|
||||
$this->assertCount(2, $response['data']['channels']);
|
||||
$this->assertContains('console', $response['data']['channels']);
|
||||
$this->assertContains("projects.{$projectId}", $response['data']['channels']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.indexes.*.update", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.indexes.*", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}", $response['data']['events']);
|
||||
|
|
@ -377,8 +387,9 @@ class RealtimeConsoleClientTest extends Scope
|
|||
$this->assertEquals('event', $response['type']);
|
||||
$this->assertNotEmpty($response['data']);
|
||||
$this->assertArrayHasKey('timestamp', $response['data']);
|
||||
$this->assertCount(1, $response['data']['channels']);
|
||||
$this->assertCount(2, $response['data']['channels']);
|
||||
$this->assertContains('console', $response['data']['channels']);
|
||||
$this->assertContains("projects.{$projectId}", $response['data']['channels']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.indexes.*.delete", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.indexes.*", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}", $response['data']['events']);
|
||||
|
|
@ -416,10 +427,12 @@ class RealtimeConsoleClientTest extends Scope
|
|||
$this->assertContains('console', $response['data']['channels']);
|
||||
$this->assertNotEmpty($response['data']['user']);
|
||||
|
||||
$attributeKey = 'name';
|
||||
$projectId = $this->getProject()['$id'];
|
||||
|
||||
/**
|
||||
* Test Delete Attribute
|
||||
*/
|
||||
$attributeKey = 'name';
|
||||
$attribute = $this->client->call(Client::METHOD_DELETE, '/databases/' . $databaseId . '/collections/' . $data['actorsId'] . '/attributes/' . $attributeKey, array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
|
|
@ -433,8 +446,9 @@ class RealtimeConsoleClientTest extends Scope
|
|||
$this->assertEquals('event', $response['type']);
|
||||
$this->assertNotEmpty($response['data']);
|
||||
$this->assertArrayHasKey('timestamp', $response['data']);
|
||||
$this->assertCount(1, $response['data']['channels']);
|
||||
$this->assertCount(2, $response['data']['channels']);
|
||||
$this->assertContains('console', $response['data']['channels']);
|
||||
$this->assertContains("projects.{$projectId}", $response['data']['channels']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.attributes.*.update", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.attributes.*", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}", $response['data']['events']);
|
||||
|
|
@ -450,8 +464,9 @@ class RealtimeConsoleClientTest extends Scope
|
|||
$this->assertEquals('event', $response['type']);
|
||||
$this->assertNotEmpty($response['data']);
|
||||
$this->assertArrayHasKey('timestamp', $response['data']);
|
||||
$this->assertCount(1, $response['data']['channels']);
|
||||
$this->assertCount(2, $response['data']['channels']);
|
||||
$this->assertContains('console', $response['data']['channels']);
|
||||
$this->assertContains("projects.{$projectId}", $response['data']['channels']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.attributes.*.delete", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}.attributes.*", $response['data']['events']);
|
||||
$this->assertContains("databases.{$databaseId}.collections.{$actorsId}", $response['data']['events']);
|
||||
|
|
@ -505,22 +520,16 @@ class RealtimeConsoleClientTest extends Scope
|
|||
/**
|
||||
* Test Create Deployment
|
||||
*/
|
||||
|
||||
$folder = 'php';
|
||||
$code = realpath(__DIR__ . '/../../../resources/functions') . "/$folder/code.tar.gz";
|
||||
$this->packageCode($folder);
|
||||
|
||||
$projectId = $this->getProject()['$id'];
|
||||
$deployment = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/deployments', array_merge([
|
||||
'content-type' => 'multipart/form-data',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-project' => $projectId,
|
||||
], $this->getHeaders()), [
|
||||
'entrypoint' => 'index.php',
|
||||
'code' => new CURLFile($code, 'application/x-gzip', \basename($code)),
|
||||
'code' => $this->packageFunction('php'),
|
||||
'activate' => true
|
||||
]);
|
||||
|
||||
$deploymentId = $deployment['body']['$id'] ?? '';
|
||||
|
||||
$this->assertEquals(202, $deployment['headers']['status-code']);
|
||||
|
||||
$response = json_decode($client->receive(), true);
|
||||
|
|
@ -530,8 +539,9 @@ class RealtimeConsoleClientTest extends Scope
|
|||
$this->assertEquals('event', $response['type']);
|
||||
$this->assertNotEmpty($response['data']);
|
||||
$this->assertArrayHasKey('timestamp', $response['data']);
|
||||
$this->assertCount(1, $response['data']['channels']);
|
||||
$this->assertCount(2, $response['data']['channels']);
|
||||
$this->assertContains('console', $response['data']['channels']);
|
||||
$this->assertContains("projects.{$projectId}", $response['data']['channels']);
|
||||
// $this->assertContains("functions.{$functionId}.deployments.{$deploymentId}.create", $response['data']['events']); TODO @christyjacob4 : enable test once we allow functions.* events
|
||||
$this->assertNotEmpty($response['data']['payload']);
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,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 Tests\E2E\Services\Functions\FunctionsBase;
|
||||
use Utopia\Database\Helpers\ID;
|
||||
use Utopia\Database\Helpers\Permission;
|
||||
use Utopia\Database\Helpers\Role;
|
||||
|
|
@ -15,6 +15,7 @@ use WebSocket\ConnectionException;
|
|||
|
||||
class RealtimeCustomClientTest extends Scope
|
||||
{
|
||||
use FunctionsBase;
|
||||
use RealtimeBase;
|
||||
use ProjectCustom;
|
||||
use SideClient;
|
||||
|
|
@ -1271,20 +1272,13 @@ class RealtimeCustomClientTest extends Scope
|
|||
$this->assertEquals($function['headers']['status-code'], 201);
|
||||
$this->assertNotEmpty($function['body']['$id']);
|
||||
|
||||
$folder = 'timeout';
|
||||
$stderr = '';
|
||||
$stdout = '';
|
||||
$code = realpath(__DIR__ . '/../../../resources/functions') . "/{$folder}/code.tar.gz";
|
||||
|
||||
Console::execute('cd ' . realpath(__DIR__ . "/../../../resources/functions") . "/{$folder} && tar --exclude code.tar.gz -czf code.tar.gz .", '', $stdout, $stderr);
|
||||
|
||||
$deployment = $this->client->call(Client::METHOD_POST, '/functions/' . $functionId . '/deployments', array_merge([
|
||||
'content-type' => 'multipart/form-data',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'x-appwrite-key' => $this->getProject()['apiKey']
|
||||
]), [
|
||||
'entrypoint' => 'index.php',
|
||||
'code' => new CURLFile($code, 'application/x-gzip', basename($code)),
|
||||
'code' => $this->packageFunction('timeout'),
|
||||
'activate' => true
|
||||
]);
|
||||
|
||||
|
|
@ -1340,8 +1334,9 @@ class RealtimeCustomClientTest extends Scope
|
|||
$this->assertEquals('event', $response['type']);
|
||||
$this->assertNotEmpty($response['data']);
|
||||
$this->assertArrayHasKey('timestamp', $response['data']);
|
||||
$this->assertCount(4, $response['data']['channels']);
|
||||
$this->assertCount(5, $response['data']['channels']);
|
||||
$this->assertContains('console', $response['data']['channels']);
|
||||
$this->assertContains("projects.{$this->getProject()['$id']}", $response['data']['channels']);
|
||||
$this->assertContains('executions', $response['data']['channels']);
|
||||
$this->assertContains("executions.{$executionId}", $response['data']['channels']);
|
||||
$this->assertContains("functions.{$functionId}", $response['data']['channels']);
|
||||
|
|
@ -1362,8 +1357,9 @@ class RealtimeCustomClientTest extends Scope
|
|||
$this->assertEquals('event', $responseUpdate['type']);
|
||||
$this->assertNotEmpty($responseUpdate['data']);
|
||||
$this->assertArrayHasKey('timestamp', $responseUpdate['data']);
|
||||
$this->assertCount(4, $responseUpdate['data']['channels']);
|
||||
$this->assertCount(5, $responseUpdate['data']['channels']);
|
||||
$this->assertContains('console', $responseUpdate['data']['channels']);
|
||||
$this->assertContains("projects.{$this->getProject()['$id']}", $response['data']['channels']);
|
||||
$this->assertContains('executions', $responseUpdate['data']['channels']);
|
||||
$this->assertContains("executions.{$executionId}", $responseUpdate['data']['channels']);
|
||||
$this->assertContains("functions.{$functionId}", $responseUpdate['data']['channels']);
|
||||
|
|
|
|||
|
|
@ -161,7 +161,7 @@ trait TeamsBaseClient
|
|||
$this->assertNotEmpty($response['body']['userEmail']);
|
||||
$this->assertNotEmpty($response['body']['teamId']);
|
||||
$this->assertNotEmpty($response['body']['teamName']);
|
||||
$this->assertCount(2, $response['body']['roles']);
|
||||
$this->assertCount(1, $response['body']['roles']);
|
||||
$this->assertEquals(false, (new DatetimeValidator())->isValid($response['body']['joined'])); // is null in DB
|
||||
$this->assertEquals(false, $response['body']['confirm']);
|
||||
|
||||
|
|
@ -203,7 +203,7 @@ trait TeamsBaseClient
|
|||
], $this->getHeaders()), [
|
||||
'email' => $email,
|
||||
'name' => $name,
|
||||
'roles' => ['admin', 'editor'],
|
||||
'roles' => ['developer'],
|
||||
'url' => 'http://localhost:5000/join-us#title'
|
||||
]);
|
||||
|
||||
|
|
@ -214,7 +214,7 @@ trait TeamsBaseClient
|
|||
$this->assertEquals($email, $response['body']['userEmail']);
|
||||
$this->assertNotEmpty($response['body']['teamId']);
|
||||
$this->assertNotEmpty($response['body']['teamName']);
|
||||
$this->assertCount(2, $response['body']['roles']);
|
||||
$this->assertCount(1, $response['body']['roles']);
|
||||
$this->assertEquals(false, (new DatetimeValidator())->isValid($response['body']['joined'])); // is null in DB
|
||||
$this->assertEquals(false, $response['body']['confirm']);
|
||||
|
||||
|
|
@ -255,7 +255,7 @@ trait TeamsBaseClient
|
|||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'userId' => 'abcdefdg',
|
||||
'roles' => ['admin', 'editor'],
|
||||
'roles' => ['developer'],
|
||||
'url' => 'http://localhost:5000/join-us#title'
|
||||
]);
|
||||
|
||||
|
|
@ -270,7 +270,7 @@ trait TeamsBaseClient
|
|||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'userId' => $userId,
|
||||
'roles' => ['admin', 'editor'],
|
||||
'roles' => ['developer'],
|
||||
'url' => 'http://localhost:5000/join-us#title'
|
||||
]);
|
||||
|
||||
|
|
@ -281,7 +281,7 @@ trait TeamsBaseClient
|
|||
$this->assertEquals($secondEmail, $response['body']['userEmail']);
|
||||
$this->assertNotEmpty($response['body']['teamId']);
|
||||
$this->assertNotEmpty($response['body']['teamName']);
|
||||
$this->assertCount(2, $response['body']['roles']);
|
||||
$this->assertCount(1, $response['body']['roles']);
|
||||
$this->assertEquals(false, (new DateTimeValidator())->isValid($response['body']['joined'])); // is null in DB
|
||||
$this->assertEquals(false, $response['body']['confirm']);
|
||||
|
||||
|
|
@ -301,7 +301,7 @@ trait TeamsBaseClient
|
|||
], $this->getHeaders()), [
|
||||
'email' => $email,
|
||||
'name' => 'Friend User',
|
||||
'roles' => ['admin', 'editor'],
|
||||
'roles' => ['developer'],
|
||||
'url' => 'http://localhost:5000/join-us#title'
|
||||
]);
|
||||
|
||||
|
|
@ -313,7 +313,7 @@ trait TeamsBaseClient
|
|||
], $this->getHeaders()), [
|
||||
'email' => 'dasdkaskdjaskdjasjkd',
|
||||
'name' => $name,
|
||||
'roles' => ['admin', 'editor'],
|
||||
'roles' => ['developer'],
|
||||
'url' => 'http://localhost:5000/join-us#title'
|
||||
]);
|
||||
|
||||
|
|
@ -337,7 +337,7 @@ trait TeamsBaseClient
|
|||
], $this->getHeaders()), [
|
||||
'email' => $email,
|
||||
'name' => $name,
|
||||
'roles' => ['admin', 'editor'],
|
||||
'roles' => ['developer'],
|
||||
'url' => 'http://example.com/join-us#title' // bad url
|
||||
]);
|
||||
|
||||
|
|
@ -413,7 +413,7 @@ trait TeamsBaseClient
|
|||
$this->assertNotEmpty($response['body']['$id']);
|
||||
$this->assertNotEmpty($response['body']['userId']);
|
||||
$this->assertNotEmpty($response['body']['teamId']);
|
||||
$this->assertCount(2, $response['body']['roles']);
|
||||
$this->assertCount(1, $response['body']['roles']);
|
||||
$this->assertEquals(true, (new DatetimeValidator())->isValid($response['body']['joined']));
|
||||
$this->assertEquals(true, $response['body']['confirm']);
|
||||
$session = $response['cookies']['a_session_' . $this->getProject()['$id']];
|
||||
|
|
@ -571,7 +571,7 @@ trait TeamsBaseClient
|
|||
/**
|
||||
* Test for SUCCESS
|
||||
*/
|
||||
$roles = ['admin', 'editor', 'uncle'];
|
||||
$roles = ['editor', 'uncle'];
|
||||
$response = $this->client->call(Client::METHOD_PATCH, '/teams/' . $teamUid . '/memberships/' . $membershipUid, array_merge([
|
||||
'origin' => 'http://localhost',
|
||||
'content-type' => 'application/json',
|
||||
|
|
@ -587,7 +587,6 @@ trait TeamsBaseClient
|
|||
$this->assertCount(count($roles), $response['body']['roles']);
|
||||
$this->assertEquals($roles[0], $response['body']['roles'][0]);
|
||||
$this->assertEquals($roles[1], $response['body']['roles'][1]);
|
||||
$this->assertEquals($roles[2], $response['body']['roles'][2]);
|
||||
|
||||
/**
|
||||
* Test for unknown team
|
||||
|
|
|
|||
|
|
@ -28,12 +28,13 @@ class TeamsConsoleClientTest extends Scope
|
|||
// Create a user account before we create a invite so we can check if the user has permissions when it shouldn't
|
||||
$user = $this->client->call(Client::METHOD_POST, '/account', [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => 'console'], [
|
||||
'userId' => 'unique()',
|
||||
'email' => $email,
|
||||
'password' => $password,
|
||||
'name' => $name,
|
||||
], false);
|
||||
'x-appwrite-project' => 'console'
|
||||
], [
|
||||
'userId' => 'unique()',
|
||||
'email' => $email,
|
||||
'password' => $password,
|
||||
'name' => $name,
|
||||
], false);
|
||||
|
||||
$this->assertEquals(201, $user['headers']['status-code']);
|
||||
|
||||
|
|
@ -46,7 +47,7 @@ class TeamsConsoleClientTest extends Scope
|
|||
], $this->getHeaders()), [
|
||||
'email' => $email,
|
||||
'name' => $name,
|
||||
'roles' => ['admin', 'editor'],
|
||||
'roles' => ['developer'],
|
||||
'url' => 'http://localhost:5000/join-us#title'
|
||||
]);
|
||||
|
||||
|
|
@ -76,4 +77,75 @@ class TeamsConsoleClientTest extends Scope
|
|||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/** @depends testUpdateTeamMembership */
|
||||
public function testUpdateTeamMembershipRoles($data): array
|
||||
{
|
||||
$teamUid = $data['teamUid'] ?? '';
|
||||
$membershipUid = $data['membershipUid'] ?? '';
|
||||
$session = $data['session'] ?? '';
|
||||
|
||||
/**
|
||||
* Test for SUCCESS
|
||||
*/
|
||||
$roles = ['developer'];
|
||||
$response = $this->client->call(Client::METHOD_PATCH, '/teams/' . $teamUid . '/memberships/' . $membershipUid, array_merge([
|
||||
'origin' => 'http://localhost',
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'roles' => $roles
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertNotEmpty($response['body']['$id']);
|
||||
$this->assertNotEmpty($response['body']['userId']);
|
||||
$this->assertNotEmpty($response['body']['teamId']);
|
||||
$this->assertCount(count($roles), $response['body']['roles']);
|
||||
$this->assertEquals($roles[0], $response['body']['roles'][0]);
|
||||
|
||||
/**
|
||||
* Test for unknown team
|
||||
*/
|
||||
$response = $this->client->call(Client::METHOD_PATCH, '/teams/' . 'abc' . '/memberships/' . $membershipUid, array_merge([
|
||||
'origin' => 'http://localhost',
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'roles' => $roles
|
||||
]);
|
||||
|
||||
$this->assertEquals(404, $response['headers']['status-code']);
|
||||
|
||||
/**
|
||||
* Test for unknown membership ID
|
||||
*/
|
||||
$response = $this->client->call(Client::METHOD_PATCH, '/teams/' . $teamUid . '/memberships/' . 'abc', array_merge([
|
||||
'origin' => 'http://localhost',
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
], $this->getHeaders()), [
|
||||
'roles' => $roles
|
||||
]);
|
||||
|
||||
$this->assertEquals(404, $response['headers']['status-code']);
|
||||
|
||||
|
||||
/**
|
||||
* Test for when a user other than the owner tries to update membership
|
||||
*/
|
||||
$response = $this->client->call(Client::METHOD_PATCH, '/teams/' . $teamUid . '/memberships/' . $membershipUid, [
|
||||
'origin' => 'http://localhost',
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'cookie' => 'a_session_' . $this->getProject()['$id'] . '=' . $session,
|
||||
], [
|
||||
'roles' => $roles
|
||||
]);
|
||||
|
||||
$this->assertEquals(401, $response['headers']['status-code']);
|
||||
$this->assertEquals('User is not allowed to modify roles', $response['body']['message']);
|
||||
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
17
tests/extensions/Async.php
Normal file
17
tests/extensions/Async.php
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
|
||||
namespace Appwrite\Tests;
|
||||
|
||||
use Appwrite\Tests\Async\Eventually;
|
||||
use PHPUnit\Framework\Assert;
|
||||
|
||||
const DEFAULT_TIMEOUT_MS = 10000;
|
||||
const DEFAULT_WAIT_MS = 500;
|
||||
|
||||
trait Async
|
||||
{
|
||||
public static function assertEventually(callable $probe, int $timeoutMs = DEFAULT_TIMEOUT_MS, int $waitMs = DEFAULT_WAIT_MS): void
|
||||
{
|
||||
Assert::assertThat($probe, new Eventually($timeoutMs, $waitMs));
|
||||
}
|
||||
}
|
||||
49
tests/extensions/Async/Eventually.php
Normal file
49
tests/extensions/Async/Eventually.php
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
namespace Appwrite\Tests\Async;
|
||||
|
||||
use PHPUnit\Framework\Constraint\Constraint;
|
||||
|
||||
final class Eventually extends Constraint
|
||||
{
|
||||
public function __construct(private int $timeoutMs, private int $waitMs)
|
||||
{
|
||||
}
|
||||
|
||||
public function evaluate(mixed $probe, string $description = '', bool $returnResult = false): ?bool
|
||||
{
|
||||
if (!is_callable($probe)) {
|
||||
throw new \Exception('Probe must be a callable');
|
||||
}
|
||||
|
||||
$start = microtime(true);
|
||||
$lastException = null;
|
||||
|
||||
do {
|
||||
try {
|
||||
$probe();
|
||||
return true;
|
||||
} catch (\Exception $exception) {
|
||||
$lastException = $exception;
|
||||
}
|
||||
|
||||
usleep($this->waitMs * 1000);
|
||||
} while (microtime(true) - $start < $this->timeoutMs / 1000);
|
||||
|
||||
if ($returnResult) {
|
||||
return false;
|
||||
}
|
||||
|
||||
throw $lastException;
|
||||
}
|
||||
|
||||
protected function failureDescription(mixed $other): string
|
||||
{
|
||||
return 'the given probe was satisfied within ' . $this->timeoutMs . 'ms.';
|
||||
}
|
||||
|
||||
public function toString(): string
|
||||
{
|
||||
return 'Eventually';
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue