Compare commits

..
Author SHA1 Message Date
ArnabChatterjee20k 5baa2ad113 refactor: Rename triggerQueuesForBulkDocuments to triggerBulk for consistency across document actions 2025-08-05 13:29:38 +05:30
ArnabChatterjee20k a144d41020 feat: Enhance RealtimeCustomClientTest with permission updates and timeout assertions for clients 2025-08-05 11:53:17 +05:30
ArnabChatterjee20k 7334efbf3a feat: Initialize event and payload properties in Event class and optimize bulk document queue triggering 2025-08-05 11:52:58 +05:30
ArnabChatterjee20k 59026a17dc feat: Enhance database operations with event queues and improve test coverage for bulk operations
- Added event queue injections in Bulk Update and Create classes for better event handling.
- Modified getUser method in Scope class to allow for user retrieval with an override option.
- Expanded RealtimeCustomClientTest to include comprehensive tests for bulk create, update, and delete operations, ensuring proper event emissions for multiple clients.
- Improved assertions in tests to validate event data and permissions for created, updated, and deleted documents.
2025-08-04 19:01:48 +05:30
Jake BarnbyandGitHub e6f0804272 Merge pull request #10244 from appwrite/dat-588
Allow modifying createdAt and updatedAt with server side sdk and api key
2025-08-01 21:37:09 +12:00
ArnabChatterjee20k f6c4457398 changed the error message for client side 2025-08-01 14:54:15 +05:30
ArnabChatterjee20k 67582b103c updated composer 2025-08-01 13:57:38 +05:30
ArnabChatterjee20k 27684ef38c Merge remote-tracking branch 'upstream/1.8.x' into dat-588 2025-08-01 13:54:13 +05:30
ArnabChatterjee20k 82fbc524f8 Add comprehensive tests for date and time operations in database rows
- Implemented `testDateTimeRow` to validate the behavior of datetime columns, including creation, retrieval, and modification of rows with custom createdAt and updatedAt timestamps.
- Added `testSingleRowDateOperations` to cover various scenarios for single row operations with custom date handling.
- Created `testBulkRowDateOperations` to test bulk creation and updates of rows with date fields.
- Introduced `testUpsertRowDateOperations` to verify upsert functionality with custom date fields.
- Cleaned up legacy test file by removing unnecessary blank lines.
2025-08-01 13:53:04 +05:30
ArnabChatterjee20k 983d102ff2 Restrict createdAt and updatedAt attributes for non-API key and non-privileged users in Create, Update, and Upsert actions 2025-08-01 12:31:29 +05:30
Jake Barnby 29973e4182 Update db + migrations 2025-08-01 03:09:36 +12:00
ArnabChatterjee20k de69692ff2 added modify createdAt/updatedAt support 2025-07-31 20:32:14 +05:30
Jake Barnby de6ee12daf Update db 2025-08-01 01:42:57 +12:00
Jake BarnbyandGitHub 7f27589c96 Merge pull request #10226 from appwrite/skip-teams-query
Skip empty queries
2025-08-01 00:25:55 +12:00
fogelito 6ead087e91 fix nesting if 2025-07-31 14:26:36 +03:00
fogelito ae34df3608 Merge branch '1.8.x' of https://github.com/appwrite/appwrite into skip-teams-query 2025-07-31 13:20:30 +03:00
fogelito e76aba3fd4 Revert composer 2025-07-31 13:19:55 +03:00
Jake BarnbyandGitHub d72aaf42bd Merge pull request #10234 from appwrite/bump-composer
Bump deps
2025-07-30 21:08:58 +12:00
Darshan 0023d5afc2 update: sdk-gen. 2025-07-30 14:35:25 +05:30
Jake BarnbyandGitHub c5b0d15340 Merge pull request #10232 from appwrite/1.8-docs
1.8.x docs, examples, specs.
2025-07-30 17:20:20 +12:00
Darshan cd5844b8e3 update: regen examples, references. 2025-07-30 10:39:28 +05:30
Darshan 451e590c49 remove: tables examples. 2025-07-30 10:24:37 +05:30
Jake Barnby 6347d7da3f Merge remote-tracking branch 'origin/1.7.x' into 1.8.x
# Conflicts:
#	composer.lock
2025-07-29 22:52:06 +12:00
Luke B. SilverandGitHub 3eb5cd80f3 Merge pull request #10224 from appwrite/pla-692
fix: create email target when using email otp registration
2025-07-29 10:27:43 +01:00
fogelito eddc782c6e formatting 2025-07-29 11:24:41 +03:00
Jake Barnby bdf9dd5192 Update migrations 2025-07-29 20:12:27 +12:00
fogelito 19bd04e8c9 Skip empty queries 2025-07-29 11:10:25 +03:00
Chirag Aggarwal 7ad01fcada linebreak 2025-07-29 12:23:06 +05:30
Chirag Aggarwal 06e4920ee2 fix: create email target when using email otp registration 2025-07-29 11:57:57 +05:30
Jake BarnbyandGitHub e57364c831 Merge pull request #10214 from appwrite/fix-nulls
Fix document nulls
2025-07-29 18:16:01 +12:00
Jake BarnbyandGitHub f89e46817f Merge pull request #10221 from appwrite/fix-sequence-type
Filter sequence to int because any models skip rule checks
2025-07-29 17:56:18 +12:00
fogelito a520e9fcc9 Update 0.73.2 2025-07-29 08:34:44 +03:00
Jake BarnbyandGitHub 9b0a6bf33a Merge pull request #10222 from appwrite/update-migration
updated migration release
2025-07-29 17:12:36 +12:00
ArnabChatterjee20k b69ad22485 updated migration release 2025-07-29 10:25:31 +05:30
Jake Barnby 360e4ce992 Add test case 2025-07-29 16:54:39 +12:00
Jake Barnby 2529d64791 Filter sequence to int because any models skip rule checks 2025-07-29 16:53:13 +12:00
fogelito ff171853b4 use 0.73.1 2025-07-28 17:14:41 +03:00
fogelito bbf3164cac Run tests 2025-07-28 13:40:27 +03:00
fogelito 78887b9df6 fallbacks 2025-07-28 11:18:03 +03:00
fogelito 66fa7ad659 Use null default with fallback 2025-07-28 11:08:32 +03:00
fogelito 9a3687ae3b Run tests 2025-07-28 10:43:35 +03:00
Jake BarnbyandGitHub 767f575984 Merge pull request #10212 from appwrite/grids-api
Move to grids API
2025-07-28 19:15:44 +12:00
Jake Barnby 503d7e13f8 Update generator 2025-07-28 18:45:01 +12:00
Jake Barnby cb8b13e27e Merge remote-tracking branch 'origin/1.8.x' into grids-api
# Conflicts:
#	composer.lock
2025-07-28 18:40:58 +12:00
Jake Barnby c359c34917 Downgrade db 2025-07-28 18:38:00 +12:00
Jake Barnby e18c8942fd Revert migrations, update db 2025-07-28 18:23:50 +12:00
Darshan 0f7d06b4d5 reset: docs for easier review. 2025-07-28 11:50:08 +05:30
Darshan c9d9c4ab76 reset: docs for easier review. 2025-07-28 11:49:49 +05:30
Darshan 00290bdb65 reset: docs for easier review. 2025-07-28 11:46:43 +05:30
Jake Barnby 11136f4215 Merge branch '1.8.x' of github.com:appwrite/appwrite into 1.8.x 2025-07-28 15:02:16 +12:00
Jake Barnby 4adff28540 Update migration 2025-07-28 15:02:01 +12:00
Darshan be3d91d541 regen: specs. 2025-07-27 19:20:21 +05:30
Darshan c71ff3542f fix: deprecation inheritance on other methods with different namespace. 2025-07-27 19:19:14 +05:30
Luke B. SilverandGitHub 5924434e1d Merge pull request #10202 from appwrite/update-sdks-1.7.x
chore: update sdks 1.7.x
2025-07-27 14:28:18 +01:00
Darshan dccf64ae2e update: regen specs with updated deprecations. 2025-07-27 18:16:13 +05:30
Darshan 7a5a3706b6 fix: tests. 2025-07-27 18:13:30 +05:30
Darshan 4146671ff8 address comments. 2025-07-27 17:55:07 +05:30
Darshan d17e7e853b update: deprecation methods. 2025-07-27 17:39:43 +05:30
Darshan e41ee30ed9 remove: local setup. 2025-07-27 17:28:37 +05:30
Darshan d253329870 remove: local setup. 2025-07-27 17:28:24 +05:30
Luke B. SilverandGitHub 1d736dec54 Merge pull request #10204 from appwrite/add-docs-swift-apple
chore: add docs for nestedType, encode, from and toMap
2025-07-27 12:55:21 +01:00
Darshan bc8d5963ae update: regen examples for grids. 2025-07-27 17:15:17 +05:30
Darshan 5ceaf66cc9 update: regen examples. 2025-07-27 17:14:23 +05:30
Darshan 0df9d51b01 update: regen specs. 2025-07-27 17:09:44 +05:30
Darshan 24614225a8 fix: no params on multiple methods. 2025-07-27 16:58:04 +05:30
Darshan e4a02b0d74 delete: tables examples. 2025-07-27 16:40:55 +05:30
Darshan 5b1a750dd1 regen: specs and fix file name. 2025-07-27 16:40:36 +05:30
Darshan ba79c5d9df update: docs. 2025-07-27 16:31:10 +05:30
Darshan 1ed45def9d update: graphql tests. 2025-07-27 15:23:07 +05:30
Darshan 1f31b75582 fix: tests. 2025-07-27 14:48:19 +05:30
Darshan d7136e77ea fix: tests. 2025-07-27 13:50:34 +05:30
Darshan f19ef05a98 fix: response modals and sdk-gen for multiple namespaces. 2025-07-27 13:47:44 +05:30
Darshan 557493d091 update: move to grids api. 2025-07-27 12:05:40 +05:30
Jake BarnbyandGitHub 0c85f1e032 Merge branch 'main' into 1.8.x 2025-07-27 17:50:38 +12:00
Jake Barnby d491a6db2d Fix consumers 2025-07-27 17:12:33 +12:00
Jake Barnby 6637cc0ed7 Fix merge 2025-07-27 17:09:50 +12:00
Chirag Aggarwal 1f13a0d437 fix: gitignore 2025-07-27 10:19:14 +05:30
Chirag Aggarwal f2a3369131 chore: use config.json 2025-07-27 10:18:51 +05:30
Chirag Aggarwal 1f26f98568 chore: update go 2025-07-27 10:01:37 +05:30
Chirag AggarwalandGitHub 3c6291024b Merge branch 'update-sdks-1.7.x' into add-docs-swift-apple 2025-07-27 09:57:52 +05:30
Chirag AggarwalandGitHub b23f382dcc Merge branch '1.7.x' into update-sdks-1.7.x 2025-07-27 09:52:05 +05:30
Jake Barnby 07d5d71fba Update database 2025-07-27 16:13:41 +12:00
Jake Barnby cdbd89b3f3 Merge remote-tracking branch 'origin/1.7.x' into 1.8.x
# Conflicts:
#	app/config/specs/open-api3-1.8.x-client.json
#	app/config/specs/open-api3-1.8.x-console.json
#	app/config/specs/open-api3-1.8.x-server.json
#	app/config/specs/open-api3-latest-client.json
#	app/config/specs/open-api3-latest-console.json
#	app/config/specs/open-api3-latest-server.json
#	app/config/specs/swagger2-1.8.x-client.json
#	app/config/specs/swagger2-1.8.x-console.json
#	app/config/specs/swagger2-1.8.x-server.json
#	app/config/specs/swagger2-latest-client.json
#	app/config/specs/swagger2-latest-console.json
#	app/config/specs/swagger2-latest-server.json
#	app/controllers/api/databases.php
#	composer.lock
#	tests/e2e/Services/Databases/Legacy/DatabasesBase.php
2025-07-27 16:07:04 +12:00
Chirag Aggarwal 9be01f2ac9 add docs in rn 2025-07-26 11:24:19 +05:30
Chirag Aggarwal f39fe22e6f chore: add docs in web and node 2025-07-26 11:17:43 +05:30
Chirag Aggarwal cf3abd0f6c add java example 2025-07-26 11:10:24 +05:30
Chirag Aggarwal aa91189848 add docs for android as well 2025-07-25 17:08:43 +05:30
Matej BačoandGitHub 30d18f6f09 Merge pull request #10205 from hmacr/fix-mfa-email-preview
Change preview & body for MFA email
2025-07-25 12:54:00 +02:00
Chirag Aggarwal eeed9a08ec chore: add docs for nestedType, encode, from and toMap 2025-07-25 16:18:52 +05:30
hmacr 4940dcbf3a Change preview & body for MFA email 2025-07-25 16:08:11 +05:30
Chirag Aggarwal 6bd3e6fe96 update version for rn 2025-07-25 16:05:16 +05:30
Matej BačoandGitHub 91fda66d78 Merge pull request #10203 from appwrite/fix-templates
Fix: templates on `1.7.x`.
2025-07-25 11:14:26 +02:00
Darshan e67e6303b2 fix: templates on 1.7.x. 2025-07-25 14:30:03 +05:30
Luke B. SilverandGitHub 2f39e16b97 Merge pull request #10156 from appwrite/feat-stats-usage-on-redis
feat: stats-usage on redis
2025-07-24 22:42:09 +01:00
Matej BačoandGitHub d0b04cd61b Merge pull request #10190 from hmacr/1we24-auto-suggest-default-branch
Add defaultBranch in getRepository response
2025-07-24 17:25:51 +02:00
loks0n 1d86cc6010 feat: stats-usage on redis 2025-07-24 16:19:13 +01:00
Steven Nguyenandloks0n 8d1bc10cc6 docs: update CONTRIBUTING.md to clarify how to start 2025-07-24 16:19:13 +01:00
Khushboo VermaandGitHub 607cc9a926 Merge branch '1.7.x' into 1we24-auto-suggest-default-branch 2025-07-24 20:31:10 +05:30
Matej BačoandGitHub e4dc36edf0 Merge pull request #10198 from hmacr/1we17-preview-for-emails
Preview text for emails
2025-07-24 16:47:08 +02:00
Matej BačoandGitHub ce1ba58e73 Merge pull request #10201 from hmacr/1we6-better-error-msg-for-scheduled-date
Better error message for invalid function scheduled time
2025-07-24 16:40:14 +02:00
HemachandarandGitHub d7f85f9f58 remove dot 2025-07-24 20:06:49 +05:30
hmacr a8d5fc9998 format 2025-07-24 19:49:52 +05:30
Matej BačoandGitHub fc31787e9a Merge branch '1.7.x' into 1we6-better-error-msg-for-scheduled-date 2025-07-24 16:15:06 +02:00
hmacr 5ce141b75b change error msg 2025-07-24 19:43:14 +05:30
hmacr ee5a644771 tests 2025-07-24 19:39:23 +05:30
Khushboo VermaandGitHub d607f227a2 Merge branch '1.7.x' into 1we24-auto-suggest-default-branch 2025-07-24 19:38:17 +05:30
Matej BačoandGitHub 3439951538 Merge pull request #10199 from hmacr/1we21-handle-failed-git-action-in-worker
Suppress git-action exception in deployment worker
2025-07-24 14:50:57 +02:00
hmacr 9055d41aa0 send log to queue 2025-07-24 17:56:24 +05:30
Chirag Aggarwal 6c5cdfbe85 chore: update to use angle brackets 2025-07-24 17:11:21 +05:30
Matej BačoandGitHub b762e7fb73 Merge pull request #10181 from hmacr/1we9-use-preview-for-screenshots
fix: Use direct source for file-preview when empty
2025-07-24 13:39:24 +02:00
Matej BačoandGitHub f70a5e67be Merge pull request #10187 from hmacr/1we19-fix-double-deployment
Skip deployment when commit is created by us
2025-07-24 13:38:48 +02:00
Chirag Aggarwal e68acd3f02 chore: add more changelog 2025-07-24 16:47:24 +05:30
Chirag Aggarwal 2dfd2f4426 chore: add more changelog 2025-07-24 16:11:59 +05:30
Chirag Aggarwal 89b9afd066 update swift 2025-07-24 13:53:03 +05:30
Chirag Aggarwal 32bb8b7c7e chore: update sdks 1.7.x 2025-07-24 13:42:55 +05:30
hmacr ed4e85f28a validate only when scheduledAt is available 2025-07-24 11:56:05 +05:30
hmacr 7ae237e433 Better error message for invalid function scheduled time 2025-07-24 11:44:44 +05:30
Jake BarnbyandGitHub cc8e04f4fa Merge pull request #10197 from appwrite/fix-specs
fix: specs (1.7.x)
2025-07-24 17:10:55 +12:00
Chirag Aggarwal 3cbded226b fix: unwanted method being added to specs 2025-07-24 10:07:46 +05:30
Steven NguyenandGitHub d939415c3a Merge pull request #10200 from appwrite/docs-contributing-how-to-start
docs: update CONTRIBUTING.md to clarify how to start
2025-07-23 18:14:30 -07:00
Steven NguyenandGitHub 73da590d65 docs: update CONTRIBUTING.md to clarify how to start 2025-07-23 12:31:28 -07:00
hmacr 7ca03a5889 Suppress git-action exception in deployment worker 2025-07-23 22:26:35 +05:30
hmacr f75b53f3bc Merge branch '1.7.x' into 1we17-preview-for-emails 2025-07-23 22:05:23 +05:30
hmacr c5f8bdfd36 Preview texts for emails 2025-07-23 22:04:25 +05:30
Chirag Aggarwal 309f6ca1f7 chore: regen 2025-07-23 21:41:17 +05:30
Chirag Aggarwal 01cd296132 fix: compose 2025-07-23 21:30:28 +05:30
Chirag Aggarwal b3124f7288 uncomment 2025-07-23 21:16:55 +05:30
Chirag Aggarwal e8f53f27e3 regen sdks 2025-07-23 21:14:50 +05:30
Chirag Aggarwal 1340d14e7c chore: regen 2025-07-23 21:13:59 +05:30
Chirag Aggarwal 132b8f8234 chore: remove 2025-07-23 21:01:18 +05:30
Chirag Aggarwal 715ae4857b chore: remove 2025-07-23 21:00:12 +05:30
Chirag Aggarwal 69142048af chore: regen 2025-07-23 20:58:37 +05:30
Chirag Aggarwal 8fe62a2585 chore: regen 2025-07-23 20:57:31 +05:30
Chirag Aggarwal a53dcd8a23 chore: regen 2025-07-23 20:56:20 +05:30
hmacr f8d6706fde update composer 2025-07-23 20:45:46 +05:30
hmacr 8240c9ccdc add tests 2025-07-23 20:39:02 +05:30
Matej Bačo b194558226 Switch from gzip to none compression 2025-07-23 15:49:07 +02:00
hmacr c29ef4087b compress screenshots before uploading 2025-07-23 16:28:09 +05:30
Jake BarnbyandGitHub 722c1ddf99 Merge pull request #10193 from appwrite/fix-stuff
Fix: route didn't include the params needed
2025-07-23 21:57:31 +12:00
Darshan 8ac0486e73 fix: route didn't include the params needed. 2025-07-23 15:10:27 +05:30
Jake Barnby 201c18051f Update lock 2025-07-23 20:09:14 +12:00
Jake Barnby 1f60bb1aa6 Fix index models 2025-07-23 19:48:29 +12:00
hmacr f85a7410df Merge branch '1.7.x' into 1we9-use-preview-for-screenshots 2025-07-23 12:13:04 +05:30
hmacr c83dd7aa13 Add defaultBranch in getRepository response 2025-07-23 11:45:27 +05:30
hmacr 50eca9ebbc update commit author name param 2025-07-23 09:53:09 +05:30
hmacr 2a7ce13224 Merge branch '1.7.x' into 1we19-fix-double-deployment 2025-07-23 09:38:37 +05:30
Steven NguyenandGitHub 898365a922 Merge pull request #10170 from appwrite/fix-templates
Fix default email templates
2025-07-22 18:25:57 -07:00
hmacr 9c0e6f4203 Skip deployment when commit is created by us 2025-07-22 20:39:36 +05:30
Jake BarnbyandGitHub e88b66c358 Merge pull request #10047 from appwrite/deprecate-old-methods
chore: deprecate old database methods
2025-07-23 00:14:11 +12:00
Chirag Aggarwal e10f1eb10f handle case when there are multiple sdk methods 2025-07-22 17:27:09 +05:30
Chirag Aggarwal 3128a7b837 chore: update to return object 2025-07-22 16:59:05 +05:30
Chirag Aggarwal 2aaaf90044 chore: client spec changes 2025-07-22 16:51:29 +05:30
Chirag Aggarwal fde03fc61b chore: regen specs 2025-07-22 16:50:19 +05:30
hmacr bf3efea98d framework support + content for OTP & add-member email 2025-07-22 16:43:17 +05:30
Chirag Aggarwal 2a81075830 chore: use class 2025-07-22 16:43:02 +05:30
Chirag Aggarwal 51614105df chore: uncomment 2025-07-22 15:54:42 +05:30
Chirag Aggarwal 8018e7dd80 chore: review comments 2025-07-22 15:54:24 +05:30
Chirag Aggarwal 51064b0154 chore: regen specs 2025-07-22 15:44:57 +05:30
Chirag Aggarwal 929c7a3d36 Merge branch '1.8.x' into deprecate-old-methods 2025-07-22 15:42:32 +05:30
Jake Barnby d0682b4b67 Revert "Downgrade migrations"
This reverts commit 5227ce267e.
2025-07-22 21:56:07 +12:00
Jake Barnby 5227ce267e Downgrade migrations 2025-07-22 21:47:08 +12:00
Jake Barnby 959e101c88 Fix merge 2025-07-22 21:23:32 +12:00
Jake BarnbyandGitHub b02fc55ea2 Merge pull request #10184 from ArnabChatterjee20k/upsert-fix-1.8.x
Upsert fix 1.8.x
2025-07-22 21:20:03 +12:00
ArnabChatterjee20k c398e08f90 Add user injection and permission handling in Upsert actions 2025-07-22 14:10:58 +05:30
Jake Barnby f5ef8b5b7e Trigger CI 2025-07-22 20:36:01 +12:00
Jake BarnbyandGitHub cd39bd6512 Merge pull request #10179 from appwrite/dat-579
Added the cases of null permissions in the upsert route and update th…
2025-07-22 20:22:56 +12:00
Jake Barnby 5a06fab2a3 Update specs 2025-07-22 20:09:50 +12:00
ArnabChatterjee20k 7bb760b4a1 added test for relation related upsert , fixed formatting 2025-07-22 13:10:05 +05:30
Jake Barnby 2e783865b9 Update service defs 2025-07-22 19:38:12 +12:00
Jake Barnby 07dfa58eba Update specs 2025-07-22 19:32:36 +12:00
Jake Barnby d6d78ff218 Update database 2025-07-22 19:25:44 +12:00
Jake Barnby 63a24c82f8 Merge branch '1.8.x' of github.com:appwrite/appwrite into 1.8.x 2025-07-22 16:35:43 +12:00
Jake Barnby 7355711f24 Fix index tests 2025-07-22 16:35:35 +12:00
Jake BarnbyandGitHub 8898d4c55b Merge pull request #10182 from appwrite/bump-response-format
Bump response format, Fix backwards compat
2025-07-22 16:27:48 +12:00
DarshanandGitHub 3c4bd67de6 Merge branch '1.8.x' into bump-response-format 2025-07-22 09:51:49 +05:30
Darshan 97c54aeaac fix: add wildcards on getDocument response model as well. 2025-07-22 09:31:09 +05:30
Jake Barnby 8056a9d675 Update database 2025-07-22 15:47:38 +12:00
Jake Barnby 724ee41eff Fix index tests 2025-07-22 14:48:48 +12:00
Jake Barnby afd6730a81 FIx name mismatch 2025-07-22 14:43:32 +12:00
Jake Barnby f33ed64f6a Fix index tests 2025-07-22 14:14:08 +12:00
Jake BarnbyandGitHub 6da637b8b5 Merge pull request #10180 from appwrite/fix-database-tests
Fix database tests
2025-07-22 13:48:30 +12:00
Jake Barnby 8ef8f8c2d9 Merge remote-tracking branch 'origin/1.8.x' into fix-database-tests
# Conflicts:
#	composer.json
#	composer.lock
2025-07-22 13:47:56 +12:00
Jake Barnby 9a6032c804 Update libs 2025-07-22 12:11:03 +12:00
hmacr 9da57a457b fix: Use direct source for file-preview when empty 2025-07-21 22:31:06 +05:30
fogelito ee5ce895f7 Remove var_dump 2025-07-21 18:26:53 +03:00
fogelito e82003873a formatting 2025-07-21 18:17:12 +03:00
fogelito 64d1d78d84 lock 2025-07-21 18:15:48 +03:00
fogelito 959c165a00 Merge branch '1.8.x' of https://github.com/appwrite/appwrite into fix-database-tests
# Conflicts:
#	composer.lock
2025-07-21 18:12:39 +03:00
fogelito 51f518ae03 Remove var_dump 2025-07-21 18:11:13 +03:00
fogelito b2cd1413ce Fallback index length 0 2025-07-21 17:45:34 +03:00
ArnabChatterjee20k 8b88a09374 added the cases of null permissions in the upsert route and update the e2e test 2025-07-21 19:32:27 +05:30
Darshan 59fce99ef6 bump: response format for preview sdk. 2025-07-21 19:15:29 +05:30
fogelito 1ff1b55298 Check tests 2025-07-21 14:12:10 +03:00
fogelito ffb3a522b0 Check tests 2025-07-21 14:06:39 +03:00
Jake Barnby 58aaee1c4a Downgrade migrations 2025-07-21 22:56:19 +12:00
Jake Barnby 75bd0dc55b Update tables test 2025-07-21 21:26:08 +12:00
Jake Barnby 1aea95c6a9 Revert DB 2025-07-21 21:09:07 +12:00
Jake Barnby 51c95347a0 Merge remote-tracking branch 'origin/main' into 1.8.x
# Conflicts:
#	app/config/specs/open-api3-latest-client.json
#	app/config/specs/open-api3-latest-console.json
#	app/config/specs/open-api3-latest-server.json
#	app/config/specs/swagger2-latest-client.json
#	app/config/specs/swagger2-latest-console.json
#	app/config/specs/swagger2-latest-server.json
#	app/controllers/api/databases.php
2025-07-21 20:42:16 +12:00
Jake BarnbyandGitHub c35a7cc09b Merge pull request #9897 from appwrite/1.7.x
1.7.x
2025-07-21 20:40:41 +12:00
Jake Barnby 891db255bc Fix tests 2025-07-21 19:59:38 +12:00
Jake Barnby f082cfacfa Fix tests 2025-07-21 19:43:33 +12:00
Jake Barnby d32da05f92 Merge remote-tracking branch 'origin/main' into 1.7.x
# Conflicts:
#	app/config/specs/open-api3-1.7.x-console.json
#	app/config/specs/open-api3-1.7.x-server.json
#	app/config/specs/open-api3-latest-console.json
#	app/config/specs/open-api3-latest-server.json
#	app/config/specs/swagger2-1.7.x-console.json
#	app/config/specs/swagger2-1.7.x-server.json
#	app/config/specs/swagger2-latest-console.json
#	app/config/specs/swagger2-latest-server.json
#	app/init/constants.php
#	composer.lock
#	docs/references/databases/upsert-documents.md
#	tests/e2e/Services/Account/AccountCustomClientTest.php
2025-07-21 19:22:15 +12:00
Jake Barnby f0f7381b97 Update libs 2025-07-21 19:13:34 +12:00
Jake Barnby 25074ca2b1 Update console 2025-07-21 18:53:54 +12:00
Jake Barnby 3e8cd9d748 Merge remote-tracking branch 'origin/1.7.x' into 1.8.x 2025-07-21 18:53:02 +12:00
Darshan e7315e23c7 fix: address comment. 2025-07-20 17:28:44 +05:30
Darshan 373ceecebb fix: add a default client name for session alerts 2025-07-20 16:40:29 +05:30
Darshan 0926250f17 fix: session alerts template. 2025-07-20 16:39:08 +05:30
Darshan 5243af937f fix: the default templates. 2025-07-20 14:40:30 +05:30
Jake Barnby 97a4e5f355 Bump version 2025-07-18 21:38:35 +12:00
Jake BarnbyandGitHub ec2ef72876 Merge pull request #10030 from appwrite/update-documentation
Update documentation
2025-07-18 20:19:37 +12:00
Jake BarnbyandGitHub 0b7f62c75c Merge branch '1.8.x' into update-documentation 2025-07-18 19:51:57 +12:00
Jake BarnbyandGitHub 6861a7bc22 Merge pull request #10160 from appwrite/bump-migrations
Bump migrations
2025-07-18 19:35:26 +12:00
5b60eb8b94 update: code quality.
Co-authored-by: Jake Barnby <jakeb994@gmail.com>
2025-07-18 12:44:51 +05:30
Darshan d6ec18bda7 update: maintain tests consistency. 2025-07-18 12:14:02 +05:30
Darshan 5a44f6bcea update: maintain consistency for permissions with a null check. 2025-07-18 12:03:46 +05:30
Darshan 2c28fa5cac bump: specs. 2025-07-18 11:48:19 +05:30
Darshan d4de3a722d Merge branch '1.8.x' into 'update-documentation'. 2025-07-18 11:46:27 +05:30
Darshan d3726f9a55 fix: null permissions on tables api as well. 2025-07-18 11:37:47 +05:30
Darshan dca9a17e7a fix: null permissions. 2025-07-18 11:36:47 +05:30
Darshan 79bdf705d6 Merge branch '1.8.x' into 'bump-migrations'. 2025-07-18 10:57:29 +05:30
Darshan 9b1f5eb905 update: tests. 2025-07-18 10:55:48 +05:30
Darshan 40a6190844 update: log message with fallbacks. 2025-07-18 10:55:30 +05:30
Jake Barnby 9ceeb76ad0 Merge branch '1.7.x' into 1.8.x
# Conflicts:
#	app/controllers/api/databases.php
#	composer.lock
#	src/Appwrite/GraphQL/Types/Mapper.php
2025-07-18 17:24:12 +12:00
Jake BarnbyandGitHub 0a3d206d76 Merge pull request #10115 from appwrite/dat-571
Removed $sequence from response through response filters
2025-07-18 17:16:02 +12:00
Darshan 12f8374378 update: response modal. 2025-07-18 10:32:35 +05:30
Darshan 46c755336c bump: dependencies. 2025-07-18 10:28:29 +05:30
ArnabChatterjee20k e97d10061f Merge branch '1.8.x' into dat-571 2025-07-18 10:28:27 +05:30
ArnabChatterjee20k 16c3f2c55a Merge branch '1.8.x' into dat-571 2025-07-18 10:26:01 +05:30
Jake BarnbyandGitHub ebdc6c9016 Merge pull request #10019 from appwrite/lazy-load-relationships
Lazy load relationships
2025-07-18 12:52:01 +12:00
Darshan 944f5ed7c1 update: mirror tests to Tables api. 2025-07-17 18:58:56 +05:30
Darshan 5b8751d270 add: changes to module structure. 2025-07-17 18:23:33 +05:30
Darshan ee317b0b8d Merge branch '1.8.x' into 'lazy-load-relationships'. 2025-07-17 18:15:16 +05:30
Matej BačoandGitHub 91f3c6e95e Merge pull request #10153 from Veera-mulge/change-desc
Update README.md
2025-07-16 14:11:20 +02:00
VeereshandGitHub 7b87decba4 Update README.md 2025-07-15 17:47:34 +05:30
Steven NguyenandGitHub a7e164e019 Merge pull request #10134 from Veera-mulge/main
Update README.md
2025-07-10 16:30:57 -07:00
VeereshandGitHub c6f6b6db90 Update README.md 2025-07-10 19:30:13 +05:30
Matej BačoandGitHub 5de2547cf6 Merge pull request #10112 from Veera-mulge/change-desc
Update README.md to add Upsert announcement
2025-07-08 16:56:51 +02:00
ArnabChatterjee20k a2b6ed3513 added response filters for version older than 1.8.x 2025-07-07 14:11:35 +05:30
VeereshandGitHub b5035c7034 Update README.md 2025-07-07 11:03:40 +05:30
Jake Barnby b2fa28754d Merge remote-tracking branch 'origin/1.7.x' into 1.8.x
# Conflicts:
#	.github/workflows/benchmark.yml
#	composer.lock
#	src/Appwrite/Event/Database.php
2025-07-04 10:00:45 -04:00
Matej BačoandGitHub 41a1bb928e Merge pull request #10095 from Veera-mulge/change-desc
Update README to add Bulk API link
2025-07-03 14:48:44 +02:00
VeereshandGitHub a8982bfb80 Update README.md 2025-07-03 14:44:39 +05:30
Chirag Aggarwal 8cc254a56f fix: replacewith methods 2025-07-03 11:29:41 +05:30
Chirag AggarwalandGitHub 0076340f7f Merge branch 'update-documentation' into deprecate-old-methods 2025-07-02 13:33:29 +05:30
Chirag Aggarwal 634a160d41 chore: move deprecated 2025-07-02 13:23:00 +05:30
Chirag Aggarwal 85250ba7bb chore: update format 2025-07-02 11:53:26 +05:30
Chirag Aggarwal 9c413fd020 chore: remove deprecatedMessage 2025-07-02 11:41:21 +05:30
Eldad A. FuxandGitHub b119ecf92c Merge pull request #10084 from appwrite/LauraDuRy-patch-5
Update README.md
2025-07-01 15:50:14 +01:00
Laura Du RyandGitHub 925ac33536 Update README.md 2025-07-01 16:47:10 +02:00
Laura Du RyandGitHub eea09c56f8 Update README.md 2025-07-01 15:38:19 +02:00
Laura Du RyandGitHub 991c86c937 Update README.md 2025-07-01 14:26:25 +02:00
Darshan 73b0b9d0dd Merge branch '1.8.x' into 'update-documentation'. 2025-07-01 14:43:32 +05:30
Darshan e66201bad5 Merge branch '1.7.x' into '1.8.x'. 2025-07-01 14:41:20 +05:30
Chirag Aggarwal 3d4e146942 chore: update ordering 2025-07-01 10:06:12 +05:30
Chirag Aggarwal 0ea66121b1 chore: add deprecated version 2025-07-01 09:54:57 +05:30
Darshan 86dfed8f7c Merge branch '1.8.x' into 'update-documentation'. 2025-07-01 09:04:46 +05:30
Jake BarnbyandGitHub a24c941e07 Merge pull request #9693 from appwrite/database-aliases
Database aliases, new terminologies and a migration to modules
2025-07-01 03:18:43 +00:00
Jake BarnbyandGitHub 38719dcb4a Merge branch '1.8.x' into database-aliases 2025-07-01 02:15:07 +00:00
Chirag AggarwalandGitHub 591cc32bfc Merge branch 'update-documentation' into deprecate-old-methods 2025-06-27 16:24:02 +05:30
Jake BarnbyandGitHub 7aed35a588 Merge pull request #10065 from appwrite/dat-565
Updated utopia database
2025-06-26 19:26:28 +00:00
ArnabChatterjee20k b36431d45c empty commit 2025-06-26 21:26:25 +05:30
ArnabChatterjee20k c76fa53f55 updated the db version 2025-06-26 21:13:12 +05:30
Eldad A. FuxandGitHub 9ab8097387 Merge pull request #10063 from appwrite/LauraDuRy-patch-4
Update README.md
2025-06-26 12:23:21 +01:00
Laura Du RyandGitHub 484d5ca4b4 Update README.md 2025-06-26 13:10:57 +02:00
Darshan 91d3b43d2e bump: dependencies. 2025-06-25 19:56:59 +05:30
Darshan 6118d5b46d remove: wrong examples. 2025-06-25 19:10:40 +05:30
Darshan eb201fe2ae update: examples. 2025-06-25 19:07:26 +05:30
Darshan 562f5c2a1e update: docs, misc. 2025-06-25 19:06:17 +05:30
Darshan d44b43373a update: docs, misc. 2025-06-25 18:14:35 +05:30
DarshanandGitHub 922eba865d Merge branch 'database-aliases' into update-documentation 2025-06-25 17:51:34 +05:30
Darshan 67e546faa8 fix: namespace for table logs. 2025-06-25 17:50:54 +05:30
DarshanandGitHub 6ca856c5b8 Merge branch 'database-aliases' into update-documentation 2025-06-25 17:02:36 +05:30
Darshan bce666e81b add: scopes on migrations and update tests. 2025-06-25 17:02:21 +05:30
Darshan b39325e23e add: scopes on migrations. 2025-06-25 16:54:45 +05:30
Darshan 8632f3360f bump: sdk examples. 2025-06-25 12:43:51 +05:30
Darshan 6a5ffb2e82 bump: specs for sdks. 2025-06-25 11:58:47 +05:30
Darshan 68bff78dfb Merge branch 'database-aliases' into update-documentation 2025-06-25 11:55:38 +05:30
Darshan d7d8dbdbd4 fix: name. 2025-06-25 11:53:21 +05:30
Darshan fb81b13389 update: doc links. 2025-06-25 11:49:59 +05:30
Darshan 839015419c Merge branch 'database-aliases' into update-documentation 2025-06-25 11:30:21 +05:30
Darshan 789064e295 add: new scopes to the api. 2025-06-25 11:29:45 +05:30
Darshan 7f4d6233a2 add: validators to swagger2. 2025-06-25 11:00:09 +05:30
Chirag Aggarwal 6d9b3aef0e chore: fix table replacewith methods 2025-06-24 17:32:23 +05:30
Chirag Aggarwal 7d15d25773 chore: add more deprecations 2025-06-24 16:42:28 +05:30
Chirag Aggarwal c7c198fa2e chore: add more deprecations, add warning headers 2025-06-24 14:54:15 +05:30
Chirag Aggarwal ccbd699ee7 chore: add namespace to replacements 2025-06-24 14:24:18 +05:30
Chirag Aggarwal ac395452bc chore: deprecate old database methods 2025-06-24 14:03:19 +05:30
Darshan ffccdef68c fix: oha as per latest updates. 2025-06-23 12:58:46 +05:30
Darshan 0f6e77d85e Merge remote-tracking branch 'origin/update-documentation' into update-documentation
# Conflicts:
#	.github/workflows/benchmark.yml
2025-06-23 12:58:06 +05:30
Darshan 38a39d1168 fix: oha as per latest updates. 2025-06-23 12:57:40 +05:30
Darshan 6a74273564 fix: oha as per latest updates. 2025-06-23 12:45:34 +05:30
DarshanandGitHub 80c2fca110 Merge branch 'database-aliases' into update-documentation 2025-06-23 12:29:58 +05:30
Darshan b52c49389c fix: oha as per latest updates. 2025-06-23 12:28:14 +05:30
Darshan 9b51b1bf9c fix: oha as per latest updates. 2025-06-23 12:27:00 +05:30
Darshan 597230006f fix: oha as per latest updates. 2025-06-23 12:23:26 +05:30
Darshan 7969e57134 ci: empty commit 2025-06-23 12:11:00 +05:30
Darshan 7f8fcb1b0b fix: missing range on tables api. 2025-06-23 12:03:45 +05:30
Darshan ebfa6eba8b update: formatter, specs, docs, sdk method names. 2025-06-23 11:49:43 +05:30
DarshanandGitHub 7e026b11b4 Merge branch '1.8.x' into lazy-load-relationships 2025-06-23 10:45:55 +05:30
Darshan d338007d68 update: re-add filters since the PR is in draft and will be merged in the end. 2025-06-23 10:44:25 +05:30
Steven NguyenandGitHub e56c03a007 Merge pull request #10001 from appwrite/fix-golang-sdk-examples
Fix Golang SDK examples for docs
2025-06-19 15:11:29 -07:00
Darshan 88f9377226 Merge branch 'database-aliases' into update-documentation 2025-06-19 18:49:00 +05:30
Darshan 4521302cb8 fix: graphql test for complex queries. 2025-06-19 18:36:32 +05:30
Darshan 974037ee38 update: generate docs examples as per latest 1.8.x source. 2025-06-19 18:13:27 +05:30
Darshan c7a3ffdb71 update: generate latest specs. 2025-06-19 18:07:53 +05:30
Darshan 36dfd217b6 Merge branch 'database-aliases' into update-documentation 2025-06-19 18:01:19 +05:30
Darshan 531f50a2c7 fix: sdk namespacing and graphql tests. 2025-06-19 17:59:29 +05:30
Darshan 7ebe8f6c9e revert: legacy tests namespacing to old. 2025-06-19 17:34:16 +05:30
DarshanandGitHub c08db975d6 Merge branch '1.8.x' into database-aliases 2025-06-19 14:52:13 +05:30
Darshan 5287a3d619 address comment. 2025-06-19 14:52:01 +05:30
Darshan caf2308300 address comment. 2025-06-19 14:50:15 +05:30
Darshan 3d6acaa19c address comments. 2025-06-19 14:49:42 +05:30
Darshan 60ab787894 address comments. 2025-06-19 14:33:58 +05:30
Darshan 03b4026233 remove: leftover. 2025-06-19 14:33:23 +05:30
Darshan 1d23e2ec12 remove: use HTTP. update: inline context logic. 2025-06-19 14:31:54 +05:30
Darshan e5caa85629 update: init with module structure. 2025-06-19 11:02:31 +05:30
Darshan c41d37c982 change: namespace. 2025-06-19 10:54:56 +05:30
Darshan c93d92abef rename: tests from collections to legacy. 2025-06-19 10:52:15 +05:30
Darshan 83968a62f2 update: docs. 2025-06-19 10:42:48 +05:30
Jake BarnbyandGitHub 53a00deb0a Merge pull request #10010 from ArnabChatterjee20k/dat-522
Added auth option to allow invalidating existing sessions
2025-06-18 17:41:41 -04:00
ArnabChatterjee20k d053282bcb linting 2025-06-19 02:29:21 +05:30
ArnabChatterjee20k 225b6e8413 updated tests and project invaldate session 2025-06-19 02:26:58 +05:30
Jake BarnbyandGitHub da83470f4d Merge pull request #10020 from appwrite/optimize-process-documents
Improve `processDocuments`
2025-06-18 13:06:18 -04:00
DarshanandGitHub 5e9cabf115 Merge branch '1.8.x' into lazy-load-relationships 2025-06-18 18:36:47 +05:30
Eldad A. FuxandGitHub 179acec25c Merge pull request #10026 from appwrite/LauraDuRy-patch-3
Update README.md
2025-06-18 13:26:00 +01:00
Eldad A. FuxandGitHub 8379ea2469 Merge branch 'main' into LauraDuRy-patch-3 2025-06-18 13:25:52 +01:00
Eldad A. FuxandGitHub 2acb9c5b99 Merge pull request #9867 from appwrite/update-readme
Update Appwrite description to include Sites, add MCP to products list
2025-06-18 13:25:12 +01:00
Laura Du RyandGitHub 8b160d7dc0 Update README.md 2025-06-18 13:47:24 +02:00
ArnabChatterjee20k 56494ca427 updated invalidation session during the change password in the account endpoint 2025-06-18 13:30:24 +05:30
Darshan 6214c2d104 update: disable 1.8.x request/response filters for lazy-loading-relationships. 2025-06-18 12:07:00 +05:30
Darshan d69189bd55 ci: empty commit 2025-06-18 12:02:08 +05:30
Darshan d6bf748a07 address comments. 2025-06-18 12:00:19 +05:30
ArnabChatterjee20k 8d62ada545 updated example of the authInvalidateSession 2025-06-18 10:54:26 +05:30
Darshan 16a8753509 update: comment. 2025-06-17 15:03:11 +05:30
Darshan 1fbbbee310 update: add cached logic to processDocument. 2025-06-17 15:01:13 +05:30
Darshan 1e39d8d6ee revert: sanity check tests! 2025-06-17 12:01:50 +05:30
Darshan bfb383e28a test: backwards compat for request/response filters on latest 1.6.x. 2025-06-17 11:47:40 +05:30
Darshan 57d8185b16 test: backwards compat for request/response filters. 2025-06-17 11:26:22 +05:30
Darshan deb8b3a789 revert: stuff that is not supposed to be in this branch. 2025-06-17 11:11:47 +05:30
Darshan 16a3275c81 Merge branch '1.8.x' into 'lazy-load-relationships'. 2025-06-17 10:36:16 +05:30
Darshan 8c57672032 Merge commit 'e704e96290' into lazy-load-relationships 2025-06-17 10:34:54 +05:30
DarshanandGitHub 1337b759de fix: remove event for bulk api support. 2025-06-17 10:15:45 +05:30
DarshanandGitHub 34e4299e10 Merge branch '1.8.x' into database-aliases 2025-06-17 10:13:38 +05:30
Darshan e236aac0ea fix: events logic 😮‍💨 2025-06-17 09:57:35 +05:30
ArnabChatterjee20k 28fbd64864 updated session invalidation tests , models and descriptions 2025-06-17 00:40:32 +05:30
ArnabChatterjee20k 9bf4361761 updated indentation 2025-06-16 23:48:08 +05:30
ArnabChatterjee20k 7a0ba95231 updated onPasswordChange to invalidate session 2025-06-16 23:05:52 +05:30
ArnabChatterjee20k 774291b5d8 added onPasswordChange property to the console project 2025-06-14 18:15:41 +05:30
ArnabChatterjee20k 74614e8d58 updated description of on password change 2025-06-14 18:09:20 +05:30
ArnabChatterjee20k fde2f278e8 added invalidating sessions for the project users 2025-06-14 18:07:42 +05:30
Darshan 8d74083da3 remove: filter queries. 2025-06-13 15:18:21 +05:30
Darshan 8cbd06173d update: realtime channels checks for tables api. 2025-06-13 15:11:18 +05:30
Darshan 9cfff792fd add: graphql tests for bulk apis to server tests. 2025-06-13 14:13:26 +05:30
Darshan 6e1fa0526d add: graphql tests for bulk apis to server tests. 2025-06-13 14:07:33 +05:30
Darshan 2e05844ca2 add: graphql tests for bulk apis. 2025-06-13 14:04:23 +05:30
Darshan a13a6a6913 update: naming convention for table tests. 2025-06-13 11:06:51 +05:30
Darshan 6f16895e8b Merge branch '1.8.x' into 'database-aliases'. 2025-06-13 10:44:44 +05:30
Darshan 44870b9810 fix: pending tests. 2025-06-13 10:26:05 +05:30
Darshan 5f8c811f15 fix: missing context. 2025-06-13 10:08:07 +05:30
Darshan 018aad5339 fix: one more test... 2025-06-12 20:03:41 +05:30
Darshan 58e878653e fix: one more test before I sign out 👋 2025-06-12 20:00:53 +05:30
Darshan b248c9b640 fix: a bunch of tests 🚧 2025-06-12 19:58:28 +05:30
Aditya Oberai d799891f53 Update Go SDK examples 2025-06-12 14:23:25 +00:00
Darshan 1f31998092 fix: route name 😒 2025-06-12 19:48:28 +05:30
Aditya Oberai fe86a446da Update sdk generator dependency 2025-06-12 14:13:23 +00:00
Darshan 90d18a9bd5 add: increment, decrement document/row attribute/column; fixes: misc. 2025-06-12 18:24:54 +05:30
Darshan 3426847b17 add: update documents/rows. 2025-06-12 17:31:37 +05:30
Darshan 2994cdf874 update: model. 2025-06-12 17:14:50 +05:30
Darshan 1c87e765de add: delete documents/rows 2025-06-12 17:12:43 +05:30
Darshan 919f358f3f fix: audit event. 2025-06-12 16:58:18 +05:30
Darshan a6ae715e3a update: descriptions. 2025-06-12 16:55:31 +05:30
Darshan 44b8054ed7 add: upsert documents/rows. 2025-06-12 16:55:15 +05:30
Darshan ad34cf3a62 add: lengths to column indexes. 2025-06-12 16:17:27 +05:30
Darshan ffec769f4a fix: index lengths. 2025-06-12 16:16:55 +05:30
Darshan b1f7f08b9a remove: duplicate events. 2025-06-12 16:06:15 +05:30
Darshan d502869c3d fix: index lengths. 2025-06-12 15:21:06 +05:30
Darshan d6b55730eb fix: string encryption attribute in model. 2025-06-12 15:10:28 +05:30
Darshan 9334b98308 fix: duplicate call to collection creation. 2025-06-12 14:40:33 +05:30
Darshan db128d1fb4 update: better syntax for callbacks. 2025-06-12 14:39:47 +05:30
Darshan 95bc85f18d add: upsert for collections and tables. 2025-06-12 14:31:28 +05:30
Darshan 7beae21535 fix: missing context! 2025-06-12 14:20:22 +05:30
Darshan 30eb206dc8 Merge branch '1.8.x' into database-aliases 2025-06-12 11:41:11 +05:30
Darshan 7169e67245 add/update: createDocuments on module structure. 2025-06-11 20:05:09 +05:30
Darshan 8e2eff7894 rollback: auth exception as per 1.8.x source. 2025-06-11 16:53:14 +05:30
Darshan 3e1adc6004 remove: $isTablesAPI var. 2025-06-11 16:51:27 +05:30
Darshan 86a9598a51 update: remove not-found and index dependency exceptions from global handler. 2025-06-11 16:51:09 +05:30
Darshan dc439d1a16 update: remove authorization from global handler. 2025-06-11 16:46:21 +05:30
Darshan 6b53337a23 update: remove duplicate exceptions from global handler. 2025-06-11 16:44:32 +05:30
Darshan 3a88c74109 update: remove structure exceptions from global handler. 2025-06-11 16:18:06 +05:30
Darshan e6268fe5a6 update: remove query exceptions from global handler. 2025-06-11 15:58:22 +05:30
Darshan e07a1817ab update: remove conflict, restrict and relationship exceptions from global handler. 2025-06-11 13:42:55 +05:30
Darshan 3f81847267 update: getInternalId() -> getSequence() 2025-06-11 12:51:31 +05:30
Darshan 1ac22c0ae0 Merge branch '1.8.x' into 'database-aliases'. 2025-06-11 12:36:33 +05:30
Darshan fcdddf7bf0 address comments. 2025-06-11 12:21:48 +05:30
Damodar LohaniandGitHub 45e5509113 Merge pull request #9959 from appwrite/chore-add-warning
chore: update version to 1.7.4 and add experimental warnings
2025-06-04 10:59:56 +05:45
Chirag Aggarwal 4d66aeed5a fix: account tests 2025-06-03 08:52:43 +00:00
Chirag Aggarwal 848d38b75d chore: update version to 1.7.4 and add experimental feature warnings to document endpoints 2025-06-03 06:59:30 +00:00
Steven NguyenandGitHub 623369e426 Merge pull request #9600 from jmastr/fix-4982-expire-sessions-format-for-multiple-api
fix: expire format account recovery, verification, phone and mfa
2025-05-31 09:23:55 -07:00
Eldad A. FuxandGitHub fed881a611 Merge branch 'main' into update-readme 2025-05-23 20:02:55 +01:00
Ebenezer DonandGitHub ba4592609c Merge branch 'main' into update-readme 2025-05-23 11:41:33 +01:00
Ebenezer Don 1030053d5a Fix typo 2025-05-23 11:41:11 +01:00
Ebenezer Don 6b8aa1544b Improve formatting by adding line break between links 2025-05-23 11:39:16 +01:00
Ebenezer Don c82d0b5dc3 Rename duplicate getting Started section to Installation & Setup in README 2025-05-23 11:18:18 +01:00
Ebenezer Don f306e5e868 Update Chinese translation of README to include hosting/MCP 2025-05-22 22:23:23 +01:00
Ebenezer Don e27f1e1f6a Add Sites info to readme 2025-05-22 22:07:10 +01:00
Ebenezer Don e9c6ab491a Add info about Appwrite MCP to readme 2025-05-22 22:00:59 +01:00
Ebenezer Don 8c2235816e Update Appwrite description in readme 2025-05-22 22:00:28 +01:00
Darshan 087ccfe347 remove: todo. 2025-05-10 12:06:17 +05:30
Darshan b0d9215ea5 fix: abuse tests! 2025-05-10 11:57:32 +05:30
Darshan 63d591e766 fix: method name. 2025-05-10 11:39:46 +05:30
Darshan e50d7df56c fix: audits event. 2025-05-10 11:38:28 +05:30
Darshan 9ba29d4779 update: var name. 2025-05-10 11:36:55 +05:30
Darshan 15e0385723 update: exception name. 2025-05-10 11:36:13 +05:30
Darshan 6bdfe3b895 address naming comments. 2025-05-10 11:34:20 +05:30
Darshan afa8341f95 add: table apis to webhook custom server tests. 2025-05-10 11:01:36 +05:30
Darshan 45370f91c3 add: table apis to webhook tests. 2025-05-10 10:52:43 +05:30
Darshan ba26eae2c3 Merge remote-tracking branch 'origin/database-aliases' into database-aliases 2025-05-10 10:36:26 +05:30
Darshan 5dca1ff0d6 update: fix test variable. 2025-05-10 10:36:16 +05:30
Darshan fbe2609f7b update: simplify setting events context param. 2025-05-10 10:34:44 +05:30
Darshan 5022a052ce update: test coverage for databases. 2025-05-10 10:20:23 +05:30
Darshan 68994f2634 fix: graphql tests. 2025-05-10 10:19:01 +05:30
Darshan 594f8595ae update: database server test for graphql <> tables api. 2025-05-10 10:10:23 +05:30
Darshan 02af05b409 fix: endpoint in abuse test. 2025-05-10 10:10:03 +05:30
Darshan d1ae06550f update: realtime events logic. 2025-05-10 10:09:43 +05:30
DarshanandGitHub e1c5b3f59e Merge branch '1.7.x' into database-aliases 2025-05-10 09:38:17 +05:30
Darshan a067b77e90 update: model; add|update: graphql tests [wip]. 2025-05-09 20:04:02 +05:30
Darshan c542ba033f patch: graphql tests <> collections. 2025-05-09 18:15:17 +05:30
Darshan d5e94a57be revert: graphql tests for collections api. 2025-05-09 17:38:02 +05:30
Darshan 241779e046 add: table api tests to abuse. 2025-05-09 17:34:41 +05:30
Darshan f16ba8dee3 add: table api tests. 2025-05-09 17:25:36 +05:30
Darshan 1756acd89c fix: realtime channel count. 2025-05-09 15:16:10 +05:30
Darshan 94fbf19e54 fix|add: tables api tests to realtime. 2025-05-09 15:11:14 +05:30
Darshan d3f1c4f852 revert: tests to collections API. 2025-05-09 15:10:44 +05:30
Darshan f10be55f92 update: short the callbacks. 2025-05-09 14:49:44 +05:30
Darshan a807dd97d9 fix: realtime events. 2025-05-09 14:47:01 +05:30
Darshan a8dc5c3797 add: table tests to usage. 2025-05-09 11:10:53 +05:30
Darshan 65dbebd103 misc: fix error types. 2025-05-09 11:09:58 +05:30
Darshan 938b376f3c fix: var ref. 2025-05-09 10:02:14 +05:30
Darshan ef30e827c7 misc: changes to the databases worker. 2025-05-09 09:52:04 +05:30
Darshan 0ecd97d027 fix: wrong param. 2025-05-09 09:33:52 +05:30
Darshan 2d74765ba0 update: fix exception. 2025-05-08 20:00:01 +05:30
Darshan c5074fd52f update: move around tests. 2025-05-08 19:53:31 +05:30
Darshan 5c0717458f update: the usage model. 2025-05-08 19:51:16 +05:30
Darshan 36e6617090 update: the usage modals. 2025-05-08 19:47:35 +05:30
Darshan 8006c9d60b misc: fixes. 2025-05-08 19:36:59 +05:30
Darshan 44a5fef345 misc: name fixes. 2025-05-08 19:17:06 +05:30
Darshan 4e83fc856a update: split service registrations into smaller registries. 2025-05-08 15:38:07 +05:30
Darshan c4a26fbb95 fix: another pesky sdk namespace 🤨. 2025-05-08 15:37:00 +05:30
Darshan eafa9bb393 fix: namespaces, again. 2025-05-08 15:33:41 +05:30
Darshan d7023b5a69 fix: namespaces. 2025-05-08 15:33:00 +05:30
Darshan 97d1a535df fix: missing path :\ 2025-05-08 15:30:52 +05:30
Darshan 6fba4a5f08 update: sdk namespaces. 2025-05-08 14:20:11 +05:30
Darshan fe693a9469 add: indexes api to tables. 2025-05-08 14:15:00 +05:30
Darshan da70da985b update: use nested directory structure. 2025-05-08 12:55:54 +05:30
Darshan 96b89693fc update: use abstract for getResponseModel. 2025-05-08 12:47:21 +05:30
Darshan cb64484c44 update: abstraction over document and row apis. 2025-05-08 11:59:55 +05:30
Darshan fc456b4cca update: abstraction over attribute and column apis. 2025-05-08 10:40:35 +05:30
Darshan b55521e3de update: address minor comments by coderabbitai. 2025-05-08 09:36:13 +05:30
Darshan 6493759536 Merge remote-tracking branch 'origin/database-aliases' into database-aliases
# Conflicts:
#	app/init/constants.php
2025-05-07 20:02:23 +05:30
Darshan bc8a38ba55 update: abstraction over attribute and column apis [WIP]. 2025-05-07 20:01:46 +05:30
Darshan 69cc4f0bb6 update: handle the context logic, use defaults. 2025-05-07 17:32:54 +05:30
DarshanandGitHub b534d3843e Merge branch '1.7.x' into database-aliases 2025-05-07 17:03:17 +05:30
Darshan 0f94b800a5 update: abstraction over table and collection apis. 2025-05-07 17:02:24 +05:30
Darshan 6d1afea436 misc. 2025-05-07 14:14:12 +05:30
Darshan f2f23be648 update: events, errors, realtime. 2025-05-07 14:11:28 +05:30
DarshanandGitHub 04386eea7c Merge pull request #9720 from appwrite/response-filters-for-databases
Request, Response filters for databases
2025-05-07 13:38:19 +05:30
Darshan 8610687b87 update: events schema, response models for database usages. 2025-05-07 13:23:27 +05:30
DarshanandGitHub 28a74e664d Merge pull request #9728 from appwrite/update-exceptions
Update Exceptions
2025-05-07 11:31:49 +05:30
DarshanandGitHub 0266376315 Merge branch 'response-filters-for-databases' into update-exceptions 2025-05-07 11:30:48 +05:30
Darshan 7f023f29c5 update: keep both tables and collections api errors. 2025-05-07 11:30:31 +05:30
Darshan 46ccf6f537 update: re-add legacy models; remove: filters. 2025-05-07 11:13:15 +05:30
DarshanandGitHub 026150971f Merge pull request #9722 from appwrite/events-compatibility
Events compat based on version
2025-05-07 10:34:36 +05:30
Darshan ee117b816a manage: events and channels. 2025-05-07 10:33:54 +05:30
DarshanandGitHub 80915fc5e9 Merge branch 'events-compatibility' into update-exceptions 2025-05-06 17:03:52 +05:30
DarshanandGitHub 9a45a0fc7b Merge branch 'response-filters-for-databases' into events-compatibility 2025-05-06 17:02:58 +05:30
Darshan ed9306ef8d update: change filter name for attributes <> columns. 2025-05-06 17:00:57 +05:30
Darshan 3e813f6cba update: change filter name for collections <> tables. 2025-05-06 17:00:12 +05:30
Darshan 6eb1c3ae68 update: rename remaining variables. 2025-05-06 16:58:56 +05:30
Darshan 7a52ace9b2 update: attributes <> columns errors. 2025-05-06 16:53:20 +05:30
Darshan 6e8dbfc674 update: documents <> rows errors. 2025-05-06 16:48:20 +05:30
Darshan 59e5ce0664 update: collections <> tables errors. 2025-05-06 16:44:19 +05:30
Darshan d70d001f5a add: backported channels. 2025-05-06 12:52:05 +05:30
Darshan a0ffcd54dc Merge branch 'response-filters-for-databases' into events-compatibility 2025-05-06 12:17:02 +05:30
Darshan b1735ef945 remove: aliasing filter. 2025-05-06 12:14:54 +05:30
Darshan 9ec897f7d6 fix: filtering 2025-05-06 12:05:06 +05:30
Darshan 86d195c1c0 update: request, response filters. 2025-05-06 11:31:35 +05:30
Darshan 3a8f097c17 fix: realtime channels; update: row model. 2025-05-06 11:31:05 +05:30
Darshan 253c428ca2 remove: filter. 2025-05-06 11:30:15 +05:30
Darshan 9e1105b61f update: tests. 2025-05-06 11:29:56 +05:30
Darshan 56077d59f7 fix: graphql tests. 2025-05-06 10:51:11 +05:30
Darshan 565e6b2ad8 fix: migrations test <> csv imports. 2025-05-05 17:03:17 +05:30
Darshan 67a8f522e5 fix: project and general usage tests. 2025-05-05 14:45:55 +05:30
Darshan b905af91af fix: project usage documents to rows. 2025-05-05 14:43:09 +05:30
Darshan 37fb34ae12 wip: events compat based on version. 2025-05-05 14:33:27 +05:30
Darshan 75c9db8031 update: tests to use the 1.7.x changes on databases. 2025-05-05 14:07:34 +05:30
Darshan e2202e9ffa remove: old attributes anyway. 2025-05-05 14:05:24 +05:30
Darshan d30fd56573 patch: index module to use/specify columns instead of attributes. 2025-05-05 14:04:39 +05:30
Darshan 71ad9c203e fix: response modals, mappings, filters. 2025-05-05 13:53:57 +05:30
Darshan bdfab30fd4 Merge branch 'database-aliases' into response-filters-for-databases 2025-05-05 10:58:08 +05:30
Darshan 6cb44399c1 update: services. 2025-05-05 10:57:54 +05:30
Darshan cabf32559a update: return keys. 2025-05-05 09:50:57 +05:30
Darshan 7a53680786 update: document response model to row; refactor: old collection to table models on response types. 2025-05-05 09:42:33 +05:30
Darshan 675d404b9b update: attribute* response model to column*. 2025-05-05 09:30:27 +05:30
Darshan 8504fbc0b9 update: collection response model to table. 2025-05-05 09:14:20 +05:30
Darshan d184d1c7b1 fix: lint! 2025-05-04 18:50:24 +05:30
Darshan e0a4c698bc fix: float column creation! 2025-05-04 18:43:32 +05:30
Darshan 2554adb41e update: error messages. 2025-05-04 18:29:11 +05:30
DarshanandGitHub c3d3665383 Merge branch '1.7.x' into database-aliases 2025-05-04 18:18:53 +05:30
Darshan 6fac164d46 update: keep message same. 2025-05-04 18:18:28 +05:30
Darshan ad16bd281e add: database module to platform registry. 2025-05-04 18:16:08 +05:30
Darshan 57a9218649 remove: database controller 👋 2025-05-04 18:10:09 +05:30
Darshan 4cd8f49f82 add: usage. 2025-05-04 18:09:39 +05:30
Darshan 286c695b47 add: move and register row modules. 2025-05-04 17:52:29 +05:30
Darshan fd7801fe26 add: register index and table modules. 2025-05-04 17:24:38 +05:30
Darshan 76785d58c6 fix: imports, lint. 2025-05-04 17:16:52 +05:30
Darshan 3271ef5769 update: move Index ops to module. 2025-05-04 17:16:37 +05:30
Darshan 8efc1543e9 update: move Table ops to module. 2025-05-04 17:05:14 +05:30
Darshan 1945a64083 update: move DB ops to module. 2025-05-04 14:08:10 +05:30
Darshan 9c1ec6fe02 update: move the init hook. 2025-05-04 13:37:25 +05:30
Darshan b3b9961860 init: move to module structure for database; start with columns. 2025-05-04 13:22:26 +05:30
Darshan 7ffd5cfde6 fix: graphql tests, again. 2025-04-27 14:47:59 +05:30
Darshan 9bf1fdc2ff fix: graphql tests. 2025-04-27 14:27:07 +05:30
Darshan 9cccd89439 fix: graphql tests. 2025-04-27 14:08:26 +05:30
Darshan f94ecc885a fix: tests as per new events system. 2025-04-27 10:36:21 +05:30
Darshan 949f58522d change: events system. 2025-04-27 10:33:44 +05:30
Darshan 89ce5a6e10 add: todo. 2025-04-26 16:07:46 +05:30
Darshan 21715448ac fix|update: database tests for new error messages. 2025-04-26 16:07:32 +05:30
Darshan 4f1f9bb4a2 add: filter for latest changes. 2025-04-26 16:06:53 +05:30
Darshan 814be66b98 update: use new terminologies on path params and local variables. 2025-04-26 16:05:07 +05:30
Julian Strobl 0da3602426 fix: expire format account recovery, verification, phone and mfa
closes: #4982

