diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 277a509447..c6837673d5 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -9,7 +9,31 @@ You can [find issues using this query](https://github.com/search?q=org%3Aappwrit
## How to Start?
-If you are worried or don’t know where to start, check out the next section that explains what kind of help we could use and where you can get involved. You can send your questions to [@appwrite on Twitter](https://twitter.com/appwrite) or to anyone from the [Appwrite team on Discord](https://appwrite.io/discord). You can also submit an issue, and a maintainer can guide you!
+Welcome! We're excited that you're interested in contributing to Appwrite. To make sure your time is valued and your contributions are successful, please follow these steps before writing any code:
+
+### 🔍 Step 1: Find an Issue
+
+Browse open issues and look for ones labeled [good first issue](https://github.com/search?q=org%3Aappwrite+is%3Aopen+type%3Aissue+label%3A%22good+first+issue%22&type=issues) or [help wanted](https://github.com/search?q=org%3Aappwrite+is%3Aopen+type%3Aissue+label%3A%22help+wanted%22&type=issues).
+
+If you're not sure which issue to pick, ask in our [maintainers channel](https://discord.com/channels/564160730845151244/636852860709240842) on Discord.
+
+### 📝 Step 2: Ask to Be Assigned
+
+Before working on an issue, comment on the GitHub issue asking to be assigned. This prevents multiple people working on the same task.
+
+Then, create a thread in the [maintainers channel](https://discord.com/channels/564160730845151244/636852860709240842) on Discord with a link to the issue.
+
+Our team is small and may not see your GitHub comment right away - posting in the [maintainers channel](https://discord.com/channels/564160730845151244/636852860709240842) ensures it gets seen.
+
+### 💬 Step 3: Don’t Submit Random PRs
+
+If you're not working on an assigned issue, create a GitHub issue first.
+
+PRs submitted without context or discussion may not align with our roadmap and may be closed without review.
+
+### ⚠️ Please Note
+
+We’re a very small team managing a large project. Many PRs are submitted, and while we appreciate every effort, we can only review contributions that follow the process above. This helps us keep things fair and organized.
## Code of Conduct
diff --git a/app/cli.php b/app/cli.php
index 86ec241c93..504e4fb5e6 100644
--- a/app/cli.php
+++ b/app/cli.php
@@ -191,9 +191,15 @@ CLI::setResource('getLogsDB', function (Group $pools, Cache $cache) {
CLI::setResource('publisher', function (Group $pools) {
return new BrokerPool(publisher: $pools->get('publisher'));
}, ['pools']);
-CLI::setResource('publisherRedis', function () {
- // Stub
-});
+CLI::setResource('publisherDatabases', function (BrokerPool $publisher) {
+ return $publisher;
+}, ['publisher']);
+CLI::setResource('publisherMigrations', function (BrokerPool $publisher) {
+ return $publisher;
+}, ['publisher']);
+CLI::setResource('publisherStatsUsage', function (BrokerPool $publisher) {
+ return $publisher;
+}, ['publisher']);
CLI::setResource('queueForStatsUsage', function (Publisher $publisher) {
return new StatsUsage($publisher);
}, ['publisher']);
diff --git a/app/config/locale/templates/email-base-styled.tpl b/app/config/locale/templates/email-base-styled.tpl
index f6d3e8cd63..b5aece0253 100644
--- a/app/config/locale/templates/email-base-styled.tpl
+++ b/app/config/locale/templates/email-base-styled.tpl
@@ -120,6 +120,11 @@
+
+ {{preview}}
+
{{previewWhitespace}}
+
+
diff --git a/app/config/locale/templates/email-base.tpl b/app/config/locale/templates/email-base.tpl
index 13056fd5ae..f6807ce7b2 100644
--- a/app/config/locale/templates/email-base.tpl
+++ b/app/config/locale/templates/email-base.tpl
@@ -121,6 +121,11 @@
+
+ {{preview}}
+
{{previewWhitespace}}
+
+
diff --git a/app/config/locale/translations/en.json b/app/config/locale/translations/en.json
index dbfa2e1be8..072a7f7552 100644
--- a/app/config/locale/translations/en.json
+++ b/app/config/locale/translations/en.json
@@ -4,6 +4,7 @@
"settings.direction": "ltr",
"emails.sender": "%s Team",
"emails.verification.subject": "Account Verification",
+ "emails.verification.preview": "Verify your email to activate your {{project}} account.",
"emails.verification.hello": "Hello {{user}},",
"emails.verification.body": "Follow this link to verify your email address to your {{b}}{{project}}{{/b}} account.",
"emails.verification.footer": "If you didn’t ask to verify this address, you can ignore this message.",
@@ -11,6 +12,7 @@
"emails.verification.buttonText": "Confirm email address",
"emails.verification.signature": "{{project}} team",
"emails.magicSession.subject": "{{project}} Login",
+ "emails.magicSession.preview": "Sign in to {{project}} with your secure link. Expires in 1 hour.",
"emails.magicSession.hello": "Hello {{user}},",
"emails.magicSession.optionButton": "Click the button below to securely sign in to your {{b}}{{project}}{{/b}} account. This link will expire in 1 hour.",
"emails.magicSession.buttonText": "Sign in to {{project}}",
@@ -20,6 +22,7 @@
"emails.magicSession.thanks": "Thanks,",
"emails.magicSession.signature": "{{project}} team",
"emails.sessionAlert.subject": "Security alert: new session on your {{project}} account",
+ "emails.sessionAlert.preview": "New login detected on {{project}} at {{time}} UTC.",
"emails.sessionAlert.hello": "Hello {{user}},",
"emails.sessionAlert.body": "A new session has been created on your {{b}}{{project}}{{/b}} account, {{b}}on {{date}}, {{year}} at {{time}} UTC{{/b}}.\nHere are the details of the new session: ",
"emails.sessionAlert.listDevice": "Device: {{b}}{{device}}{{/b}}",
@@ -29,6 +32,7 @@
"emails.sessionAlert.thanks": "Thanks,",
"emails.sessionAlert.signature": "{{project}} team",
"emails.otpSession.subject": "OTP for {{project}} Login",
+ "emails.otpSession.preview": "Use OTP {{otp}} to sign in to {{project}}. Expires in 15 minutes.",
"emails.otpSession.hello": "Hello {{user}},",
"emails.otpSession.description": "Enter the following verification code when prompted to securely sign in to your {{b}}{{project}}{{/b}} account. This code will expire in 15 minutes.",
"emails.otpSession.clientInfo": "This sign in was requested using {{b}}{{agentClient}}{{/b}} on {{b}}{{agentDevice}}{{/b}} {{b}}{{agentOs}}{{/b}}. If you didn't request the sign in, you can safely ignore this email.",
@@ -36,12 +40,14 @@
"emails.otpSession.thanks": "Thanks,",
"emails.otpSession.signature": "{{project}} team",
"emails.mfaChallenge.subject": "Verification Code for {{project}}",
+ "emails.mfaChallenge.preview": "Use code {{otp}} for two-step verification in {{project}}. Expires in 15 minutes.",
"emails.mfaChallenge.hello": "Hello {{user}},",
- "emails.mfaChallenge.description": "Enter the following verification code to verify your email and activate two-step verification in {{b}}{{project}}{{/b}}. This code will expire in 15 minutes.",
+ "emails.mfaChallenge.description": "Enter the following code to confirm your two-step verification in {{b}}{{project}}{{/b}}. This code will expire in 15 minutes.",
"emails.mfaChallenge.clientInfo": "This verification code was requested using {{b}}{{agentClient}}{{/b}} on {{b}}{{agentDevice}}{{/b}} {{b}}{{agentOs}}{{/b}}. If you didn't request the verification code, you can safely ignore this email.",
"emails.mfaChallenge.thanks": "Thanks,",
"emails.mfaChallenge.signature": "{{project}} team",
"emails.recovery.subject": "Password Reset",
+ "emails.recovery.preview": "Reset your {{project}} password using the link.",
"emails.recovery.hello": "Hello {{user}},",
"emails.recovery.body": "Follow this link to reset your {{b}}{{project}}{{/b}} password.",
"emails.recovery.footer": "If you didn't ask to reset your password, you can ignore this message.",
@@ -49,6 +55,7 @@
"emails.recovery.buttonText": "Reset password",
"emails.recovery.signature": "{{project}} team",
"emails.invitation.subject": "Invitation to %s Team at %s",
+ "emails.invitation.preview": "{{owner}} invited you to join {{team}} at {{project}}",
"emails.invitation.hello": "Hello {{user}},",
"emails.invitation.body": "This mail was sent to you because {{b}}{{owner}}{{/b}} wanted to invite you to become a member of the {{b}}{{team}}{{/b}} team at {{b}}{{project}}{{/b}}.",
"emails.invitation.footer": "If you are not interested, you can ignore this message.",
@@ -56,6 +63,7 @@
"emails.invitation.buttonText": "Accept invite to {{team}}",
"emails.invitation.signature": "{{project}} team",
"emails.certificate.subject": "Certificate failure for %s",
+ "emails.certificate.preview": "Your domain %s certificate generation has failed.",
"emails.certificate.hello": "Hello,",
"emails.certificate.body": "Certificate for your domain '{{domain}}' could not be generated. This is attempt no. {{attempt}}, and the failure was caused by: {{error}}",
"emails.certificate.footer": "Your previous certificate will be valid for 30 days since the first failure. We highly recommend investigating this case, otherwise your domain will end up without a valid SSL communication.",
diff --git a/app/config/specs/open-api3-1.7.x-client.json b/app/config/specs/open-api3-1.7.x-client.json
index d09108e51d..3cf675c5ad 100644
--- a/app/config/specs/open-api3-1.7.x-client.json
+++ b/app/config/specs/open-api3-1.7.x-client.json
@@ -4467,10 +4467,7 @@
{
"name": "createDocument",
"auth": {
- "Admin": [],
- "Session": [],
- "Key": [],
- "JWT": []
+ "Project": []
},
"parameters": [
"databaseId",
diff --git a/app/config/specs/open-api3-1.7.x-console.json b/app/config/specs/open-api3-1.7.x-console.json
index b7450bc7e6..0bfebf37b9 100644
--- a/app/config/specs/open-api3-1.7.x-console.json
+++ b/app/config/specs/open-api3-1.7.x-console.json
@@ -8026,10 +8026,7 @@
{
"name": "createDocument",
"auth": {
- "Admin": [],
- "Session": [],
- "Key": [],
- "JWT": []
+ "Project": []
},
"parameters": [
"databaseId",
@@ -8055,8 +8052,7 @@
{
"name": "createDocuments",
"auth": {
- "Admin": [],
- "Key": []
+ "Project": []
},
"parameters": [
"databaseId",
diff --git a/app/config/specs/open-api3-1.7.x-server.json b/app/config/specs/open-api3-1.7.x-server.json
index 8056d5f21b..bd78f99a76 100644
--- a/app/config/specs/open-api3-1.7.x-server.json
+++ b/app/config/specs/open-api3-1.7.x-server.json
@@ -7507,10 +7507,8 @@
{
"name": "createDocument",
"auth": {
- "Admin": [],
- "Session": [],
- "Key": [],
- "JWT": []
+ "Project": [],
+ "Session": []
},
"parameters": [
"databaseId",
@@ -7536,7 +7534,7 @@
{
"name": "createDocuments",
"auth": {
- "Admin": [],
+ "Project": [],
"Key": []
},
"parameters": [
diff --git a/app/config/specs/swagger2-1.7.x-client.json b/app/config/specs/swagger2-1.7.x-client.json
index c3353e157f..95d88bb925 100644
--- a/app/config/specs/swagger2-1.7.x-client.json
+++ b/app/config/specs/swagger2-1.7.x-client.json
@@ -4604,10 +4604,7 @@
{
"name": "createDocument",
"auth": {
- "Admin": [],
- "Session": [],
- "Key": [],
- "JWT": []
+ "Project": []
},
"parameters": [
"databaseId",
diff --git a/app/config/specs/swagger2-1.7.x-console.json b/app/config/specs/swagger2-1.7.x-console.json
index 4fa839aa39..314564477c 100644
--- a/app/config/specs/swagger2-1.7.x-console.json
+++ b/app/config/specs/swagger2-1.7.x-console.json
@@ -8146,10 +8146,7 @@
{
"name": "createDocument",
"auth": {
- "Admin": [],
- "Session": [],
- "Key": [],
- "JWT": []
+ "Project": []
},
"parameters": [
"databaseId",
@@ -8175,8 +8172,7 @@
{
"name": "createDocuments",
"auth": {
- "Admin": [],
- "Key": []
+ "Project": []
},
"parameters": [
"databaseId",
diff --git a/app/config/specs/swagger2-1.7.x-server.json b/app/config/specs/swagger2-1.7.x-server.json
index 5dc7b6d925..c67d26dd54 100644
--- a/app/config/specs/swagger2-1.7.x-server.json
+++ b/app/config/specs/swagger2-1.7.x-server.json
@@ -7617,10 +7617,8 @@
{
"name": "createDocument",
"auth": {
- "Admin": [],
- "Session": [],
- "Key": [],
- "JWT": []
+ "Project": [],
+ "Session": []
},
"parameters": [
"databaseId",
@@ -7646,7 +7644,7 @@
{
"name": "createDocuments",
"auth": {
- "Admin": [],
+ "Project": [],
"Key": []
},
"parameters": [
diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php
index dbbff5ce74..fcce0c3a63 100644
--- a/app/controllers/api/account.php
+++ b/app/controllers/api/account.php
@@ -71,6 +71,7 @@ $oauthDefaultFailure = '/console/auth/oauth2/failure';
function sendSessionAlert(Locale $locale, Document $user, Document $project, Document $session, Mail $queueForMails)
{
$subject = $locale->getText("emails.sessionAlert.subject");
+ $preview = $locale->getText("emails.sessionAlert.preview");
$customTemplate = $project->getAttribute('templates', [])['email.sessionAlert-' . $locale->default] ?? [];
$message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-session-alert.tpl');
@@ -158,6 +159,7 @@ function sendSessionAlert(Locale $locale, Document $user, Document $project, Doc
$queueForMails
->setSubject($subject)
+ ->setPreview($preview)
->setBody($body)
->setVariables($emailVariables)
->setRecipient($email)
@@ -2035,6 +2037,7 @@ App::post('/v1/account/tokens/magic-url')
$url = Template::unParseURL($url);
$subject = $locale->getText("emails.magicSession.subject");
+ $preview = $locale->getText("emails.magicSession.preview");
$customTemplate = $project->getAttribute('templates', [])['email.magicSession-' . $locale->default] ?? [];
$detector = new Detector($request->getUserAgent('UNKNOWN'));
@@ -2123,6 +2126,7 @@ App::post('/v1/account/tokens/magic-url')
$queueForMails
->setSubject($subject)
+ ->setPreview($preview)
->setBody($body)
->setVariables($emailVariables)
->setRecipient($email)
@@ -2264,6 +2268,7 @@ App::post('/v1/account/tokens/email')
$dbForProject->purgeCachedDocument('users', $user->getId());
$subject = $locale->getText("emails.otpSession.subject");
+ $preview = $locale->getText("emails.otpSession.preview");
$customTemplate = $project->getAttribute('templates', [])['email.otpSession-' . $locale->default] ?? [];
$detector = new Detector($request->getUserAgent('UNKNOWN'));
@@ -2349,6 +2354,7 @@ App::post('/v1/account/tokens/email')
$queueForMails
->setSubject($subject)
+ ->setPreview($preview)
->setBody($body)
->setVariables($emailVariables)
->setRecipient($email)
@@ -3287,6 +3293,7 @@ App::post('/v1/account/recovery')
$projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]');
$body = $locale->getText("emails.recovery.body");
$subject = $locale->getText("emails.recovery.subject");
+ $preview = $locale->getText("emails.recovery.preview");
$customTemplate = $project->getAttribute('templates', [])['email.recovery-' . $locale->default] ?? [];
$message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl');
@@ -3361,6 +3368,7 @@ App::post('/v1/account/recovery')
->setBody($body)
->setVariables($emailVariables)
->setSubject($subject)
+ ->setPreview($preview)
->trigger();
$recovery->setAttribute('secret', $secret);
@@ -3542,6 +3550,7 @@ App::post('/v1/account/verification')
$projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]');
$body = $locale->getText("emails.verification.body");
+ $preview = $locale->getText("emails.verification.preview");
$subject = $locale->getText("emails.verification.subject");
$customTemplate = $project->getAttribute('templates', [])['email.verification-' . $locale->default] ?? [];
@@ -3614,6 +3623,7 @@ App::post('/v1/account/verification')
$queueForMails
->setSubject($subject)
+ ->setPreview($preview)
->setBody($body)
->setVariables($emailVariables)
->setRecipient($user->getAttribute('email'))
@@ -4459,6 +4469,7 @@ App::post('/v1/account/mfa/challenge')
}
$subject = $locale->getText("emails.mfaChallenge.subject");
+ $preview = $locale->getText("emails.mfaChallenge.preview");
$customTemplate = $project->getAttribute('templates', [])['email.mfaChallenge-' . $locale->default] ?? [];
$detector = new Detector($request->getUserAgent('UNKNOWN'));
@@ -4535,6 +4546,7 @@ App::post('/v1/account/mfa/challenge')
$queueForMails
->setSubject($subject)
+ ->setPreview($preview)
->setBody($body)
->setVariables($emailVariables)
->setRecipient($user->getAttribute('email'))
diff --git a/app/controllers/api/health.php b/app/controllers/api/health.php
index 43368b8d3f..39ebae9590 100644
--- a/app/controllers/api/health.php
+++ b/app/controllers/api/health.php
@@ -522,17 +522,11 @@ App::get('/v1/health/queue/databases')
))
->param('name', 'database_db_main', new Text(256), 'Queue name for which to check the queue size', true)
->param('threshold', 5000, new Integer(true), 'Queue size threshold. When hit (equal or higher), endpoint returns server error. Default value is 5000.', true)
- ->inject('publisher')
- ->inject('publisherRedis')
+ ->inject('publisherDatabases')
->inject('response')
- ->action(function (string $name, int|string $threshold, Publisher $publisher, ?Publisher $publisherRedis, Response $response) {
+ ->action(function (string $name, int|string $threshold, Publisher $publisherDatabases, Response $response) {
$threshold = \intval($threshold);
-
- $isRedisFallback = \str_contains(System::getEnv('_APP_WORKER_REDIS_FALLBACK', ''), 'databases');
-
- $size = $isRedisFallback
- ? $publisherRedis->getQueueSize(new Queue($name))
- : $publisher->getQueueSize(new Queue($name));
+ $size = $publisherDatabases->getQueueSize(new Queue($name));
if ($size >= $threshold) {
throw new Exception(Exception::HEALTH_QUEUE_SIZE_EXCEEDED, "Queue size threshold hit. Current size is {$size} and threshold is {$threshold}.");
@@ -659,17 +653,12 @@ App::get('/v1/health/queue/migrations')
contentType: ContentType::JSON
))
->param('threshold', 5000, new Integer(true), 'Queue size threshold. When hit (equal or higher), endpoint returns server error. Default value is 5000.', true)
- ->inject('publisher')
- ->inject('publisherRedis')
+ ->inject('publisherMigrations')
->inject('response')
- ->action(function (int|string $threshold, Publisher $publisher, ?Publisher $publisherRedis, Response $response) {
+ ->action(function (int|string $threshold, Publisher $publisherMigrations, Response $response) {
$threshold = \intval($threshold);
- $isRedisFallback = \str_contains(System::getEnv('_APP_WORKER_REDIS_FALLBACK', ''), 'migrations');
-
- $size = $isRedisFallback
- ? $publisherRedis->getQueueSize(new Queue(Event::MIGRATIONS_QUEUE_NAME))
- : $publisher->getQueueSize(new Queue(Event::MIGRATIONS_QUEUE_NAME));
+ $size = $publisherMigrations->getQueueSize(new Queue(Event::MIGRATIONS_QUEUE_NAME));
if ($size >= $threshold) {
throw new Exception(Exception::HEALTH_QUEUE_SIZE_EXCEEDED, "Queue size threshold hit. Current size is {$size} and threshold is {$threshold}.");
diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php
index c6e242296b..480f6c63c6 100644
--- a/app/controllers/api/storage.php
+++ b/app/controllers/api/storage.php
@@ -1870,7 +1870,7 @@ App::get('/v1/storage/usage')
$total = [];
Authorization::skip(function () use ($dbForProject, $days, $metrics, &$stats, &$total) {
foreach ($metrics as $metric) {
- $result = $dbForProject->findOne('stats', [
+ $result = $dbForProject->findOne('stats', [
Query::equal('metric', [$metric]),
Query::equal('period', ['inf'])
]);
@@ -1899,7 +1899,7 @@ App::get('/v1/storage/usage')
};
foreach ($metrics as $metric) {
- $usage[$metric]['total'] = $stats[$metric]['total'];
+ $usage[$metric]['total'] = $stats[$metric]['total'];
$usage[$metric]['data'] = [];
$leap = time() - ($days['limit'] * $days['factor']);
while ($leap < time()) {
@@ -1917,8 +1917,8 @@ App::get('/v1/storage/usage')
'filesTotal' => $usage[$metrics[1]]['total'],
'filesStorageTotal' => $usage[$metrics[2]]['total'],
'buckets' => $usage[$metrics[0]]['data'],
- 'files' => $usage[$metrics[1]]['data'],
- 'storage' => $usage[$metrics[2]]['data'],
+ 'files' => $usage[$metrics[1]]['data'],
+ 'storage' => $usage[$metrics[2]]['data'],
]), Response::MODEL_USAGE_STORAGE);
});
@@ -1970,7 +1970,7 @@ App::get('/v1/storage/:bucketId/usage')
? $dbForLogs
: $dbForProject;
- $result = $db->findOne('stats', [
+ $result = $db->findOne('stats', [
Query::equal('metric', [$metric]),
Query::equal('period', ['inf'])
]);
@@ -2000,7 +2000,7 @@ App::get('/v1/storage/:bucketId/usage')
};
foreach ($metrics as $metric) {
- $usage[$metric]['total'] = $stats[$metric]['total'];
+ $usage[$metric]['total'] = $stats[$metric]['total'];
$usage[$metric]['data'] = [];
$leap = time() - ($days['limit'] * $days['factor']);
while ($leap < time()) {
diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php
index 98ec49ca48..fe411d53ab 100644
--- a/app/controllers/api/teams.php
+++ b/app/controllers/api/teams.php
@@ -657,6 +657,7 @@ App::post('/v1/teams/:teamId/memberships')
$projectName = $project->isEmpty() ? 'Console' : $project->getAttribute('name', '[APP-NAME]');
$body = $locale->getText("emails.invitation.body");
+ $preview = $locale->getText("emails.invitation.preview");
$subject = \sprintf($locale->getText("emails.invitation.subject"), $team->getAttribute('name'), $projectName);
$customTemplate = $project->getAttribute('templates', [])['email.invitation-' . $locale->default] ?? [];
@@ -729,6 +730,7 @@ App::post('/v1/teams/:teamId/memberships')
$queueForMails
->setSubject($subject)
->setBody($body)
+ ->setPreview($preview)
->setRecipient($invitee->getAttribute('email'))
->setName($invitee->getAttribute('name', ''))
->setVariables($emailVariables)
diff --git a/app/controllers/api/vcs.php b/app/controllers/api/vcs.php
index a8efd093b5..9271e87448 100644
--- a/app/controllers/api/vcs.php
+++ b/app/controllers/api/vcs.php
@@ -1137,6 +1137,7 @@ App::get('/v1/vcs/github/installations/:installationId/providerRepositories/:pro
$repository['pushedAt'] = $repository['pushed_at'] ?? '';
$repository['organization'] = $installation->getAttribute('organization', '');
$repository['provider'] = $installation->getAttribute('provider', '');
+ $repository['defaultBranch'] = $repository['default_branch'] ?? '';
$response->dynamic(new Document($repository), Response::MODEL_PROVIDER_REPOSITORY);
});
@@ -1234,7 +1235,8 @@ App::post('/v1/vcs/github/events')
$providerRepositoryUrl = $parsedPayload["repositoryUrl"] ?? '';
$providerCommitHash = $parsedPayload["commitHash"] ?? '';
$providerRepositoryOwner = $parsedPayload["owner"] ?? '';
- $providerCommitAuthor = $parsedPayload["headCommitAuthor"] ?? '';
+ $providerCommitAuthorName = $parsedPayload["headCommitAuthorName"] ?? '';
+ $providerCommitAuthorEmail = $parsedPayload["headCommitAuthorEmail"] ?? '';
$providerCommitAuthorUrl = $parsedPayload["authorUrl"] ?? '';
$providerCommitMessage = $parsedPayload["headCommitMessage"] ?? '';
$providerCommitUrl = $parsedPayload["headCommitUrl"] ?? '';
@@ -1247,9 +1249,9 @@ App::post('/v1/vcs/github/events')
Query::limit(100),
]));
- // create new deployment only on push and not when branch is created or deleted
- if (!$providerBranchCreated && !$providerBranchDeleted) {
- $createGitDeployments($github, $providerInstallationId, $repositories, $providerBranch, $providerBranchUrl, $providerRepositoryName, $providerRepositoryUrl, $providerRepositoryOwner, $providerCommitHash, $providerCommitAuthor, $providerCommitAuthorUrl, $providerCommitMessage, $providerCommitUrl, '', false, $dbForPlatform, $queueForBuilds, $getProjectDB, $request);
+ // create new deployment only on push (not committed by us) and not when branch is created or deleted
+ if ($providerCommitAuthorEmail !== APP_VCS_GITHUB_EMAIL && !$providerBranchCreated && !$providerBranchDeleted) {
+ $createGitDeployments($github, $providerInstallationId, $repositories, $providerBranch, $providerBranchUrl, $providerRepositoryName, $providerRepositoryUrl, $providerRepositoryOwner, $providerCommitHash, $providerCommitAuthorName, $providerCommitAuthorUrl, $providerCommitMessage, $providerCommitUrl, '', false, $dbForPlatform, $queueForBuilds, $getProjectDB, $request);
}
} elseif ($event == $github::EVENT_INSTALLATION) {
if ($parsedPayload["action"] == "deleted") {
diff --git a/app/init/constants.php b/app/init/constants.php
index 0e69dd737c..f2f9f82698 100644
--- a/app/init/constants.php
+++ b/app/init/constants.php
@@ -80,6 +80,8 @@ const APP_COMPUTE_SPECIFICATION_DEFAULT = Specification::S_1VCPU_512MB;
const APP_PLATFORM_SERVER = 'server';
const APP_PLATFORM_CLIENT = 'client';
const APP_PLATFORM_CONSOLE = 'console';
+const APP_VCS_GITHUB_USERNAME = 'Appwrite';
+const APP_VCS_GITHUB_EMAIL = 'team@appwrite.io';
// Database Reconnect
const DATABASE_RECONNECT_SLEEP = 2;
diff --git a/app/init/resources.php b/app/init/resources.php
index b75c32cba0..0193da60b1 100644
--- a/app/init/resources.php
+++ b/app/init/resources.php
@@ -80,15 +80,27 @@ App::setResource('localeCodes', function () {
App::setResource('publisher', function (Group $pools) {
return new BrokerPool(publisher: $pools->get('publisher'));
}, ['pools']);
-App::setResource('publisherRedis', function () {
- // Stub
-});
+App::setResource('publisherDatabases', function (BrokerPool $publisher) {
+ return $publisher;
+}, ['publisher']);
+App::setResource('publisherMigrations', function (BrokerPool $publisher) {
+ return $publisher;
+}, ['publisher']);
+App::setResource('publisherStatsUsage', function (BrokerPool $publisher) {
+ return $publisher;
+}, ['publisher']);
App::setResource('consumer', function (Group $pools) {
return new BrokerPool(consumer: $pools->get('consumer'));
}, ['pools']);
-App::setResource('consumerRedis', function () {
- // Stub
-});
+App::setResource('consumerDatabases', function (BrokerPool $consumer) {
+ return $consumer;
+}, ['consumer']);
+App::setResource('consumerMigrations', function (BrokerPool $consumer) {
+ return $consumer;
+}, ['publisher']);
+App::setResource('consumerStatsUsage', function (BrokerPool $consumer) {
+ return $consumer;
+}, ['publisher']);
App::setResource('queueForMessaging', function (Publisher $publisher) {
return new Messaging($publisher);
}, ['publisher']);
diff --git a/app/worker.php b/app/worker.php
index 4f0f569a9e..90f3368fe7 100644
--- a/app/worker.php
+++ b/app/worker.php
@@ -247,17 +247,33 @@ Server::setResource('publisher', function (Group $pools) {
return new BrokerPool(publisher: $pools->get('publisher'));
}, ['pools']);
-Server::setResource('publisherRedis', function () {
- // Stub
-});
+Server::setResource('publisherDatabases', function (BrokerPool $publisher) {
+ return $publisher;
+}, ['publisher']);
+
+Server::setResource('publisherMigrations', function (BrokerPool $publisher) {
+ return $publisher;
+}, ['publisher']);
+
+Server::setResource('publisherStatsUsage', function (BrokerPool $publisher) {
+ return $publisher;
+}, ['publisher']);
Server::setResource('consumer', function (Group $pools) {
return new BrokerPool(consumer: $pools->get('consumer'));
}, ['pools']);
-Server::setResource('consumerRedis', function () {
- // Stub
-});
+Server::setResource('consumerDatabases', function (BrokerPool $consumer) {
+ return $consumer;
+}, ['consumer']);
+
+Server::setResource('consumerMigrations', function (BrokerPool $consumer) {
+ return $consumer;
+}, ['consumer']);
+
+Server::setResource('consumerStatsUsage', function (BrokerPool $consumer) {
+ return $consumer;
+}, ['consumer']);
Server::setResource('queueForStatsUsage', function (Publisher $publisher) {
return new StatsUsage($publisher);
diff --git a/composer.json b/composer.json
index 1ebd6716e3..aca7b9cda5 100644
--- a/composer.json
+++ b/composer.json
@@ -73,7 +73,7 @@
"utopia-php/swoole": "0.8.*",
"utopia-php/system": "0.9.*",
"utopia-php/telemetry": "0.1.*",
- "utopia-php/vcs": "0.10.*",
+ "utopia-php/vcs": "0.11.*",
"utopia-php/websocket": "0.3.*",
"matomo/device-detector": "6.1.*",
"dragonmantank/cron-expression": "3.3.*",
diff --git a/composer.lock b/composer.lock
index 618c8c704e..a5207b2590 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4587,16 +4587,16 @@
},
{
"name": "utopia-php/vcs",
- "version": "0.10.5",
+ "version": "0.11.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/vcs.git",
- "reference": "b358439dc387f6097019eb83ebb9fc258fe9da05"
+ "reference": "0e665eaa7d906168525bf6aac50b6bcc3e4fe528"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/utopia-php/vcs/zipball/b358439dc387f6097019eb83ebb9fc258fe9da05",
- "reference": "b358439dc387f6097019eb83ebb9fc258fe9da05",
+ "url": "https://api.github.com/repos/utopia-php/vcs/zipball/0e665eaa7d906168525bf6aac50b6bcc3e4fe528",
+ "reference": "0e665eaa7d906168525bf6aac50b6bcc3e4fe528",
"shasum": ""
},
"require": {
@@ -4630,9 +4630,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/vcs/issues",
- "source": "https://github.com/utopia-php/vcs/tree/0.10.5"
+ "source": "https://github.com/utopia-php/vcs/tree/0.11.0"
},
- "time": "2025-06-10T15:01:16+00:00"
+ "time": "2025-07-23T13:54:58+00:00"
},
{
"name": "utopia-php/websocket",
diff --git a/docs/examples/1.7.x/client-android/java/databases/create-document.md b/docs/examples/1.7.x/client-android/java/databases/create-document.md
index 7fb129bb0b..4804d751e3 100644
--- a/docs/examples/1.7.x/client-android/java/databases/create-document.md
+++ b/docs/examples/1.7.x/client-android/java/databases/create-document.md
@@ -4,9 +4,7 @@ import io.appwrite.services.Databases;
Client client = new Client(context)
.setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
- .setSession("") // The user session to authenticate with
- .setKey("") //
- .setJWT(""); // Your secret JSON Web Token
+ .setProject(""); // Your project ID
Databases databases = new Databases(client);
diff --git a/docs/examples/1.7.x/client-android/java/databases/decrement-document-attribute.md b/docs/examples/1.7.x/client-android/java/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..de6a4ab48d
--- /dev/null
+++ b/docs/examples/1.7.x/client-android/java/databases/decrement-document-attribute.md
@@ -0,0 +1,27 @@
+import io.appwrite.Client;
+import io.appwrite.coroutines.CoroutineCallback;
+import io.appwrite.services.Databases;
+
+Client client = new Client(context)
+ .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .setProject(""); // Your project ID
+
+Databases databases = new Databases(client);
+
+databases.decrementDocumentAttribute(
+ "", // databaseId
+ "", // collectionId
+ "", // documentId
+ "", // attribute
+ 0, // value (optional)
+ 0, // min (optional)
+ new CoroutineCallback<>((result, error) -> {
+ if (error != null) {
+ error.printStackTrace();
+ return;
+ }
+
+ Log.d("Appwrite", result.toString());
+ })
+);
+
diff --git a/docs/examples/1.7.x/client-android/java/databases/increment-document-attribute.md b/docs/examples/1.7.x/client-android/java/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..94ffa9d749
--- /dev/null
+++ b/docs/examples/1.7.x/client-android/java/databases/increment-document-attribute.md
@@ -0,0 +1,27 @@
+import io.appwrite.Client;
+import io.appwrite.coroutines.CoroutineCallback;
+import io.appwrite.services.Databases;
+
+Client client = new Client(context)
+ .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .setProject(""); // Your project ID
+
+Databases databases = new Databases(client);
+
+databases.incrementDocumentAttribute(
+ "", // databaseId
+ "", // collectionId
+ "", // documentId
+ "", // attribute
+ 0, // value (optional)
+ 0, // max (optional)
+ new CoroutineCallback<>((result, error) -> {
+ if (error != null) {
+ error.printStackTrace();
+ return;
+ }
+
+ Log.d("Appwrite", result.toString());
+ })
+);
+
diff --git a/docs/examples/1.7.x/client-android/kotlin/databases/create-document.md b/docs/examples/1.7.x/client-android/kotlin/databases/create-document.md
index 0bafb315e7..849a636afb 100644
--- a/docs/examples/1.7.x/client-android/kotlin/databases/create-document.md
+++ b/docs/examples/1.7.x/client-android/kotlin/databases/create-document.md
@@ -4,9 +4,7 @@ import io.appwrite.services.Databases
val client = Client(context)
.setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
- .setSession("") // The user session to authenticate with
- .setKey("") //
- .setJWT("") // Your secret JSON Web Token
+ .setProject("") // Your project ID
val databases = Databases(client)
diff --git a/docs/examples/1.7.x/client-android/kotlin/databases/decrement-document-attribute.md b/docs/examples/1.7.x/client-android/kotlin/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..c500fa8687
--- /dev/null
+++ b/docs/examples/1.7.x/client-android/kotlin/databases/decrement-document-attribute.md
@@ -0,0 +1,18 @@
+import io.appwrite.Client
+import io.appwrite.coroutines.CoroutineCallback
+import io.appwrite.services.Databases
+
+val client = Client(context)
+ .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .setProject("") // Your project ID
+
+val databases = Databases(client)
+
+val result = databases.decrementDocumentAttribute(
+ databaseId = "",
+ collectionId = "",
+ documentId = "",
+ attribute = "",
+ value = 0, // (optional)
+ min = 0, // (optional)
+)
\ No newline at end of file
diff --git a/docs/examples/1.7.x/client-android/kotlin/databases/increment-document-attribute.md b/docs/examples/1.7.x/client-android/kotlin/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..0ae6b02d3d
--- /dev/null
+++ b/docs/examples/1.7.x/client-android/kotlin/databases/increment-document-attribute.md
@@ -0,0 +1,18 @@
+import io.appwrite.Client
+import io.appwrite.coroutines.CoroutineCallback
+import io.appwrite.services.Databases
+
+val client = Client(context)
+ .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .setProject("") // Your project ID
+
+val databases = Databases(client)
+
+val result = databases.incrementDocumentAttribute(
+ databaseId = "",
+ collectionId = "",
+ documentId = "",
+ attribute = "",
+ value = 0, // (optional)
+ max = 0, // (optional)
+)
\ No newline at end of file
diff --git a/docs/examples/1.7.x/client-apple/examples/databases/create-document.md b/docs/examples/1.7.x/client-apple/examples/databases/create-document.md
index 6c2baee728..51adb64bb3 100644
--- a/docs/examples/1.7.x/client-apple/examples/databases/create-document.md
+++ b/docs/examples/1.7.x/client-apple/examples/databases/create-document.md
@@ -2,9 +2,7 @@ import Appwrite
let client = Client()
.setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
- .setSession("") // The user session to authenticate with
- .setKey("") //
- .setJWT("") // Your secret JSON Web Token
+ .setProject("") // Your project ID
let databases = Databases(client)
diff --git a/docs/examples/1.7.x/client-apple/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/client-apple/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..8ef2637bf2
--- /dev/null
+++ b/docs/examples/1.7.x/client-apple/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,17 @@
+import Appwrite
+
+let client = Client()
+ .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .setProject("") // Your project ID
+
+let databases = Databases(client)
+
+let document = try await databases.decrementDocumentAttribute(
+ databaseId: "",
+ collectionId: "",
+ documentId: "",
+ attribute: "",
+ value: 0, // optional
+ min: 0 // optional
+)
+
diff --git a/docs/examples/1.7.x/client-apple/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/client-apple/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..f64b2cd76c
--- /dev/null
+++ b/docs/examples/1.7.x/client-apple/examples/databases/increment-document-attribute.md
@@ -0,0 +1,17 @@
+import Appwrite
+
+let client = Client()
+ .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .setProject("") // Your project ID
+
+let databases = Databases(client)
+
+let document = try await databases.incrementDocumentAttribute(
+ databaseId: "",
+ collectionId: "",
+ documentId: "",
+ attribute: "",
+ value: 0, // optional
+ max: 0 // optional
+)
+
diff --git a/docs/examples/1.7.x/client-flutter/examples/databases/create-document.md b/docs/examples/1.7.x/client-flutter/examples/databases/create-document.md
index 4f286fff95..27efc34580 100644
--- a/docs/examples/1.7.x/client-flutter/examples/databases/create-document.md
+++ b/docs/examples/1.7.x/client-flutter/examples/databases/create-document.md
@@ -2,9 +2,7 @@ import 'package:appwrite/appwrite.dart';
Client client = Client()
.setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
- .setSession('') // The user session to authenticate with
- .setKey('') //
- .setJWT(''); // Your secret JSON Web Token
+ .setProject(''); // Your project ID
Databases databases = Databases(client);
diff --git a/docs/examples/1.7.x/client-flutter/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/client-flutter/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..ec0d9ee300
--- /dev/null
+++ b/docs/examples/1.7.x/client-flutter/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,16 @@
+import 'package:appwrite/appwrite.dart';
+
+Client client = Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject(''); // Your project ID
+
+Databases databases = Databases(client);
+
+Document result = await databases.decrementDocumentAttribute(
+ databaseId: '',
+ collectionId: '',
+ documentId: '',
+ attribute: '',
+ value: 0, // optional
+ min: 0, // optional
+);
diff --git a/docs/examples/1.7.x/client-flutter/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/client-flutter/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..78f5b0cb6f
--- /dev/null
+++ b/docs/examples/1.7.x/client-flutter/examples/databases/increment-document-attribute.md
@@ -0,0 +1,16 @@
+import 'package:appwrite/appwrite.dart';
+
+Client client = Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject(''); // Your project ID
+
+Databases databases = Databases(client);
+
+Document result = await databases.incrementDocumentAttribute(
+ databaseId: '',
+ collectionId: '',
+ documentId: '',
+ attribute: '',
+ value: 0, // optional
+ max: 0, // optional
+);
diff --git a/docs/examples/1.7.x/client-graphql/examples/databases/create-document.md b/docs/examples/1.7.x/client-graphql/examples/databases/create-document.md
index 4e2d90660b..4f525d6b1f 100644
--- a/docs/examples/1.7.x/client-graphql/examples/databases/create-document.md
+++ b/docs/examples/1.7.x/client-graphql/examples/databases/create-document.md
@@ -7,6 +7,7 @@ mutation {
permissions: ["read("any")"]
) {
_id
+ _sequence
_collectionId
_databaseId
_createdAt
diff --git a/docs/examples/1.7.x/client-graphql/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/client-graphql/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..2e7970049d
--- /dev/null
+++ b/docs/examples/1.7.x/client-graphql/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,19 @@
+mutation {
+ databasesDecrementDocumentAttribute(
+ databaseId: "",
+ collectionId: "",
+ documentId: "",
+ attribute: "",
+ value: 0,
+ min: 0
+ ) {
+ _id
+ _sequence
+ _collectionId
+ _databaseId
+ _createdAt
+ _updatedAt
+ _permissions
+ data
+ }
+}
diff --git a/docs/examples/1.7.x/client-graphql/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/client-graphql/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..322ed69ced
--- /dev/null
+++ b/docs/examples/1.7.x/client-graphql/examples/databases/increment-document-attribute.md
@@ -0,0 +1,19 @@
+mutation {
+ databasesIncrementDocumentAttribute(
+ databaseId: "",
+ collectionId: "",
+ documentId: "",
+ attribute: "",
+ value: 0,
+ max: 0
+ ) {
+ _id
+ _sequence
+ _collectionId
+ _databaseId
+ _createdAt
+ _updatedAt
+ _permissions
+ data
+ }
+}
diff --git a/docs/examples/1.7.x/client-graphql/examples/databases/update-document.md b/docs/examples/1.7.x/client-graphql/examples/databases/update-document.md
index 5e80894620..aea605d9d7 100644
--- a/docs/examples/1.7.x/client-graphql/examples/databases/update-document.md
+++ b/docs/examples/1.7.x/client-graphql/examples/databases/update-document.md
@@ -7,6 +7,7 @@ mutation {
permissions: ["read("any")"]
) {
_id
+ _sequence
_collectionId
_databaseId
_createdAt
diff --git a/docs/examples/1.7.x/client-graphql/examples/databases/upsert-document.md b/docs/examples/1.7.x/client-graphql/examples/databases/upsert-document.md
index 2ccab1c490..9d1e753081 100644
--- a/docs/examples/1.7.x/client-graphql/examples/databases/upsert-document.md
+++ b/docs/examples/1.7.x/client-graphql/examples/databases/upsert-document.md
@@ -7,6 +7,7 @@ mutation {
permissions: ["read("any")"]
) {
_id
+ _sequence
_collectionId
_databaseId
_createdAt
diff --git a/docs/examples/1.7.x/client-react-native/examples/databases/create-document.md b/docs/examples/1.7.x/client-react-native/examples/databases/create-document.md
index ec768fcfaf..1b28231ed3 100644
--- a/docs/examples/1.7.x/client-react-native/examples/databases/create-document.md
+++ b/docs/examples/1.7.x/client-react-native/examples/databases/create-document.md
@@ -2,9 +2,7 @@ import { Client, Databases } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
- .setSession('') // The user session to authenticate with
- .setKey('') //
- .setJWT(''); // Your secret JSON Web Token
+ .setProject(''); // Your project ID
const databases = new Databases(client);
diff --git a/docs/examples/1.7.x/client-react-native/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/client-react-native/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..4c9c2d9923
--- /dev/null
+++ b/docs/examples/1.7.x/client-react-native/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,18 @@
+import { Client, Databases } from "react-native-appwrite";
+
+const client = new Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject(''); // Your project ID
+
+const databases = new Databases(client);
+
+const result = await databases.decrementDocumentAttribute(
+ '', // databaseId
+ '', // collectionId
+ '', // documentId
+ '', // attribute
+ null, // value (optional)
+ null // min (optional)
+);
+
+console.log(result);
diff --git a/docs/examples/1.7.x/client-react-native/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/client-react-native/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..3a9d94904f
--- /dev/null
+++ b/docs/examples/1.7.x/client-react-native/examples/databases/increment-document-attribute.md
@@ -0,0 +1,18 @@
+import { Client, Databases } from "react-native-appwrite";
+
+const client = new Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject(''); // Your project ID
+
+const databases = new Databases(client);
+
+const result = await databases.incrementDocumentAttribute(
+ '', // databaseId
+ '', // collectionId
+ '', // documentId
+ '', // attribute
+ null, // value (optional)
+ null // max (optional)
+);
+
+console.log(result);
diff --git a/docs/examples/1.7.x/client-rest/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/client-rest/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..7f056fb965
--- /dev/null
+++ b/docs/examples/1.7.x/client-rest/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,12 @@
+PATCH /v1/databases/{databaseId}/collections/{collectionId}/documents/{documentId}/{attribute}/decrement HTTP/1.1
+Host: cloud.appwrite.io
+Content-Type: application/json
+X-Appwrite-Response-Format: 1.7.0
+X-Appwrite-Project:
+X-Appwrite-Session:
+X-Appwrite-JWT:
+
+{
+ "value": 0,
+ "min": 0
+}
diff --git a/docs/examples/1.7.x/client-rest/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/client-rest/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..002d10238b
--- /dev/null
+++ b/docs/examples/1.7.x/client-rest/examples/databases/increment-document-attribute.md
@@ -0,0 +1,12 @@
+PATCH /v1/databases/{databaseId}/collections/{collectionId}/documents/{documentId}/{attribute}/increment HTTP/1.1
+Host: cloud.appwrite.io
+Content-Type: application/json
+X-Appwrite-Response-Format: 1.7.0
+X-Appwrite-Project:
+X-Appwrite-Session:
+X-Appwrite-JWT:
+
+{
+ "value": 0,
+ "max": 0
+}
diff --git a/docs/examples/1.7.x/client-web/examples/databases/create-document.md b/docs/examples/1.7.x/client-web/examples/databases/create-document.md
index 401a67488c..916cc92689 100644
--- a/docs/examples/1.7.x/client-web/examples/databases/create-document.md
+++ b/docs/examples/1.7.x/client-web/examples/databases/create-document.md
@@ -2,9 +2,7 @@ import { Client, Databases } from "appwrite";
const client = new Client()
.setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
- .setSession('') // The user session to authenticate with
- .setKey('') //
- .setJWT(''); // Your secret JSON Web Token
+ .setProject(''); // Your project ID
const databases = new Databases(client);
diff --git a/docs/examples/1.7.x/client-web/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/client-web/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..10d785a9a8
--- /dev/null
+++ b/docs/examples/1.7.x/client-web/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,18 @@
+import { Client, Databases } from "appwrite";
+
+const client = new Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject(''); // Your project ID
+
+const databases = new Databases(client);
+
+const result = await databases.decrementDocumentAttribute(
+ '', // databaseId
+ '', // collectionId
+ '', // documentId
+ '', // attribute
+ null, // value (optional)
+ null // min (optional)
+);
+
+console.log(result);
diff --git a/docs/examples/1.7.x/client-web/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/client-web/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..4b32be959c
--- /dev/null
+++ b/docs/examples/1.7.x/client-web/examples/databases/increment-document-attribute.md
@@ -0,0 +1,18 @@
+import { Client, Databases } from "appwrite";
+
+const client = new Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject(''); // Your project ID
+
+const databases = new Databases(client);
+
+const result = await databases.incrementDocumentAttribute(
+ '', // databaseId
+ '', // collectionId
+ '', // documentId
+ '', // attribute
+ null, // value (optional)
+ null // max (optional)
+);
+
+console.log(result);
diff --git a/docs/examples/1.7.x/console-cli/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/console-cli/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..e6607ea833
--- /dev/null
+++ b/docs/examples/1.7.x/console-cli/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,7 @@
+appwrite databases decrementDocumentAttribute \
+ --databaseId \
+ --collectionId \
+ --documentId \
+ --attribute '' \
+
+
diff --git a/docs/examples/1.7.x/console-cli/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/console-cli/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..8a5150eebd
--- /dev/null
+++ b/docs/examples/1.7.x/console-cli/examples/databases/increment-document-attribute.md
@@ -0,0 +1,7 @@
+appwrite databases incrementDocumentAttribute \
+ --databaseId \
+ --collectionId \
+ --documentId \
+ --attribute '' \
+
+
diff --git a/docs/examples/1.7.x/console-web/examples/databases/create-document.md b/docs/examples/1.7.x/console-web/examples/databases/create-document.md
index 4524017dd5..1b96d07899 100644
--- a/docs/examples/1.7.x/console-web/examples/databases/create-document.md
+++ b/docs/examples/1.7.x/console-web/examples/databases/create-document.md
@@ -2,9 +2,7 @@ import { Client, Databases } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
- .setSession('') //
- .setKey('') // Your secret API key
- .setJWT(''); // Your secret JSON Web Token
+ .setProject(''); // Your project ID
const databases = new Databases(client);
diff --git a/docs/examples/1.7.x/console-web/examples/databases/create-documents.md b/docs/examples/1.7.x/console-web/examples/databases/create-documents.md
index 9651a99775..09f3007208 100644
--- a/docs/examples/1.7.x/console-web/examples/databases/create-documents.md
+++ b/docs/examples/1.7.x/console-web/examples/databases/create-documents.md
@@ -2,7 +2,7 @@ import { Client, Databases } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
- .setKey(''); // Your secret API key
+ .setProject(''); // Your project ID
const databases = new Databases(client);
diff --git a/docs/examples/1.7.x/console-web/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/console-web/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..f090f53b49
--- /dev/null
+++ b/docs/examples/1.7.x/console-web/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,18 @@
+import { Client, Databases } from "@appwrite.io/console";
+
+const client = new Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject(''); // Your project ID
+
+const databases = new Databases(client);
+
+const result = await databases.decrementDocumentAttribute(
+ '', // databaseId
+ '', // collectionId
+ '', // documentId
+ '', // attribute
+ null, // value (optional)
+ null // min (optional)
+);
+
+console.log(result);
diff --git a/docs/examples/1.7.x/console-web/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/console-web/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..62ebd6fe3c
--- /dev/null
+++ b/docs/examples/1.7.x/console-web/examples/databases/increment-document-attribute.md
@@ -0,0 +1,18 @@
+import { Client, Databases } from "@appwrite.io/console";
+
+const client = new Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject(''); // Your project ID
+
+const databases = new Databases(client);
+
+const result = await databases.incrementDocumentAttribute(
+ '', // databaseId
+ '', // collectionId
+ '', // documentId
+ '', // attribute
+ null, // value (optional)
+ null // max (optional)
+);
+
+console.log(result);
diff --git a/docs/examples/1.7.x/console-web/examples/databases/upsert-document.md b/docs/examples/1.7.x/console-web/examples/databases/upsert-document.md
new file mode 100644
index 0000000000..3b89ed3aef
--- /dev/null
+++ b/docs/examples/1.7.x/console-web/examples/databases/upsert-document.md
@@ -0,0 +1,17 @@
+import { Client, Databases } from "@appwrite.io/console";
+
+const client = new Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject(''); // Your project ID
+
+const databases = new Databases(client);
+
+const result = await databases.upsertDocument(
+ '', // databaseId
+ '', // collectionId
+ '', // documentId
+ {}, // data
+ ["read("any")"] // permissions (optional)
+);
+
+console.log(result);
diff --git a/docs/examples/1.7.x/console-web/examples/databases/upsert-documents.md b/docs/examples/1.7.x/console-web/examples/databases/upsert-documents.md
index c58bd1e99c..2d12f7caec 100644
--- a/docs/examples/1.7.x/console-web/examples/databases/upsert-documents.md
+++ b/docs/examples/1.7.x/console-web/examples/databases/upsert-documents.md
@@ -9,7 +9,7 @@ const databases = new Databases(client);
const result = await databases.upsertDocuments(
'', // databaseId
'', // collectionId
- [] // documents (optional)
+ [] // documents
);
console.log(result);
diff --git a/docs/examples/1.7.x/console-web/examples/proxy/create-redirect-rule.md b/docs/examples/1.7.x/console-web/examples/proxy/create-redirect-rule.md
index 43b3f79d8a..294e496987 100644
--- a/docs/examples/1.7.x/console-web/examples/proxy/create-redirect-rule.md
+++ b/docs/examples/1.7.x/console-web/examples/proxy/create-redirect-rule.md
@@ -1,4 +1,4 @@
-import { Client, Proxy, } from "@appwrite.io/console";
+import { Client, Proxy, , ProxyResourceType } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
@@ -9,7 +9,9 @@ const proxy = new Proxy(client);
const result = await proxy.createRedirectRule(
'', // domain
'https://example.com', // url
- .MovedPermanently301 // statusCode
+ .MovedPermanently301, // statusCode
+ '', // resourceId
+ ProxyResourceType.Site // resourceType
);
console.log(result);
diff --git a/docs/examples/1.7.x/console-web/examples/vcs/get-repository-contents.md b/docs/examples/1.7.x/console-web/examples/vcs/get-repository-contents.md
index 8a04ba1ae4..6d0cbd19ee 100644
--- a/docs/examples/1.7.x/console-web/examples/vcs/get-repository-contents.md
+++ b/docs/examples/1.7.x/console-web/examples/vcs/get-repository-contents.md
@@ -9,7 +9,8 @@ const vcs = new Vcs(client);
const result = await vcs.getRepositoryContents(
'', // installationId
'', // providerRepositoryId
- '' // providerRootDirectory (optional)
+ '', // providerRootDirectory (optional)
+ '' // providerReference (optional)
);
console.log(result);
diff --git a/docs/examples/1.7.x/server-dart/examples/databases/create-document.md b/docs/examples/1.7.x/server-dart/examples/databases/create-document.md
index 1c9af5112c..1d58fc586c 100644
--- a/docs/examples/1.7.x/server-dart/examples/databases/create-document.md
+++ b/docs/examples/1.7.x/server-dart/examples/databases/create-document.md
@@ -2,9 +2,8 @@ import 'package:dart_appwrite/dart_appwrite.dart';
Client client = Client()
.setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
- .setSession('') // The user session to authenticate with
- .setKey('') // Your secret API key
- .setJWT(''); // Your secret JSON Web Token
+ .setProject('') // Your project ID
+ .setSession(''); // The user session to authenticate with
Databases databases = Databases(client);
diff --git a/docs/examples/1.7.x/server-dart/examples/databases/create-documents.md b/docs/examples/1.7.x/server-dart/examples/databases/create-documents.md
index 7b4409a0b1..ba0e34950b 100644
--- a/docs/examples/1.7.x/server-dart/examples/databases/create-documents.md
+++ b/docs/examples/1.7.x/server-dart/examples/databases/create-documents.md
@@ -2,6 +2,7 @@ import 'package:dart_appwrite/dart_appwrite.dart';
Client client = Client()
.setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject('') // Your project ID
.setKey(''); // Your secret API key
Databases databases = Databases(client);
diff --git a/docs/examples/1.7.x/server-dart/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/server-dart/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..c8ec38dab8
--- /dev/null
+++ b/docs/examples/1.7.x/server-dart/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,17 @@
+import 'package:dart_appwrite/dart_appwrite.dart';
+
+Client client = Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject('') // Your project ID
+ .setKey(''); // Your secret API key
+
+Databases databases = Databases(client);
+
+Document result = await databases.decrementDocumentAttribute(
+ databaseId: '',
+ collectionId: '',
+ documentId: '',
+ attribute: '',
+ value: 0, // (optional)
+ min: 0, // (optional)
+);
diff --git a/docs/examples/1.7.x/server-dart/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/server-dart/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..6e5134b03a
--- /dev/null
+++ b/docs/examples/1.7.x/server-dart/examples/databases/increment-document-attribute.md
@@ -0,0 +1,17 @@
+import 'package:dart_appwrite/dart_appwrite.dart';
+
+Client client = Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject('') // Your project ID
+ .setKey(''); // Your secret API key
+
+Databases databases = Databases(client);
+
+Document result = await databases.incrementDocumentAttribute(
+ databaseId: '',
+ collectionId: '',
+ documentId: '',
+ attribute: '',
+ value: 0, // (optional)
+ max: 0, // (optional)
+);
diff --git a/docs/examples/1.7.x/server-deno/examples/databases/create-document.md b/docs/examples/1.7.x/server-deno/examples/databases/create-document.md
index f18b4f30dc..be8a1bdac9 100644
--- a/docs/examples/1.7.x/server-deno/examples/databases/create-document.md
+++ b/docs/examples/1.7.x/server-deno/examples/databases/create-document.md
@@ -2,9 +2,8 @@ import { Client, Databases } from "https://deno.land/x/appwrite/mod.ts";
const client = new Client()
.setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
- .setSession('') // The user session to authenticate with
- .setKey('') // Your secret API key
- .setJWT(''); // Your secret JSON Web Token
+ .setProject('') // Your project ID
+ .setSession(''); // The user session to authenticate with
const databases = new Databases(client);
diff --git a/docs/examples/1.7.x/server-deno/examples/databases/create-documents.md b/docs/examples/1.7.x/server-deno/examples/databases/create-documents.md
index f5e320e193..26c9796cf0 100644
--- a/docs/examples/1.7.x/server-deno/examples/databases/create-documents.md
+++ b/docs/examples/1.7.x/server-deno/examples/databases/create-documents.md
@@ -2,6 +2,7 @@ import { Client, Databases } from "https://deno.land/x/appwrite/mod.ts";
const client = new Client()
.setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject('') // Your project ID
.setKey(''); // Your secret API key
const databases = new Databases(client);
diff --git a/docs/examples/1.7.x/server-deno/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/server-deno/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..0142188185
--- /dev/null
+++ b/docs/examples/1.7.x/server-deno/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,17 @@
+import { Client, Databases } from "https://deno.land/x/appwrite/mod.ts";
+
+const client = new Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject('') // Your project ID
+ .setKey(''); // Your secret API key
+
+const databases = new Databases(client);
+
+const response = await databases.decrementDocumentAttribute(
+ '', // databaseId
+ '', // collectionId
+ '', // documentId
+ '', // attribute
+ null, // value (optional)
+ null // min (optional)
+);
diff --git a/docs/examples/1.7.x/server-deno/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/server-deno/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..9202a94bb9
--- /dev/null
+++ b/docs/examples/1.7.x/server-deno/examples/databases/increment-document-attribute.md
@@ -0,0 +1,17 @@
+import { Client, Databases } from "https://deno.land/x/appwrite/mod.ts";
+
+const client = new Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject('') // Your project ID
+ .setKey(''); // Your secret API key
+
+const databases = new Databases(client);
+
+const response = await databases.incrementDocumentAttribute(
+ '', // databaseId
+ '', // collectionId
+ '', // documentId
+ '', // attribute
+ null, // value (optional)
+ null // max (optional)
+);
diff --git a/docs/examples/1.7.x/server-deno/examples/databases/upsert-document.md b/docs/examples/1.7.x/server-deno/examples/databases/upsert-document.md
new file mode 100644
index 0000000000..f05100e3df
--- /dev/null
+++ b/docs/examples/1.7.x/server-deno/examples/databases/upsert-document.md
@@ -0,0 +1,16 @@
+import { Client, Databases } from "https://deno.land/x/appwrite/mod.ts";
+
+const client = new Client()
+ .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint
+ .setProject('') // Your project ID
+ .setSession(''); // The user session to authenticate with
+
+const databases = new Databases(client);
+
+const response = await databases.upsertDocument(
+ '', // databaseId
+ '', // collectionId
+ '', // documentId
+ {}, // data
+ ["read("any")"] // permissions (optional)
+);
diff --git a/docs/examples/1.7.x/server-deno/examples/databases/upsert-documents.md b/docs/examples/1.7.x/server-deno/examples/databases/upsert-documents.md
index c0ee477875..0cd804bfb6 100644
--- a/docs/examples/1.7.x/server-deno/examples/databases/upsert-documents.md
+++ b/docs/examples/1.7.x/server-deno/examples/databases/upsert-documents.md
@@ -10,5 +10,5 @@ const databases = new Databases(client);
const response = await databases.upsertDocuments(
'', // databaseId
'', // collectionId
- [] // documents (optional)
+ [] // documents
);
diff --git a/docs/examples/1.7.x/server-dotnet/examples/databases/create-document.md b/docs/examples/1.7.x/server-dotnet/examples/databases/create-document.md
index cb4bc62ced..52254e0c25 100644
--- a/docs/examples/1.7.x/server-dotnet/examples/databases/create-document.md
+++ b/docs/examples/1.7.x/server-dotnet/examples/databases/create-document.md
@@ -4,9 +4,8 @@ using Appwrite.Services;
Client client = new Client()
.SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
- .SetSession("") // The user session to authenticate with
- .SetKey("") // Your secret API key
- .SetJWT(""); // Your secret JSON Web Token
+ .SetProject("") // Your project ID
+ .SetSession(""); // The user session to authenticate with
Databases databases = new Databases(client);
diff --git a/docs/examples/1.7.x/server-dotnet/examples/databases/create-documents.md b/docs/examples/1.7.x/server-dotnet/examples/databases/create-documents.md
index 495a3080fa..dad710f0df 100644
--- a/docs/examples/1.7.x/server-dotnet/examples/databases/create-documents.md
+++ b/docs/examples/1.7.x/server-dotnet/examples/databases/create-documents.md
@@ -4,6 +4,7 @@ using Appwrite.Services;
Client client = new Client()
.SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .SetProject("") // Your project ID
.SetKey(""); // Your secret API key
Databases databases = new Databases(client);
diff --git a/docs/examples/1.7.x/server-dotnet/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/server-dotnet/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..c327458f61
--- /dev/null
+++ b/docs/examples/1.7.x/server-dotnet/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,19 @@
+using Appwrite;
+using Appwrite.Models;
+using Appwrite.Services;
+
+Client client = new Client()
+ .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .SetProject("") // Your project ID
+ .SetKey(""); // Your secret API key
+
+Databases databases = new Databases(client);
+
+Document result = await databases.DecrementDocumentAttribute(
+ databaseId: "",
+ collectionId: "",
+ documentId: "",
+ attribute: "",
+ value: 0, // optional
+ min: 0 // optional
+);
\ No newline at end of file
diff --git a/docs/examples/1.7.x/server-dotnet/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/server-dotnet/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..be52584aaf
--- /dev/null
+++ b/docs/examples/1.7.x/server-dotnet/examples/databases/increment-document-attribute.md
@@ -0,0 +1,19 @@
+using Appwrite;
+using Appwrite.Models;
+using Appwrite.Services;
+
+Client client = new Client()
+ .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .SetProject("") // Your project ID
+ .SetKey(""); // Your secret API key
+
+Databases databases = new Databases(client);
+
+Document result = await databases.IncrementDocumentAttribute(
+ databaseId: "",
+ collectionId: "",
+ documentId: "",
+ attribute: "",
+ value: 0, // optional
+ max: 0 // optional
+);
\ No newline at end of file
diff --git a/docs/examples/1.7.x/server-go/examples/databases/create-document.md b/docs/examples/1.7.x/server-go/examples/databases/create-document.md
index 8990beaa8d..fe96a0d601 100644
--- a/docs/examples/1.7.x/server-go/examples/databases/create-document.md
+++ b/docs/examples/1.7.x/server-go/examples/databases/create-document.md
@@ -9,9 +9,8 @@ import (
func main() {
client := client.New(
client.WithEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ client.WithProject("") // Your project ID
client.WithSession("") // The user session to authenticate with
- client.WithKey("") // Your secret API key
- client.WithJWT("") // Your secret JSON Web Token
)
service := databases.New(client)
diff --git a/docs/examples/1.7.x/server-go/examples/databases/create-documents.md b/docs/examples/1.7.x/server-go/examples/databases/create-documents.md
index d9492df5f7..9e4da5dac7 100644
--- a/docs/examples/1.7.x/server-go/examples/databases/create-documents.md
+++ b/docs/examples/1.7.x/server-go/examples/databases/create-documents.md
@@ -9,6 +9,7 @@ import (
func main() {
client := client.New(
client.WithEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ client.WithProject("") // Your project ID
client.WithKey("") // Your secret API key
)
diff --git a/docs/examples/1.7.x/server-go/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/server-go/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..1d9c094030
--- /dev/null
+++ b/docs/examples/1.7.x/server-go/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,31 @@
+package main
+
+import (
+ "fmt"
+ "github.com/appwrite/sdk-for-go/client"
+ "github.com/appwrite/sdk-for-go/databases"
+)
+
+func main() {
+ client := client.New(
+ client.WithEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ client.WithProject("") // Your project ID
+ client.WithKey("") // Your secret API key
+ )
+
+ service := databases.New(client)
+ response, error := service.DecrementDocumentAttribute(
+ "",
+ "",
+ "",
+ "",
+ databases.WithDecrementDocumentAttributeValue(0),
+ databases.WithDecrementDocumentAttributeMin(0),
+ )
+
+ if error != nil {
+ panic(error)
+ }
+
+ fmt.Println(response)
+}
diff --git a/docs/examples/1.7.x/server-go/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/server-go/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..fa63e9c8df
--- /dev/null
+++ b/docs/examples/1.7.x/server-go/examples/databases/increment-document-attribute.md
@@ -0,0 +1,31 @@
+package main
+
+import (
+ "fmt"
+ "github.com/appwrite/sdk-for-go/client"
+ "github.com/appwrite/sdk-for-go/databases"
+)
+
+func main() {
+ client := client.New(
+ client.WithEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ client.WithProject("") // Your project ID
+ client.WithKey("") // Your secret API key
+ )
+
+ service := databases.New(client)
+ response, error := service.IncrementDocumentAttribute(
+ "",
+ "",
+ "",
+ "",
+ databases.WithIncrementDocumentAttributeValue(0),
+ databases.WithIncrementDocumentAttributeMax(0),
+ )
+
+ if error != nil {
+ panic(error)
+ }
+
+ fmt.Println(response)
+}
diff --git a/docs/examples/1.7.x/server-go/examples/databases/upsert-documents.md b/docs/examples/1.7.x/server-go/examples/databases/upsert-documents.md
index 7e4550d512..d2731cd128 100644
--- a/docs/examples/1.7.x/server-go/examples/databases/upsert-documents.md
+++ b/docs/examples/1.7.x/server-go/examples/databases/upsert-documents.md
@@ -17,7 +17,7 @@ func main() {
response, error := service.UpsertDocuments(
"",
"",
- databases.WithUpsertDocumentsDocuments([]interface{}{}),
+ []interface{}{},
)
if error != nil {
diff --git a/docs/examples/1.7.x/server-graphql/examples/databases/create-document.md b/docs/examples/1.7.x/server-graphql/examples/databases/create-document.md
index 4e2d90660b..4f525d6b1f 100644
--- a/docs/examples/1.7.x/server-graphql/examples/databases/create-document.md
+++ b/docs/examples/1.7.x/server-graphql/examples/databases/create-document.md
@@ -7,6 +7,7 @@ mutation {
permissions: ["read("any")"]
) {
_id
+ _sequence
_collectionId
_databaseId
_createdAt
diff --git a/docs/examples/1.7.x/server-graphql/examples/databases/create-documents.md b/docs/examples/1.7.x/server-graphql/examples/databases/create-documents.md
index 3e3a50f3ab..8ce79dcbb5 100644
--- a/docs/examples/1.7.x/server-graphql/examples/databases/create-documents.md
+++ b/docs/examples/1.7.x/server-graphql/examples/databases/create-documents.md
@@ -7,6 +7,7 @@ mutation {
total
documents {
_id
+ _sequence
_collectionId
_databaseId
_createdAt
diff --git a/docs/examples/1.7.x/server-graphql/examples/databases/create-string-attribute.md b/docs/examples/1.7.x/server-graphql/examples/databases/create-string-attribute.md
index 62d97d6962..489f9ce015 100644
--- a/docs/examples/1.7.x/server-graphql/examples/databases/create-string-attribute.md
+++ b/docs/examples/1.7.x/server-graphql/examples/databases/create-string-attribute.md
@@ -19,5 +19,6 @@ mutation {
_updatedAt
size
default
+ encrypt
}
}
diff --git a/docs/examples/1.7.x/server-graphql/examples/databases/decrement-document-attribute.md b/docs/examples/1.7.x/server-graphql/examples/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..2e7970049d
--- /dev/null
+++ b/docs/examples/1.7.x/server-graphql/examples/databases/decrement-document-attribute.md
@@ -0,0 +1,19 @@
+mutation {
+ databasesDecrementDocumentAttribute(
+ databaseId: "",
+ collectionId: "",
+ documentId: "",
+ attribute: "",
+ value: 0,
+ min: 0
+ ) {
+ _id
+ _sequence
+ _collectionId
+ _databaseId
+ _createdAt
+ _updatedAt
+ _permissions
+ data
+ }
+}
diff --git a/docs/examples/1.7.x/server-graphql/examples/databases/delete-documents.md b/docs/examples/1.7.x/server-graphql/examples/databases/delete-documents.md
index ad5826f22a..5822d3b950 100644
--- a/docs/examples/1.7.x/server-graphql/examples/databases/delete-documents.md
+++ b/docs/examples/1.7.x/server-graphql/examples/databases/delete-documents.md
@@ -7,6 +7,7 @@ mutation {
total
documents {
_id
+ _sequence
_collectionId
_databaseId
_createdAt
diff --git a/docs/examples/1.7.x/server-graphql/examples/databases/increment-document-attribute.md b/docs/examples/1.7.x/server-graphql/examples/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..322ed69ced
--- /dev/null
+++ b/docs/examples/1.7.x/server-graphql/examples/databases/increment-document-attribute.md
@@ -0,0 +1,19 @@
+mutation {
+ databasesIncrementDocumentAttribute(
+ databaseId: "",
+ collectionId: "",
+ documentId: "",
+ attribute: "",
+ value: 0,
+ max: 0
+ ) {
+ _id
+ _sequence
+ _collectionId
+ _databaseId
+ _createdAt
+ _updatedAt
+ _permissions
+ data
+ }
+}
diff --git a/docs/examples/1.7.x/server-graphql/examples/databases/update-document.md b/docs/examples/1.7.x/server-graphql/examples/databases/update-document.md
index 5e80894620..aea605d9d7 100644
--- a/docs/examples/1.7.x/server-graphql/examples/databases/update-document.md
+++ b/docs/examples/1.7.x/server-graphql/examples/databases/update-document.md
@@ -7,6 +7,7 @@ mutation {
permissions: ["read("any")"]
) {
_id
+ _sequence
_collectionId
_databaseId
_createdAt
diff --git a/docs/examples/1.7.x/server-graphql/examples/databases/update-documents.md b/docs/examples/1.7.x/server-graphql/examples/databases/update-documents.md
index c05acb16a0..83c0c07f84 100644
--- a/docs/examples/1.7.x/server-graphql/examples/databases/update-documents.md
+++ b/docs/examples/1.7.x/server-graphql/examples/databases/update-documents.md
@@ -8,6 +8,7 @@ mutation {
total
documents {
_id
+ _sequence
_collectionId
_databaseId
_createdAt
diff --git a/docs/examples/1.7.x/server-graphql/examples/databases/update-string-attribute.md b/docs/examples/1.7.x/server-graphql/examples/databases/update-string-attribute.md
index afafb307f5..f9398c9ca1 100644
--- a/docs/examples/1.7.x/server-graphql/examples/databases/update-string-attribute.md
+++ b/docs/examples/1.7.x/server-graphql/examples/databases/update-string-attribute.md
@@ -18,5 +18,6 @@ mutation {
_updatedAt
size
default
+ encrypt
}
}
diff --git a/docs/examples/1.7.x/server-graphql/examples/databases/upsert-document.md b/docs/examples/1.7.x/server-graphql/examples/databases/upsert-document.md
new file mode 100644
index 0000000000..9d1e753081
--- /dev/null
+++ b/docs/examples/1.7.x/server-graphql/examples/databases/upsert-document.md
@@ -0,0 +1,18 @@
+mutation {
+ databasesUpsertDocument(
+ databaseId: "",
+ collectionId: "",
+ documentId: "",
+ data: "{}",
+ permissions: ["read("any")"]
+ ) {
+ _id
+ _sequence
+ _collectionId
+ _databaseId
+ _createdAt
+ _updatedAt
+ _permissions
+ data
+ }
+}
diff --git a/docs/examples/1.7.x/server-graphql/examples/databases/upsert-documents.md b/docs/examples/1.7.x/server-graphql/examples/databases/upsert-documents.md
index d6e7bba9a3..2bfb765915 100644
--- a/docs/examples/1.7.x/server-graphql/examples/databases/upsert-documents.md
+++ b/docs/examples/1.7.x/server-graphql/examples/databases/upsert-documents.md
@@ -7,6 +7,7 @@ mutation {
total
documents {
_id
+ _sequence
_collectionId
_databaseId
_createdAt
diff --git a/docs/examples/1.7.x/server-kotlin/java/databases/create-document.md b/docs/examples/1.7.x/server-kotlin/java/databases/create-document.md
index 368b816219..5231be33d6 100644
--- a/docs/examples/1.7.x/server-kotlin/java/databases/create-document.md
+++ b/docs/examples/1.7.x/server-kotlin/java/databases/create-document.md
@@ -4,9 +4,8 @@ import io.appwrite.services.Databases;
Client client = new Client()
.setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
- .setSession("") // The user session to authenticate with
- .setKey("") // Your secret API key
- .setJWT(""); // Your secret JSON Web Token
+ .setProject("") // Your project ID
+ .setSession(""); // The user session to authenticate with
Databases databases = new Databases(client);
diff --git a/docs/examples/1.7.x/server-kotlin/java/databases/create-documents.md b/docs/examples/1.7.x/server-kotlin/java/databases/create-documents.md
index d816af366d..0de0c276ed 100644
--- a/docs/examples/1.7.x/server-kotlin/java/databases/create-documents.md
+++ b/docs/examples/1.7.x/server-kotlin/java/databases/create-documents.md
@@ -4,6 +4,7 @@ import io.appwrite.services.Databases;
Client client = new Client()
.setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .setProject("") // Your project ID
.setKey(""); // Your secret API key
Databases databases = new Databases(client);
diff --git a/docs/examples/1.7.x/server-kotlin/java/databases/decrement-document-attribute.md b/docs/examples/1.7.x/server-kotlin/java/databases/decrement-document-attribute.md
new file mode 100644
index 0000000000..34b74726ff
--- /dev/null
+++ b/docs/examples/1.7.x/server-kotlin/java/databases/decrement-document-attribute.md
@@ -0,0 +1,28 @@
+import io.appwrite.Client;
+import io.appwrite.coroutines.CoroutineCallback;
+import io.appwrite.services.Databases;
+
+Client client = new Client()
+ .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .setProject("") // Your project ID
+ .setKey(""); // Your secret API key
+
+Databases databases = new Databases(client);
+
+databases.decrementDocumentAttribute(
+ "", // databaseId
+ "", // collectionId
+ "", // documentId
+ "", // attribute
+ 0, // value (optional)
+ 0, // min (optional)
+ new CoroutineCallback<>((result, error) -> {
+ if (error != null) {
+ error.printStackTrace();
+ return;
+ }
+
+ System.out.println(result);
+ })
+);
+
diff --git a/docs/examples/1.7.x/server-kotlin/java/databases/increment-document-attribute.md b/docs/examples/1.7.x/server-kotlin/java/databases/increment-document-attribute.md
new file mode 100644
index 0000000000..ca9c357f19
--- /dev/null
+++ b/docs/examples/1.7.x/server-kotlin/java/databases/increment-document-attribute.md
@@ -0,0 +1,28 @@
+import io.appwrite.Client;
+import io.appwrite.coroutines.CoroutineCallback;
+import io.appwrite.services.Databases;
+
+Client client = new Client()
+ .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .setProject("") // Your project ID
+ .setKey(""); // Your secret API key
+
+Databases databases = new Databases(client);
+
+databases.incrementDocumentAttribute(
+ "", // databaseId
+ "", // collectionId
+ "", // documentId
+ "", // attribute
+ 0, // value (optional)
+ 0, // max (optional)
+ new CoroutineCallback<>((result, error) -> {
+ if (error != null) {
+ error.printStackTrace();
+ return;
+ }
+
+ System.out.println(result);
+ })
+);
+
diff --git a/docs/examples/1.7.x/server-kotlin/java/databases/upsert-document.md b/docs/examples/1.7.x/server-kotlin/java/databases/upsert-document.md
new file mode 100644
index 0000000000..daa44141e2
--- /dev/null
+++ b/docs/examples/1.7.x/server-kotlin/java/databases/upsert-document.md
@@ -0,0 +1,27 @@
+import io.appwrite.Client;
+import io.appwrite.coroutines.CoroutineCallback;
+import io.appwrite.services.Databases;
+
+Client client = new Client()
+ .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .setProject("") // Your project ID
+ .setSession(""); // The user session to authenticate with
+
+Databases databases = new Databases(client);
+
+databases.upsertDocument(
+ "", // databaseId
+ "", // collectionId
+ "", // documentId
+ mapOf( "a" to "b" ), // data
+ listOf("read("any")"), // permissions (optional)
+ new CoroutineCallback<>((result, error) -> {
+ if (error != null) {
+ error.printStackTrace();
+ return;
+ }
+
+ System.out.println(result);
+ })
+);
+
diff --git a/docs/examples/1.7.x/server-kotlin/java/databases/upsert-documents.md b/docs/examples/1.7.x/server-kotlin/java/databases/upsert-documents.md
index e2f2a46337..95e9a33ef2 100644
--- a/docs/examples/1.7.x/server-kotlin/java/databases/upsert-documents.md
+++ b/docs/examples/1.7.x/server-kotlin/java/databases/upsert-documents.md
@@ -12,7 +12,7 @@ Databases databases = new Databases(client);
databases.upsertDocuments(
"", // databaseId
"", // collectionId
- listOf(), // documents (optional)
+ listOf(), // documents
new CoroutineCallback<>((result, error) -> {
if (error != null) {
error.printStackTrace();
diff --git a/docs/examples/1.7.x/server-kotlin/kotlin/databases/create-document.md b/docs/examples/1.7.x/server-kotlin/kotlin/databases/create-document.md
index 93da01eefa..695fdbdfaa 100644
--- a/docs/examples/1.7.x/server-kotlin/kotlin/databases/create-document.md
+++ b/docs/examples/1.7.x/server-kotlin/kotlin/databases/create-document.md
@@ -4,9 +4,8 @@ import io.appwrite.services.Databases
val client = Client()
.setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint
+ .setProject("") // Your project ID
.setSession("") // The user session to authenticate with
- .setKey("") // Your secret API key
- .setJWT("