Signed-off-by: Julian Strobl <jmastr@mailbox.org>
2025-04-01 18:29:32 +02:00
7132 changed files with 202271 additions and 16971 deletions
+4 -2
View File
@@ -145,7 +145,8 @@ jobs:
Account,
Avatars,
Console,
Databases,
Databases/Legacy,
Databases/Grids,
Functions,
FunctionsSchedule,
GraphQL,
@@ -214,7 +215,8 @@ jobs:
Account,
Avatars,
Console,
Databases,
Databases/Legacy,
Databases/Grids,
Functions,
FunctionsSchedule,
GraphQL,
+1 -1
View File
@@ -16,5 +16,5 @@ app/sdks
dev/yasd_init.php
.phpunit.result.cache
Makefile
appwrite.json
appwrite.config.json
/.zed/
+25 -1
View File
@@ -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 dont 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: Dont 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
Were 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
+6 -4
View File
@@ -26,7 +26,7 @@
[**Appwrite 云公开测试版!立即注册!**](https://cloud.appwrite.io)
Appwrite 是一个基于 Docker 的端到端开发者平台,其容器化的微服务库可应用于网页端,移动端,以及后端。Appwrite 通过视觉化界面简化了从零开始编写 API 的繁琐过程,在保证软件安全的前提下为开发者创造了一个高效的开发环境
Appwrite 是一个基于 Docker 的端到端开发者平台,其容器化的微服务库可应用于网页端,移动端,原生应用,以及后端。它既包含后端服务器,也提供了用于部署静态和服务器端渲染前端的完全集成托管解决方案。Appwrite 通过视觉化界面简化了从零开始构建现代应用的复杂性和重复性,让您能够更快地构建安全的全栈应用
Appwrite 可以提供给开发者用户验证,外部授权,用户数据读写检索,文件储存,图像处理,云函数计算,[等多种服务](https://appwrite.io/docs).
@@ -72,7 +72,7 @@ docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:1.7.4
appwrite/appwrite:1.8.0
```
### Windows
@@ -84,7 +84,7 @@ docker run -it --rm ^
--volume //var/run/docker.sock:/var/run/docker.sock ^
--volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^
--entrypoint="install" ^
appwrite/appwrite:1.7.4
appwrite/appwrite:1.8.0
```
#### PowerShell
@@ -94,7 +94,7 @@ docker run -it --rm `
--volume /var/run/docker.sock:/var/run/docker.sock `
--volume ${pwd}/appwrite:/usr/src/code/appwrite:rw `
--entrypoint="install" `
appwrite/appwrite:1.7.4
appwrite/appwrite:1.8.0
```
运行后,可以在浏览器上访问 http://localhost 找到 Appwrite 控制台。在非 Linux 的本机主机上完成安装后,服务器可能需要几分钟才能启动。
@@ -179,6 +179,8 @@ docker run -it --rm `
- [**消息传递**](https://appwrite.io/docs/references/cloud/client-web/messaging) - 使用 Appwrite 消息传递功能通过推送通知、电子邮件和短信与用户进行通信。
- [**语言适配**](https://appwrite.io/docs/references/cloud/client-web/locale) - 根据用户所在的的国家和地区做出合适的语言适配。
- [**头像**](https://appwrite.io/docs/references/cloud/client-web/avatars) -管理用户头像、国家旗帜、浏览器图标、信用卡符号,和生成二维码。
- [**MCP**](https://appwrite.io/docs/tooling/mcp) - 使用 Appwrite 的模型上下文协议(Model Context Protocol)服务器,允许大语言模型(LLM)和 AI 工具(如 Claude Desktop、Cursor 和 Windsurf Editor)通过自然语言直接与您的 Appwrite 项目交互。
- [**站点**](https://appwrite.io/docs/products/sites) - 直接从 Appwrite 开发、部署和扩展您的 Web 应用程序,与您的后端一起。
如需完整的 API 界面文档,请访问 [https://appwrite.io/docs](https://appwrite.io/docs)。如需更多教程、新闻和公告,请订阅我们的 [博客](https://medium.com/appwrite-io) 和 加入我们的[Discord 社区](https://discord.gg/GSeTUeA)。
### 开发套件
+17 -12
View File
@@ -1,12 +1,14 @@
> We just announced Auto-increment support for Appwrite Databases - [Learn more](https://appwrite.io/blog/post/announcing-auto-increment-support)
> [Get started with Appwrite](https://apwr.dev/appcloud)
> [Join the Init kick off event 19th of May: The future of Appwrite with Founder & CEO Eldad Fux](https://www.youtube.com/watch?v=1g8tuogsp7A)
<br />
<p align="center">
<a href="https://appwrite.io" target="_blank"><img src="./public/images/banner.png" alt="Appwrite banner, with logo and text saying "Build Like a Team of Hundreds"></a>
<br />
<br />
<b>Appwrite is a backend platform for developing Web, Mobile, and Flutter applications. Built with the open source community and optimized for developer experience in the coding languages you love.</b>
<b>Appwrite is an all-in-one development platform for Web, Mobile, and Flutter applications. Use built-in backend infrastructure and web hosting, all from a single place. Built with the open source community and optimized for developer experience in the coding languages you love.</b>
<br />
<br />
</p>
@@ -25,7 +27,7 @@
English | [简体中文](README-CN.md)
Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps packaged as a set of Docker<nobr> microservices. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster.
Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. It includes both a backend server and a fully integrated hosting solution for deploying static and server-side rendered frontends. Appwrite abstracts the complexity and repetitiveness required to build modern apps from scratch and allows you to build secure, full-stack applications faster.
Using Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and [more services](https://appwrite.io/docs).
@@ -42,7 +44,7 @@ Find out more at: [https://appwrite.io](https://appwrite.io).
Table of Contents:
- [Getting Started](#getting-started)
- [Installation \& Setup](#installation--setup)
- [Self-Hosting](#self-hosting)
- [Unix](#unix)
- [Windows](#windows)
@@ -62,8 +64,9 @@ Table of Contents:
- [Follow Us](#follow-us)
- [License](#license)
## Getting Started
The easiest way to get started with Appwrite is by [signing up for Appwrite Cloud](https://cloud.appwrite.io/). While Appwrite Cloud is in public beta, you can build with Appwrite completely free, and we won't collect you credit card information.
## Installation & Setup
The easiest way to get started with Appwrite is by [signing up for Appwrite Cloud](https://cloud.appwrite.io/). While Appwrite Cloud is in public beta, you can build with Appwrite completely free, and we won't collect your credit card information.
## Self-Hosting
@@ -78,7 +81,7 @@ docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:1.7.4
appwrite/appwrite:1.8.0
```
### Windows
@@ -90,7 +93,7 @@ docker run -it --rm ^
--volume //var/run/docker.sock:/var/run/docker.sock ^
--volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^
--entrypoint="install" ^
appwrite/appwrite:1.7.4
appwrite/appwrite:1.8.0
```
#### PowerShell
@@ -100,7 +103,7 @@ docker run -it --rm `
--volume /var/run/docker.sock:/var/run/docker.sock `
--volume ${pwd}/appwrite:/usr/src/code/appwrite:rw `
--entrypoint="install" `
appwrite/appwrite:1.7.4
appwrite/appwrite:1.8.0
```
Once the Docker installation is complete, go to http://localhost to access the Appwrite console from your browser. Please note that on non-Linux native hosts, the server might take a few minutes to start after completing the installation.
@@ -128,19 +131,19 @@ Choose from one of the providers below:
<td align="center" width="100" height="100">
<a href="https://gitpod.io/#https://github.com/appwrite/integration-for-gitpod">
<img width="50" height="39" src="public/images/integrations/gitpod-logo.svg" alt="Gitpod Logo" />
<br /><sub><b>Gitpod</b></sub></a>
<br /><sub><b>Gitpod</b></sub></a>
</a>
</td>
<td align="center" width="100" height="100">
<a href="https://www.linode.com/marketplace/apps/appwrite/appwrite/">
<img width="50" height="39" src="public/images/integrations/akamai-logo.svg" alt="Akamai Logo" />
<br /><sub><b>Akamai Compute</b></sub></a>
<br /><sub><b>Akamai Compute</b></sub></a>
</a>
</td>
<td align="center" width="100" height="100">
<a href="https://aws.amazon.com/marketplace/pp/prodview-2hiaeo2px4md6">
<img width="50" height="39" src="public/images/integrations/aws-logo.svg" alt="AWS Logo" />
<br /><sub><b>AWS Marketplace</b></sub></a>
<br /><sub><b>AWS Marketplace</b></sub></a>
</a>
</td>
</tr>
@@ -186,6 +189,8 @@ Getting started with Appwrite is as easy as creating a new project, choosing you
- [**Realtime**](https://appwrite.io/docs/realtime) - Listen to real-time events for any of your Appwrite services including users, storage, functions, databases, and more.
- [**Locale**](https://appwrite.io/docs/references/cloud/client-web/locale) - Track your user's location and manage your app locale-based data.
- [**Avatars**](https://appwrite.io/docs/references/cloud/client-web/avatars) - Manage your users' avatars, countries' flags, browser icons, and credit card symbols. Generate QR codes from links or plaintext strings.
- [**MCP**](https://appwrite.io/docs/tooling/mcp) - Use Appwrite's Model Context Protocol (MCP) server to allow LLMs and AI tools like Claude Desktop, Cursor, and Windsurf Editor to directly interact with your Appwrite project through natural language.
- [**Sites**](https://appwrite.io/docs/products/sites) - Develop, deploy, and scale your web applications directly from Appwrite, alongside your backend.
For the complete API documentation, visit [https://appwrite.io/docs](https://appwrite.io/docs). For more tutorials, news and announcements check out our [blog](https://medium.com/appwrite-io) and [Discord Server](https://discord.gg/GSeTUeA).
+9 -3
View File
@@ -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']);
+2 -1
View File
@@ -39,7 +39,8 @@ $console = [
'invites' => System::getEnv('_APP_CONSOLE_INVITES', 'enabled') === 'enabled',
'limit' => (System::getEnv('_APP_CONSOLE_WHITELIST_ROOT', 'enabled') === 'enabled') ? 1 : 0, // limit signup to 1 user
'duration' => Auth::TOKEN_EXPIRATION_LOGIN_LONG, // 1 Year in seconds
'sessionAlerts' => System::getEnv('_APP_CONSOLE_SESSION_ALERTS', 'disabled') === 'enabled'
'sessionAlerts' => System::getEnv('_APP_CONSOLE_SESSION_ALERTS', 'disabled') === 'enabled',
'invalidateSessions' => true
],
'authWhitelistEmails' => (!empty(System::getEnv('_APP_CONSOLE_WHITELIST_EMAILS', null))) ? \explode(',', System::getEnv('_APP_CONSOLE_WHITELIST_EMAILS', null)) : [],
'authWhitelistIPs' => (!empty(System::getEnv('_APP_CONSOLE_WHITELIST_IPS', null))) ? \explode(',', System::getEnv('_APP_CONSOLE_WHITELIST_IPS', null)) : [],
+146 -6
View File
@@ -69,9 +69,14 @@ return [
'description' => 'The request contains one or more invalid arguments. Please refer to the endpoint documentation.',
'code' => 400,
],
Exception::GENERAL_QUERY_LIMIT_EXCEEDED => [
'name' => Exception::GENERAL_QUERY_LIMIT_EXCEEDED,
'description' => 'Query limit exceeded for the current attribute. Usage of more than 100 query values on a single attribute is prohibited.',
Exception::GENERAL_ATTRIBUTE_QUERY_LIMIT_EXCEEDED => [
'name' => Exception::GENERAL_ATTRIBUTE_QUERY_LIMIT_EXCEEDED,
'description' => 'Query limit exceeded for the current attribute.',
'code' => 400,
],
Exception::GENERAL_COLUMN_QUERY_LIMIT_EXCEEDED => [
'name' => Exception::GENERAL_COLUMN_QUERY_LIMIT_EXCEEDED,
'description' => 'Query limit exceeded for the current column.',
'code' => 400,
],
Exception::GENERAL_QUERY_INVALID => [
@@ -668,7 +673,7 @@ return [
],
Exception::DATABASE_QUERY_ORDER_NULL => [
'name' => Exception::DATABASE_QUERY_ORDER_NULL,
'description' => 'The order attribute had a null value. Cursor pagination requires all documents order attribute values are non-null.',
'description' => 'The order attribute/column had a null value. Cursor pagination requires all documents/rows order attribute/column values are non-null.',
'code' => 400,
],
@@ -689,6 +694,23 @@ return [
'code' => 400,
],
/** Tables */
Exception::TABLE_NOT_FOUND => [
'name' => Exception::TABLE_NOT_FOUND,
'description' => 'Table with the requested ID could not be found.',
'code' => 404,
],
Exception::TABLE_ALREADY_EXISTS => [
'name' => Exception::TABLE_ALREADY_EXISTS,
'description' => 'A table with the requested ID already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
'code' => 409,
],
Exception::TABLE_LIMIT_EXCEEDED => [
'name' => Exception::TABLE_LIMIT_EXCEEDED,
'description' => 'The maximum number of tables has been reached.',
'code' => 400,
],
/** Documents */
Exception::DOCUMENT_NOT_FOUND => [
'name' => Exception::DOCUMENT_NOT_FOUND,
@@ -726,6 +748,43 @@ return [
'code' => 403,
],
/** Rows */
Exception::ROW_NOT_FOUND => [
'name' => Exception::ROW_NOT_FOUND,
'description' => 'Row with the requested ID could not be found.',
'code' => 404,
],
Exception::ROW_INVALID_STRUCTURE => [
'name' => Exception::ROW_INVALID_STRUCTURE,
'description' => 'The row structure is invalid. Please ensure the columns match the table definition.',
'code' => 400,
],
Exception::ROW_MISSING_DATA => [
'name' => Exception::ROW_MISSING_DATA,
'description' => 'The row data is missing. Try again with row data populated',
'code' => 400,
],
Exception::ROW_MISSING_PAYLOAD => [
'name' => Exception::ROW_MISSING_PAYLOAD,
'description' => 'The row data and permissions are missing. You must provide either row data or permissions to be updated.',
'code' => 400,
],
Exception::ROW_ALREADY_EXISTS => [
'name' => Exception::ROW_ALREADY_EXISTS,
'description' => 'Row with the requested ID already exists. Try again with a different ID or use ID.unique() to generate a unique ID.',
'code' => 409,
],
Exception::ROW_UPDATE_CONFLICT => [
'name' => Exception::ROW_UPDATE_CONFLICT,
'description' => 'Remote row is newer than local.',
'code' => 409,
],
Exception::ROW_DELETE_RESTRICTED => [
'name' => Exception::ROW_DELETE_RESTRICTED,
'description' => 'Row cannot be deleted because it is referenced by another row.',
'code' => 403,
],
/** Attributes */
Exception::ATTRIBUTE_NOT_FOUND => [
'name' => Exception::ATTRIBUTE_NOT_FOUND,
@@ -772,13 +831,67 @@ return [
'description' => 'The attribute type is invalid.',
'code' => 400,
],
Exception::ATTRIBUTE_INVALID_RESIZE => [
'name' => Exception::ATTRIBUTE_INVALID_RESIZE,
'description' => 'Existing data is too large for new size, truncate your existing data then try again.',
'code' => 400,
],
/** Exists for both Attributes & Columns */
Exception::RELATIONSHIP_VALUE_INVALID => [
'name' => Exception::RELATIONSHIP_VALUE_INVALID,
'description' => 'The relationship value is invalid.',
'code' => 400,
],
Exception::ATTRIBUTE_INVALID_RESIZE => [
'name' => Exception::ATTRIBUTE_INVALID_RESIZE,
/** Columns */
Exception::COLUMN_NOT_FOUND => [
'name' => Exception::COLUMN_NOT_FOUND,
'description' => 'Column with the requested ID could not be found.',
'code' => 404,
],
Exception::COLUMN_UNKNOWN => [
'name' => Exception::COLUMN_UNKNOWN,
'description' => 'The column required for the index could not be found. Please confirm all your columns are in the available state.',
'code' => 400,
],
Exception::COLUMN_NOT_AVAILABLE => [
'name' => Exception::COLUMN_NOT_AVAILABLE,
'description' => 'The requested column is not yet available. Please try again later.',
'code' => 400,
],
Exception::COLUMN_FORMAT_UNSUPPORTED => [
'name' => Exception::COLUMN_FORMAT_UNSUPPORTED,
'description' => 'The requested column format is not supported.',
'code' => 400,
],
Exception::COLUMN_DEFAULT_UNSUPPORTED => [
'name' => Exception::COLUMN_DEFAULT_UNSUPPORTED,
'description' => 'Default values cannot be set for array or required columns.',
'code' => 400,
],
Exception::COLUMN_ALREADY_EXISTS => [
'name' => Exception::COLUMN_ALREADY_EXISTS,
'description' => 'Column with the requested key already exists. Column keys must be unique, try again with a different key.',
'code' => 409,
],
Exception::COLUMN_LIMIT_EXCEEDED => [
'name' => Exception::COLUMN_LIMIT_EXCEEDED,
'description' => 'The maximum number or size of columns for this table has been reached.',
'code' => 400,
],
Exception::COLUMN_VALUE_INVALID => [
'name' => Exception::COLUMN_VALUE_INVALID,
'description' => 'The column value is invalid. Please check the type, range and value of the column.',
'code' => 400,
],
Exception::COLUMN_TYPE_INVALID => [
'name' => Exception::COLUMN_TYPE_INVALID,
'description' => 'The column type is invalid.',
'code' => 400,
],
Exception::COLUMN_INVALID_RESIZE => [
'name' => Exception::COLUMN_INVALID_RESIZE,
'description' => "Existing data is too large for new size, truncate your existing data then try again.",
'code' => 400,
],
@@ -810,6 +923,33 @@ return [
'code' => 409,
],
/** Column Indexes, same as Indexes but with different type */
Exception::COLUMN_INDEX_NOT_FOUND => [
'name' => Exception::COLUMN_INDEX_NOT_FOUND,
'description' => 'Index with the requested ID could not be found.',
'code' => 404,
],
Exception::COLUMN_INDEX_LIMIT_EXCEEDED => [
'name' => Exception::COLUMN_INDEX_LIMIT_EXCEEDED,
'description' => 'The maximum number of indexes has been reached.',
'code' => 400,
],
Exception::COLUMN_INDEX_ALREADY_EXISTS => [
'name' => Exception::COLUMN_INDEX_ALREADY_EXISTS,
'description' => 'Index with the requested key already exists. Try again with a different key.',
'code' => 409,
],
Exception::COLUMN_INDEX_INVALID => [
'name' => Exception::COLUMN_INDEX_INVALID,
'description' => 'Index invalid.',
'code' => 400,
],
Exception::COLUMN_INDEX_DEPENDENCY => [
'name' => Exception::COLUMN_INDEX_DEPENDENCY,
'description' => 'Column cannot be renamed or deleted. Please remove the associated index first.',
'code' => 409,
],
/** Project Errors */
Exception::PROJECT_NOT_FOUND => [
'name' => Exception::PROJECT_NOT_FOUND,
+50
View File
@@ -95,6 +95,56 @@ return [
'$model' => Response::MODEL_DATABASE,
'$resource' => true,
'$description' => 'This event triggers on any database event.',
'tables' => [
'$model' => Response::MODEL_TABLE,
'$resource' => true,
'$description' => 'This event triggers on any table event.',
'rows' => [
'$model' => Response::MODEL_ROW,
'$resource' => true,
'$description' => 'This event triggers on any rows event.',
'create' => [
'$description' => 'This event triggers when a row is created.',
],
'delete' => [
'$description' => 'This event triggers when a row is deleted.'
],
'update' => [
'$description' => 'This event triggers when a row is updated.'
],
],
'indexes' => [
'$model' => Response::MODEL_COLUMN_INDEX,
'$resource' => true,
'$description' => 'This event triggers on any indexes event.',
'create' => [
'$description' => 'This event triggers when an index is created.',
],
'delete' => [
'$description' => 'This event triggers when an index is deleted.'
]
],
'columns' => [
'$model' => Response::MODEL_COLUMN,
'$resource' => true,
'$description' => 'This event triggers on any columns event.',
'create' => [
'$description' => 'This event triggers when a column is created.',
],
'delete' => [
'$description' => 'This event triggers when an column is deleted.'
]
],
'create' => [
'$description' => 'This event triggers when a table is created.'
],
'delete' => [
'$description' => 'This event triggers when a table is deleted.',
],
'update' => [
'$description' => 'This event triggers when a table is updated.',
]
],
'collections' => [
'$model' => Response::MODEL_COLLECTION,
'$resource' => true,
@@ -120,6 +120,11 @@
</head>
<body>
<div style="display: none; overflow: hidden; max-height: 0; max-width: 0; opacity: 0; line-height: 1px;">
{{preview}}
<div>{{previewWhitespace}}</div>
</div>
<div class="main">
<table>
<tr>
@@ -121,6 +121,11 @@
<body style="direction: {{direction}}">
<div style="display: none; overflow: hidden; max-height: 0; max-width: 0; opacity: 0; line-height: 1px;">
{{preview}}
<div>{{previewWhitespace}}</div>
</div>
<div style="max-width:650px; word-wrap: break-word; overflow-wrap: break-word;
word-break: normal; margin:0 auto;">
<table style="margin-top: 32px">
@@ -9,4 +9,4 @@
<p>If you have trouble with the sender's image, ensure it is set in the <a href="https://gravatar.com/">Gravatar database</a>.</p>
<p style="margin-block-end: 0;">Best regards,</p>
<p style="margin-block-start: 0;">Appwrtite team</p>
<p style="margin-block-start: 0;">Appwrite team</p>
@@ -14,7 +14,7 @@
<table border="0" cellspacing="0" cellpadding="0" style="padding-top: 10px; padding-bottom: 10px; margin-top: 32px">
<tr>
<td style="border-radius: 8px; display: block; width: 100%;">
<a class="mobile-full-width" rel="noopener" target="_blank" href="{{host}}{{path}}" style="font-size: 14px; font-family: Inter; color: #ffffff; text-decoration: none; background-color: #FD366E; border-radius: 8px; padding: 9px 14px; border: 1px solid #FD366E; display: inline-block; text-align:center; box-sizing: border-box;">Webhook settings</a>
<a class="mobile-full-width" rel="noopener" target="_blank" href="{{host}}{{path}}" style="font-size: 14px; font-family: Inter; color: #ffffff; text-decoration: none; background-color: #2D2D31; border-radius: 8px; padding: 9px 14px; border: 1px solid #414146; display: inline-block; text-align:center; box-sizing: border-box;">Webhook settings</a>
</td>
</tr>
</table>
+9 -1
View File
@@ -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 didnt 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.",
+17 -17
View File
@@ -11,7 +11,7 @@ return [
[
'key' => 'web',
'name' => 'Web',
'version' => '18.1.0',
'version' => '18.2.0',
'url' => 'https://github.com/appwrite/sdk-for-web',
'package' => 'https://www.npmjs.com/package/appwrite',
'enabled' => true,
@@ -59,7 +59,7 @@ return [
[
'key' => 'flutter',
'name' => 'Flutter',
'version' => '17.0.2',
'version' => '17.1.0',
'url' => 'https://github.com/appwrite/sdk-for-flutter',
'package' => 'https://pub.dev/packages/appwrite',
'enabled' => true,
@@ -77,7 +77,7 @@ return [
[
'key' => 'apple',
'name' => 'Apple',
'version' => '10.1.1',
'version' => '10.2.0',
'url' => 'https://github.com/appwrite/sdk-for-apple',
'package' => 'https://github.com/appwrite/sdk-for-apple',
'enabled' => true,
@@ -112,7 +112,7 @@ return [
[
'key' => 'android',
'name' => 'Android',
'version' => '8.1.0',
'version' => '8.2.0',
'url' => 'https://github.com/appwrite/sdk-for-android',
'package' => 'https://search.maven.org/artifact/io.appwrite/sdk-for-android',
'enabled' => true,
@@ -134,7 +134,7 @@ return [
[
'key' => 'react-native',
'name' => 'React Native',
'version' => '0.10.1',
'version' => '0.11.0',
'url' => 'https://github.com/appwrite/sdk-for-react-native',
'package' => 'https://npmjs.com/package/react-native-appwrite',
'enabled' => true,
@@ -199,7 +199,7 @@ return [
[
'key' => 'web',
'name' => 'Console',
'version' => '1.7.0',
'version' => '1.9.0',
'url' => 'https://github.com/appwrite/sdk-for-console',
'package' => '',
'enabled' => true,
@@ -217,7 +217,7 @@ return [
[
'key' => 'cli',
'name' => 'Command Line',
'version' => '8.2.2',
'version' => '8.3.0',
'url' => 'https://github.com/appwrite/sdk-for-cli',
'package' => 'https://www.npmjs.com/package/appwrite-cli',
'enabled' => true,
@@ -251,7 +251,7 @@ return [
[
'key' => 'nodejs',
'name' => 'Node.js',
'version' => '17.1.0',
'version' => '17.2.0',
'url' => 'https://github.com/appwrite/sdk-for-node',
'package' => 'https://www.npmjs.com/package/node-appwrite',
'enabled' => true,
@@ -269,7 +269,7 @@ return [
[
'key' => 'deno',
'name' => 'Deno',
'version' => '15.0.0',
'version' => '15.1.0',
'url' => 'https://github.com/appwrite/sdk-for-deno',
'package' => 'https://deno.land/x/appwrite',
'enabled' => true,
@@ -287,7 +287,7 @@ return [
[
'key' => 'php',
'name' => 'PHP',
'version' => '15.0.0',
'version' => '15.1.0',
'url' => 'https://github.com/appwrite/sdk-for-php',
'package' => 'https://packagist.org/packages/appwrite/appwrite',
'enabled' => true,
@@ -305,7 +305,7 @@ return [
[
'key' => 'python',
'name' => 'Python',
'version' => '11.0.0',
'version' => '11.1.0',
'url' => 'https://github.com/appwrite/sdk-for-python',
'package' => 'https://pypi.org/project/appwrite/',
'enabled' => true,
@@ -323,7 +323,7 @@ return [
[
'key' => 'ruby',
'name' => 'Ruby',
'version' => '16.0.0',
'version' => '16.1.0',
'url' => 'https://github.com/appwrite/sdk-for-ruby',
'package' => 'https://rubygems.org/gems/appwrite',
'enabled' => true,
@@ -341,7 +341,7 @@ return [
[
'key' => 'go',
'name' => 'Go',
'version' => '0.8.0',
'version' => '0.9.0',
'url' => 'https://github.com/appwrite/sdk-for-go',
'package' => 'https://github.com/appwrite/sdk-for-go',
'enabled' => true,
@@ -359,7 +359,7 @@ return [
[
'key' => 'dotnet',
'name' => '.NET',
'version' => '0.14.0',
'version' => '0.14.1',
'url' => 'https://github.com/appwrite/sdk-for-dotnet',
'package' => 'https://www.nuget.org/packages/Appwrite',
'enabled' => true,
@@ -377,7 +377,7 @@ return [
[
'key' => 'dart',
'name' => 'Dart',
'version' => '16.1.0',
'version' => '16.2.0',
'url' => 'https://github.com/appwrite/sdk-for-dart',
'package' => 'https://pub.dev/packages/dart_appwrite',
'enabled' => true,
@@ -395,7 +395,7 @@ return [
[
'key' => 'kotlin',
'name' => 'Kotlin',
'version' => '9.0.0',
'version' => '9.1.0',
'url' => 'https://github.com/appwrite/sdk-for-kotlin',
'package' => 'https://search.maven.org/artifact/io.appwrite/sdk-for-kotlin',
'enabled' => true,
@@ -417,7 +417,7 @@ return [
[
'key' => 'swift',
'name' => 'Swift',
'version' => '10.1.0',
'version' => '10.2.0',
'url' => 'https://github.com/appwrite/sdk-for-swift',
'package' => 'https://github.com/appwrite/sdk-for-swift',
'enabled' => true,
+8
View File
@@ -14,6 +14,8 @@ $member = [
'teams.write',
'documents.read',
'documents.write',
'rows.read',
'rows.write',
'files.read',
'files.write',
'projects.read',
@@ -37,6 +39,8 @@ $admins = [
'teams.write',
'documents.read',
'documents.write',
'rows.read',
'rows.write',
'files.read',
'files.write',
'buckets.read',
@@ -47,6 +51,8 @@ $admins = [
'databases.write',
'collections.read',
'collections.write',
'tables.read',
'tables.write',
'platforms.read',
'platforms.write',
'projects.write',
@@ -97,6 +103,8 @@ return [
'sessions.write',
'documents.read',
'documents.write',
'rows.read',
'rows.write',
'files.read',
'files.write',
'locale.read',
+18
View File
@@ -28,12 +28,24 @@ return [ // List of publicly visible scopes
'collections.write' => [
'description' => 'Access to create, update, and delete your project\'s database collections',
],
'tables.read' => [
'description' => 'Access to read your project\'s database tables',
],
'tables.write' => [
'description' => 'Access to create, update, and delete your project\'s database tables',
],
'attributes.read' => [
'description' => 'Access to read your project\'s database collection\'s attributes',
],
'attributes.write' => [
'description' => 'Access to create, update, and delete your project\'s database collection\'s attributes',
],
'columns.read' => [
'description' => 'Access to read your project\'s database table\'s columns',
],
'columns.write' => [
'description' => 'Access to create, update, and delete your project\'s database table\'s columns',
],
'indexes.read' => [
'description' => 'Access to read your project\'s database collection\'s indexes',
],
@@ -46,6 +58,12 @@ return [ // List of publicly visible scopes
'documents.write' => [
'description' => 'Access to create, update, and delete your project\'s database documents',
],
'rows.read' => [
'description' => 'Access to read your project\'s database rows',
],
'rows.write' => [
'description' => 'Access to create, update, and delete your project\'s database rows',
],
'files.read' => [
'description' => 'Access to read your project\'s storage files and preview images',
],
+15 -2
View File
@@ -55,10 +55,10 @@ return [
],
'databases' => [
'key' => 'databases',
'name' => 'Databases',
'name' => 'Databases (legacy)',
'subtitle' => 'The Databases service allows you to create structured collections of documents, query and filter lists of documents',
'description' => '/docs/services/databases.md',
'controller' => 'api/databases.php',
'controller' => '', // Uses modules
'sdk' => true,
'docs' => true,
'docsUrl' => 'https://appwrite.io/docs/client/databases',
@@ -66,6 +66,19 @@ return [
'optional' => true,
'icon' => '/images/services/databases.png',
],
'tables' => [
'key' => 'tables',
'name' => 'Tables',
'subtitle' => 'The Tables service allows you to create structured tables of rows, query and filter lists of rows',
'description' => '/docs/services/tables.md',
'controller' => '', // Uses modules
'sdk' => true,
'docs' => true,
'docsUrl' => 'https://appwrite.io/docs/client/tables',
'tests' => false,
'optional' => true,
'icon' => '/images/services/databases.png',
],
'locale' => [
'key' => 'locale',
'name' => 'Locale',
+276 -40
View File
@@ -4457,6 +4457,7 @@
"rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}",
"scope": "documents.write",
"platforms": [
"console",
"client",
"server",
"server"
@@ -4466,9 +4467,7 @@
{
"name": "createDocument",
"auth": {
"Session": [],
"Key": [],
"JWT": []
"Project": []
},
"parameters": [
"databaseId",
@@ -4890,7 +4889,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 117,
"weight": 119,
"cookies": false,
"type": "",
"deprecated": false,
@@ -4951,6 +4950,236 @@
]
}
},
"\/databases\/{databaseId}\/collections\/{collectionId}\/documents\/{documentId}\/{attribute}\/decrement": {
"patch": {
"summary": "Decrement document attribute",
"operationId": "databasesDecrementDocumentAttribute",
"tags": [
"databases"
],
"description": "Decrement a specific attribute of a document by a given value.",
"responses": {
"200": {
"description": "Document",
"content": {
"application\/json": {
"schema": {
"$ref": "#\/components\/schemas\/document"
}
}
}
}
},
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 116,
"cookies": false,
"type": "",
"deprecated": false,
"demo": "databases\/decrement-document-attribute.md",
"edit": "https:\/\/github.com\/appwrite\/appwrite\/edit\/master\/docs\/references\/databases\/decrement-document-attribute.md",
"rate-limit": 120,
"rate-time": 60,
"rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}",
"scope": "documents.write",
"platforms": [
"console",
"server",
"client",
"server"
],
"packaging": false,
"auth": {
"Project": []
}
},
"security": [
{
"Project": [],
"Session": [],
"JWT": []
}
],
"parameters": [
{
"name": "databaseId",
"description": "Database ID.",
"required": true,
"schema": {
"type": "string",
"x-example": "<DATABASE_ID>"
},
"in": "path"
},
{
"name": "collectionId",
"description": "Collection ID.",
"required": true,
"schema": {
"type": "string",
"x-example": "<COLLECTION_ID>"
},
"in": "path"
},
{
"name": "documentId",
"description": "Document ID.",
"required": true,
"schema": {
"type": "string",
"x-example": "<DOCUMENT_ID>"
},
"in": "path"
},
{
"name": "attribute",
"description": "Attribute key.",
"required": true,
"schema": {
"type": "string"
},
"in": "path"
}
],
"requestBody": {
"content": {
"application\/json": {
"schema": {
"type": "object",
"properties": {
"value": {
"type": "number",
"description": "Value to decrement the attribute by. The value must be a number.",
"x-example": null
},
"min": {
"type": "number",
"description": "Minimum value for the attribute. If the current value is lesser than this value, an exception will be thrown.",
"x-example": null
}
}
}
}
}
}
}
},
"\/databases\/{databaseId}\/collections\/{collectionId}\/documents\/{documentId}\/{attribute}\/increment": {
"patch": {
"summary": "Increment document attribute",
"operationId": "databasesIncrementDocumentAttribute",
"tags": [
"databases"
],
"description": "Increment a specific attribute of a document by a given value.",
"responses": {
"200": {
"description": "Document",
"content": {
"application\/json": {
"schema": {
"$ref": "#\/components\/schemas\/document"
}
}
}
}
},
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 115,
"cookies": false,
"type": "",
"deprecated": false,
"demo": "databases\/increment-document-attribute.md",
"edit": "https:\/\/github.com\/appwrite\/appwrite\/edit\/master\/docs\/references\/databases\/increment-document-attribute.md",
"rate-limit": 120,
"rate-time": 60,
"rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}",
"scope": "documents.write",
"platforms": [
"console",
"server",
"client",
"server"
],
"packaging": false,
"auth": {
"Project": []
}
},
"security": [
{
"Project": [],
"Session": [],
"JWT": []
}
],
"parameters": [
{
"name": "databaseId",
"description": "Database ID.",
"required": true,
"schema": {
"type": "string",
"x-example": "<DATABASE_ID>"
},
"in": "path"
},
{
"name": "collectionId",
"description": "Collection ID.",
"required": true,
"schema": {
"type": "string",
"x-example": "<COLLECTION_ID>"
},
"in": "path"
},
{
"name": "documentId",
"description": "Document ID.",
"required": true,
"schema": {
"type": "string",
"x-example": "<DOCUMENT_ID>"
},
"in": "path"
},
{
"name": "attribute",
"description": "Attribute key.",
"required": true,
"schema": {
"type": "string"
},
"in": "path"
}
],
"requestBody": {
"content": {
"application\/json": {
"schema": {
"type": "object",
"properties": {
"value": {
"type": "number",
"description": "Value to increment the attribute by. The value must be a number.",
"x-example": null
},
"max": {
"type": "number",
"description": "Maximum value for the attribute. If the current value is greater than this value, an error will be thrown.",
"x-example": null
}
}
}
}
}
}
}
},
"\/functions\/{functionId}\/executions": {
"get": {
"summary": "List executions",
@@ -4974,7 +5203,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 392,
"weight": 393,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5049,7 +5278,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 390,
"weight": 391,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5164,7 +5393,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 391,
"weight": 392,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5238,7 +5467,7 @@
"x-appwrite": {
"method": "query",
"group": "graphql",
"weight": 306,
"weight": 307,
"cookies": false,
"type": "graphql",
"deprecated": false,
@@ -5290,7 +5519,7 @@
"x-appwrite": {
"method": "mutation",
"group": "graphql",
"weight": 305,
"weight": 306,
"cookies": false,
"type": "graphql",
"deprecated": false,
@@ -5342,7 +5571,7 @@
"x-appwrite": {
"method": "get",
"group": null,
"weight": 122,
"weight": 124,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5394,7 +5623,7 @@
"x-appwrite": {
"method": "listCodes",
"group": null,
"weight": 123,
"weight": 125,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5446,7 +5675,7 @@
"x-appwrite": {
"method": "listContinents",
"group": null,
"weight": 127,
"weight": 129,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5498,7 +5727,7 @@
"x-appwrite": {
"method": "listCountries",
"group": null,
"weight": 124,
"weight": 126,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5550,7 +5779,7 @@
"x-appwrite": {
"method": "listCountriesEU",
"group": null,
"weight": 125,
"weight": 127,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5602,7 +5831,7 @@
"x-appwrite": {
"method": "listCountriesPhones",
"group": null,
"weight": 126,
"weight": 128,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5654,7 +5883,7 @@
"x-appwrite": {
"method": "listCurrencies",
"group": null,
"weight": 128,
"weight": 130,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5706,7 +5935,7 @@
"x-appwrite": {
"method": "listLanguages",
"group": null,
"weight": 129,
"weight": 131,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5758,7 +5987,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 352,
"weight": 353,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5841,7 +6070,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 356,
"weight": 357,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5916,7 +6145,7 @@
"x-appwrite": {
"method": "listFiles",
"group": "files",
"weight": 212,
"weight": 214,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6002,7 +6231,7 @@
"x-appwrite": {
"method": "createFile",
"group": "files",
"weight": 211,
"weight": 213,
"cookies": false,
"type": "upload",
"deprecated": false,
@@ -6100,7 +6329,7 @@
"x-appwrite": {
"method": "getFile",
"group": "files",
"weight": 213,
"weight": 215,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6172,7 +6401,7 @@
"x-appwrite": {
"method": "updateFile",
"group": "files",
"weight": 218,
"weight": 220,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6261,7 +6490,7 @@
"x-appwrite": {
"method": "deleteFile",
"group": "files",
"weight": 219,
"weight": 221,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6328,7 +6557,7 @@
"x-appwrite": {
"method": "getFileDownload",
"group": "files",
"weight": 215,
"weight": 217,
"cookies": false,
"type": "location",
"deprecated": false,
@@ -6406,7 +6635,7 @@
"x-appwrite": {
"method": "getFilePreview",
"group": "files",
"weight": 214,
"weight": 216,
"cookies": false,
"type": "location",
"deprecated": false,
@@ -6634,7 +6863,7 @@
"x-appwrite": {
"method": "getFileView",
"group": "files",
"weight": 216,
"weight": 218,
"cookies": false,
"type": "location",
"deprecated": false,
@@ -6719,7 +6948,7 @@
"x-appwrite": {
"method": "list",
"group": "teams",
"weight": 223,
"weight": 225,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6795,7 +7024,7 @@
"x-appwrite": {
"method": "create",
"group": "teams",
"weight": 222,
"weight": 224,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6880,7 +7109,7 @@
"x-appwrite": {
"method": "get",
"group": "teams",
"weight": 224,
"weight": 226,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6942,7 +7171,7 @@
"x-appwrite": {
"method": "updateName",
"group": "teams",
"weight": 226,
"weight": 228,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7016,7 +7245,7 @@
"x-appwrite": {
"method": "delete",
"group": "teams",
"weight": 228,
"weight": 230,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7080,7 +7309,7 @@
"x-appwrite": {
"method": "listMemberships",
"group": "memberships",
"weight": 230,
"weight": 232,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7166,7 +7395,7 @@
"x-appwrite": {
"method": "createMembership",
"group": "memberships",
"weight": 229,
"weight": 231,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7277,7 +7506,7 @@
"x-appwrite": {
"method": "getMembership",
"group": "memberships",
"weight": 231,
"weight": 233,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7349,7 +7578,7 @@
"x-appwrite": {
"method": "updateMembership",
"group": "memberships",
"weight": 232,
"weight": 234,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7436,7 +7665,7 @@
"x-appwrite": {
"method": "deleteMembership",
"group": "memberships",
"weight": 234,
"weight": 236,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7510,7 +7739,7 @@
"x-appwrite": {
"method": "updateMembershipStatus",
"group": "memberships",
"weight": 233,
"weight": 235,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7608,7 +7837,7 @@
"x-appwrite": {
"method": "getPrefs",
"group": "teams",
"weight": 225,
"weight": 227,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7669,7 +7898,7 @@
"x-appwrite": {
"method": "updatePrefs",
"group": "teams",
"weight": 227,
"weight": 229,
"cookies": false,
"type": "",
"deprecated": false,
@@ -8183,6 +8412,12 @@
"description": "Document ID.",
"x-example": "5e5ea5c16897e"
},
"$sequence": {
"type": "integer",
"description": "Document automatically incrementing ID.",
"x-example": 1,
"format": "int32"
},
"$collectionId": {
"type": "string",
"description": "Collection ID.",
@@ -8217,6 +8452,7 @@
"additionalProperties": true,
"required": [
"$id",
"$sequence",
"$collectionId",
"$databaseId",
"$createdAt",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+266 -90
View File
@@ -3451,7 +3451,6 @@
"scope": "avatars.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -3576,7 +3575,6 @@
"scope": "avatars.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -3707,7 +3705,6 @@
"scope": "avatars.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -3770,7 +3767,6 @@
"scope": "avatars.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -4257,7 +4253,6 @@
"scope": "avatars.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -4340,7 +4335,6 @@
"scope": "avatars.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -4431,7 +4425,6 @@
"scope": "avatars.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -4522,7 +4515,6 @@
"scope": "documents.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -4603,8 +4595,8 @@
"rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}",
"scope": "documents.write",
"platforms": [
"console",
"client",
"server",
"server"
],
"packaging": false,
@@ -4612,9 +4604,7 @@
{
"name": "createDocument",
"auth": {
"Session": [],
"Key": [],
"JWT": []
"Project": []
},
"parameters": [
"databaseId",
@@ -4743,7 +4733,6 @@
"scope": "documents.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -4833,7 +4822,6 @@
"scope": "documents.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -4938,7 +4926,6 @@
"scope": "documents.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5023,7 +5010,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 117,
"weight": 119,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5035,7 +5022,6 @@
"scope": "documents.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5078,6 +5064,222 @@
]
}
},
"\/databases\/{databaseId}\/collections\/{collectionId}\/documents\/{documentId}\/{attribute}\/decrement": {
"patch": {
"summary": "Decrement document attribute",
"operationId": "databasesDecrementDocumentAttribute",
"consumes": [
"application\/json"
],
"produces": [
"application\/json"
],
"tags": [
"databases"
],
"description": "Decrement a specific attribute of a document by a given value.",
"responses": {
"200": {
"description": "Document",
"schema": {
"$ref": "#\/definitions\/document"
}
}
},
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 116,
"cookies": false,
"type": "",
"deprecated": false,
"demo": "databases\/decrement-document-attribute.md",
"edit": "https:\/\/github.com\/appwrite\/appwrite\/edit\/master\/docs\/references\/databases\/decrement-document-attribute.md",
"rate-limit": 120,
"rate-time": 60,
"rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}",
"scope": "documents.write",
"platforms": [
"console",
"server",
"client"
],
"packaging": false,
"auth": {
"Project": []
}
},
"security": [
{
"Project": [],
"Session": [],
"JWT": []
}
],
"parameters": [
{
"name": "databaseId",
"description": "Database ID.",
"required": true,
"type": "string",
"x-example": "<DATABASE_ID>",
"in": "path"
},
{
"name": "collectionId",
"description": "Collection ID.",
"required": true,
"type": "string",
"x-example": "<COLLECTION_ID>",
"in": "path"
},
{
"name": "documentId",
"description": "Document ID.",
"required": true,
"type": "string",
"x-example": "<DOCUMENT_ID>",
"in": "path"
},
{
"name": "attribute",
"description": "Attribute key.",
"required": true,
"type": "string",
"in": "path"
},
{
"name": "payload",
"in": "body",
"schema": {
"type": "object",
"properties": {
"value": {
"type": "number",
"description": "Value to decrement the attribute by. The value must be a number.",
"default": 1,
"x-example": null
},
"min": {
"type": "number",
"description": "Minimum value for the attribute. If the current value is lesser than this value, an exception will be thrown.",
"default": null,
"x-example": null
}
}
}
}
]
}
},
"\/databases\/{databaseId}\/collections\/{collectionId}\/documents\/{documentId}\/{attribute}\/increment": {
"patch": {
"summary": "Increment document attribute",
"operationId": "databasesIncrementDocumentAttribute",
"consumes": [
"application\/json"
],
"produces": [
"application\/json"
],
"tags": [
"databases"
],
"description": "Increment a specific attribute of a document by a given value.",
"responses": {
"200": {
"description": "Document",
"schema": {
"$ref": "#\/definitions\/document"
}
}
},
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 115,
"cookies": false,
"type": "",
"deprecated": false,
"demo": "databases\/increment-document-attribute.md",
"edit": "https:\/\/github.com\/appwrite\/appwrite\/edit\/master\/docs\/references\/databases\/increment-document-attribute.md",
"rate-limit": 120,
"rate-time": 60,
"rate-key": "ip:{ip},method:{method},url:{url},userId:{userId}",
"scope": "documents.write",
"platforms": [
"console",
"server",
"client"
],
"packaging": false,
"auth": {
"Project": []
}
},
"security": [
{
"Project": [],
"Session": [],
"JWT": []
}
],
"parameters": [
{
"name": "databaseId",
"description": "Database ID.",
"required": true,
"type": "string",
"x-example": "<DATABASE_ID>",
"in": "path"
},
{
"name": "collectionId",
"description": "Collection ID.",
"required": true,
"type": "string",
"x-example": "<COLLECTION_ID>",
"in": "path"
},
{
"name": "documentId",
"description": "Document ID.",
"required": true,
"type": "string",
"x-example": "<DOCUMENT_ID>",
"in": "path"
},
{
"name": "attribute",
"description": "Attribute key.",
"required": true,
"type": "string",
"in": "path"
},
{
"name": "payload",
"in": "body",
"schema": {
"type": "object",
"properties": {
"value": {
"type": "number",
"description": "Value to increment the attribute by. The value must be a number.",
"default": 1,
"x-example": null
},
"max": {
"type": "number",
"description": "Maximum value for the attribute. If the current value is greater than this value, an error will be thrown.",
"default": null,
"x-example": null
}
}
}
}
]
}
},
"\/functions\/{functionId}\/executions": {
"get": {
"summary": "List executions",
@@ -5101,7 +5303,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 392,
"weight": 393,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5113,7 +5315,6 @@
"scope": "execution.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5175,7 +5376,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 390,
"weight": 391,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5187,7 +5388,6 @@
"scope": "execution.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5292,7 +5492,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 391,
"weight": 392,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5304,7 +5504,6 @@
"scope": "execution.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5364,7 +5563,7 @@
"x-appwrite": {
"method": "query",
"group": "graphql",
"weight": 306,
"weight": 307,
"cookies": false,
"type": "graphql",
"deprecated": false,
@@ -5376,8 +5575,7 @@
"scope": "graphql",
"platforms": [
"server",
"client",
"server"
"client"
],
"packaging": false,
"auth": {
@@ -5438,7 +5636,7 @@
"x-appwrite": {
"method": "mutation",
"group": "graphql",
"weight": 305,
"weight": 306,
"cookies": false,
"type": "graphql",
"deprecated": false,
@@ -5450,8 +5648,7 @@
"scope": "graphql",
"platforms": [
"server",
"client",
"server"
"client"
],
"packaging": false,
"auth": {
@@ -5510,7 +5707,7 @@
"x-appwrite": {
"method": "get",
"group": null,
"weight": 122,
"weight": 124,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5522,7 +5719,6 @@
"scope": "locale.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5562,7 +5758,7 @@
"x-appwrite": {
"method": "listCodes",
"group": null,
"weight": 123,
"weight": 125,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5574,7 +5770,6 @@
"scope": "locale.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5614,7 +5809,7 @@
"x-appwrite": {
"method": "listContinents",
"group": null,
"weight": 127,
"weight": 129,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5626,7 +5821,6 @@
"scope": "locale.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5666,7 +5860,7 @@
"x-appwrite": {
"method": "listCountries",
"group": null,
"weight": 124,
"weight": 126,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5678,7 +5872,6 @@
"scope": "locale.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5718,7 +5911,7 @@
"x-appwrite": {
"method": "listCountriesEU",
"group": null,
"weight": 125,
"weight": 127,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5730,7 +5923,6 @@
"scope": "locale.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5770,7 +5962,7 @@
"x-appwrite": {
"method": "listCountriesPhones",
"group": null,
"weight": 126,
"weight": 128,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5782,7 +5974,6 @@
"scope": "locale.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5822,7 +6013,7 @@
"x-appwrite": {
"method": "listCurrencies",
"group": null,
"weight": 128,
"weight": 130,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5834,7 +6025,6 @@
"scope": "locale.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5874,7 +6064,7 @@
"x-appwrite": {
"method": "listLanguages",
"group": null,
"weight": 129,
"weight": 131,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5886,7 +6076,6 @@
"scope": "locale.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -5928,7 +6117,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 352,
"weight": 353,
"cookies": false,
"type": "",
"deprecated": false,
@@ -5941,8 +6130,7 @@
"platforms": [
"server",
"client",
"console",
"server"
"console"
],
"packaging": false,
"auth": {
@@ -6013,7 +6201,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 356,
"weight": 357,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6026,8 +6214,7 @@
"platforms": [
"server",
"client",
"console",
"server"
"console"
],
"packaging": false,
"auth": {
@@ -6084,7 +6271,7 @@
"x-appwrite": {
"method": "listFiles",
"group": "files",
"weight": 212,
"weight": 214,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6096,7 +6283,6 @@
"scope": "files.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -6167,7 +6353,7 @@
"x-appwrite": {
"method": "createFile",
"group": "files",
"weight": 211,
"weight": 213,
"cookies": false,
"type": "upload",
"deprecated": false,
@@ -6179,7 +6365,6 @@
"scope": "files.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -6257,7 +6442,7 @@
"x-appwrite": {
"method": "getFile",
"group": "files",
"weight": 213,
"weight": 215,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6269,7 +6454,6 @@
"scope": "files.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -6327,7 +6511,7 @@
"x-appwrite": {
"method": "updateFile",
"group": "files",
"weight": 218,
"weight": 220,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6339,7 +6523,6 @@
"scope": "files.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -6416,7 +6599,7 @@
"x-appwrite": {
"method": "deleteFile",
"group": "files",
"weight": 219,
"weight": 221,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6428,7 +6611,6 @@
"scope": "files.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -6486,7 +6668,7 @@
"x-appwrite": {
"method": "getFileDownload",
"group": "files",
"weight": 215,
"weight": 217,
"cookies": false,
"type": "location",
"deprecated": false,
@@ -6498,7 +6680,6 @@
"scope": "files.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -6565,7 +6746,7 @@
"x-appwrite": {
"method": "getFilePreview",
"group": "files",
"weight": 214,
"weight": 216,
"cookies": false,
"type": "location",
"deprecated": false,
@@ -6577,7 +6758,6 @@
"scope": "files.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -6772,7 +6952,7 @@
"x-appwrite": {
"method": "getFileView",
"group": "files",
"weight": 216,
"weight": 218,
"cookies": false,
"type": "location",
"deprecated": false,
@@ -6784,7 +6964,6 @@
"scope": "files.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -6851,7 +7030,7 @@
"x-appwrite": {
"method": "list",
"group": "teams",
"weight": 223,
"weight": 225,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6863,7 +7042,6 @@
"scope": "teams.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -6926,7 +7104,7 @@
"x-appwrite": {
"method": "create",
"group": "teams",
"weight": 222,
"weight": 224,
"cookies": false,
"type": "",
"deprecated": false,
@@ -6938,7 +7116,6 @@
"scope": "teams.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -7016,7 +7193,7 @@
"x-appwrite": {
"method": "get",
"group": "teams",
"weight": 224,
"weight": 226,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7028,7 +7205,6 @@
"scope": "teams.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -7078,7 +7254,7 @@
"x-appwrite": {
"method": "updateName",
"group": "teams",
"weight": 226,
"weight": 228,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7090,7 +7266,6 @@
"scope": "teams.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -7153,7 +7328,7 @@
"x-appwrite": {
"method": "delete",
"group": "teams",
"weight": 228,
"weight": 230,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7165,7 +7340,6 @@
"scope": "teams.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -7215,7 +7389,7 @@
"x-appwrite": {
"method": "listMemberships",
"group": "memberships",
"weight": 230,
"weight": 232,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7227,7 +7401,6 @@
"scope": "teams.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -7298,7 +7471,7 @@
"x-appwrite": {
"method": "createMembership",
"group": "memberships",
"weight": 229,
"weight": 231,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7310,7 +7483,6 @@
"scope": "teams.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -7411,7 +7583,7 @@
"x-appwrite": {
"method": "getMembership",
"group": "memberships",
"weight": 231,
"weight": 233,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7423,7 +7595,6 @@
"scope": "teams.read",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -7481,7 +7652,7 @@
"x-appwrite": {
"method": "updateMembership",
"group": "memberships",
"weight": 232,
"weight": 234,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7493,7 +7664,6 @@
"scope": "teams.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -7567,7 +7737,7 @@
"x-appwrite": {
"method": "deleteMembership",
"group": "memberships",
"weight": 234,
"weight": 236,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7579,7 +7749,6 @@
"scope": "teams.write",
"platforms": [
"client",
"server",
"server"
],
"packaging": false,
@@ -7639,7 +7808,7 @@
"x-appwrite": {
"method": "updateMembershipStatus",
"group": "memberships",
"weight": 233,
"weight": 235,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7733,7 +7902,7 @@
"x-appwrite": {
"method": "getPrefs",
"group": "teams",
"weight": 225,
"weight": 227,
"cookies": false,
"type": "",
"deprecated": false,
@@ -7794,7 +7963,7 @@
"x-appwrite": {
"method": "updatePrefs",
"group": "teams",
"weight": 227,
"weight": 229,
"cookies": false,
"type": "",
"deprecated": false,
@@ -8286,6 +8455,12 @@
"description": "Document ID.",
"x-example": "5e5ea5c16897e"
},
"$sequence": {
"type": "integer",
"description": "Document automatically incrementing ID.",
"x-example": 1,
"format": "int32"
},
"$collectionId": {
"type": "string",
"description": "Collection ID.",
@@ -8320,6 +8495,7 @@
"additionalProperties": true,
"required": [
"$id",
"$sequence",
"$collectionId",
"$databaseId",
"$createdAt",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+13 -10
View File
@@ -635,7 +635,7 @@ return [
'type' => 'url'
]
],
'scopes' => ['databases.read', 'databases.write', 'collections.write', 'attributes.write', 'documents.read', 'documents.write']
'scopes' => ['databases.read', 'databases.write', 'collections.write', 'tables.write', 'attributes.write', 'columns.write', 'documents.read', 'rows.read', 'documents.write', 'rows.write']
],
[
'icon' => 'icon-algolia',
@@ -717,7 +717,7 @@ return [
'type' => 'password'
],
],
'scopes' => ['databases.read', 'collections.read', 'documents.read']
'scopes' => ['databases.read', 'collections.read', 'tables.read', 'documents.read', 'rows.read']
],
[
'icon' => 'icon-meilisearch',
@@ -811,7 +811,7 @@ return [
'type' => 'text'
],
],
'scopes' => ['databases.read', 'collections.read', 'documents.read']
'scopes' => ['databases.read', 'collections.read', 'tables.read', 'documents.read', 'rows.read']
],
[
'icon' => 'icon-vonage',
@@ -1139,7 +1139,7 @@ return [
'type' => 'text'
]
],
'scopes' => ['databases.read', 'databases.write', 'collections.write', 'attributes.write', 'documents.read', 'documents.write']
'scopes' => ['databases.read', 'databases.write', 'collections.write', 'tables.write', 'attributes.write', 'columns.write', 'documents.read', 'rows.read', 'documents.write', 'rows.write']
],
[
'icon' => 'icon-chat',
@@ -1268,7 +1268,7 @@ return [
'type' => 'password'
]
],
'scopes' => ['databases.read', 'databases.write', 'collections.read', 'collections.write', 'attributes.write', 'documents.read', 'documents.write', 'buckets.read', 'buckets.write', 'files.read']
'scopes' => ['databases.read', 'databases.write', 'collections.read', 'tables.read', 'collections.write', 'tables.write', 'attributes.write', 'columns.write', 'documents.read', 'rows.read', 'documents.write', 'rows.write', 'buckets.read', 'buckets.write', 'files.read']
],
[
'icon' => 'icon-eye',
@@ -1327,7 +1327,7 @@ return [
'type' => 'password'
]
],
'scopes' => ['databases.read', 'databases.write', 'collections.read', 'collections.write', 'attributes.write', 'documents.read', 'documents.write', 'buckets.read', 'buckets.write', 'files.read']
'scopes' => ['databases.read', 'databases.write', 'collections.read', 'tables.read', 'collections.write', 'tables.write', 'attributes.write', 'columns.write', 'documents.read', 'rows.read', 'documents.write', 'rows.write', 'buckets.read', 'buckets.write', 'files.read']
],
[
'icon' => 'icon-text',
@@ -1386,7 +1386,7 @@ return [
'type' => 'password'
]
],
'scopes' => ['databases.read', 'databases.write', 'collections.read', 'collections.write', 'attributes.write', 'documents.read', 'documents.write', 'buckets.read', 'buckets.write', 'files.read']
'scopes' => ['databases.read', 'databases.write', 'collections.read', 'tables.read', 'collections.write', 'tables.write', 'attributes.write', 'columns.write', 'documents.read', 'rows.read', 'documents.write', 'rows.write', 'buckets.read', 'buckets.write', 'files.read']
],
[
'icon' => 'icon-chat',
@@ -1395,7 +1395,10 @@ return [
'score' => 5,
'tagline' => 'Convert text to speech using the Hugging Face inference API.',
'permissions' => ['any'],
'events' => ['databases.*.collections.*.documents.*.create'],
'events' => [
'databases.*.tables.*.rows.*.create',
'databases.*.collections.*.documents.*.create',
],
'cron' => '',
'timeout' => 15,
'useCases' => ['ai'],
@@ -1666,7 +1669,7 @@ return [
'type' => 'text'
]
],
'scopes' => ['databases.read', 'collections.read', 'documents.read']
'scopes' => ['databases.read', 'collections.read', 'tables.read', 'documents.read', 'rows.read']
],
[
'icon' => 'icon-chip',
@@ -1730,7 +1733,7 @@ return [
'type' => 'text'
]
],
'scopes' => ['databases.read', 'collections.read', 'documents.read']
'scopes' => ['databases.read', 'collections.read', 'tables.read', 'documents.read', 'rows.read']
],
[
'icon' => 'icon-chat',
+2 -2
View File
@@ -827,7 +827,7 @@ return [
],
[
'name' => '_APP_FUNCTIONS_TIMEOUT',
'description' => 'The maximum number of seconds allowed as a timeout value when creating a new function. The default value is 900 seconds. This is the global limit, timeout for individual functions are configured in the function\'s settings or in appwrite.json.',
'description' => 'The maximum number of seconds allowed as a timeout value when creating a new function. The default value is 900 seconds. This is the global limit, timeout for individual functions are configured in the function\'s settings or in appwrite.config.json.',
'introduction' => '0.7.0',
'default' => '900',
'required' => false,
@@ -1070,7 +1070,7 @@ return [
'variables' => [
[
'name' => '_APP_SITES_TIMEOUT',
'description' => 'The maximum number of seconds allowed as a timeout value when creating a new site. The default value is 900 seconds. This is the global limit, timeout for individual functions are configured in the sites\'s settings or in appwrite.json.',
'description' => 'The maximum number of seconds allowed as a timeout value when creating a new site. The default value is 900 seconds. This is the global limit, timeout for individual functions are configured in the sites\'s settings or in appwrite.config.json.',
'introduction' => '1.7.0',
'default' => '900',
'required' => false,
+62 -5
View File
@@ -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');
@@ -132,6 +133,16 @@ function sendSessionAlert(Locale $locale, Document $user, Document $project, Doc
->setSmtpSenderName($senderName);
}
// session alerts should always have a client name!
$clientName = $session->getAttribute('clientName');
if (empty($clientName)) {
// fallback to the user agent and then unknown!
$userAgent = $session->getAttribute('userAgent');
$clientName = !empty($userAgent) ? $userAgent : 'UNKNOWN';
$session->setAttribute('clientName', $clientName);
}
$emailVariables = [
'direction' => $locale->getText('settings.direction'),
'date' => (new \DateTime())->format('F j'),
@@ -148,6 +159,7 @@ function sendSessionAlert(Locale $locale, Document $user, Document $project, Doc
$queueForMails
->setSubject($subject)
->setPreview($preview)
->setBody($body)
->setVariables($emailVariables)
->setRecipient($email)
@@ -2025,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'));
@@ -2113,6 +2126,7 @@ App::post('/v1/account/tokens/magic-url')
$queueForMails
->setSubject($subject)
->setPreview($preview)
->setBody($body)
->setVariables($emailVariables)
->setRecipient($email)
@@ -2225,7 +2239,30 @@ App::post('/v1/account/tokens/email')
]);
$user->removeAttribute('$sequence');
Authorization::skip(fn () => $dbForProject->createDocument('users', $user));
$user = Authorization::skip(fn () => $dbForProject->createDocument('users', $user));
try {
$target = Authorization::skip(fn () => $dbForProject->createDocument('targets', new Document([
'$permissions' => [
Permission::read(Role::user($user->getId())),
Permission::update(Role::user($user->getId())),
Permission::delete(Role::user($user->getId())),
],
'userId' => $user->getId(),
'userInternalId' => $user->getSequence(),
'providerType' => MESSAGE_TYPE_EMAIL,
'identifier' => $email,
])));
$user->setAttribute('targets', [...$user->getAttribute('targets', []), $target]);
} catch (Duplicate) {
$existingTarget = $dbForProject->findOne('targets', [
Query::equal('identifier', [$email]),
]);
if (!$existingTarget->isEmpty()) {
$user->setAttribute('targets', $existingTarget, Document::SET_TYPE_APPEND);
}
}
$dbForProject->purgeCachedDocument('users', $user->getId());
}
$tokenSecret = Auth::codeGenerator(6);
@@ -2254,6 +2291,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'));
@@ -2339,6 +2377,7 @@ App::post('/v1/account/tokens/email')
$queueForMails
->setSubject($subject)
->setPreview($preview)
->setBody($body)
->setVariables($emailVariables)
->setRecipient($email)
@@ -2899,6 +2938,18 @@ App::patch('/v1/account/password')
->setAttribute('hash', Auth::DEFAULT_ALGO)
->setAttribute('hashOptions', Auth::DEFAULT_ALGO_OPTIONS);
$sessions = $user->getAttribute('sessions', []);
$current = Auth::sessionVerify($sessions, Auth::$secret);
$invalidate = $project->getAttribute('auths', default: [])['invalidateSessions'] ?? false;
if ($invalidate && !empty($current)) {
foreach ($sessions as $session) {
/** @var Document $session */
if ($session->getId() !== $current) {
$dbForProject->deleteDocument('sessions', $session->getId());
}
}
}
$user = $dbForProject->updateDocument('users', $user->getId(), $user);
$queueForEvents->setParam('userId', $user->getId());
@@ -3233,7 +3284,7 @@ App::post('/v1/account/recovery')
throw new Exception(Exception::USER_BLOCKED);
}
$expire = DateTime::addSeconds(new \DateTime(), Auth::TOKEN_EXPIRATION_RECOVERY);
$expire = DateTime::formatTz(DateTime::addSeconds(new \DateTime(), Auth::TOKEN_EXPIRATION_RECOVERY));
$secret = Auth::tokenGenerator(Auth::TOKEN_LENGTH_RECOVERY);
$recovery = new Document([
@@ -3265,6 +3316,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');
@@ -3339,6 +3391,7 @@ App::post('/v1/account/recovery')
->setBody($body)
->setVariables($emailVariables)
->setSubject($subject)
->setPreview($preview)
->trigger();
$recovery->setAttribute('secret', $secret);
@@ -3490,7 +3543,7 @@ App::post('/v1/account/verification')
}
$verificationSecret = Auth::tokenGenerator(Auth::TOKEN_LENGTH_VERIFICATION);
$expire = DateTime::addSeconds(new \DateTime(), Auth::TOKEN_EXPIRATION_CONFIRM);
$expire = DateTime::formatTz(DateTime::addSeconds(new \DateTime(), Auth::TOKEN_EXPIRATION_CONFIRM));
$verification = new Document([
'$id' => ID::unique(),
@@ -3520,6 +3573,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] ?? [];
@@ -3592,6 +3646,7 @@ App::post('/v1/account/verification')
$queueForMails
->setSubject($subject)
->setPreview($preview)
->setBody($body)
->setVariables($emailVariables)
->setRecipient($user->getAttribute('email'))
@@ -3738,7 +3793,7 @@ App::post('/v1/account/verification/phone')
}
$secret ??= Auth::codeGenerator();
$expire = DateTime::addSeconds(new \DateTime(), Auth::TOKEN_EXPIRATION_CONFIRM);
$expire = DateTime::formatTz(DateTime::addSeconds(new \DateTime(), Auth::TOKEN_EXPIRATION_CONFIRM));
$verification = new Document([
'$id' => ID::unique(),
@@ -4346,7 +4401,7 @@ App::post('/v1/account/mfa/challenge')
->inject('plan')
->action(function (string $factor, Response $response, Database $dbForProject, Document $user, Locale $locale, Document $project, Request $request, Event $queueForEvents, Messaging $queueForMessaging, Mail $queueForMails, callable $timelimit, StatsUsage $queueForStatsUsage, array $plan) {
$expire = DateTime::addSeconds(new \DateTime(), Auth::TOKEN_EXPIRATION_CONFIRM);
$expire = DateTime::formatTz(DateTime::addSeconds(new \DateTime(), Auth::TOKEN_EXPIRATION_CONFIRM));
$code = Auth::codeGenerator();
$challenge = new Document([
'userId' => $user->getId(),
@@ -4437,6 +4492,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'));
@@ -4513,6 +4569,7 @@ App::post('/v1/account/mfa/challenge')
$queueForMails
->setSubject($subject)
->setPreview($preview)
->setBody($body)
->setVariables($emailVariables)
->setRecipient($user->getAttribute('email'))
File diff suppressed because it is too large Load Diff
+6 -17
View File
@@ -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}.");
+1
View File
@@ -354,6 +354,7 @@ App::get('/v1/project/usage')
'executionsMbSecondsTotal' => $total[METRIC_EXECUTIONS_MB_SECONDS],
'buildsMbSecondsTotal' => $total[METRIC_BUILDS_MB_SECONDS],
'documentsTotal' => $total[METRIC_DOCUMENTS],
'rowsTotal' => $total[METRIC_DOCUMENTS],
'databasesTotal' => $total[METRIC_DATABASES],
'databasesStorageTotal' => $total[METRIC_DATABASES_STORAGE],
'usersTotal' => $total[METRIC_USERS],
+83 -8
View File
@@ -127,6 +127,7 @@ App::post('/v1/projects')
'membershipsUserName' => false,
'membershipsUserEmail' => false,
'membershipsMfa' => false,
'invalidateSessions' => true
];
foreach ($auth as $method) {
@@ -2175,7 +2176,7 @@ App::post('/v1/projects/:projectId/smtp/tests')
->setSmtpSenderName($senderName)
->setRecipient($email)
->setName('')
->setbodyTemplate(__DIR__ . '/../../config/locale/templates/email-base-styled.tpl')
->setBodyTemplate(__DIR__ . '/../../config/locale/templates/email-base-styled.tpl')
->setBody($template->render())
->setVariables([])
->setSubject($subject)
@@ -2268,16 +2269,53 @@ App::get('/v1/projects/:projectId/templates/email/:type/:locale')
$localeObj = new Locale($locale);
if (is_null($template)) {
$message = Template::fromFile(__DIR__ . '/../../config/locale/templates/email-inner-base.tpl');
/**
* different templates, different placeholders.
*/
$templateConfigs = [
'magicSession' => [
'file' => 'email-magic-url.tpl',
'placeholders' => ['optionButton', 'buttonText', 'optionUrl', 'clientInfo', 'securityPhrase']
],
'mfaChallenge' => [
'file' => 'email-mfa-challenge.tpl',
'placeholders' => ['description', 'clientInfo']
],
'otpSession' => [
'file' => 'email-otp.tpl',
'placeholders' => ['description', 'clientInfo', 'securityPhrase']
],
'sessionAlert' => [
'file' => 'email-session-alert.tpl',
'placeholders' => ['body', 'listDevice', 'listIpAddress', 'listCountry', 'footer']
],
];
// fallback to the base template.
$config = $templateConfigs[$type] ?? [
'file' => 'email-inner-base.tpl',
'placeholders' => ['buttonText', 'body', 'footer']
];
$templateString = file_get_contents(__DIR__ . '/../../config/locale/templates/' . $config['file']);
// We use `fromString` due to the replace above
$message = Template::fromString($templateString);
// Set type-specific parameters
foreach ($config['placeholders'] as $param) {
$escapeHtml = !in_array($param, ['clientInfo', 'body', 'footer', 'description']);
$message->setParam("{{{$param}}}", $localeObj->getText("emails.{$type}.{$param}"), escapeHtml: $escapeHtml);
}
$message
// common placeholders on all the templates
->setParam('{{hello}}', $localeObj->getText("emails.{$type}.hello"))
->setParam('{{footer}}', $localeObj->getText("emails.{$type}.footer"))
->setParam('{{body}}', $localeObj->getText('emails.' . $type . '.body'), escapeHtml: false)
->setParam('{{thanks}}', $localeObj->getText("emails.{$type}.thanks"))
->setParam('{{buttonText}}', $localeObj->getText("emails.{$type}.buttonText"))
->setParam('{{signature}}', $localeObj->getText("emails.{$type}.signature"))
->setParam('{{direction}}', $localeObj->getText('settings.direction'));
$message = $message->render();
->setParam('{{signature}}', $localeObj->getText("emails.{$type}.signature"));
// `useContent: false` will strip new lines!
$message = $message->render(useContent: true);
$template = [
'message' => $message,
@@ -2500,3 +2538,40 @@ App::delete('/v1/projects/:projectId/templates/email/:type/:locale')
'message' => $template['message']
]), Response::MODEL_EMAIL_TEMPLATE);
});
App::patch('/v1/projects/:projectId/auth/session-invalidation')
->desc('Update invalidate session option of the project')
->groups(['api', 'projects'])
->label('scope', 'projects.write')
->label('sdk', new Method(
namespace: 'projects',
group: 'auth',
name: 'updateSessionInvalidation',
description: '/docs/references/projects/update-session-invalidation.md',
auth: [AuthType::ADMIN],
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_PROJECT,
)
]
))
->param('projectId', '', new UID(), 'Project unique ID.')
->param('enabled', false, new Boolean(), 'Update authentication session invalidation status. Use this endpoint to enable or disable session invalidation on password change')
->inject('response')
->inject('dbForPlatform')
->action(function (string $projectId, bool $enabled, Response $response, Database $dbForPlatform) {
$project = $dbForPlatform->getDocument('projects', $projectId);
if ($project->isEmpty()) {
throw new Exception(Exception::PROJECT_NOT_FOUND);
}
$auths = $project->getAttribute('auths', []);
$auths['invalidateSessions'] = $enabled;
$dbForPlatform->updateDocument('projects', $project->getId(), $project
->setAttribute('auths', $auths));
$response->dynamic($project, Response::MODEL_PROJECT);
});
+8 -8
View File
@@ -93,7 +93,7 @@ App::post('/v1/storage/buckets')
$bucketId = $bucketId === 'unique()' ? ID::unique() : $bucketId;
// Map aggregate permissions into the multiple permissions they represent.
$permissions = Permission::aggregate($permissions);
$permissions = Permission::aggregate($permissions) ?? [];
$compression ??= Compression::NONE;
$encryption ??= true;
try {
@@ -146,7 +146,7 @@ App::post('/v1/storage/buckets')
$bucket = $dbForProject->getDocument('buckets', $bucketId);
$dbForProject->createCollection('bucket_' . $bucket->getSequence(), $attributes, $indexes, permissions: $permissions ?? [], documentSecurity: $fileSecurity);
$dbForProject->createCollection('bucket_' . $bucket->getSequence(), $attributes, $indexes, permissions: $permissions, documentSecurity: $fileSecurity);
} catch (DuplicateException) {
throw new Exception(Exception::STORAGE_BUCKET_ALREADY_EXISTS);
}
@@ -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()) {
+2
View File
@@ -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)
+11
View File
@@ -1353,6 +1353,17 @@ App::patch('/v1/users/:userId/password')
$user = $dbForProject->updateDocument('users', $user->getId(), $user);
$sessions = $user->getAttribute('sessions', []);
$invalidate = $project->getAttribute('auths', default: [])['invalidateSessions'] ?? false;
if ($invalidate) {
foreach ($sessions as $session) {
/** @var Document $session */
$dbForProject->deleteDocument('sessions', $session->getId());
}
}
$dbForProject->purgeCachedDocument('users', $user->getId());
$queueForEvents->setParam('userId', $user->getId());
$response->dynamic($user, Response::MODEL_USER);
+6 -4
View File
@@ -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") {
+29 -2
View File
@@ -22,11 +22,13 @@ use Appwrite\Utopia\Request\Filters\V16 as RequestV16;
use Appwrite\Utopia\Request\Filters\V17 as RequestV17;
use Appwrite\Utopia\Request\Filters\V18 as RequestV18;
use Appwrite\Utopia\Request\Filters\V19 as RequestV19;
use Appwrite\Utopia\Request\Filters\V20 as RequestV20;
use Appwrite\Utopia\Response;
use Appwrite\Utopia\Response\Filters\V16 as ResponseV16;
use Appwrite\Utopia\Response\Filters\V17 as ResponseV17;
use Appwrite\Utopia\Response\Filters\V18 as ResponseV18;
use Appwrite\Utopia\Response\Filters\V19 as ResponseV19;
use Appwrite\Utopia\Response\Filters\V20 as ResponseV20;
use Appwrite\Utopia\View;
use Executor\Executor;
use MaxMind\Db\Reader;
@@ -850,6 +852,10 @@ App::init()
if (version_compare($requestFormat, '1.7.0', '<')) {
$request->addFilter(new RequestV19());
}
if (version_compare($requestFormat, '1.8.0', '<')) {
$dbForProject = $getProjectDB($project);
$request->addFilter(new RequestV20($dbForProject, $request->getParams()));
}
}
$domain = $request->getHostname();
@@ -969,6 +975,8 @@ App::init()
)
);
$warnings = [];
/*
* Response format
*/
@@ -986,8 +994,11 @@ App::init()
if (version_compare($responseFormat, '1.7.0', '<')) {
$response->addFilter(new ResponseV19());
}
if (version_compare($responseFormat, '1.8.0', '<')) {
$response->addFilter(new ResponseV20());
}
if (version_compare($responseFormat, APP_VERSION_STABLE, '>')) {
$response->addHeader('X-Appwrite-Warning', "The current SDK is built for Appwrite " . $responseFormat . ". However, the current Appwrite server version is " . APP_VERSION_STABLE . ". Please downgrade your SDK to match the Appwrite version: https://appwrite.io/docs/sdks");
$warnings[] = "The current SDK is built for Appwrite " . $responseFormat . ". However, the current Appwrite server version is " . APP_VERSION_STABLE . ". Please downgrade your SDK to match the Appwrite version: https://appwrite.io/docs/sdks";
}
}
@@ -1024,6 +1035,22 @@ App::init()
$response->addHeader('Access-Control-Allow-Origin', '*');
}
/**
* Deprecation Warning
*/
$sdk = $route->getLabel('sdk', false);
$deprecationWarning = 'This route is deprecated. See the updated documentation for improved compatibility and migration details.';
$sdkItems = is_array($sdk) ? $sdk : (!empty($sdk) ? [$sdk] : []);
foreach ($sdkItems as $sdkItem) {
if ($sdkItem->isDeprecated()) {
$warnings[] = $deprecationWarning;
}
}
if (!empty($warnings)) {
$response->addHeader('X-Appwrite-Warning', implode(';', $warnings));
}
/*
* Validate Client Domain - Check to avoid CSRF attack
* Adding Appwrite API domains to allow XDOMAIN communication
@@ -1260,7 +1287,7 @@ App::error()
$action = 'UNKNOWN_NAMESPACE.UNKNOWN.METHOD';
if (!empty($sdk)) {
/** @var Appwrite\SDK\Method $sdk */
/** @var \Appwrite\SDK\Method $sdk */
$action = $sdk->getNamespace() . '.' . $sdk->getMethodName();
}
+2 -2
View File
@@ -800,8 +800,8 @@ App::shutdown()
Console::info("Triggering database event: \n" . \json_encode([
'projectId' => $project->getId(),
'databaseId' => $queueForDatabase->getDatabase()?->getId(),
'collectionId' => $queueForDatabase->getCollection()?->getId(),
'documentId' => $queueForDatabase->getDocument()?->getId(),
'tableId' => $queueForDatabase->getTable()?->getId() ?? $queueForDatabase->getCollection()?->getId(),
'rowId' => $queueForDatabase->getRow()?->getId() ?? $queueForDatabase->getDocument()?->getId(),
]));
$queueForDatabase->trigger();
}
+4 -2
View File
@@ -37,8 +37,8 @@ const APP_PROJECT_ACCESS = 24 * 60 * 60; // 24 hours
const APP_RESOURCE_TOKEN_ACCESS = 24 * 60 * 60; // 24 hours
const APP_FILE_ACCESS = 24 * 60 * 60; // 24 hours
const APP_CACHE_UPDATE = 24 * 60 * 60; // 24 hours
const APP_CACHE_BUSTER = 4320;
const APP_VERSION_STABLE = '1.7.4';
const APP_CACHE_BUSTER = 4321;
const APP_VERSION_STABLE = '1.8.0';
const APP_DATABASE_ATTRIBUTE_EMAIL = 'email';
const APP_DATABASE_ATTRIBUTE_ENUM = 'enum';
const APP_DATABASE_ATTRIBUTE_IP = 'ip';
@@ -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;
+34 -12
View File
@@ -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;
}, ['consumer']);
App::setResource('consumerStatsUsage', function (BrokerPool $consumer) {
return $consumer;
}, ['consumer']);
App::setResource('queueForMessaging', function (Publisher $publisher) {
return new Messaging($publisher);
}, ['publisher']);
@@ -222,12 +234,12 @@ App::setResource('user', function ($mode, $project, $console, $request, $respons
Auth::$unique = $session['id'] ?? '';
Auth::$secret = $session['secret'] ?? '';
if ($mode === APP_MODE_ADMIN) {
$user = $dbForPlatform->getDocument('users', Auth::$unique);
} else {
if ($project->isEmpty()) {
$user = new Document([]);
} else {
$user = new Document([]);
if (!empty(Auth::$unique)) {
if ($mode === APP_MODE_ADMIN) {
$user = $dbForPlatform->getDocument('users', Auth::$unique);
} elseif (!$project->isEmpty()) {
if ($project->getId() === 'console') {
$user = $dbForPlatform->getDocument('users', Auth::$unique);
} else {
@@ -688,6 +700,7 @@ App::setResource('schema', function ($utopia, $dbForProject) {
},
];
// NOTE: `params` and `urls` are not used internally in the `Schema::build` function below!
$params = [
'list' => function (string $databaseId, string $collectionId, array $args) {
return [ 'queries' => $args['queries']];
@@ -836,11 +849,20 @@ App::setResource('team', function (Document $project, Database $dbForPlatform, A
$teamInternalId = $p->getAttribute('teamInternalId', '');
} elseif ($path === '/v1/projects') {
$teamId = $request->getParam('teamId', '');
if (empty($teamId)) {
return new Document([]);
}
$team = Authorization::skip(fn () => $dbForPlatform->getDocument('teams', $teamId));
return $team;
}
}
if (empty($teamInternalId)) {
return new Document([]);
}
$team = Authorization::skip(function () use ($dbForPlatform, $teamInternalId) {
return $dbForPlatform->findOne('teams', [
Query::equal('$sequence', [$teamInternalId]),
+1 -1
View File
@@ -177,7 +177,7 @@ $image = $this->getParam('image', '');
appwrite-console:
<<: *x-logging
container_name: appwrite-console
image: <?php echo $organization; ?>/console:6.0.13
image: <?php echo $organization; ?>/console:6.2.0
restart: unless-stopped
networks:
- appwrite
+22 -6
View File
@@ -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);
+6 -6
View File
@@ -12,8 +12,8 @@
],
"scripts": {
"test": "vendor/bin/phpunit",
"lint": "vendor/bin/pint --test",
"format": "vendor/bin/pint",
"lint": "vendor/bin/pint --test --config pint.json",
"format": "vendor/bin/pint --config pint.json",
"bench": "vendor/bin/phpbench run --report=benchmark",
"check": "./vendor/bin/phpstan analyse -c phpstan.neon"
},
@@ -52,7 +52,7 @@
"utopia-php/cache": "0.13.*",
"utopia-php/cli": "0.15.*",
"utopia-php/config": "0.2.*",
"utopia-php/database": "dev-validate-create-index-array as 0.71.10",
"utopia-php/database": "0.74.*",
"utopia-php/detector": "0.1.*",
"utopia-php/domains": "0.8.*",
"utopia-php/dsn": "0.2.1",
@@ -62,7 +62,7 @@
"utopia-php/locale": "0.4.*",
"utopia-php/logger": "0.6.*",
"utopia-php/messaging": "0.18.*",
"utopia-php/migration": "0.11.*",
"utopia-php/migration": "0.13.*",
"utopia-php/orchestration": "0.9.*",
"utopia-php/platform": "0.7.*",
"utopia-php/pools": "0.8.*",
@@ -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.*",
@@ -86,7 +86,7 @@
},
"require-dev": {
"ext-fileinfo": "*",
"appwrite/sdk-generator": "0.41.*",
"appwrite/sdk-generator": "0.*.*",
"phpunit/phpunit": "9.*",
"swoole/ide-helper": "5.1.2",
"phpstan/phpstan": "1.8.*",
Generated
+105 -90
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "b7f645a2dfd3313b7202189c133ea954",
"content-hash": "c4ae112243a897e16552c507c5e94097",
"packages": [
{
"name": "adhocore/jwt",
@@ -69,16 +69,16 @@
},
{
"name": "appwrite/appwrite",
"version": "15.0.0",
"version": "15.1.0",
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-for-php.git",
"reference": "deb97b62e0abed8a4fd5c5d48e77365cf89867cf"
"reference": "c438b3885071ac7c0329199dce5e6f6a24dd215b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/appwrite/sdk-for-php/zipball/deb97b62e0abed8a4fd5c5d48e77365cf89867cf",
"reference": "deb97b62e0abed8a4fd5c5d48e77365cf89867cf",
"url": "https://api.github.com/repos/appwrite/sdk-for-php/zipball/c438b3885071ac7c0329199dce5e6f6a24dd215b",
"reference": "c438b3885071ac7c0329199dce5e6f6a24dd215b",
"shasum": ""
},
"require": {
@@ -104,10 +104,10 @@
"support": {
"email": "team@appwrite.io",
"issues": "https://github.com/appwrite/sdk-for-php/issues",
"source": "https://github.com/appwrite/sdk-for-php/tree/15.0.0",
"source": "https://github.com/appwrite/sdk-for-php/tree/15.1.0",
"url": "https://appwrite.io/support"
},
"time": "2025-05-18T09:47:10+00:00"
"time": "2025-08-01T04:50:51+00:00"
},
{
"name": "appwrite/php-clamav",
@@ -2547,16 +2547,16 @@
},
{
"name": "symfony/http-client",
"version": "v7.3.1",
"version": "v7.3.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client.git",
"reference": "4403d87a2c16f33345dca93407a8714ee8c05a64"
"reference": "1c064a0c67749923483216b081066642751cc2c7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-client/zipball/4403d87a2c16f33345dca93407a8714ee8c05a64",
"reference": "4403d87a2c16f33345dca93407a8714ee8c05a64",
"url": "https://api.github.com/repos/symfony/http-client/zipball/1c064a0c67749923483216b081066642751cc2c7",
"reference": "1c064a0c67749923483216b081066642751cc2c7",
"shasum": ""
},
"require": {
@@ -2622,7 +2622,7 @@
"http"
],
"support": {
"source": "https://github.com/symfony/http-client/tree/v7.3.1"
"source": "https://github.com/symfony/http-client/tree/v7.3.2"
},
"funding": [
{
@@ -2633,12 +2633,16 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2025-06-28T07:58:39+00:00"
"time": "2025-07-15T11:36:08+00:00"
},
{
"name": "symfony/http-client-contracts",
@@ -3493,16 +3497,16 @@
},
{
"name": "utopia-php/database",
"version": "dev-validate-create-index-array",
"version": "0.74.3",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/database.git",
"reference": "9e2895b92cb094436973d5f8f30d75014bf03ae6"
"reference": "065b4812799d57fd2c596f88aadd51644247c7e3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/database/zipball/9e2895b92cb094436973d5f8f30d75014bf03ae6",
"reference": "9e2895b92cb094436973d5f8f30d75014bf03ae6",
"url": "https://api.github.com/repos/utopia-php/database/zipball/065b4812799d57fd2c596f88aadd51644247c7e3",
"reference": "065b4812799d57fd2c596f88aadd51644247c7e3",
"shasum": ""
},
"require": {
@@ -3543,9 +3547,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/database/issues",
"source": "https://github.com/utopia-php/database/tree/validate-create-index-array"
"source": "https://github.com/utopia-php/database/tree/0.74.3"
},
"time": "2025-07-20T08:28:54+00:00"
"time": "2025-07-31T15:00:30+00:00"
},
{
"name": "utopia-php/detector",
@@ -3942,16 +3946,16 @@
},
{
"name": "utopia-php/messaging",
"version": "0.18.1",
"version": "0.18.2",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/messaging.git",
"reference": "5d1245207a61d7ca065daddad7ac5f1d5640152f"
"reference": "0d364edacf4d4867964c7e17f653031dd39394bf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/messaging/zipball/5d1245207a61d7ca065daddad7ac5f1d5640152f",
"reference": "5d1245207a61d7ca065daddad7ac5f1d5640152f",
"url": "https://api.github.com/repos/utopia-php/messaging/zipball/0d364edacf4d4867964c7e17f653031dd39394bf",
"reference": "0d364edacf4d4867964c7e17f653031dd39394bf",
"shasum": ""
},
"require": {
@@ -3987,22 +3991,22 @@
],
"support": {
"issues": "https://github.com/utopia-php/messaging/issues",
"source": "https://github.com/utopia-php/messaging/tree/0.18.1"
"source": "https://github.com/utopia-php/messaging/tree/0.18.2"
},
"time": "2025-06-26T18:26:07+00:00"
"time": "2025-07-21T18:27:03+00:00"
},
{
"name": "utopia-php/migration",
"version": "0.11.1",
"version": "0.13.7",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/migration.git",
"reference": "d528a454d5c1ed6564b2843a39ff13297bcdb1af"
"reference": "fc25d50c3a19e701e905c56a9465143cacb02717"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/migration/zipball/d528a454d5c1ed6564b2843a39ff13297bcdb1af",
"reference": "d528a454d5c1ed6564b2843a39ff13297bcdb1af",
"url": "https://api.github.com/repos/utopia-php/migration/zipball/fc25d50c3a19e701e905c56a9465143cacb02717",
"reference": "fc25d50c3a19e701e905c56a9465143cacb02717",
"shasum": ""
},
"require": {
@@ -4043,9 +4047,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/migration/issues",
"source": "https://github.com/utopia-php/migration/tree/0.11.1"
"source": "https://github.com/utopia-php/migration/tree/0.13.7"
},
"time": "2025-07-11T13:46:37+00:00"
"time": "2025-07-31T15:08:29+00:00"
},
{
"name": "utopia-php/orchestration",
@@ -4587,16 +4591,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 +4634,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",
@@ -4810,16 +4814,16 @@
"packages-dev": [
{
"name": "appwrite/sdk-generator",
"version": "0.41.17",
"version": "0.41.27",
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-generator.git",
"reference": "ef5e9d952032deecffee7f825a941c40ed4c84b8"
"reference": "083fd2e8163d6a4e59ee971ac6cb97277d831dd5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/ef5e9d952032deecffee7f825a941c40ed4c84b8",
"reference": "ef5e9d952032deecffee7f825a941c40ed4c84b8",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/083fd2e8163d6a4e59ee971ac6cb97277d831dd5",
"reference": "083fd2e8163d6a4e59ee971ac6cb97277d831dd5",
"shasum": ""
},
"require": {
@@ -4855,9 +4859,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.41.17"
"source": "https://github.com/appwrite/sdk-generator/tree/0.41.27"
},
"time": "2025-07-18T08:18:48+00:00"
"time": "2025-07-31T10:20:46+00:00"
},
{
"name": "doctrine/annotations",
@@ -5336,16 +5340,16 @@
},
{
"name": "nikic/php-parser",
"version": "v5.5.0",
"version": "v5.6.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "ae59794362fe85e051a58ad36b289443f57be7a9"
"reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9",
"reference": "ae59794362fe85e051a58ad36b289443f57be7a9",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/221b0d0fdf1369c71047ad1d18bb5880017bbc56",
"reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56",
"shasum": ""
},
"require": {
@@ -5388,9 +5392,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0"
"source": "https://github.com/nikic/PHP-Parser/tree/v5.6.0"
},
"time": "2025-05-31T08:24:38+00:00"
"time": "2025-07-27T20:03:57+00:00"
},
{
"name": "phar-io/manifest",
@@ -7258,16 +7262,16 @@
},
{
"name": "symfony/console",
"version": "v7.3.1",
"version": "v7.3.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "9e27aecde8f506ba0fd1d9989620c04a87697101"
"reference": "5f360ebc65c55265a74d23d7fe27f957870158a1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/9e27aecde8f506ba0fd1d9989620c04a87697101",
"reference": "9e27aecde8f506ba0fd1d9989620c04a87697101",
"url": "https://api.github.com/repos/symfony/console/zipball/5f360ebc65c55265a74d23d7fe27f957870158a1",
"reference": "5f360ebc65c55265a74d23d7fe27f957870158a1",
"shasum": ""
},
"require": {
@@ -7332,7 +7336,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v7.3.1"
"source": "https://github.com/symfony/console/tree/v7.3.2"
},
"funding": [
{
@@ -7343,25 +7347,29 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2025-06-27T19:55:54+00:00"
"time": "2025-07-30T17:13:41+00:00"
},
{
"name": "symfony/filesystem",
"version": "v7.3.0",
"version": "v7.3.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb"
"reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
"reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/edcbb768a186b5c3f25d0643159a787d3e63b7fd",
"reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd",
"shasum": ""
},
"require": {
@@ -7398,7 +7406,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v7.3.0"
"source": "https://github.com/symfony/filesystem/tree/v7.3.2"
},
"funding": [
{
@@ -7409,25 +7417,29 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-10-25T15:15:23+00:00"
"time": "2025-07-07T08:17:47+00:00"
},
{
"name": "symfony/finder",
"version": "v7.3.0",
"version": "v7.3.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d"
"reference": "2a6614966ba1074fa93dae0bc804227422df4dfe"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/ec2344cf77a48253bbca6939aa3d2477773ea63d",
"reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d",
"url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe",
"reference": "2a6614966ba1074fa93dae0bc804227422df4dfe",
"shasum": ""
},
"require": {
@@ -7462,7 +7474,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/finder/tree/v7.3.0"
"source": "https://github.com/symfony/finder/tree/v7.3.2"
},
"funding": [
{
@@ -7473,25 +7485,29 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-12-30T19:00:26+00:00"
"time": "2025-07-15T13:41:35+00:00"
},
{
"name": "symfony/options-resolver",
"version": "v7.3.0",
"version": "v7.3.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
"reference": "afb9a8038025e5dbc657378bfab9198d75f10fca"
"reference": "119bcf13e67dbd188e5dbc74228b1686f66acd37"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/afb9a8038025e5dbc657378bfab9198d75f10fca",
"reference": "afb9a8038025e5dbc657378bfab9198d75f10fca",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/119bcf13e67dbd188e5dbc74228b1686f66acd37",
"reference": "119bcf13e67dbd188e5dbc74228b1686f66acd37",
"shasum": ""
},
"require": {
@@ -7529,7 +7545,7 @@
"options"
],
"support": {
"source": "https://github.com/symfony/options-resolver/tree/v7.3.0"
"source": "https://github.com/symfony/options-resolver/tree/v7.3.2"
},
"funding": [
{
@@ -7540,12 +7556,16 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2025-04-04T13:12:05+00:00"
"time": "2025-07-15T11:36:08+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -7924,16 +7944,16 @@
},
{
"name": "symfony/string",
"version": "v7.3.0",
"version": "v7.3.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125"
"reference": "42f505aff654e62ac7ac2ce21033818297ca89ca"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125",
"reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125",
"url": "https://api.github.com/repos/symfony/string/zipball/42f505aff654e62ac7ac2ce21033818297ca89ca",
"reference": "42f505aff654e62ac7ac2ce21033818297ca89ca",
"shasum": ""
},
"require": {
@@ -7991,7 +8011,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v7.3.0"
"source": "https://github.com/symfony/string/tree/v7.3.2"
},
"funding": [
{
@@ -8002,12 +8022,16 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2025-04-20T20:19:01+00:00"
"time": "2025-07-10T08:47:49+00:00"
},
{
"name": "textalk/websocket",
@@ -8237,18 +8261,9 @@
"time": "2024-03-07T20:33:40+00:00"
}
],
"aliases": [
{
"package": "utopia-php/database",
"version": "dev-validate-create-index-array",
"alias": "0.71.10",
"alias_normalized": "0.71.10.0"
}
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {
"utopia-php/database": 20
},
"stability-flags": {},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
+1 -1
View File
@@ -214,7 +214,7 @@ services:
appwrite-console:
<<: *x-logging
container_name: appwrite-console
image: appwrite/console:6.1.12
image: appwrite/console:6.2.0
restart: unless-stopped
networks:
- appwrite
@@ -4,9 +4,7 @@ import io.appwrite.services.Databases;
Client client = new Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
.setSession("") // The user session to authenticate with
.setKey("") //
.setJWT("<YOUR_JWT>"); // Your secret JSON Web Token
.setProject("<YOUR_PROJECT_ID>"); // Your project ID
Databases databases = new Databases(client);
@@ -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://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
.setProject("<YOUR_PROJECT_ID>"); // Your project ID
Databases databases = new Databases(client);
databases.decrementDocumentAttribute(
"<DATABASE_ID>", // databaseId
"<COLLECTION_ID>", // collectionId
"<DOCUMENT_ID>", // documentId
"", // attribute
0, // value (optional)
0, // min (optional)
new CoroutineCallback<>((result, error) -> {
if (error != null) {
error.printStackTrace();
return;
}
Log.d("Appwrite", result.toString());
})
);
@@ -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://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
.setProject("<YOUR_PROJECT_ID>"); // Your project ID
Databases databases = new Databases(client);
databases.incrementDocumentAttribute(
"<DATABASE_ID>", // databaseId
"<COLLECTION_ID>", // collectionId
"<DOCUMENT_ID>", // documentId
"", // attribute
0, // value (optional)
0, // max (optional)
new CoroutineCallback<>((result, error) -> {
if (error != null) {
error.printStackTrace();
return;
}
Log.d("Appwrite", result.toString());
})
);
@@ -4,9 +4,7 @@ import io.appwrite.services.Databases
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
.setSession("") // The user session to authenticate with
.setKey("") //
.setJWT("<YOUR_JWT>") // Your secret JSON Web Token
.setProject("<YOUR_PROJECT_ID>") // Your project ID
val databases = Databases(client)
@@ -0,0 +1,18 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.Databases
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
.setProject("<YOUR_PROJECT_ID>") // Your project ID
val databases = Databases(client)
val result = databases.decrementDocumentAttribute(
databaseId = "<DATABASE_ID>",
collectionId = "<COLLECTION_ID>",
documentId = "<DOCUMENT_ID>",
attribute = "",
value = 0, // (optional)
min = 0, // (optional)
)
@@ -0,0 +1,18 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.Databases
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
.setProject("<YOUR_PROJECT_ID>") // Your project ID
val databases = Databases(client)
val result = databases.incrementDocumentAttribute(
databaseId = "<DATABASE_ID>",
collectionId = "<COLLECTION_ID>",
documentId = "<DOCUMENT_ID>",
attribute = "",
value = 0, // (optional)
max = 0, // (optional)
)
@@ -2,9 +2,7 @@ import Appwrite
let client = Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
.setSession("") // The user session to authenticate with
.setKey("") //
.setJWT("<YOUR_JWT>") // Your secret JSON Web Token
.setProject("<YOUR_PROJECT_ID>") // Your project ID
let databases = Databases(client)
@@ -0,0 +1,17 @@
import Appwrite
let client = Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
.setProject("<YOUR_PROJECT_ID>") // Your project ID
let databases = Databases(client)
let document = try await databases.decrementDocumentAttribute(
databaseId: "<DATABASE_ID>",
collectionId: "<COLLECTION_ID>",
documentId: "<DOCUMENT_ID>",
attribute: "",
value: 0, // optional
min: 0 // optional
)
@@ -0,0 +1,17 @@
import Appwrite
let client = Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
.setProject("<YOUR_PROJECT_ID>") // Your project ID
let databases = Databases(client)
let document = try await databases.incrementDocumentAttribute(
databaseId: "<DATABASE_ID>",
collectionId: "<COLLECTION_ID>",
documentId: "<DOCUMENT_ID>",
attribute: "",
value: 0, // optional
max: 0 // optional
)
@@ -2,9 +2,7 @@ import 'package:appwrite/appwrite.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setSession('') // The user session to authenticate with
.setKey('') //
.setJWT('<YOUR_JWT>'); // Your secret JSON Web Token
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
Databases databases = Databases(client);
@@ -0,0 +1,16 @@
import 'package:appwrite/appwrite.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
Databases databases = Databases(client);
Document result = await databases.decrementDocumentAttribute(
databaseId: '<DATABASE_ID>',
collectionId: '<COLLECTION_ID>',
documentId: '<DOCUMENT_ID>',
attribute: '',
value: 0, // optional
min: 0, // optional
);
@@ -0,0 +1,16 @@
import 'package:appwrite/appwrite.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
Databases databases = Databases(client);
Document result = await databases.incrementDocumentAttribute(
databaseId: '<DATABASE_ID>',
collectionId: '<COLLECTION_ID>',
documentId: '<DOCUMENT_ID>',
attribute: '',
value: 0, // optional
max: 0, // optional
);
@@ -7,6 +7,7 @@ mutation {
permissions: ["read("any")"]
) {
_id
_sequence
_collectionId
_databaseId
_createdAt
@@ -0,0 +1,19 @@
mutation {
databasesDecrementDocumentAttribute(
databaseId: "<DATABASE_ID>",
collectionId: "<COLLECTION_ID>",
documentId: "<DOCUMENT_ID>",
attribute: "",
value: 0,
min: 0
) {
_id
_sequence
_collectionId
_databaseId
_createdAt
_updatedAt
_permissions
data
}
}
@@ -0,0 +1,19 @@
mutation {
databasesIncrementDocumentAttribute(
databaseId: "<DATABASE_ID>",
collectionId: "<COLLECTION_ID>",
documentId: "<DOCUMENT_ID>",
attribute: "",
value: 0,
max: 0
) {
_id
_sequence
_collectionId
_databaseId
_createdAt
_updatedAt
_permissions
data
}
}
@@ -7,6 +7,7 @@ mutation {
permissions: ["read("any")"]
) {
_id
_sequence
_collectionId
_databaseId
_createdAt
@@ -7,6 +7,7 @@ mutation {
permissions: ["read("any")"]
) {
_id
_sequence
_collectionId
_databaseId
_createdAt
@@ -2,9 +2,7 @@ import { Client, Databases } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setSession('') // The user session to authenticate with
.setKey('') //
.setJWT('<YOUR_JWT>'); // Your secret JSON Web Token
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
const databases = new Databases(client);
@@ -0,0 +1,18 @@
import { Client, Databases } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
const databases = new Databases(client);
const result = await databases.decrementDocumentAttribute(
'<DATABASE_ID>', // databaseId
'<COLLECTION_ID>', // collectionId
'<DOCUMENT_ID>', // documentId
'', // attribute
null, // value (optional)
null // min (optional)
);
console.log(result);
@@ -0,0 +1,18 @@
import { Client, Databases } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
const databases = new Databases(client);
const result = await databases.incrementDocumentAttribute(
'<DATABASE_ID>', // databaseId
'<COLLECTION_ID>', // collectionId
'<DOCUMENT_ID>', // documentId
'', // attribute
null, // value (optional)
null // max (optional)
);
console.log(result);
@@ -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: <YOUR_PROJECT_ID>
X-Appwrite-Session:
X-Appwrite-JWT: <YOUR_JWT>
{
"value": 0,
"min": 0
}
@@ -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: <YOUR_PROJECT_ID>
X-Appwrite-Session:
X-Appwrite-JWT: <YOUR_JWT>
{
"value": 0,
"max": 0
}
@@ -2,9 +2,7 @@ import { Client, Databases } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setSession('') // The user session to authenticate with
.setKey('') //
.setJWT('<YOUR_JWT>'); // Your secret JSON Web Token
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
const databases = new Databases(client);
@@ -0,0 +1,18 @@
import { Client, Databases } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
const databases = new Databases(client);
const result = await databases.decrementDocumentAttribute(
'<DATABASE_ID>', // databaseId
'<COLLECTION_ID>', // collectionId
'<DOCUMENT_ID>', // documentId
'', // attribute
null, // value (optional)
null // min (optional)
);
console.log(result);
@@ -0,0 +1,18 @@
import { Client, Databases } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
const databases = new Databases(client);
const result = await databases.incrementDocumentAttribute(
'<DATABASE_ID>', // databaseId
'<COLLECTION_ID>', // collectionId
'<DOCUMENT_ID>', // documentId
'', // attribute
null, // value (optional)
null // max (optional)
);
console.log(result);
@@ -0,0 +1,7 @@
appwrite databases decrementDocumentAttribute \
--databaseId <DATABASE_ID> \
--collectionId <COLLECTION_ID> \
--documentId <DOCUMENT_ID> \
--attribute '' \
@@ -0,0 +1,7 @@
appwrite databases incrementDocumentAttribute \
--databaseId <DATABASE_ID> \
--collectionId <COLLECTION_ID> \
--documentId <DOCUMENT_ID> \
--attribute '' \
@@ -2,9 +2,7 @@ import { Client, Databases } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setSession('') //
.setKey('<YOUR_API_KEY>') // Your secret API key
.setJWT('<YOUR_JWT>'); // Your secret JSON Web Token
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
const databases = new Databases(client);
@@ -2,7 +2,7 @@ import { Client, Databases } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setKey('<YOUR_API_KEY>'); // Your secret API key
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
const databases = new Databases(client);
@@ -0,0 +1,18 @@
import { Client, Databases } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
const databases = new Databases(client);
const result = await databases.decrementDocumentAttribute(
'<DATABASE_ID>', // databaseId
'<COLLECTION_ID>', // collectionId
'<DOCUMENT_ID>', // documentId
'', // attribute
null, // value (optional)
null // min (optional)
);
console.log(result);
@@ -0,0 +1,18 @@
import { Client, Databases } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
const databases = new Databases(client);
const result = await databases.incrementDocumentAttribute(
'<DATABASE_ID>', // databaseId
'<COLLECTION_ID>', // collectionId
'<DOCUMENT_ID>', // documentId
'', // attribute
null, // value (optional)
null // max (optional)
);
console.log(result);
@@ -0,0 +1,17 @@
import { Client, Databases } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>'); // Your project ID
const databases = new Databases(client);
const result = await databases.upsertDocument(
'<DATABASE_ID>', // databaseId
'<COLLECTION_ID>', // collectionId
'<DOCUMENT_ID>', // documentId
{}, // data
["read("any")"] // permissions (optional)
);
console.log(result);
@@ -9,7 +9,7 @@ const databases = new Databases(client);
const result = await databases.upsertDocuments(
'<DATABASE_ID>', // databaseId
'<COLLECTION_ID>', // collectionId
[] // documents (optional)
[] // documents
);
console.log(result);
@@ -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://<REGION>.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
'<RESOURCE_ID>', // resourceId
ProxyResourceType.Site // resourceType
);
console.log(result);
@@ -9,7 +9,8 @@ const vcs = new Vcs(client);
const result = await vcs.getRepositoryContents(
'<INSTALLATION_ID>', // installationId
'<PROVIDER_REPOSITORY_ID>', // providerRepositoryId
'<PROVIDER_ROOT_DIRECTORY>' // providerRootDirectory (optional)
'<PROVIDER_ROOT_DIRECTORY>', // providerRootDirectory (optional)
'<PROVIDER_REFERENCE>' // providerReference (optional)
);
console.log(result);
@@ -2,9 +2,8 @@ import 'package:dart_appwrite/dart_appwrite.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setSession('') // The user session to authenticate with
.setKey('<YOUR_API_KEY>') // Your secret API key
.setJWT('<YOUR_JWT>'); // Your secret JSON Web Token
.setProject('<YOUR_PROJECT_ID>') // Your project ID
.setSession(''); // The user session to authenticate with
Databases databases = Databases(client);
@@ -2,6 +2,7 @@ import 'package:dart_appwrite/dart_appwrite.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>') // Your project ID
.setKey('<YOUR_API_KEY>'); // Your secret API key
Databases databases = Databases(client);
@@ -0,0 +1,17 @@
import 'package:dart_appwrite/dart_appwrite.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>') // Your project ID
.setKey('<YOUR_API_KEY>'); // Your secret API key
Databases databases = Databases(client);
Document result = await databases.decrementDocumentAttribute(
databaseId: '<DATABASE_ID>',
collectionId: '<COLLECTION_ID>',
documentId: '<DOCUMENT_ID>',
attribute: '',
value: 0, // (optional)
min: 0, // (optional)
);
@@ -0,0 +1,17 @@
import 'package:dart_appwrite/dart_appwrite.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>') // Your project ID
.setKey('<YOUR_API_KEY>'); // Your secret API key
Databases databases = Databases(client);
Document result = await databases.incrementDocumentAttribute(
databaseId: '<DATABASE_ID>',
collectionId: '<COLLECTION_ID>',
documentId: '<DOCUMENT_ID>',
attribute: '',
value: 0, // (optional)
max: 0, // (optional)
);
@@ -2,9 +2,8 @@ import { Client, Databases } from "https://deno.land/x/appwrite/mod.ts";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setSession('') // The user session to authenticate with
.setKey('<YOUR_API_KEY>') // Your secret API key
.setJWT('<YOUR_JWT>'); // Your secret JSON Web Token
.setProject('<YOUR_PROJECT_ID>') // Your project ID
.setSession(''); // The user session to authenticate with
const databases = new Databases(client);
@@ -2,6 +2,7 @@ import { Client, Databases } from "https://deno.land/x/appwrite/mod.ts";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>') // Your project ID
.setKey('<YOUR_API_KEY>'); // Your secret API key
const databases = new Databases(client);
@@ -0,0 +1,17 @@
import { Client, Databases } from "https://deno.land/x/appwrite/mod.ts";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>') // Your project ID
.setKey('<YOUR_API_KEY>'); // Your secret API key
const databases = new Databases(client);
const response = await databases.decrementDocumentAttribute(
'<DATABASE_ID>', // databaseId
'<COLLECTION_ID>', // collectionId
'<DOCUMENT_ID>', // documentId
'', // attribute
null, // value (optional)
null // min (optional)
);
@@ -0,0 +1,17 @@
import { Client, Databases } from "https://deno.land/x/appwrite/mod.ts";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>') // Your project ID
.setKey('<YOUR_API_KEY>'); // Your secret API key
const databases = new Databases(client);
const response = await databases.incrementDocumentAttribute(
'<DATABASE_ID>', // databaseId
'<COLLECTION_ID>', // collectionId
'<DOCUMENT_ID>', // documentId
'', // attribute
null, // value (optional)
null // max (optional)
);
@@ -0,0 +1,16 @@
import { Client, Databases } from "https://deno.land/x/appwrite/mod.ts";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
.setProject('<YOUR_PROJECT_ID>') // Your project ID
.setSession(''); // The user session to authenticate with
const databases = new Databases(client);
const response = await databases.upsertDocument(
'<DATABASE_ID>', // databaseId
'<COLLECTION_ID>', // collectionId
'<DOCUMENT_ID>', // documentId
{}, // data
["read("any")"] // permissions (optional)
);

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