Compare commits

...
Author SHA1 Message Date
Chirag Aggarwal 18fc1e0b6e more debug 2025-10-31 12:16:01 +05:30
Chirag Aggarwal e5b29d919c debug 2025-10-31 11:07:13 +05:30
Chirag Aggarwal 3d7251f66e debug 2025-10-31 11:03:14 +05:30
Luke B. SilverandGitHub 60726757ab Merge pull request #10726 from appwrite/fix-testListSites
fix: testListSites 2 not matching expected 1
2025-10-29 12:48:38 +00:00
Jake BarnbyandGitHub 7b55a9810f Merge pull request #10668 from appwrite/feat-disable-count
Feat disable count
2025-10-29 23:47:33 +13:00
Chirag Aggarwal d995dbb159 fix: naming 2025-10-29 15:19:16 +05:30
Chirag Aggarwal 1180dc0781 use search 2025-10-29 15:13:33 +05:30
Chirag Aggarwal 2951a1b7b8 fix: testListSites 2 not matching expected 1 2025-10-29 15:11:42 +05:30
shimon a7dbb3daea Refactor API parameters to replace 'includeTotal' with 'total' across multiple endpoints for consistency in response handling. 2025-10-29 11:08:08 +02:00
shimon 33000134df addrising comments + composer.lock 2025-10-29 09:17:10 +02:00
shimon b893599ba8 Merge branch '1.8.x', commit 'f18aa6b6486d52ef97674c1ac483c476b85a6f21' of github.com:appwrite/appwrite into feat-disable-count
# Conflicts:
#	composer.lock
2025-10-29 09:03:44 +02:00
Jake BarnbyandGitHub 2a260c3d5f Merge pull request #10720 from appwrite/composer-add-emails
Composer add emails lib
2025-10-28 22:05:19 +13:00
fogelito b8321d3bb0 Update lock for database 3.0.4 2025-10-28 10:25:29 +02:00
fogelito 66610cfd4e Pull main 2025-10-28 09:33:56 +02:00
fogelito 149fa141d0 Merge branch '1.8.x' of https://github.com/appwrite/appwrite into composer-add-emails
# Conflicts:
#	composer.lock
2025-10-28 09:33:21 +02:00
fogelito 9305c86367 Add utopia-php/emails 0.6 2025-10-28 09:32:00 +02:00
Jake BarnbyandGitHub 0e6d3279d7 Merge pull request #10546 from appwrite/feat-csv-export
CSV export
2025-10-28 18:19:54 +13:00
Jake Barnby c0cb4681ae Fix error encode 2025-10-28 17:58:31 +13:00
Jake BarnbyandGitHub b9fb10a379 Merge pull request #10719 from appwrite/fix-error-handler-error
Return empty on no collection, fallback to route validation
2025-10-28 17:39:05 +13:00
Jake Barnby b39a118bba Clean up errors 2025-10-28 17:37:22 +13:00
Jake Barnby 9f2ff0e1f7 Merge remote-tracking branch 'origin/1.8.x' into feat-csv-export
# 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
2025-10-28 17:22:02 +13:00
Jake Barnby 15cabd018d Lint 2025-10-28 16:56:54 +13:00
Jake Barnby 8a5a6037b1 Return empty on no collection, fallback to route validation 2025-10-28 16:50:38 +13:00
Matej BačoandGitHub dde6968e50 Merge pull request #10713 from appwrite/fix-next-16
Fix: Next.js 16
2025-10-27 17:22:57 +01:00
Matej Bačo 71349385b4 Upgrade Console (tanstack support), and detector (next.js 16) 2025-10-27 17:03:24 +01:00
fogelito 6f299e922c Add emails 2025-10-27 15:50:45 +02:00
Luke B. SilverandGitHub 7047ffe3dd Merge pull request #10707 from appwrite/update-docs-examples-to-use-permission-class
Update docs examples to use permission class
2025-10-27 12:38:13 +00:00
Chirag Aggarwal 73e3f2869f fix: imports 2025-10-27 17:41:33 +05:30
Luke B. SilverandGitHub e4f63ed0c9 Merge pull request #10694 from appwrite/update-sdks
update sdks
2025-10-27 11:16:26 +00:00
Chirag Aggarwal 720dfb97e8 feat: improve doc examples to use Permission and Roles helper classes 2025-10-27 14:13:54 +05:30
shimon f18aa6b648 composer.lock 2025-10-27 10:14:41 +02:00
shimon b760a88af7 Merge branch '1.8.x', commit 'ab1e51034826dde50034e6e73fc5d546e800dd6d' of github.com:appwrite/appwrite into feat-disable-count
# Conflicts:
#	composer.lock
2025-10-27 10:13:37 +02:00
Damodar LohaniandGitHub 15b12551a0 Merge pull request #10702 from appwrite/fix-description
fix: execution status enum description
2025-10-27 12:08:20 +05:45
Chirag Aggarwal 22f44c51d6 regen specs 2025-10-27 11:23:56 +05:30
Damodar LohaniandGitHub 128dc34a52 Merge pull request #10705 from appwrite/fix-warning-builds-worker
Fix warning builds worker
2025-10-27 10:42:29 +05:45
Chirag Aggarwal ecc3f61f1e fix: warning Undefined variable $adapter 2025-10-27 08:41:13 +05:30
Chirag Aggarwal ffb2a02ea0 fix: execution status enum description 2025-10-25 10:52:22 +05:30
Chirag Aggarwal f6135a0e04 update composer 2025-10-25 10:10:51 +05:30
Matej BačoandGitHub 3733df6fc5 Merge pull request #10698 from appwrite/ser-218-functions
Fix errors on downloading function deployment output
2025-10-24 16:57:48 +02:00
Hemachandar b5d26bb426 Fix errors on downloading function deployment output 2025-10-24 19:59:48 +05:30
Matej Bačo fa4529846c Applying SDK generation fix for Console
https://github.com/appwrite/appwrite/pull/10628/files
2025-10-24 16:18:11 +02:00
Matej BačoandGitHub 1fc790802d Merge pull request #10681 from appwrite/feat-tanstack-start-sites
Feat: Tanstack support
2025-10-24 15:57:20 +02:00
Matej Bačo 52ababa800 Update docker-compose.yml 2025-10-24 14:57:12 +02:00
Matej Bačo b3c1dea8d7 Fix template test 2025-10-24 13:25:25 +02:00
Matej Bačo f51c387cd8 Update composer.lock 2025-10-24 12:44:42 +02:00
Matej Bačo 3dd1c3de13 Merge branch '1.8.x' into feat-tanstack-start-sites 2025-10-24 12:43:51 +02:00
Matej Bačo 4472437696 AI code review fix 2025-10-24 12:41:46 +02:00
Matej Bačo ca39c2cde5 Add tanstack starter 2025-10-24 12:33:50 +02:00
Chirag Aggarwal a7b74cede8 update generator 2025-10-24 14:46:28 +05:30
Jake BarnbyandGitHub 24bfad100d Merge pull request #10690 from appwrite/feat-resend
feat: resend adapter
2025-10-24 09:13:24 +00:00
Matej BačoandGitHub a8de338d5f Merge pull request #10633 from appwrite/ser-376
Dark mode styles for emails
2025-10-24 10:50:53 +02:00
Chirag Aggarwal 9c0772f125 add tests 2025-10-24 14:19:59 +05:30
Chirag Aggarwal d90e2621a1 update sdks 2025-10-24 14:00:39 +05:30
HemachandarandGitHub 572870e320 Merge branch '1.8.x' into ser-376 2025-10-24 13:55:21 +05:30
Matej BačoandGitHub 046d1190cf Merge pull request #10691 from appwrite/chore-skip-auth-to-delete-vcs-lock
Skip auth check to delete vcs lock document
2025-10-23 18:00:58 +02:00
Khushboo Verma a6af0cc73a Skip auth check to delete vcs lock document 2025-10-23 20:27:45 +05:30
Chirag Aggarwal f12481ce20 add update endpoint 2025-10-23 19:42:12 +05:30
Chirag Aggarwal a280a565f6 feat: resend adapter 2025-10-23 19:06:11 +05:30
Matej BačoandGitHub c80b40cec7 Merge pull request #10648 from appwrite/ser-218
Fix errors on downloading large deployment output
2025-10-23 14:25:34 +02:00
HemachandarandGitHub 5ebb7e23a9 Merge branch '1.8.x' into ser-218 2025-10-23 17:31:16 +05:30
Matej Bačo 6f188a03d5 Manual QA bug fixing 2025-10-23 12:43:57 +02:00
Jake Barnby 7318ebf1d8 Merge branch 'feat-csv-export' of github.com:appwrite/appwrite into feat-csv-export 2025-10-23 21:34:21 +13:00
Jake Barnby e222221ec9 Add failure email 2025-10-23 21:34:09 +13:00
Jake Barnby fdf5367e39 Fix options not fired from realtime 2025-10-23 20:35:17 +13:00
DarshanandGitHub 42c75c43de Merge branch '1.8.x' into feat-csv-export 2025-10-23 12:20:06 +05:30
Jake Barnby 28a6f6de00 Format 2025-10-23 18:57:10 +13:00
Jake Barnby c03b56c0de Check plan file size max 2025-10-23 18:47:55 +13:00
Jake Barnby e21f53f4c7 Abstract error sanitization 2025-10-23 18:47:11 +13:00
Jake Barnby 462a2d505d Remove unused scopes 2025-10-23 18:17:35 +13:00
Jake Barnby 654125a6a8 Review comments 2025-10-23 17:21:05 +13:00
Jake BarnbyGitHubcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
d4e5a1bdf2 Update src/Appwrite/Platform/Workers/Migrations.php
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-10-23 17:03:16 +13:00
Jake Barnby 26e07b8c26 Update specs 2025-10-23 16:58:29 +13:00
Jake Barnby 2a4f191a69 Fix log sets 2025-10-23 16:49:37 +13:00
Steven NguyenandGitHub aec26277c7 Merge pull request #10500 from appwrite/copilot/fix-3b5374b7-acb3-4c22-9573-00c1feec5bc1
Fix hardcoded specification defaults to use dynamic plan-based logic
2025-10-22 15:41:11 -07:00
Luke B. SilverandGitHub 887820dbec Merge pull request #10683 from appwrite/fix-stats-usage-memory-leak
fix: stats usage memory leak
2025-10-22 17:53:47 +01:00
loks0n 18371eb511 fix: stats usage memory leak 2025-10-22 17:53:16 +01:00
Matej BačoandGitHub c38d319aeb Merge pull request #10535 from appwrite/fix-author-url-in-template-deployments
Fix Author URL in template deployments
2025-10-22 17:35:41 +02:00
Khushboo Verma 9c55da5b99 Resolve merge conflicts 2025-10-22 20:44:47 +05:30
Matej Bačo 3019551db5 remove leftover todo 2025-10-22 16:04:30 +02:00
Matej Bačo d787408e1d Implement package-based framework detection 2025-10-22 15:28:49 +02:00
Jake Barnby c86702430b Merge branch 'feat-csv-export' of github.com:appwrite/appwrite into feat-csv-export 2025-10-23 02:23:15 +13:00
Jake Barnby 597dc308a6 Fix test 2025-10-23 02:22:49 +13:00
Jake BarnbyandGitHub f89dc6c1ae Merge branch '1.8.x' into feat-csv-export 2025-10-22 12:48:39 +00:00
Jake Barnby 95902fa897 Fix lock 2025-10-23 01:39:25 +13:00
Jake Barnby d2aa971ed3 Update lock 2025-10-23 01:33:28 +13:00
Jake Barnby 9a1b5d4eee Only parse for validation 2025-10-23 01:28:06 +13:00
Matej Bačo a5486128d4 Update composer.lock 2025-10-22 13:41:55 +02:00
Matej Bačo 14b1cc6e48 Merge branch '1.8.x' into feat-tanstack-start-sites 2025-10-22 13:41:37 +02:00
Matej Bačo f9257c1ec9 add tanstack template, use detection lib v 0.2 2025-10-22 13:40:49 +02:00
Luke B. SilverandGitHub 45e938b4ba Merge pull request #10679 from appwrite/update-apple-swift-13.3.0
chore: update apple sdk to 13.3.0
2025-10-22 12:17:33 +01:00
Jake Barnby c177d54f59 Update lock 2025-10-22 23:51:28 +13:00
Jake Barnby de7f69ae3f Remove invalid param 2025-10-22 23:49:11 +13:00
Jake Barnby 7249083152 Pass through queries 2025-10-22 23:23:07 +13:00
Jake Barnby d5bd6a0475 Fix file ID 2025-10-22 22:06:55 +13:00
Chirag Aggarwal c2d4997810 update apple to 13.3.0 2025-10-22 14:17:57 +05:30
Jake Barnby c9d83cb3f5 Custom writer 2025-10-22 20:37:03 +13:00
Matej BačoandGitHub de03506c0a Merge pull request #10674 from appwrite/feat-SER-457-add-max-build-duration-env
feat: add _APP_COMPUTE_BUILD_TIMEOUT to console variables
2025-10-22 09:32:46 +02:00
Harsh MahajanandGitHub b6349b17f2 Merge branch '1.8.x' into feat-SER-457-add-max-build-duration-env 2025-10-22 10:24:37 +05:30
Jake BarnbyandGitHub 2e699ef8b9 Merge pull request #10678 from appwrite/update-domains-0.9.1
update domain lib to 0.9.1
2025-10-22 04:53:35 +00:00
Harsh MahajanandGitHub f5034a6ad8 Merge branch '1.8.x' into feat-SER-457-add-max-build-duration-env 2025-10-22 09:56:56 +05:30
Jake Barnby 929baa17db Fix capture 2025-10-22 17:18:57 +13:00
Jake Barnby 8ded7c5942 Add options on response 2025-10-22 17:15:06 +13:00
Chirag Aggarwal 9c30f32281 update domain lib to 0.9.1 2025-10-22 09:29:45 +05:30
Jake Barnby 94c309d61e Fix default escape 2025-10-22 16:41:00 +13:00
Steven NguyenandGitHub 2652a21332 Merge pull request #10404 from appwrite/feat-1.8.0-release-prep
Prepare 1.8.0 release
2025-10-21 15:40:07 -07:00
Jake Barnby 4619e03d64 Update specs 2025-10-22 01:26:01 +13:00
Harsh MahajanandGitHub d48ef373a7 Fix environment variable assignment for build timeout 2025-10-21 17:48:48 +05:30
Harsh MahajanGitHubcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
4cb20b3fe3 Update app/controllers/api/console.php
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-10-21 17:47:30 +05:30
Jake Barnby f1c68af091 Add queries for csv export 2025-10-22 01:12:18 +13:00
Harsh Mahajan 803244ccf7 feat:add _APP_COMPUTE_BUILD_TIMEOUT to console variables 2025-10-21 11:48:48 +00:00
Jake Barnby 215d55a997 Merge remote-tracking branch 'origin/1.8.x' into feat-csv-export
# Conflicts:
#	composer.json
#	composer.lock
2025-10-22 00:34:01 +13:00
Luke B. SilverandGitHub 16a2dd0b27 Merge pull request #10672 from appwrite/update-cli-10.2.2
chore: update cli to 10.2.2
2025-10-21 10:53:16 +01:00
shimon ab1e510348 Enhance API response handling by adding 'includeTotal' parameter to account endpoints, allowing control over total count calculation for sessions, logs, and identities. Updated tests to verify functionality. 2025-10-21 11:41:41 +03:00
shimon 232f1b1c05 account sync 2025-10-21 11:24:09 +03:00
shimon 1606141a5a Merge branch '1.8.x' of github.com:appwrite/appwrite into feat-disable-count
# Conflicts:
#	app/controllers/api/account.php
2025-10-21 11:14:05 +03:00
shimon c8f8b6ff0c account sync 2025-10-21 10:54:03 +03:00
shimon 095ee8511b composer 2025-10-21 10:44:17 +03:00
shimon bb0889fdba test fix 2025-10-21 10:35:01 +03:00
Chirag Aggarwal 8154a8524a update sdk gen 2025-10-21 12:51:10 +05:30
Chirag Aggarwal 0e567e3e68 chore: update cli to 10.2.2 2025-10-21 11:40:50 +05:30
Jake BarnbyandGitHub f150cffa17 Merge pull request #10670 from appwrite/revert-auth
Revert "Merge pull request #10468 from appwrite/feat-apps-module-dl"
2025-10-21 02:58:23 +00:00
Jake Barnby f4efb81832 Update lock 2025-10-21 15:07:53 +13:00
Jake Barnby ddde13a78f Revert "Merge pull request #10468 from appwrite/feat-apps-module-dl"
This reverts commit 9dd1939d1f, reversing
changes made to 8dfdfcb522.

# Conflicts:
#	app/config/collections/common.php
#	app/controllers/api/users.php
#	app/init/resources.php
#	composer.lock
2025-10-21 14:59:30 +13:00
shimon a643cde26d Update 'includeTotal' parameter to use Boolean(true) for consistent behavior across API endpoints, enhancing response handling for sessions, logs, memberships, and more. 2025-10-20 22:00:57 +03:00
shimon 5f3316ff18 fix assertion order 2025-10-20 18:38:14 +03:00
shimon 9be7f4d72c Merge remote-tracking branch 'origin/feat-disable-count' into feat-disable-count 2025-10-20 18:28:14 +03:00
shimon 76f4483dda Merge branch '1.8.x' of github.com:appwrite/appwrite into feat-disable-count 2025-10-20 18:27:36 +03:00
shimon fb4e3e1b9d Implement 'includeTotal' parameter across multiple API endpoints to control total count in responses, ensuring consistent behavior in session, log, and membership retrievals. 2025-10-20 18:18:17 +03:00
Jake BarnbyandGitHub e2d3624713 Merge pull request #10664 from appwrite/feat-update-db
Update db
2025-10-20 14:11:36 +00:00
shimon 55a33c135c Merge branch '1.8.x' of github.com:appwrite/appwrite into feat-disable-count 2025-10-20 17:11:32 +03:00
Matej BačoandGitHub 411951f9d5 Merge pull request #10669 from appwrite/copilot/update-github-comment-title
Change GitHub alert from NOTE to TIP in VCS build comments
2025-10-20 16:03:59 +02:00
Jake Barnby caa699e181 Update database 2025-10-21 02:25:51 +13:00
copilot-swe-agent[bot]andMeldiron d9773f44b1 Change GitHub alert from NOTE to TIP in VCS comments
Co-authored-by: Meldiron <19310830+Meldiron@users.noreply.github.com>
2025-10-20 12:32:38 +00:00
copilot-swe-agent[bot] 46dd8fdc68 Initial plan 2025-10-20 12:28:04 +00:00
Jake Barnby 94d02aff4f Fix DB tests 2025-10-21 01:24:50 +13:00
Jake Barnby d23f993a6c Fix validator constructor 2025-10-21 00:13:43 +13:00
Jake Barnby bfe639fb70 Fix key 2025-10-21 00:13:32 +13:00
Jake Barnby 568651291e Update libs 2025-10-20 23:13:17 +13:00
shimon 09075a05db typo fix 2025-10-19 16:22:13 +03:00
shimon 9f80952251 linter 2025-10-19 16:15:13 +03:00
shimon d0e0f67fee Implement 'includeTotal' parameter across various API endpoints to control total count in responses 2025-10-19 15:45:16 +03:00
shimon f16de4abb9 Refactor XList classes to consistently implement 'includeTotal' parameter for total count control in database queries 2025-10-19 14:46:55 +03:00
shimon 7bbe08f23e Enhance XList classes to support 'includeTotal' parameter for controlling total count in database queries 2025-10-19 14:38:32 +03:00
shimon 3229956eef Enhance XList actions to include 'includeTotal' parameter for total count control 2025-10-19 13:16:39 +03:00
Damodar LohaniandGitHub 254f026458 Merge pull request #10667 from appwrite/fix-auth-refactor
Fix: reset argon 2 options to previous default
2025-10-19 14:00:25 +05:45
Damodar Lohani 248d3aea7a Fix: reset argon 2 options to previous default 2025-10-19 05:44:44 +00:00
Jake Barnby 11042af051 Update db 2025-10-18 02:19:43 +13:00
Luke B. SilverandGitHub 07d55d17a3 Merge pull request #10658 from appwrite/update-domains-0.8.3
update domain lib to 0.8.4
2025-10-17 13:09:36 +01:00
Chirag Aggarwal abfab60eec update to 0.8.4 2025-10-17 17:05:47 +05:30
Chirag Aggarwal fc3ac122dd Merge branch '1.8.x' into update-domains-0.8.3 2025-10-17 17:05:24 +05:30
Jake BarnbyandGitHub 3963b632d8 Merge pull request #10663 from appwrite/update-apple-swift
chore: update apple and swift sdks to 13.2.2
2025-10-17 07:01:25 +00:00
Chirag Aggarwal 1936a01464 chore: update apple and swift sdks to 13.2.2 2025-10-17 12:28:31 +05:30
Luke B. SilverandGitHub 2cbfa6930f Merge pull request #10655 from appwrite/fix-test-dependencies-projects
Refactor ProjectsConsoleClientTest to remove test dependencies
2025-10-16 11:30:50 +01:00
Chirag Aggarwal 33a856af41 update domain lib to 0.8.3 2025-10-16 15:54:43 +05:30
Chirag Aggarwal 5d1d937fde remove changes 2025-10-16 15:29:59 +05:30
Chirag Aggarwal 83ec855f4b skip harder ones 2025-10-16 15:18:21 +05:30
Luke B. SilverandGitHub 5ce9b8eaeb Merge pull request #10656 from appwrite/feat-replace-sleep-in-webhooks-service
Replace sleep in webhook tests with assertEventually
2025-10-16 10:45:32 +01:00
Khushboo Verma be983eb68a Remove race condition 2025-10-16 14:40:47 +05:30
Chirag Aggarwal c6f144313d more tests 2025-10-16 14:29:57 +05:30
Chirag Aggarwal ae8ec1c736 formatting 2025-10-16 14:26:39 +05:30
Chirag Aggarwal 19d7f02371 more tests 2025-10-16 14:25:12 +05:30
Khushboo Verma f0660f3fda Replace sleep in webhook tests with assertEventually 2025-10-16 14:23:35 +05:30
Chirag Aggarwal 9ded176cf2 Refactor ProjectsConsoleClientTest to remove test dependencies
- Remove @depends annotations to make tests independent
- Each test now creates its own team and project instead of relying on shared state
- Replace sleep() calls with assertEventually() for more reliable async testing
- Change test methods to return void instead of passing data between tests
- Remove unnecessary sleep() call that was causing test flakiness
2025-10-16 14:21:30 +05:30
Damodar LohaniandGitHub 2e10cd0009 Merge pull request #10654 from appwrite/fix-undefined-var
Fix: undefined variable warning
2025-10-16 13:40:04 +05:45
Damodar Lohani 7ff664e62b Fix: undefined $user 2025-10-16 07:38:13 +00:00
Damodar LohaniandGitHub 9dd1939d1f Merge pull request #10468 from appwrite/feat-apps-module-dl
Feat apps module dl
2025-10-16 11:40:27 +05:45
Damodar LohaniandGitHub 8dfdfcb522 Merge pull request #10652 from appwrite/fix-undefined-sequence
Fix undefined sequence
2025-10-16 10:34:37 +05:45
Damodar LohaniandGitHub b63c2804f1 Fix: undefined $sequence 2025-10-16 10:26:49 +05:45
Damodar Lohani ced2270571 remove unused injection 2025-10-16 03:39:39 +00:00
Damodar Lohani d3436077a1 remove unused hash 2025-10-16 03:39:18 +00:00
Damodar Lohani e06349e803 update argon2 instances 2025-10-16 03:34:45 +00:00
Damodar Lohani 9849b9d678 Fix empty check 2025-10-16 02:41:53 +00:00
Damodar Lohani 22136867ed add additional check 2025-10-16 02:29:30 +00:00
Damodar Lohani 2df621f9c5 Fix: update comment, typings 2025-10-16 02:23:41 +00:00
Damodar Lohani 9a599e2015 update recommended param for argon2 2025-10-16 02:20:28 +00:00
Damodar Lohani 431dd96b98 chaining 2025-10-16 02:17:59 +00:00
Damodar Lohani 4d8f950955 fix roles filtering 2025-10-16 02:17:52 +00:00
Damodar Lohani 08e559180d fix missing injection 2025-10-16 02:08:07 +00:00
Damodar Lohani 4cb63068de improve install loop 2025-10-16 02:07:17 +00:00
Damodar Lohani f062b39cfa Fix encoding 2025-10-16 02:06:01 +00:00
Hemachandar 635d77350a set header 2025-10-15 16:05:34 +05:30
Hemachandar 9f07a2bca4 early return 2025-10-15 15:16:28 +05:30
Damodar Lohani 06ee421965 update composer 2025-10-15 07:11:27 +00:00
Damodar Lohani c3c69cc43b Merge remote-tracking branch 'origin/1.8.x' into feat-apps-module-dl 2025-10-15 07:05:23 +00:00
Damodar Lohani e47d53ddcc Merge remote-tracking branch 'origin/main' into feat-apps-module-dl 2025-10-15 07:04:38 +00:00
Jake BarnbyandGitHub 290a7b27db Merge branch 'main' into 1.8.x 2025-10-15 18:45:38 +13:00
Hemachandar bad74bd0b8 Add cache header for deployment download API 2025-10-14 18:18:41 +05:30
Damodar Lohani 5e5b22d649 fix jwt 2025-10-12 04:38:14 +00:00
Damodar Lohani 1b17c32405 update block 2025-10-12 03:51:37 +00:00
Damodar Lohani d56dff954f Merge remote-tracking branch 'origin/1.8.x' into feat-apps-module-dl 2025-10-12 00:34:07 +00:00
Hemachandar c525e15ea5 Dark mode styles for emails 2025-10-10 23:01:26 +05:30
Jake BarnbyandGitHub 852f06cc28 Merge pull request #10623 from Veera-mulge/change-desc
Update README.md
2025-10-10 02:09:26 +13:00
VeereshandGitHub d82171b4de Update README.md 2025-10-09 18:36:30 +05:30
Khushboo VermaandGitHub 0c64eaf441 Merge branch '1.8.x' into copilot/fix-3b5374b7-acb3-4c22-9573-00c1feec5bc1 2025-10-07 19:56:12 +05:30
Khushboo VermaandGitHub 248e538518 Merge branch '1.8.x' into copilot/fix-3b5374b7-acb3-4c22-9573-00c1feec5bc1 2025-10-07 16:56:48 +05:30
Khushboo VermaandGitHub 1a07123abe Merge branch '1.8.x' into copilot/fix-3b5374b7-acb3-4c22-9573-00c1feec5bc1 2025-10-07 14:14:16 +05:30
Khushboo VermaandGitHub 35578bfada Merge branch '1.8.x' into copilot/fix-3b5374b7-acb3-4c22-9573-00c1feec5bc1 2025-10-07 12:10:42 +05:30
Khushboo VermaandGitHub bd772c97cf Merge branch '1.8.x' into copilot/fix-3b5374b7-acb3-4c22-9573-00c1feec5bc1 2025-10-01 12:39:14 +01:00
Khushboo VermaandGitHub b40769b086 Merge branch '1.8.x' into copilot/fix-3b5374b7-acb3-4c22-9573-00c1feec5bc1 2025-09-29 22:48:38 +01:00
Jake Barnby 16821a28fc Format 2025-09-24 22:53:13 +12:00
Jake Barnby 5572c4a375 Merge remote-tracking branch 'origin/1.8.x' into feat-csv-export
# Conflicts:
#	composer.lock
2025-09-24 22:40:04 +12:00
Jake Barnby 2494c9afb3 Update to release migrations 2025-09-24 22:39:06 +12:00
Jake Barnby 223523f722 Mount uploads to migrations worker 2025-09-24 22:38:55 +12:00
Jake Barnby 61d9db8c67 Cover export + notify in tests 2025-09-24 22:38:35 +12:00
Jake Barnby 4970aa7426 Send email if notify on complete is set 2025-09-24 22:38:12 +12:00
Jake Barnby 5e8951fbe0 Save export to bucket on complete 2025-09-24 22:37:49 +12:00
Jake Barnby c8993d7f71 Add additional export params 2025-09-24 22:37:12 +12:00
Jake Barnby 97c5705447 Merge remote-tracking branch 'origin/1.8.x' into feat-csv-export 2025-09-23 19:17:49 +12:00
Khushboo Verma 5d5c1d8f43 Fix Author URL in template deployments 2025-09-22 20:29:25 +05:30
Jake Barnby a0afce666f Merge remote-tracking branch 'origin/1.8.x' into feat-csv-export
# Conflicts:
#	composer.lock
2025-09-22 16:05:58 +12:00
Damodar Lohani 4540362f42 Fix: token hash magic url session 2025-09-18 01:37:19 +00:00
Damodar Lohani 3065f53d83 Fix token hash 2025-09-18 01:14:14 +00:00
Damodar Lohani 74f181d7a8 fix token length 2025-09-17 10:18:49 +00:00
Damodar LohaniandGitHub 337eda8538 Merge branch '1.8.x' into feat-apps-module-dl 2025-09-17 14:49:22 +05:45
Damodar LohaniandGitHub 20c3641ac1 Merge branch '1.8.x' into feat-apps-module-dl 2025-09-16 10:25:30 +05:45
Damodar Lohani 33f7056e7a reest callback 2025-09-16 04:38:52 +00:00
Damodar Lohani 73e7c98131 Fix token length update 2025-09-16 04:36:30 +00:00
Damodar Lohani 1157d6fd10 Fix re-hashing 2025-09-16 04:27:00 +00:00
Steven NguyenandGitHub 536cff9cc6 chore: add specification validator test 2025-09-15 21:39:23 +00:00
Steven NguyenandGitHub 62014fda26 fix: implement dynamic specification defaults for Functions and Sites
Prior to this, self-hosted instances would defualt to the lowest specification.

Now, if there is no plan (ie. on self-hosted), the highest specification is used.

If there is a plan, the lowest specification available in the plan is used.
2025-09-15 21:39:22 +00:00
copilot-swe-agent[bot]andstnguyen90 fea3544d4b Implement dynamic specification defaults for Functions and Sites
Co-authored-by: stnguyen90 <1477010+stnguyen90@users.noreply.github.com>
2025-09-15 19:18:07 +00:00
copilot-swe-agent[bot] 679de3574f Initial plan 2025-09-15 19:11:33 +00:00
Damodar Lohani cfd82d9709 use newer syntax 2025-09-15 10:57:31 +00:00
Damodar Lohani 21245836c7 Merge remote-tracking branch 'origin/1.8.x' into feat-apps-module-dl 2025-09-15 10:44:43 +00:00
Damodar Lohani b5ca4c1166 update suggestion 2025-09-15 10:43:40 +00:00
Damodar Lohani 780799f87a update to initialize first 2025-09-15 10:41:29 +00:00
Damodar Lohani 4579e41ace update check 2025-09-15 10:33:21 +00:00
Damodar Lohani 19cf94bd7e Fix oauth2 changes 2025-09-15 10:22:45 +00:00
Jake Barnby 981a1278e2 Merge remote-tracking branch 'origin/1.8.x' into feat-csv-export
# Conflicts:
#	composer.lock
2025-09-15 16:30:22 +12:00
Damodar Lohani 13b98409ae reset length 2025-09-14 05:56:56 +00:00
Damodar Lohani 518389d32c fix length 2025-09-14 05:37:06 +00:00
Damodar Lohani 800db0b99d Fix magic URL token length 2025-09-14 05:23:30 +00:00
Damodar Lohani cfa4530797 composer update 2025-09-14 05:03:20 +00:00
Damodar Lohani d42841d80a fix: remove hardcode, reuse hasher 2025-09-14 05:02:50 +00:00
3b668f7806 Update composer.json
Co-authored-by: Matej Bačo <matejbacocom@gmail.com>
2025-09-14 10:45:53 +05:45
32b290a231 Update src/Appwrite/Platform/Modules/Functions/Http/Executions/Create.php
Co-authored-by: Matej Bačo <matejbacocom@gmail.com>
2025-09-14 10:44:46 +05:45
Damodar Lohani 365aaca56d fix: remove legacy token generator use 2025-09-14 04:58:34 +00:00
Damodar Lohani 1c726d0466 fix: encoded not defined 2025-09-14 04:53:49 +00:00
Damodar Lohani c903caabcc remove dump 2025-09-14 04:50:13 +00:00
Damodar Lohani 53a117bd0f Merge remote-tracking branch 'origin/1.8.x' into feat-apps-module-dl 2025-09-14 04:49:34 +00:00
Damodar Lohani 72f5793928 revert date format 2025-09-11 09:18:23 +00:00
Damodar LohaniandGitHub b8e3a19586 Merge branch '1.8.x' into feat-apps-module-dl 2025-09-11 14:47:14 +05:45
Damodar Lohani e36de6b72b revert date format 2025-09-11 08:59:27 +00:00
Damodar Lohani bcec5c0922 revert date format 2025-09-11 08:57:27 +00:00
Damodar Lohani 72186f1882 reset det change 2025-09-11 08:46:38 +00:00
Damodar Lohani e4d70a4d4f Fix: default options 2025-09-11 07:55:52 +00:00
Damodar Lohani 6d19d76bac Fix scope check 2025-09-11 06:51:01 +00:00
Damodar Lohani 55bebd92f3 Fix date format 2025-09-11 06:27:58 +00:00
Damodar LohaniandGitHub 0d4df67958 Merge branch '1.8.x' into feat-apps-module-dl 2025-09-11 11:59:31 +05:45
Damodar Lohani 356fbed325 fix password update 2025-09-10 09:09:12 +00:00
Damodar Lohani 4578819a58 revert test update 2025-09-10 07:59:00 +00:00
Damodar Lohani 6099313cb4 Fxi teams tests 2025-09-10 07:57:45 +00:00
Damodar Lohani 487663f892 fixed attribute 2025-09-10 07:30:22 +00:00
Damodar LohaniandGitHub d8e769ef1f Merge branch '1.8.x' into feat-apps-module-dl 2025-09-10 12:48:44 +05:45
Damodar Lohani 41dbe1a384 Fix internal ID refactor 2025-09-10 07:03:11 +00:00
Damodar Lohani 631c00023e update lock 2025-09-10 04:38:14 +00:00
Damodar Lohani 4478edc211 fix linter 2025-09-10 04:25:21 +00:00
Damodar Lohani 2be8895dfd Merge remote-tracking branch 'origin/1.8.x' into feat-apps-module-dl 2025-09-10 03:56:34 +00:00
Jake Barnby 1722e9e416 Fix DB read source 2025-08-22 18:03:10 +12:00
Jake Barnby 57a46b98ec Use utopia adapter 2025-08-22 18:01:38 +12:00
Jake Barnby 74c0f6a140 Merge remote-tracking branch 'origin/1.8.x' into feat-csv-export
# Conflicts:
#	app/controllers/api/migrations.php
#	composer.lock
2025-08-22 01:41:33 +12:00
Jake Barnby 892cfe01b2 Optional columns 2025-08-07 00:47:11 +12:00
Jake Barnby bf1af094c1 Add specific column selection 2025-08-06 00:40:39 +12:00
Jake Barnby 2f5dc7782f Merge remote-tracking branch 'origin/1.7.x' into feat-csv-export 2025-08-06 00:20:02 +12:00
Jake Barnby c70915306d WIP export 2025-08-05 17:04:31 +12:00
Christy Jacob b5c5f76acc Merge branch '1.7.x' of github.com:appwrite/appwrite into feat-apps-module 2025-06-20 17:39:28 +04:00
Eldad Fux 6f861a91ee Updated auth lib 2025-04-29 21:33:59 +02:00
Eldad Fux 0483c7efb5 Merge fixes 2025-04-29 20:44:05 +02:00
Eldad Fux fb29fe7b3c Merge remote-tracking branch 'origin/1.7.x' into feat-apps-module 2025-04-29 20:12:31 +02:00
Eldad Fux 1bf1766822 Merge remote-tracking branch 'origin/feat-sites' into feat-apps-module 2025-03-28 08:20:24 +01:00
Eldad Fux 57edb4a385 Removed leftovers 2025-03-28 08:17:47 +01:00
Eldad Fux 17c555ab6c Expanded the identities collection 2025-03-28 02:13:17 +01:00
Eldad Fux d6bd72cfd3 formatting 2025-03-19 14:10:56 +01:00
Eldad Fux 8c9123beaa Fixed tests 2025-03-19 13:54:32 +01:00
Eldad Fux 3d967e695f Updated auth lib 2025-03-19 07:57:28 +01:00
Eldad Fux a7d7e39dfd Fixed tests 2025-03-18 22:47:17 +01:00
Eldad Fux 38cb95e940 Fixed tests 2025-03-18 22:28:19 +01:00
Eldad Fux b2b20c48b3 Fixed tests 2025-03-18 22:12:03 +01:00
Eldad Fux fed6579491 Update teams tests 2025-03-18 21:52:41 +01:00
Eldad Fux 8cb85cafbd Fixes realtime tests 2025-03-18 20:24:38 +01:00
Eldad Fux 55e560bb41 Fixed unit tests 2025-03-18 19:08:58 +01:00
Eldad Fux dd9a40221e Merge remote-tracking branch 'origin/feat-sites' into feat-apps-module 2025-03-18 17:38:32 +01:00
Eldad Fux 24300cd3bd tests 2025-03-18 17:22:58 +01:00
Eldad Fux 4d5961c3ab Fixed test 2025-03-18 16:20:37 +01:00
Eldad Fux afb40218d7 Fixed tests 2025-03-18 16:12:13 +01:00
Eldad Fux 3daa3821ef Fixed syntax error 2025-03-18 10:24:42 +01:00
Eldad Fux 84cec0e32c format 2025-03-18 10:18:29 +01:00
Eldad Fux 7bae15d4fe Merge remote-tracking branch 'origin/feat-sites' into feat-apps-module 2025-03-18 10:15:06 +01:00
Eldad Fux 0180f72067 Removed unsed methods and tests 2025-03-18 00:30:31 +01:00
Eldad Fux f537091eb2 Fixed tests 2025-03-17 23:57:44 +01:00
Eldad Fux c99c83a006 Merge remote-tracking branch 'origin/feat-sites' into feat-apps-module 2025-03-17 23:15:57 +01:00
Eldad Fux 113828cd00 Improved errors 2025-03-17 22:51:22 +01:00
Eldad Fux 477add3022 Formatting 2025-03-17 21:49:10 +01:00
Eldad Fux 8aa5714173 cleanups 2025-03-17 21:44:31 +01:00
Eldad Fux fdb83c51f7 formatting 2025-03-17 12:46:07 +01:00
Eldad Fux c15739bba7 Merge remote-tracking branch 'origin/feat-sites' into feat-apps-module 2025-03-17 12:44:49 +01:00
Eldad Fux 1ce84f1650 WIP 2025-03-17 12:39:35 +01:00
Eldad Fux f618a8b563 Fixed account test 2025-03-16 22:16:02 +01:00
Eldad Fux 9346efc24a Fixed some tests 2025-03-16 19:35:42 +01:00
Eldad Fux a5e57a9a67 Work in progress, moving to instance based auth 2025-03-16 18:54:55 +01:00
Eldad Fux cc724218b0 fixed formatting 2025-03-16 18:32:46 +01:00
Eldad Fux 706ce4b3b6 WIP - cleaning up auth managment 2025-03-16 18:30:48 +01:00
Eldad Fux c08355df8d Updated composer 2025-03-16 10:34:45 +01:00
Eldad Fux 2d5904e3d0 Merge remote-tracking branch 'origin/feat-sites' into feat-apps-module 2025-03-16 10:26:55 +01:00
Eldad Fux d1318cf016 Updated dependencies 2025-03-10 02:19:57 +01:00
Eldad Fux 91921859a2 Merge remote-tracking branch 'origin/1.6.x' into feat-apps-module 2025-03-10 02:14:35 +01:00
Eldad Fux a058925252 Code formatting 2025-03-10 00:23:22 +01:00
Eldad Fux fadb24f295 revert change to build 2025-03-10 00:21:49 +01:00
Eldad Fux 748119334d Merge remote-tracking branch 'origin/feat-sites' into feat-apps-module 2025-03-10 00:18:23 +01:00
Eldad Fux cb05b87dda Upgraded users to use utopia/auth 2025-03-10 00:08:04 +01:00
Eldad Fux aa36d944db Add teamId to project array in e2e test 2025-03-01 22:00:37 +01:00
307 changed files with 8458 additions and 3039 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
> We just announced Timestamp Overrides for Appwrite Databases - [Learn more](https://appwrite.io/blog/post/announcing-timestamp-overrides)
> We just announced Transactions API for Appwrite Databases - [Learn more](https://appwrite.io/blog/post/announcing-transactions-api)
> Appwrite Cloud is now Generally Available - [Learn more](https://appwrite.io/cloud-ga)
+25
View File
@@ -202,6 +202,31 @@ return [
]
]
],
'tanstack-start' => [
'key' => 'tanstack-start',
'name' => 'TanStack Start',
'screenshotSleep' => 3000,
'buildRuntime' => 'node-22',
'runtimes' => getVersions($templateRuntimes['NODE']['versions'], 'node'),
'bundleCommand' => 'bash /usr/local/server/helpers/tanstack-start/bundle.sh',
'envCommand' => 'source /usr/local/server/helpers/tanstack-start/env.sh',
'adapters' => [
'ssr' => [
'key' => 'ssr',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist',
'startCommand' => 'bash helpers/tanstack-start/server.sh',
],
'static' => [
'key' => 'static',
'buildCommand' => 'npm run build',
'installCommand' => 'npm install',
'outputDirectory' => './dist/client',
'startCommand' => 'bash helpers/server.sh',
]
]
],
'remix' => [
'key' => 'remix',
'name' => 'Remix',
@@ -2,6 +2,38 @@
<html>
<head>
<link rel="preconnect" href="https://assets.appwrite.io/" crossorigin>
<meta name="color-scheme" content="light dark">
<meta name="supported-color-schemes" content="light dark">
<style type="text/css">
:root {
color-scheme: light dark;
supported-color-schemes: light dark;
}
@media (prefers-color-scheme: dark ) {
body {
color: #616b7c !important;
background-color: #ffffff !important;
}
a {
color: currentColor !important;
}
a.button {
color: #ffffff !important;
background-color: #2D2D31 !important;
border-color: #414146 !important;
}
h1, h2, h3 {
color: #373b4d !important;
}
h4 {
color: #4f5769 !important;
}
p.security-phrase:not(:empty), hr {
border-color: #e8e9f0 !important;
}
}
</style>
<style>
@font-face {
font-family: 'Inter';
@@ -37,7 +69,6 @@
font-family: "Inter", sans-serif;
background-color: #ffffff;
margin: 0;
padding: 0;
}
a {
color: currentColor;
@@ -2,6 +2,38 @@
<html>
<head>
<link rel="preconnect" href="https://assets.appwrite.io/" crossorigin>
<meta name="color-scheme" content="light dark">
<meta name="supported-color-schemes" content="light dark">
<style type="text/css">
:root {
color-scheme: light dark;
supported-color-schemes: light dark;
}
@media (prefers-color-scheme: dark ) {
body {
color: #616b7c !important;
background-color: #ffffff !important;
}
a {
color: currentColor !important;
}
a.button {
color: #ffffff !important;
background-color: #2D2D31 !important;
border-color: #414146 !important;
}
h1, h2, h3 {
color: #373b4d !important;
}
h4 {
color: #4f5769 !important;
}
p.security-phrase:not(:empty), hr {
border-color: #e8e9f0 !important;
}
}
</style>
<style>
@font-face {
font-family: 'Inter';
+15
View File
@@ -57,6 +57,21 @@
"emails.recovery.thanks": "Thanks,",
"emails.recovery.buttonText": "Reset password",
"emails.recovery.signature": "{{project}} team",
"emails.csvExport.success.subject": "Your CSV export is ready",
"emails.csvExport.success.preview": "Your data export has been completed successfully.",
"emails.csvExport.success.hello": "Hello {{user}},",
"emails.csvExport.success.body": "Your CSV export is ready for download. Click the link below to download your data export.",
"emails.csvExport.success.footer": "This download link will expire in 1 hour.",
"emails.csvExport.success.thanks": "Thanks,",
"emails.csvExport.success.buttonText": "Download CSV",
"emails.csvExport.success.signature": "{{project}} team",
"emails.csvExport.failure.subject": "Your CSV export failed - file too large",
"emails.csvExport.failure.preview": "Your data export failed because the file size exceeds your plan limit.",
"emails.csvExport.failure.hello": "Hello {{user}},",
"emails.csvExport.failure.body": "Your CSV export could not be completed because the export file size ({{size}}MB) exceeds your plan limit. Please consider upgrading your plan or exporting a smaller dataset.",
"emails.csvExport.failure.footer": "If you have any questions, please contact our support team.",
"emails.csvExport.failure.thanks": "Thanks,",
"emails.csvExport.failure.signature": "{{project}} team",
"emails.invitation.subject": "Invitation to {{team}} Team at {{project}}",
"emails.invitation.preview": "{{owner}} invited you to join {{team}} at {{project}}",
"emails.invitation.hello": "Hello {{user}},",
+4 -4
View File
@@ -11,7 +11,7 @@ return [
[
'key' => 'web',
'name' => 'Web',
'version' => '21.2.1',
'version' => '21.3.0',
'url' => 'https://github.com/appwrite/sdk-for-web',
'package' => 'https://www.npmjs.com/package/appwrite',
'enabled' => true,
@@ -79,7 +79,7 @@ return [
[
'key' => 'apple',
'name' => 'Apple',
'version' => '13.2.1',
'version' => '13.3.0',
'url' => 'https://github.com/appwrite/sdk-for-apple',
'package' => 'https://github.com/appwrite/sdk-for-apple',
'enabled' => true,
@@ -226,7 +226,7 @@ return [
[
'key' => 'cli',
'name' => 'Command Line',
'version' => '10.2.1',
'version' => '10.2.3',
'url' => 'https://github.com/appwrite/sdk-for-cli',
'package' => 'https://www.npmjs.com/package/appwrite-cli',
'enabled' => true,
@@ -418,7 +418,7 @@ return [
[
'key' => 'swift',
'name' => 'Swift',
'version' => '13.2.1',
'version' => '13.2.2',
'url' => 'https://github.com/appwrite/sdk-for-swift',
'package' => 'https://github.com/appwrite/sdk-for-swift',
'enabled' => true,
+60 -41
View File
@@ -4934,7 +4934,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 376,
"weight": 379,
"cookies": false,
"type": "",
"demo": "databases\/list-transactions.md",
@@ -4999,7 +4999,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 372,
"weight": 375,
"cookies": false,
"type": "",
"demo": "databases\/create-transaction.md",
@@ -5067,7 +5067,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 373,
"weight": 376,
"cookies": false,
"type": "",
"demo": "databases\/get-transaction.md",
@@ -5129,7 +5129,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 374,
"weight": 377,
"cookies": false,
"type": "",
"demo": "databases\/update-transaction.md",
@@ -5205,7 +5205,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 375,
"weight": 378,
"cookies": false,
"type": "",
"demo": "databases\/delete-transaction.md",
@@ -5269,7 +5269,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 377,
"weight": 380,
"cookies": false,
"type": "",
"demo": "databases\/create-operations.md",
@@ -5352,7 +5352,7 @@
"x-appwrite": {
"method": "listDocuments",
"group": "documents",
"weight": 335,
"weight": 338,
"cookies": false,
"type": "",
"demo": "databases\/list-documents.md",
@@ -5451,7 +5451,7 @@
"x-appwrite": {
"method": "createDocument",
"group": "documents",
"weight": 327,
"weight": 330,
"cookies": false,
"type": "",
"demo": "databases\/create-document.md",
@@ -5607,7 +5607,7 @@
"x-appwrite": {
"method": "getDocument",
"group": "documents",
"weight": 328,
"weight": 331,
"cookies": false,
"type": "",
"demo": "databases\/get-document.md",
@@ -5716,7 +5716,7 @@
"x-appwrite": {
"method": "upsertDocument",
"group": "documents",
"weight": 331,
"weight": 334,
"cookies": false,
"type": "",
"demo": "databases\/upsert-document.md",
@@ -5870,7 +5870,7 @@
"x-appwrite": {
"method": "updateDocument",
"group": "documents",
"weight": 329,
"weight": 332,
"cookies": false,
"type": "",
"demo": "databases\/update-document.md",
@@ -5978,7 +5978,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 333,
"weight": 336,
"cookies": false,
"type": "",
"demo": "databases\/delete-document.md",
@@ -6082,7 +6082,7 @@
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 338,
"weight": 341,
"cookies": false,
"type": "",
"demo": "databases\/decrement-document-attribute.md",
@@ -6206,7 +6206,7 @@
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 337,
"weight": 340,
"cookies": false,
"type": "",
"demo": "databases\/increment-document-attribute.md",
@@ -6330,7 +6330,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 468,
"weight": 471,
"cookies": false,
"type": "",
"demo": "functions\/list-executions.md",
@@ -6405,7 +6405,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 466,
"weight": 469,
"cookies": false,
"type": "",
"demo": "functions\/create-execution.md",
@@ -6521,7 +6521,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 467,
"weight": 470,
"cookies": false,
"type": "",
"demo": "functions\/get-execution.md",
@@ -7115,7 +7115,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 296,
"weight": 299,
"cookies": false,
"type": "",
"demo": "messaging\/create-subscriber.md",
@@ -7198,7 +7198,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 300,
"weight": 303,
"cookies": false,
"type": "",
"demo": "messaging\/delete-subscriber.md",
@@ -8076,7 +8076,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 441,
"weight": 444,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-transactions.md",
@@ -8084,7 +8084,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.read",
"scope": [
"documents.read",
"rows.read"
],
"platforms": [
"server",
"client",
@@ -8141,7 +8144,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 437,
"weight": 440,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-transaction.md",
@@ -8149,7 +8152,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client",
@@ -8209,7 +8215,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 438,
"weight": 441,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-transaction.md",
@@ -8217,7 +8223,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.read",
"scope": [
"documents.read",
"rows.read"
],
"platforms": [
"server",
"client",
@@ -8271,7 +8280,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 439,
"weight": 442,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-transaction.md",
@@ -8279,7 +8288,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client",
@@ -8347,7 +8359,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 440,
"weight": 443,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-transaction.md",
@@ -8355,7 +8367,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client",
@@ -8411,7 +8426,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 442,
"weight": 445,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-operations.md",
@@ -8419,7 +8434,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client",
@@ -8494,7 +8512,7 @@
"x-appwrite": {
"method": "listRows",
"group": "rows",
"weight": 433,
"weight": 436,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-rows.md",
@@ -8592,7 +8610,7 @@
"x-appwrite": {
"method": "createRow",
"group": "rows",
"weight": 425,
"weight": 428,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-row.md",
@@ -8743,7 +8761,7 @@
"x-appwrite": {
"method": "getRow",
"group": "rows",
"weight": 426,
"weight": 429,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-row.md",
@@ -8851,7 +8869,7 @@
"x-appwrite": {
"method": "upsertRow",
"group": "rows",
"weight": 429,
"weight": 432,
"cookies": false,
"type": "",
"demo": "tablesdb\/upsert-row.md",
@@ -8996,7 +9014,7 @@
"x-appwrite": {
"method": "updateRow",
"group": "rows",
"weight": 427,
"weight": 430,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-row.md",
@@ -9103,7 +9121,7 @@
"x-appwrite": {
"method": "deleteRow",
"group": "rows",
"weight": 431,
"weight": 434,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-row.md",
@@ -9206,7 +9224,7 @@
"x-appwrite": {
"method": "decrementRowColumn",
"group": "rows",
"weight": 436,
"weight": 439,
"cookies": false,
"type": "",
"demo": "tablesdb\/decrement-row-column.md",
@@ -9329,7 +9347,7 @@
"x-appwrite": {
"method": "incrementRowColumn",
"group": "rows",
"weight": 435,
"weight": 438,
"cookies": false,
"type": "",
"demo": "tablesdb\/increment-row-column.md",
@@ -12496,13 +12514,14 @@
},
"status": {
"type": "string",
"description": "The status of the function execution. Possible values can be: `waiting`, `processing`, `completed`, or `failed`.",
"description": "The status of the function execution. Possible values can be: `waiting`, `processing`, `completed`, `failed`, or `scheduled`.",
"x-example": "processing",
"enum": [
"waiting",
"processing",
"completed",
"failed"
"failed",
"scheduled"
]
},
"requestMethod": {
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+60 -41
View File
@@ -4934,7 +4934,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 376,
"weight": 379,
"cookies": false,
"type": "",
"demo": "databases\/list-transactions.md",
@@ -4999,7 +4999,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 372,
"weight": 375,
"cookies": false,
"type": "",
"demo": "databases\/create-transaction.md",
@@ -5067,7 +5067,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 373,
"weight": 376,
"cookies": false,
"type": "",
"demo": "databases\/get-transaction.md",
@@ -5129,7 +5129,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 374,
"weight": 377,
"cookies": false,
"type": "",
"demo": "databases\/update-transaction.md",
@@ -5205,7 +5205,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 375,
"weight": 378,
"cookies": false,
"type": "",
"demo": "databases\/delete-transaction.md",
@@ -5269,7 +5269,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 377,
"weight": 380,
"cookies": false,
"type": "",
"demo": "databases\/create-operations.md",
@@ -5352,7 +5352,7 @@
"x-appwrite": {
"method": "listDocuments",
"group": "documents",
"weight": 335,
"weight": 338,
"cookies": false,
"type": "",
"demo": "databases\/list-documents.md",
@@ -5451,7 +5451,7 @@
"x-appwrite": {
"method": "createDocument",
"group": "documents",
"weight": 327,
"weight": 330,
"cookies": false,
"type": "",
"demo": "databases\/create-document.md",
@@ -5607,7 +5607,7 @@
"x-appwrite": {
"method": "getDocument",
"group": "documents",
"weight": 328,
"weight": 331,
"cookies": false,
"type": "",
"demo": "databases\/get-document.md",
@@ -5716,7 +5716,7 @@
"x-appwrite": {
"method": "upsertDocument",
"group": "documents",
"weight": 331,
"weight": 334,
"cookies": false,
"type": "",
"demo": "databases\/upsert-document.md",
@@ -5870,7 +5870,7 @@
"x-appwrite": {
"method": "updateDocument",
"group": "documents",
"weight": 329,
"weight": 332,
"cookies": false,
"type": "",
"demo": "databases\/update-document.md",
@@ -5978,7 +5978,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 333,
"weight": 336,
"cookies": false,
"type": "",
"demo": "databases\/delete-document.md",
@@ -6082,7 +6082,7 @@
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 338,
"weight": 341,
"cookies": false,
"type": "",
"demo": "databases\/decrement-document-attribute.md",
@@ -6206,7 +6206,7 @@
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 337,
"weight": 340,
"cookies": false,
"type": "",
"demo": "databases\/increment-document-attribute.md",
@@ -6330,7 +6330,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 468,
"weight": 471,
"cookies": false,
"type": "",
"demo": "functions\/list-executions.md",
@@ -6405,7 +6405,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 466,
"weight": 469,
"cookies": false,
"type": "",
"demo": "functions\/create-execution.md",
@@ -6521,7 +6521,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 467,
"weight": 470,
"cookies": false,
"type": "",
"demo": "functions\/get-execution.md",
@@ -7115,7 +7115,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 296,
"weight": 299,
"cookies": false,
"type": "",
"demo": "messaging\/create-subscriber.md",
@@ -7198,7 +7198,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 300,
"weight": 303,
"cookies": false,
"type": "",
"demo": "messaging\/delete-subscriber.md",
@@ -8076,7 +8076,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 441,
"weight": 444,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-transactions.md",
@@ -8084,7 +8084,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.read",
"scope": [
"documents.read",
"rows.read"
],
"platforms": [
"server",
"client",
@@ -8141,7 +8144,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 437,
"weight": 440,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-transaction.md",
@@ -8149,7 +8152,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client",
@@ -8209,7 +8215,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 438,
"weight": 441,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-transaction.md",
@@ -8217,7 +8223,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.read",
"scope": [
"documents.read",
"rows.read"
],
"platforms": [
"server",
"client",
@@ -8271,7 +8280,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 439,
"weight": 442,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-transaction.md",
@@ -8279,7 +8288,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client",
@@ -8347,7 +8359,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 440,
"weight": 443,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-transaction.md",
@@ -8355,7 +8367,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client",
@@ -8411,7 +8426,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 442,
"weight": 445,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-operations.md",
@@ -8419,7 +8434,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client",
@@ -8494,7 +8512,7 @@
"x-appwrite": {
"method": "listRows",
"group": "rows",
"weight": 433,
"weight": 436,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-rows.md",
@@ -8592,7 +8610,7 @@
"x-appwrite": {
"method": "createRow",
"group": "rows",
"weight": 425,
"weight": 428,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-row.md",
@@ -8743,7 +8761,7 @@
"x-appwrite": {
"method": "getRow",
"group": "rows",
"weight": 426,
"weight": 429,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-row.md",
@@ -8851,7 +8869,7 @@
"x-appwrite": {
"method": "upsertRow",
"group": "rows",
"weight": 429,
"weight": 432,
"cookies": false,
"type": "",
"demo": "tablesdb\/upsert-row.md",
@@ -8996,7 +9014,7 @@
"x-appwrite": {
"method": "updateRow",
"group": "rows",
"weight": 427,
"weight": 430,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-row.md",
@@ -9103,7 +9121,7 @@
"x-appwrite": {
"method": "deleteRow",
"group": "rows",
"weight": 431,
"weight": 434,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-row.md",
@@ -9206,7 +9224,7 @@
"x-appwrite": {
"method": "decrementRowColumn",
"group": "rows",
"weight": 436,
"weight": 439,
"cookies": false,
"type": "",
"demo": "tablesdb\/decrement-row-column.md",
@@ -9329,7 +9347,7 @@
"x-appwrite": {
"method": "incrementRowColumn",
"group": "rows",
"weight": 435,
"weight": 438,
"cookies": false,
"type": "",
"demo": "tablesdb\/increment-row-column.md",
@@ -12496,13 +12514,14 @@
},
"status": {
"type": "string",
"description": "The status of the function execution. Possible values can be: `waiting`, `processing`, `completed`, or `failed`.",
"description": "The status of the function execution. Possible values can be: `waiting`, `processing`, `completed`, `failed`, or `scheduled`.",
"x-example": "processing",
"enum": [
"waiting",
"processing",
"completed",
"failed"
"failed",
"scheduled"
]
},
"requestMethod": {
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+60 -41
View File
@@ -5076,7 +5076,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 376,
"weight": 379,
"cookies": false,
"type": "",
"demo": "databases\/list-transactions.md",
@@ -5141,7 +5141,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 372,
"weight": 375,
"cookies": false,
"type": "",
"demo": "databases\/create-transaction.md",
@@ -5209,7 +5209,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 373,
"weight": 376,
"cookies": false,
"type": "",
"demo": "databases\/get-transaction.md",
@@ -5270,7 +5270,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 374,
"weight": 377,
"cookies": false,
"type": "",
"demo": "databases\/update-transaction.md",
@@ -5347,7 +5347,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 375,
"weight": 378,
"cookies": false,
"type": "",
"demo": "databases\/delete-transaction.md",
@@ -5410,7 +5410,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 377,
"weight": 380,
"cookies": false,
"type": "",
"demo": "databases\/create-operations.md",
@@ -5489,7 +5489,7 @@
"x-appwrite": {
"method": "listDocuments",
"group": "documents",
"weight": 335,
"weight": 338,
"cookies": false,
"type": "",
"demo": "databases\/list-documents.md",
@@ -5582,7 +5582,7 @@
"x-appwrite": {
"method": "createDocument",
"group": "documents",
"weight": 327,
"weight": 330,
"cookies": false,
"type": "",
"demo": "databases\/create-document.md",
@@ -5736,7 +5736,7 @@
"x-appwrite": {
"method": "getDocument",
"group": "documents",
"weight": 328,
"weight": 331,
"cookies": false,
"type": "",
"demo": "databases\/get-document.md",
@@ -5837,7 +5837,7 @@
"x-appwrite": {
"method": "upsertDocument",
"group": "documents",
"weight": 331,
"weight": 334,
"cookies": false,
"type": "",
"demo": "databases\/upsert-document.md",
@@ -5987,7 +5987,7 @@
"x-appwrite": {
"method": "updateDocument",
"group": "documents",
"weight": 329,
"weight": 332,
"cookies": false,
"type": "",
"demo": "databases\/update-document.md",
@@ -6093,7 +6093,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 333,
"weight": 336,
"cookies": false,
"type": "",
"demo": "databases\/delete-document.md",
@@ -6191,7 +6191,7 @@
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 338,
"weight": 341,
"cookies": false,
"type": "",
"demo": "databases\/decrement-document-attribute.md",
@@ -6309,7 +6309,7 @@
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 337,
"weight": 340,
"cookies": false,
"type": "",
"demo": "databases\/increment-document-attribute.md",
@@ -6425,7 +6425,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 468,
"weight": 471,
"cookies": false,
"type": "",
"demo": "functions\/list-executions.md",
@@ -6498,7 +6498,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 466,
"weight": 469,
"cookies": false,
"type": "",
"demo": "functions\/create-execution.md",
@@ -6615,7 +6615,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 467,
"weight": 470,
"cookies": false,
"type": "",
"demo": "functions\/get-execution.md",
@@ -7240,7 +7240,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 296,
"weight": 299,
"cookies": false,
"type": "",
"demo": "messaging\/create-subscriber.md",
@@ -7324,7 +7324,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 300,
"weight": 303,
"cookies": false,
"type": "",
"demo": "messaging\/delete-subscriber.md",
@@ -8153,7 +8153,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 441,
"weight": 444,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-transactions.md",
@@ -8161,7 +8161,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.read",
"scope": [
"documents.read",
"rows.read"
],
"platforms": [
"server",
"client"
@@ -8218,7 +8221,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 437,
"weight": 440,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-transaction.md",
@@ -8226,7 +8229,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client"
@@ -8286,7 +8292,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 438,
"weight": 441,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-transaction.md",
@@ -8294,7 +8300,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.read",
"scope": [
"documents.read",
"rows.read"
],
"platforms": [
"server",
"client"
@@ -8347,7 +8356,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 439,
"weight": 442,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-transaction.md",
@@ -8355,7 +8364,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client"
@@ -8424,7 +8436,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 440,
"weight": 443,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-transaction.md",
@@ -8432,7 +8444,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client"
@@ -8487,7 +8502,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 442,
"weight": 445,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-operations.md",
@@ -8495,7 +8510,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client"
@@ -8566,7 +8584,7 @@
"x-appwrite": {
"method": "listRows",
"group": "rows",
"weight": 433,
"weight": 436,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-rows.md",
@@ -8658,7 +8676,7 @@
"x-appwrite": {
"method": "createRow",
"group": "rows",
"weight": 425,
"weight": 428,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-row.md",
@@ -8807,7 +8825,7 @@
"x-appwrite": {
"method": "getRow",
"group": "rows",
"weight": 426,
"weight": 429,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-row.md",
@@ -8907,7 +8925,7 @@
"x-appwrite": {
"method": "upsertRow",
"group": "rows",
"weight": 429,
"weight": 432,
"cookies": false,
"type": "",
"demo": "tablesdb\/upsert-row.md",
@@ -9048,7 +9066,7 @@
"x-appwrite": {
"method": "updateRow",
"group": "rows",
"weight": 427,
"weight": 430,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-row.md",
@@ -9153,7 +9171,7 @@
"x-appwrite": {
"method": "deleteRow",
"group": "rows",
"weight": 431,
"weight": 434,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-row.md",
@@ -9250,7 +9268,7 @@
"x-appwrite": {
"method": "decrementRowColumn",
"group": "rows",
"weight": 436,
"weight": 439,
"cookies": false,
"type": "",
"demo": "tablesdb\/decrement-row-column.md",
@@ -9367,7 +9385,7 @@
"x-appwrite": {
"method": "incrementRowColumn",
"group": "rows",
"weight": 435,
"weight": 438,
"cookies": false,
"type": "",
"demo": "tablesdb\/increment-row-column.md",
@@ -12486,13 +12504,14 @@
},
"status": {
"type": "string",
"description": "The status of the function execution. Possible values can be: `waiting`, `processing`, `completed`, or `failed`.",
"description": "The status of the function execution. Possible values can be: `waiting`, `processing`, `completed`, `failed`, or `scheduled`.",
"x-example": "processing",
"enum": [
"waiting",
"processing",
"completed",
"failed"
"failed",
"scheduled"
]
},
"requestMethod": {
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+60 -41
View File
@@ -5076,7 +5076,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 376,
"weight": 379,
"cookies": false,
"type": "",
"demo": "databases\/list-transactions.md",
@@ -5141,7 +5141,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 372,
"weight": 375,
"cookies": false,
"type": "",
"demo": "databases\/create-transaction.md",
@@ -5209,7 +5209,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 373,
"weight": 376,
"cookies": false,
"type": "",
"demo": "databases\/get-transaction.md",
@@ -5270,7 +5270,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 374,
"weight": 377,
"cookies": false,
"type": "",
"demo": "databases\/update-transaction.md",
@@ -5347,7 +5347,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 375,
"weight": 378,
"cookies": false,
"type": "",
"demo": "databases\/delete-transaction.md",
@@ -5410,7 +5410,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 377,
"weight": 380,
"cookies": false,
"type": "",
"demo": "databases\/create-operations.md",
@@ -5489,7 +5489,7 @@
"x-appwrite": {
"method": "listDocuments",
"group": "documents",
"weight": 335,
"weight": 338,
"cookies": false,
"type": "",
"demo": "databases\/list-documents.md",
@@ -5582,7 +5582,7 @@
"x-appwrite": {
"method": "createDocument",
"group": "documents",
"weight": 327,
"weight": 330,
"cookies": false,
"type": "",
"demo": "databases\/create-document.md",
@@ -5736,7 +5736,7 @@
"x-appwrite": {
"method": "getDocument",
"group": "documents",
"weight": 328,
"weight": 331,
"cookies": false,
"type": "",
"demo": "databases\/get-document.md",
@@ -5837,7 +5837,7 @@
"x-appwrite": {
"method": "upsertDocument",
"group": "documents",
"weight": 331,
"weight": 334,
"cookies": false,
"type": "",
"demo": "databases\/upsert-document.md",
@@ -5987,7 +5987,7 @@
"x-appwrite": {
"method": "updateDocument",
"group": "documents",
"weight": 329,
"weight": 332,
"cookies": false,
"type": "",
"demo": "databases\/update-document.md",
@@ -6093,7 +6093,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 333,
"weight": 336,
"cookies": false,
"type": "",
"demo": "databases\/delete-document.md",
@@ -6191,7 +6191,7 @@
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 338,
"weight": 341,
"cookies": false,
"type": "",
"demo": "databases\/decrement-document-attribute.md",
@@ -6309,7 +6309,7 @@
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 337,
"weight": 340,
"cookies": false,
"type": "",
"demo": "databases\/increment-document-attribute.md",
@@ -6425,7 +6425,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 468,
"weight": 471,
"cookies": false,
"type": "",
"demo": "functions\/list-executions.md",
@@ -6498,7 +6498,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 466,
"weight": 469,
"cookies": false,
"type": "",
"demo": "functions\/create-execution.md",
@@ -6615,7 +6615,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 467,
"weight": 470,
"cookies": false,
"type": "",
"demo": "functions\/get-execution.md",
@@ -7240,7 +7240,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 296,
"weight": 299,
"cookies": false,
"type": "",
"demo": "messaging\/create-subscriber.md",
@@ -7324,7 +7324,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 300,
"weight": 303,
"cookies": false,
"type": "",
"demo": "messaging\/delete-subscriber.md",
@@ -8153,7 +8153,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 441,
"weight": 444,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-transactions.md",
@@ -8161,7 +8161,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.read",
"scope": [
"documents.read",
"rows.read"
],
"platforms": [
"server",
"client"
@@ -8218,7 +8221,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 437,
"weight": 440,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-transaction.md",
@@ -8226,7 +8229,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client"
@@ -8286,7 +8292,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 438,
"weight": 441,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-transaction.md",
@@ -8294,7 +8300,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.read",
"scope": [
"documents.read",
"rows.read"
],
"platforms": [
"server",
"client"
@@ -8347,7 +8356,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 439,
"weight": 442,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-transaction.md",
@@ -8355,7 +8364,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client"
@@ -8424,7 +8436,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 440,
"weight": 443,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-transaction.md",
@@ -8432,7 +8444,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client"
@@ -8487,7 +8502,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 442,
"weight": 445,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-operations.md",
@@ -8495,7 +8510,10 @@
"rate-limit": 0,
"rate-time": 3600,
"rate-key": "url:{url},ip:{ip}",
"scope": "rows.write",
"scope": [
"documents.write",
"rows.write"
],
"platforms": [
"server",
"client"
@@ -8566,7 +8584,7 @@
"x-appwrite": {
"method": "listRows",
"group": "rows",
"weight": 433,
"weight": 436,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-rows.md",
@@ -8658,7 +8676,7 @@
"x-appwrite": {
"method": "createRow",
"group": "rows",
"weight": 425,
"weight": 428,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-row.md",
@@ -8807,7 +8825,7 @@
"x-appwrite": {
"method": "getRow",
"group": "rows",
"weight": 426,
"weight": 429,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-row.md",
@@ -8907,7 +8925,7 @@
"x-appwrite": {
"method": "upsertRow",
"group": "rows",
"weight": 429,
"weight": 432,
"cookies": false,
"type": "",
"demo": "tablesdb\/upsert-row.md",
@@ -9048,7 +9066,7 @@
"x-appwrite": {
"method": "updateRow",
"group": "rows",
"weight": 427,
"weight": 430,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-row.md",
@@ -9153,7 +9171,7 @@
"x-appwrite": {
"method": "deleteRow",
"group": "rows",
"weight": 431,
"weight": 434,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-row.md",
@@ -9250,7 +9268,7 @@
"x-appwrite": {
"method": "decrementRowColumn",
"group": "rows",
"weight": 436,
"weight": 439,
"cookies": false,
"type": "",
"demo": "tablesdb\/decrement-row-column.md",
@@ -9367,7 +9385,7 @@
"x-appwrite": {
"method": "incrementRowColumn",
"group": "rows",
"weight": 435,
"weight": 438,
"cookies": false,
"type": "",
"demo": "tablesdb\/increment-row-column.md",
@@ -12486,13 +12504,14 @@
},
"status": {
"type": "string",
"description": "The status of the function execution. Possible values can be: `waiting`, `processing`, `completed`, or `failed`.",
"description": "The status of the function execution. Possible values can be: `waiting`, `processing`, `completed`, `failed`, or `scheduled`.",
"x-example": "processing",
"enum": [
"waiting",
"processing",
"completed",
"failed"
"failed",
"scheduled"
]
},
"requestMethod": {
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+78
View File
@@ -9,6 +9,11 @@ use Utopia\System\System;
$protocol = System::getEnv('_APP_OPTIONS_FORCE_HTTPS') === 'disabled' ? 'http' : 'https';
$hostname = System::getEnv('_APP_DOMAIN', '');
// Temporary fix until we can set _APP_DOMAIN to "localhost" instead of "traefik"
if (System::getEnv('_APP_ENV', 'development') === 'development') {
$hostname = 'localhost';
}
$url = $protocol . '://' . $hostname;
class UseCases
@@ -111,6 +116,16 @@ const TEMPLATE_FRAMEWORKS = [
'outputDirectory' => './dist',
'fallbackFile' => '+not-found.html',
],
'TANSTACK_START' => [
'key' => 'tanstack-start',
'name' => 'TanStack Start',
'installCommand' => 'npm install',
'buildCommand' => 'npm run build',
'outputDirectory' => './dist',
'buildRuntime' => 'node-22',
'adapter' => 'ssr',
'fallbackFile' => '',
],
'ANGULAR' => [
'key' => 'angular',
'name' => 'Angular',
@@ -950,6 +965,50 @@ return [
],
]
],
[
'key' => 'starter-for-tanstack-start',
'name' => 'TanStack Start starter',
'useCases' => [UseCases::STARTER],
'tagline' => 'Simple TanStack Start application integrated with Appwrite SDK.',
'score' => 6, // 0 to 10 based on looks of screenshot (avoid 1,2,3,8,9,10 if possible)
'screenshotDark' => $url . '/images/sites/templates/starter-for-tanstack-start-dark.png',
'screenshotLight' => $url . '/images/sites/templates/starter-for-tanstack-start-light.png',
'frameworks' => [
getFramework('TANSTACK_START', [
'providerRootDirectory' => './',
]),
],
'vcsProvider' => 'github',
'providerRepositoryId' => 'starter-for-tanstack-start',
'providerOwner' => 'appwrite',
'providerVersion' => '0.1.*',
'variables' => [
[
'name' => 'VITE_APPWRITE_ENDPOINT',
'description' => 'Endpoint of Appwrite server',
'value' => '{apiEndpoint}',
'placeholder' => '{apiEndpoint}',
'required' => true,
'type' => 'text'
],
[
'name' => 'VITE_APPWRITE_PROJECT_ID',
'description' => 'Your Appwrite project ID',
'value' => '{projectId}',
'placeholder' => '{projectId}',
'required' => true,
'type' => 'text'
],
[
'name' => 'VITE_APPWRITE_PROJECT_NAME',
'description' => 'Your Appwrite project name',
'value' => '{projectName}',
'placeholder' => '{projectName}',
'required' => true,
'type' => 'text'
],
]
],
[
'key' => 'starter-for-nuxt',
'name' => 'Nuxt starter',
@@ -1327,6 +1386,25 @@ return [
'providerVersion' => '0.3.*',
'variables' => [],
],
[
'key' => 'playground-for-tanstack-start',
'name' => 'TanStack Start playground',
'tagline' => 'A basic TanStack Start website without Appwrite SDK integration.',
'score' => 1, // 0 to 10 based on looks of screenshot (avoid 1,2,3,8,9,10 if possible)
'useCases' => [UseCases::STARTER],
'screenshotDark' => $url . '/images/sites/templates/playground-for-tanstack-start-dark.png',
'screenshotLight' => $url . '/images/sites/templates/playground-for-tanstack-start-light.png',
'frameworks' => [
getFramework('TANSTACK_START', [
'providerRootDirectory' => './tanstack-start/starter',
]),
],
'vcsProvider' => 'github',
'providerRepositoryId' => 'templates-for-sites',
'providerOwner' => 'appwrite',
'providerVersion' => '0.5.*',
'variables' => [],
],
[
'key' => 'playground-for-react-native',
'name' => 'React Native playground',
+6 -4
View File
@@ -2814,12 +2814,13 @@ App::get('/v1/account/logs')
contentType: ContentType::JSON,
))
->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('user')
->inject('locale')
->inject('geodb')
->inject('dbForProject')
->action(function (array $queries, Response $response, Document $user, Locale $locale, Reader $geodb, Database $dbForProject) {
->action(function (array $queries, bool $includeTotal, Response $response, Document $user, Locale $locale, Reader $geodb, Database $dbForProject) {
try {
$queries = Query::parseQueries($queries);
@@ -2864,7 +2865,7 @@ App::get('/v1/account/logs')
}
$response->dynamic(new Document([
'total' => $audit->countLogsByUser($user->getSequence(), $queries),
'total' => $includeTotal ? $audit->countLogsByUser($user->getSequence(), $queries) : 0,
'logs' => $output,
]), Response::MODEL_LOG_LIST);
});
@@ -5211,10 +5212,11 @@ App::get('/v1/account/identities')
contentType: ContentType::JSON
))
->param('queries', [], new Identities(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Identities::ALLOWED_ATTRIBUTES), true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('user')
->inject('dbForProject')
->action(function (array $queries, Response $response, Document $user, Database $dbForProject) {
->action(function (array $queries, bool $includeTotal, Response $response, Document $user, Database $dbForProject) {
try {
$queries = Query::parseQueries($queries);
@@ -5255,7 +5257,7 @@ App::get('/v1/account/identities')
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
$total = $dbForProject->count('identities', $filterQueries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForProject->count('identities', $filterQueries, APP_LIMIT_COUNT) : 0;
$response->dynamic(new Document([
'identities' => $results,
+1
View File
@@ -74,6 +74,7 @@ App::get('/v1/console/variables')
// Combine CAA domain with most common flags and tag (no parameters)
'_APP_DOMAIN_TARGET_CAA' => '0 issue "' . System::getEnv('_APP_DOMAIN_TARGET_CAA') . '"',
'_APP_STORAGE_LIMIT' => +System::getEnv('_APP_STORAGE_LIMIT'),
'_APP_COMPUTE_BUILD_TIMEOUT' => +System::getEnv('_APP_COMPUTE_BUILD_TIMEOUT'),
'_APP_COMPUTE_SIZE_LIMIT' => +System::getEnv('_APP_COMPUTE_SIZE_LIMIT'),
'_APP_USAGE_STATS' => System::getEnv('_APP_USAGE_STATS'),
'_APP_VCS_ENABLED' => $isVcsEnabled,
+207 -18
View File
@@ -231,6 +231,88 @@ App::post('/v1/messaging/providers/sendgrid')
->dynamic($provider, Response::MODEL_PROVIDER);
});
App::post('/v1/messaging/providers/resend')
->desc('Create Resend provider')
->groups(['api', 'messaging'])
->label('audits.event', 'provider.create')
->label('audits.resource', 'provider/{response.$id}')
->label('event', 'providers.[providerId].create')
->label('scope', 'providers.write')
->label('resourceType', RESOURCE_TYPE_PROVIDERS)
->label('sdk', new Method(
namespace: 'messaging',
group: 'providers',
name: 'createResendProvider',
description: '/docs/references/messaging/create-resend-provider.md',
auth: [AuthType::ADMIN, AuthType::KEY],
responses: [
new SDKResponse(
code: Response::STATUS_CODE_CREATED,
model: Response::MODEL_PROVIDER,
)
]
))
->param('providerId', '', new CustomId(), 'Provider ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.')
->param('name', '', new Text(128), 'Provider name.')
->param('apiKey', '', new Text(0), 'Resend API key.', true)
->param('fromName', '', new Text(128, 0), 'Sender Name.', true)
->param('fromEmail', '', new Email(), 'Sender email address.', true)
->param('replyToName', '', new Text(128, 0), 'Name set in the reply to field for the mail. Default value is sender name.', true)
->param('replyToEmail', '', new Email(), 'Email set in the reply to field for the mail. Default value is sender email.', true)
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
->inject('queueForEvents')
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, string $apiKey, string $fromName, string $fromEmail, string $replyToName, string $replyToEmail, ?bool $enabled, Event $queueForEvents, Database $dbForProject, Response $response) {
$providerId = $providerId == 'unique()' ? ID::unique() : $providerId;
$credentials = [];
if (!empty($apiKey)) {
$credentials['apiKey'] = $apiKey;
}
$options = [
'fromName' => $fromName,
'fromEmail' => $fromEmail,
'replyToName' => $replyToName,
'replyToEmail' => $replyToEmail,
];
if (
$enabled === true
&& !empty($fromEmail)
&& \array_key_exists('apiKey', $credentials)
) {
$enabled = true;
} else {
$enabled = false;
}
$provider = new Document([
'$id' => $providerId,
'name' => $name,
'provider' => 'resend',
'type' => MESSAGE_TYPE_EMAIL,
'enabled' => $enabled,
'credentials' => $credentials,
'options' => $options,
]);
try {
$provider = $dbForProject->createDocument('providers', $provider);
} catch (DuplicateException) {
throw new Exception(Exception::PROVIDER_ALREADY_EXISTS);
}
$queueForEvents
->setParam('providerId', $provider->getId());
$response
->setStatusCode(Response::STATUS_CODE_CREATED)
->dynamic($provider, Response::MODEL_PROVIDER);
});
App::post('/v1/messaging/providers/smtp')
->desc('Create SMTP provider')
->groups(['api', 'messaging'])
@@ -985,9 +1067,10 @@ App::get('/v1/messaging/providers')
))
->param('queries', [], new Providers(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Providers::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('dbForProject')
->inject('response')
->action(function (array $queries, string $search, Database $dbForProject, Response $response) {
->action(function (array $queries, string $search, bool $includeTotal, Database $dbForProject, Response $response) {
try {
$queries = Query::parseQueries($queries);
} catch (QueryException $e) {
@@ -1023,7 +1106,7 @@ App::get('/v1/messaging/providers')
}
try {
$providers = $dbForProject->find('providers', $queries);
$total = $dbForProject->count('providers', $queries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForProject->count('providers', $queries, APP_LIMIT_COUNT) : 0;
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
@@ -1053,11 +1136,12 @@ App::get('/v1/messaging/providers/:providerId/logs')
))
->param('providerId', '', new UID(), 'Provider ID.')
->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->inject('locale')
->inject('geodb')
->action(function (string $providerId, array $queries, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) {
->action(function (string $providerId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) {
$provider = $dbForProject->getDocument('providers', $providerId);
if ($provider->isEmpty()) {
@@ -1125,7 +1209,7 @@ App::get('/v1/messaging/providers/:providerId/logs')
}
$response->dynamic(new Document([
'total' => $audit->countLogsByResource($resource, $queries),
'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0,
'logs' => $output,
]), Response::MODEL_LOG_LIST);
});
@@ -1372,6 +1456,104 @@ App::patch('/v1/messaging/providers/sendgrid/:providerId')
->dynamic($provider, Response::MODEL_PROVIDER);
});
App::patch('/v1/messaging/providers/resend/:providerId')
->desc('Update Resend provider')
->groups(['api', 'messaging'])
->label('audits.event', 'provider.update')
->label('audits.resource', 'provider/{response.$id}')
->label('event', 'providers.[providerId].update')
->label('scope', 'providers.write')
->label('resourceType', RESOURCE_TYPE_PROVIDERS)
->label('sdk', new Method(
namespace: 'messaging',
group: 'providers',
name: 'updateResendProvider',
description: '/docs/references/messaging/update-resend-provider.md',
auth: [AuthType::ADMIN, AuthType::KEY],
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_PROVIDER,
)
]
))
->param('providerId', '', new UID(), 'Provider ID.')
->param('name', '', new Text(128), 'Provider name.', true)
->param('enabled', null, new Boolean(), 'Set as enabled.', true)
->param('apiKey', '', new Text(0), 'Resend API key.', true)
->param('fromName', '', new Text(128), 'Sender Name.', true)
->param('fromEmail', '', new Email(), 'Sender email address.', true)
->param('replyToName', '', new Text(128), 'Name set in the Reply To field for the mail. Default value is Sender Name.', true)
->param('replyToEmail', '', new Text(128), 'Email set in the Reply To field for the mail. Default value is Sender Email.', true)
->inject('queueForEvents')
->inject('dbForProject')
->inject('response')
->action(function (string $providerId, string $name, ?bool $enabled, string $apiKey, string $fromName, string $fromEmail, string $replyToName, string $replyToEmail, Event $queueForEvents, Database $dbForProject, Response $response) {
$provider = $dbForProject->getDocument('providers', $providerId);
if ($provider->isEmpty()) {
throw new Exception(Exception::PROVIDER_NOT_FOUND);
}
$providerAttr = $provider->getAttribute('provider');
if ($providerAttr !== 'resend') {
throw new Exception(Exception::PROVIDER_INCORRECT_TYPE);
}
if (!empty($name)) {
$provider->setAttribute('name', $name);
}
$options = $provider->getAttribute('options');
if (!empty($fromName)) {
$options['fromName'] = $fromName;
}
if (!empty($fromEmail)) {
$options['fromEmail'] = $fromEmail;
}
if (!empty($replyToName)) {
$options['replyToName'] = $replyToName;
}
if (!empty($replyToEmail)) {
$options['replyToEmail'] = $replyToEmail;
}
$provider->setAttribute('options', $options);
if (!empty($apiKey)) {
$provider->setAttribute('credentials', [
'apiKey' => $apiKey,
]);
}
if (!\is_null($enabled)) {
if ($enabled) {
if (
\array_key_exists('apiKey', $provider->getAttribute('credentials')) &&
\array_key_exists('fromEmail', $provider->getAttribute('options'))
) {
$provider->setAttribute('enabled', true);
} else {
throw new Exception(Exception::PROVIDER_MISSING_CREDENTIALS);
}
} else {
$provider->setAttribute('enabled', false);
}
}
$provider = $dbForProject->updateDocument('providers', $provider->getId(), $provider);
$queueForEvents
->setParam('providerId', $provider->getId());
$response
->dynamic($provider, Response::MODEL_PROVIDER);
});
App::patch('/v1/messaging/providers/smtp/:providerId')
->desc('Update SMTP provider')
->groups(['api', 'messaging'])
@@ -2292,9 +2474,10 @@ App::get('/v1/messaging/topics')
))
->param('queries', [], new Topics(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Topics::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('dbForProject')
->inject('response')
->action(function (array $queries, string $search, Database $dbForProject, Response $response) {
->action(function (array $queries, string $search, bool $includeTotal, Database $dbForProject, Response $response) {
try {
$queries = Query::parseQueries($queries);
} catch (QueryException $e) {
@@ -2330,7 +2513,7 @@ App::get('/v1/messaging/topics')
}
try {
$topics = $dbForProject->find('topics', $queries);
$total = $dbForProject->count('topics', $queries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForProject->count('topics', $queries, APP_LIMIT_COUNT) : 0;
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
@@ -2360,11 +2543,12 @@ App::get('/v1/messaging/topics/:topicId/logs')
))
->param('topicId', '', new UID(), 'Topic ID.')
->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->inject('locale')
->inject('geodb')
->action(function (string $topicId, array $queries, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) {
->action(function (string $topicId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) {
$topic = $dbForProject->getDocument('topics', $topicId);
if ($topic->isEmpty()) {
@@ -2433,7 +2617,7 @@ App::get('/v1/messaging/topics/:topicId/logs')
}
$response->dynamic(new Document([
'total' => $audit->countLogsByResource($resource, $queries),
'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0,
'logs' => $output,
]), Response::MODEL_LOG_LIST);
});
@@ -2693,9 +2877,10 @@ App::get('/v1/messaging/topics/:topicId/subscribers')
->param('topicId', '', new UID(), 'Topic ID. The topic ID subscribed to.')
->param('queries', [], new Subscribers(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Providers::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('dbForProject')
->inject('response')
->action(function (string $topicId, array $queries, string $search, Database $dbForProject, Response $response) {
->action(function (string $topicId, array $queries, string $search, bool $includeTotal, Database $dbForProject, Response $response) {
try {
$queries = Query::parseQueries($queries);
} catch (QueryException $e) {
@@ -2757,7 +2942,7 @@ App::get('/v1/messaging/topics/:topicId/subscribers')
$response
->dynamic(new Document([
'subscribers' => $subscribers,
'total' => $dbForProject->count('subscribers', $queries, APP_LIMIT_COUNT),
'total' => $includeTotal ? $dbForProject->count('subscribers', $queries, APP_LIMIT_COUNT) : 0,
]), Response::MODEL_SUBSCRIBER_LIST);
});
@@ -2781,11 +2966,12 @@ App::get('/v1/messaging/subscribers/:subscriberId/logs')
))
->param('subscriberId', '', new UID(), 'Subscriber ID.')
->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->inject('locale')
->inject('geodb')
->action(function (string $subscriberId, array $queries, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) {
->action(function (string $subscriberId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) {
$subscriber = $dbForProject->getDocument('subscribers', $subscriberId);
if ($subscriber->isEmpty()) {
@@ -2854,7 +3040,7 @@ App::get('/v1/messaging/subscribers/:subscriberId/logs')
}
$response->dynamic(new Document([
'total' => $audit->countLogsByResource($resource, $queries),
'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0,
'logs' => $output,
]), Response::MODEL_LOG_LIST);
});
@@ -3511,9 +3697,10 @@ App::get('/v1/messaging/messages')
))
->param('queries', [], new Messages(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Messages::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('dbForProject')
->inject('response')
->action(function (array $queries, string $search, Database $dbForProject, Response $response) {
->action(function (array $queries, string $search, bool $includeTotal, Database $dbForProject, Response $response) {
try {
$queries = Query::parseQueries($queries);
} catch (QueryException $e) {
@@ -3549,7 +3736,7 @@ App::get('/v1/messaging/messages')
}
try {
$messages = $dbForProject->find('messages', $queries);
$total = $dbForProject->count('messages', $queries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForProject->count('messages', $queries, APP_LIMIT_COUNT) : 0;
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
@@ -3579,11 +3766,12 @@ App::get('/v1/messaging/messages/:messageId/logs')
))
->param('messageId', '', new UID(), 'Message ID.')
->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->inject('locale')
->inject('geodb')
->action(function (string $messageId, array $queries, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) {
->action(function (string $messageId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) {
$message = $dbForProject->getDocument('messages', $messageId);
if ($message->isEmpty()) {
@@ -3652,7 +3840,7 @@ App::get('/v1/messaging/messages/:messageId/logs')
}
$response->dynamic(new Document([
'total' => $audit->countLogsByResource($resource, $queries),
'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0,
'logs' => $output,
]), Response::MODEL_LOG_LIST);
});
@@ -3677,9 +3865,10 @@ App::get('/v1/messaging/messages/:messageId/targets')
))
->param('messageId', '', new UID(), 'Message ID.')
->param('queries', [], new Targets(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Targets::ALLOWED_ATTRIBUTES), true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->action(function (string $messageId, array $queries, Response $response, Database $dbForProject) {
->action(function (string $messageId, array $queries, bool $includeTotal, Response $response, Database $dbForProject) {
$message = $dbForProject->getDocument('messages', $messageId);
if ($message->isEmpty()) {
@@ -3729,7 +3918,7 @@ App::get('/v1/messaging/messages/:messageId/targets')
}
try {
$targets = $dbForProject->find('targets', $queries);
$total = $dbForProject->count('targets', $queries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForProject->count('targets', $queries, APP_LIMIT_COUNT) : 0;
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
+162 -24
View File
@@ -1,6 +1,5 @@
<?php
use Appwrite\Auth\Auth;
use Appwrite\Event\Event;
use Appwrite\Event\Migration;
use Appwrite\Extend\Exception;
@@ -20,6 +19,7 @@ use Utopia\Database\Exception\Query as QueryException;
use Utopia\Database\Helpers\ID;
use Utopia\Database\Query;
use Utopia\Database\Validator\Authorization;
use Utopia\Database\Validator\Queries\Documents;
use Utopia\Database\Validator\Query\Cursor;
use Utopia\Database\Validator\UID;
use Utopia\Migration\Resource;
@@ -307,7 +307,8 @@ App::post('/v1/migrations/nhost')
->dynamic($migration, Response::MODEL_MIGRATION);
});
App::post('/v1/migrations/csv')
App::post('/v1/migrations/csv/imports')
->alias('/v1/migrations/csv')
->groups(['api', 'migrations'])
->desc('Import documents from a CSV')
->label('scope', 'migrations.write')
@@ -316,8 +317,8 @@ App::post('/v1/migrations/csv')
->label('sdk', new Method(
namespace: 'migrations',
group: null,
name: 'createCsvMigration',
description: '/docs/references/migrations/migration-csv.md',
name: 'createCSVImport',
description: '/docs/references/migrations/migration-csv-import.md',
auth: [AuthType::ADMIN],
responses: [
new SDKResponse(
@@ -335,15 +336,23 @@ App::post('/v1/migrations/csv')
->inject('dbForPlatform')
->inject('project')
->inject('deviceForFiles')
->inject('deviceForImports')
->inject('deviceForMigrations')
->inject('queueForEvents')
->inject('queueForMigrations')
->action(function (string $bucketId, string $fileId, string $resourceId, bool $internalFile, Response $response, Database $dbForProject, Database $dbForPlatform, Document $project, Device $deviceForFiles, Device $deviceForImports, Event $queueForEvents, Migration $queueForMigrations) {
$isAPIKey = Auth::isAppUser(Authorization::getRoles());
$isPrivilegedUser = Auth::isPrivilegedUser(Authorization::getRoles());
if ($internalFile && !$isPrivilegedUser) {
throw new Exception(Exception::USER_UNAUTHORIZED);
}
->action(function (
string $bucketId,
string $fileId,
string $resourceId,
bool $internalFile,
Response $response,
Database $dbForProject,
Database $dbForPlatform,
Document $project,
Device $deviceForFiles,
Device $deviceForMigrations,
Event $queueForEvents,
Migration $queueForMigrations
) {
$bucket = Authorization::skip(function () use ($internalFile, $dbForPlatform, $dbForProject, $bucketId) {
if ($internalFile) {
return $dbForPlatform->getDocument('buckets', 'default');
@@ -351,7 +360,7 @@ App::post('/v1/migrations/csv')
return $dbForProject->getDocument('buckets', $bucketId);
});
if ($bucket->isEmpty() || (!$isAPIKey && !$isPrivilegedUser)) {
if ($bucket->isEmpty()) {
throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND);
}
@@ -365,18 +374,17 @@ App::post('/v1/migrations/csv')
throw new Exception(Exception::STORAGE_FILE_NOT_FOUND, 'File not found in ' . $path);
}
// no encryption, compression on files above 20MB.
// No encryption or compression on files above 20MB.
$hasEncryption = !empty($file->getAttribute('openSSLCipher'));
$compression = $file->getAttribute('algorithm', Compression::NONE);
$hasCompression = $compression !== Compression::NONE;
$migrationId = ID::unique();
$newPath = $deviceForImports->getPath($migrationId . '_' . $fileId . '.csv');
$newPath = $deviceForMigrations->getPath($migrationId . '_' . $fileId . '.csv');
if ($hasEncryption || $hasCompression) {
$source = $deviceForFiles->read($path);
// 1. decrypt
if ($hasEncryption) {
$source = OpenSSL::decrypt(
$source,
@@ -388,7 +396,6 @@ App::post('/v1/migrations/csv')
);
}
// 2. decompress
if ($hasCompression) {
switch ($compression) {
case Compression::ZSTD:
@@ -400,15 +407,15 @@ App::post('/v1/migrations/csv')
}
}
// manual write after decryption and/or decompression
if (! $deviceForImports->write($newPath, $source, 'text/csv')) {
throw new \Exception("Unable to copy file");
// Manual write after decryption and/or decompression
if (!$deviceForMigrations->write($newPath, $source, 'text/csv')) {
throw new \Exception('Unable to copy file');
}
} elseif (! $deviceForFiles->transfer($path, $newPath, $deviceForImports)) {
throw new \Exception("Unable to copy file");
} elseif (!$deviceForFiles->transfer($path, $newPath, $deviceForMigrations)) {
throw new \Exception('Unable to copy file');
}
$fileSize = $deviceForImports->getFileSize($newPath);
$fileSize = $deviceForMigrations->getFileSize($newPath);
$resources = Transfer::extractServices([Transfer::GROUP_DATABASES]);
$migration = $dbForProject->createDocument('migrations', new Document([
@@ -441,6 +448,136 @@ App::post('/v1/migrations/csv')
->dynamic($migration, Response::MODEL_MIGRATION);
});
App::post('/v1/migrations/csv/exports')
->groups(['api', 'migrations'])
->desc('Export documents to CSV')
->label('scope', 'migrations.write')
->label('event', 'migrations.[migrationId].create')
->label('audits.event', 'migration.create')
->label('sdk', new Method(
namespace: 'migrations',
group: null,
name: 'createCSVExport',
description: '/docs/references/migrations/migration-csv-export.md',
auth: [AuthType::ADMIN],
responses: [
new SDKResponse(
code: Response::STATUS_CODE_ACCEPTED,
model: Response::MODEL_MIGRATION,
)
]
))
->param('resourceId', null, new CompoundUID(), 'Composite ID in the format {databaseId:collectionId}, identifying a collection within a database to export.')
->param('bucketId', '', new UID(), 'Storage bucket unique ID where the exported CSV will be stored.')
->param('filename', '', new Text(255), 'The name of the file to be created for the export, excluding the .csv extension.')
->param('columns', [], new ArrayList(new Text(Database::LENGTH_KEY)), 'List of attributes to export. If empty, all attributes will be exported. You can use the `*` wildcard to export all attributes from the collection.', true)
->param('queries', [], new ArrayList(new Text(0)), 'Array of query strings generated using the Query class provided by the SDK to filter documents to export. [Learn more about queries](https://appwrite.io/docs/databases#querying-documents). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long.', true)
->param('delimiter', ',', new Text(1), 'The character that separates each column value. Default is comma.', true)
->param('enclosure', '"', new Text(1), 'The character that encloses each column value. Default is double quotes.', true)
->param('escape', '"', new Text(1), 'The escape character for the enclosure character. Default is double quotes.', true)
->param('header', true, new Boolean(), 'Whether to include the header row with column names. Default is true.', true)
->param('notify', true, new Boolean(), 'Set to true to receive an email when the export is complete. Default is true.', true)
->inject('user')
->inject('response')
->inject('dbForProject')
->inject('project')
->inject('queueForEvents')
->inject('queueForMigrations')
->action(function (
string $resourceId,
string $bucketId,
string $filename,
array $columns,
array $queries,
string $delimiter,
string $enclosure,
string $escape,
bool $header,
bool $notify,
Document $user,
Response $response,
Database $dbForProject,
Document $project,
Event $queueForEvents,
Migration $queueForMigrations
) {
try {
$parsedQueries = Query::parseQueries($queries);
} catch (QueryException $e) {
throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage());
}
$bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId));
if ($bucket->isEmpty()) {
throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND);
}
[$databaseId, $collectionId] = \explode(':', $resourceId, 2);
if (empty($databaseId)) {
throw new Exception(Exception::DATABASE_NOT_FOUND);
}
if (empty($collectionId)) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
}
$database = Authorization::skip(fn () => $dbForProject->getDocument('databases', $databaseId));
if ($database->isEmpty()) {
throw new Exception(Exception::DATABASE_NOT_FOUND);
}
$collection = Authorization::skip(fn () => $dbForProject->getDocument('database_' . $database->getSequence(), $collectionId));
if ($collection->isEmpty()) {
throw new Exception(Exception::COLLECTION_NOT_FOUND);
}
$validator = new Documents(
attributes: $collection->getAttribute('attributes', []),
indexes: $collection->getAttribute('indexes', []),
idAttributeType: $dbForProject->getAdapter()->getIdAttributeType(),
);
if (!$validator->isValid($parsedQueries)) {
throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription());
}
$migration = $dbForProject->createDocument('migrations', new Document([
'$id' => ID::unique(),
'status' => 'pending',
'stage' => 'init',
'source' => Appwrite::getName(),
'destination' => CSV::getName(),
'resources' => Transfer::extractServices([Transfer::GROUP_DATABASES]),
'resourceId' => $resourceId,
'resourceType' => Resource::TYPE_DATABASE,
'statusCounters' => '{}',
'resourceData' => '{}',
'errors' => [],
'options' => [
'bucketId' => $bucketId,
'filename' => $filename,
'columns' => $columns,
'queries' => $queries,
'delimiter' => $delimiter,
'enclosure' => $enclosure,
'escape' => $escape,
'header' => $header,
'notify' => $notify,
'userInternalId' => $user->getSequence(),
],
]));
$queueForEvents->setParam('migrationId', $migration->getId());
$queueForMigrations
->setMigration($migration)
->setProject($project)
->trigger();
$response
->setStatusCode(Response::STATUS_CODE_ACCEPTED)
->dynamic($migration, Response::MODEL_MIGRATION);
});
App::get('/v1/migrations')
->groups(['api', 'migrations'])
->desc('List migrations')
@@ -460,9 +597,10 @@ App::get('/v1/migrations')
))
->param('queries', [], new Migrations(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/databases#querying-documents). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Migrations::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->action(function (array $queries, string $search, Response $response, Database $dbForProject) {
->action(function (array $queries, string $search, bool $includeTotal, Response $response, Database $dbForProject) {
try {
$queries = Query::parseQueries($queries);
} catch (QueryException $e) {
@@ -501,7 +639,7 @@ App::get('/v1/migrations')
$filterQueries = Query::groupByType($queries)['filters'];
try {
$migrations = $dbForProject->find('migrations', $queries);
$total = $dbForProject->count('migrations', $filterQueries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForProject->count('migrations', $filterQueries, APP_LIMIT_COUNT) : 0;
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
+9 -6
View File
@@ -1234,9 +1234,10 @@ App::get('/v1/projects/:projectId/webhooks')
]
))
->param('projectId', '', new UID(), 'Project unique ID.')
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForPlatform')
->action(function (string $projectId, Response $response, Database $dbForPlatform) {
->action(function (string $projectId, bool $includeTotal, Response $response, Database $dbForPlatform) {
$project = $dbForPlatform->getDocument('projects', $projectId);
@@ -1251,7 +1252,7 @@ App::get('/v1/projects/:projectId/webhooks')
$response->dynamic(new Document([
'webhooks' => $webhooks,
'total' => count($webhooks),
'total' => $includeTotal ? count($webhooks) : 0,
]), Response::MODEL_WEBHOOK_LIST);
});
@@ -1531,9 +1532,10 @@ App::get('/v1/projects/:projectId/keys')
]
))
->param('projectId', '', new UID(), 'Project unique ID.')
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForPlatform')
->action(function (string $projectId, Response $response, Database $dbForPlatform) {
->action(function (string $projectId, bool $includeTotal, Response $response, Database $dbForPlatform) {
$project = $dbForPlatform->getDocument('projects', $projectId);
@@ -1548,7 +1550,7 @@ App::get('/v1/projects/:projectId/keys')
$response->dynamic(new Document([
'keys' => $keys,
'total' => count($keys),
'total' => $includeTotal ? count($keys) : 0,
]), Response::MODEL_KEY_LIST);
});
@@ -1834,9 +1836,10 @@ App::get('/v1/projects/:projectId/platforms')
]
))
->param('projectId', '', new UID(), 'Project unique ID.')
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForPlatform')
->action(function (string $projectId, Response $response, Database $dbForPlatform) {
->action(function (string $projectId, bool $includeTotal, Response $response, Database $dbForPlatform) {
$project = $dbForPlatform->getDocument('projects', $projectId);
@@ -1851,7 +1854,7 @@ App::get('/v1/projects/:projectId/platforms')
$response->dynamic(new Document([
'platforms' => $platforms,
'total' => count($platforms),
'total' => $includeTotal ? count($platforms) : 0,
]), Response::MODEL_PLATFORM_LIST);
});
+14 -5
View File
@@ -180,9 +180,10 @@ App::get('/v1/storage/buckets')
))
->param('queries', [], new Buckets(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Buckets::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->action(function (array $queries, string $search, Response $response, Database $dbForProject) {
->action(function (array $queries, string $search, bool $includeTotal, Response $response, Database $dbForProject) {
try {
$queries = Query::parseQueries($queries);
@@ -222,7 +223,7 @@ App::get('/v1/storage/buckets')
$filterQueries = Query::groupByType($queries)['filters'];
try {
$buckets = $dbForProject->find('buckets', $queries);
$total = $dbForProject->count('buckets', $filterQueries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForProject->count('buckets', $filterQueries, APP_LIMIT_COUNT) : 0;
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
} catch (QueryException $e) {
@@ -785,10 +786,11 @@ App::get('/v1/storage/buckets/:bucketId/files')
->param('bucketId', '', new UID(), 'Storage bucket unique ID. You can create a new storage bucket using the Storage service [server integration](https://appwrite.io/docs/server/storage#createBucket).')
->param('queries', [], new Files(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Files::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->inject('mode')
->action(function (string $bucketId, array $queries, string $search, Response $response, Database $dbForProject, string $mode) {
->action(function (string $bucketId, array $queries, string $search, bool $includeTotal, Response $response, Database $dbForProject, string $mode) {
$bucket = Authorization::skip(fn () => $dbForProject->getDocument('buckets', $bucketId));
$isAPIKey = Auth::isAppUser(Authorization::getRoles());
@@ -846,10 +848,10 @@ App::get('/v1/storage/buckets/:bucketId/files')
try {
if ($fileSecurity && !$valid) {
$files = $dbForProject->find('bucket_' . $bucket->getSequence(), $queries);
$total = $dbForProject->count('bucket_' . $bucket->getSequence(), $filterQueries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForProject->count('bucket_' . $bucket->getSequence(), $filterQueries, APP_LIMIT_COUNT) : 0;
} else {
$files = Authorization::skip(fn () => $dbForProject->find('bucket_' . $bucket->getSequence(), $queries));
$total = Authorization::skip(fn () => $dbForProject->count('bucket_' . $bucket->getSequence(), $filterQueries, APP_LIMIT_COUNT));
$total = $includeTotal ? Authorization::skip(fn () => $dbForProject->count('bucket_' . $bucket->getSequence(), $filterQueries, APP_LIMIT_COUNT)) : 0;
}
} catch (NotFoundException) {
throw new Exception(Exception::STORAGE_BUCKET_NOT_FOUND);
@@ -985,6 +987,13 @@ App::get('/v1/storage/buckets/:bucketId/files/:fileId/preview')
$fileSecurity = $bucket->getAttribute('fileSecurity', false);
$validator = new Authorization(Database::PERMISSION_READ);
$valid = $validator->isValid($bucket->getRead());
Console::info("File security: " . ($fileSecurity ? "true" : "false"));
Console::info("File valid: " . ($valid ? "true" : "false"));
Console::info("File token: " . ($isToken ? "true" : "false"));
Console::info("Bucket read permissions: " . json_encode($bucket->getRead()));
Console::info("Current authorization roles: " . json_encode(Authorization::getRoles()));
if (!$fileSecurity && !$valid && !$isToken) {
throw new Exception(Exception::USER_UNAUTHORIZED);
}
+11 -7
View File
@@ -52,6 +52,7 @@ use Utopia\Locale\Locale;
use Utopia\System\System;
use Utopia\Validator\ArrayList;
use Utopia\Validator\Assoc;
use Utopia\Validator\Boolean;
use Utopia\Validator\Text;
use Utopia\Validator\URL;
use Utopia\Validator\WhiteList;
@@ -169,9 +170,10 @@ App::get('/v1/teams')
))
->param('queries', [], new Teams(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Teams::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->action(function (array $queries, string $search, Response $response, Database $dbForProject) {
->action(function (array $queries, string $search, bool $includeTotal, Response $response, Database $dbForProject) {
try {
$queries = Query::parseQueries($queries);
@@ -211,7 +213,7 @@ App::get('/v1/teams')
$filterQueries = Query::groupByType($queries)['filters'];
try {
$results = $dbForProject->find('teams', $queries);
$total = $dbForProject->count('teams', $filterQueries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForProject->count('teams', $filterQueries, APP_LIMIT_COUNT) : 0;
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
@@ -838,10 +840,11 @@ App::get('/v1/teams/:teamId/memberships')
->param('teamId', '', new UID(), 'Team ID.')
->param('queries', [], new Memberships(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Memberships::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('project')
->inject('dbForProject')
->action(function (string $teamId, array $queries, string $search, Response $response, Document $project, Database $dbForProject) {
->action(function (string $teamId, array $queries, string $search, bool $includeTotal, Response $response, Document $project, Database $dbForProject) {
$team = $dbForProject->getDocument('teams', $teamId);
if ($team->isEmpty()) {
@@ -893,11 +896,11 @@ App::get('/v1/teams/:teamId/memberships')
collection: 'memberships',
queries: $queries,
);
$total = $dbForProject->count(
$total = $includeTotal ? $dbForProject->count(
collection: 'memberships',
queries: $filterQueries,
max: APP_LIMIT_COUNT
);
) : 0;
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
@@ -1430,11 +1433,12 @@ App::get('/v1/teams/:teamId/logs')
))
->param('teamId', '', new UID(), 'Team ID.')
->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->inject('locale')
->inject('geodb')
->action(function (string $teamId, array $queries, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) {
->action(function (string $teamId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) {
$team = $dbForProject->getDocument('teams', $teamId);
@@ -1503,7 +1507,7 @@ App::get('/v1/teams/:teamId/logs')
}
}
$response->dynamic(new Document([
'total' => $audit->countLogsByResource($resource, $queries),
'total' => $includeTotal ? $audit->countLogsByResource($resource, $queries) : 0,
'logs' => $output,
]), Response::MODEL_LOG_LIST);
});
+19 -14
View File
@@ -605,9 +605,10 @@ App::get('/v1/users')
))
->param('queries', [], new Users(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Users::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->action(function (array $queries, string $search, Response $response, Database $dbForProject) {
->action(function (array $queries, string $search, bool $includeTotal, Response $response, Database $dbForProject) {
try {
$queries = Query::parseQueries($queries);
@@ -647,10 +648,10 @@ App::get('/v1/users')
$users = [];
$total = 0;
$dbForProject->skipFilters(function () use ($dbForProject, $queries, &$users, &$total) {
$dbForProject->skipFilters(function () use ($dbForProject, $queries, $includeTotal, &$users, &$total) {
try {
$users = $dbForProject->find('users', $queries);
$total = $dbForProject->count('users', $queries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForProject->count('users', $queries, APP_LIMIT_COUNT) : 0;
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
} catch (QueryException $e) {
@@ -784,10 +785,11 @@ App::get('/v1/users/:userId/sessions')
]
))
->param('userId', '', new UID(), 'User ID.')
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->inject('locale')
->action(function (string $userId, Response $response, Database $dbForProject, Locale $locale) {
->action(function (string $userId, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale) {
$user = $dbForProject->getDocument('users', $userId);
@@ -809,7 +811,7 @@ App::get('/v1/users/:userId/sessions')
$response->dynamic(new Document([
'sessions' => $sessions,
'total' => count($sessions),
'total' => $includeTotal ? count($sessions) : 0,
]), Response::MODEL_SESSION_LIST);
});
@@ -833,9 +835,10 @@ App::get('/v1/users/:userId/memberships')
->param('userId', '', new UID(), 'User ID.')
->param('queries', [], new Memberships(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Memberships::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->action(function (string $userId, array $queries, string $search, Response $response, Database $dbForProject) {
->action(function (string $userId, array $queries, string $search, bool $includeTotal, Response $response, Database $dbForProject) {
$user = $dbForProject->getDocument('users', $userId);
@@ -869,7 +872,7 @@ App::get('/v1/users/:userId/memberships')
$response->dynamic(new Document([
'memberships' => $memberships,
'total' => count($memberships),
'total' => $includeTotal ? count($memberships) : 0,
]), Response::MODEL_MEMBERSHIP_LIST);
});
@@ -892,11 +895,12 @@ App::get('/v1/users/:userId/logs')
))
->param('userId', '', new UID(), 'User ID.')
->param('queries', [], new Queries([new Limit(), new Offset()]), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Only supported methods are limit and offset', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->inject('locale')
->inject('geodb')
->action(function (string $userId, array $queries, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) {
->action(function (string $userId, array $queries, bool $includeTotal, Response $response, Database $dbForProject, Locale $locale, Reader $geodb) {
$user = $dbForProject->getDocument('users', $userId);
@@ -965,7 +969,7 @@ App::get('/v1/users/:userId/logs')
}
$response->dynamic(new Document([
'total' => $audit->countLogsByUser($user->getSequence(), $queries),
'total' => $includeTotal ? $audit->countLogsByUser($user->getSequence(), $queries) : 0,
'logs' => $output,
]), Response::MODEL_LOG_LIST);
});
@@ -989,9 +993,10 @@ App::get('/v1/users/:userId/targets')
))
->param('userId', '', new UID(), 'User ID.')
->param('queries', [], new Targets(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Targets::ALLOWED_ATTRIBUTES), true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->action(function (string $userId, array $queries, Response $response, Database $dbForProject) {
->action(function (string $userId, array $queries, bool $includeTotal, Response $response, Database $dbForProject) {
$user = $dbForProject->getDocument('users', $userId);
if ($user->isEmpty()) {
@@ -1031,7 +1036,7 @@ App::get('/v1/users/:userId/targets')
}
try {
$targets = $dbForProject->find('targets', $queries);
$total = $dbForProject->count('targets', $queries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForProject->count('targets', $queries, APP_LIMIT_COUNT) : 0;
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
@@ -1060,9 +1065,10 @@ App::get('/v1/users/identities')
))
->param('queries', [], new Identities(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Identities::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('dbForProject')
->action(function (array $queries, string $search, Response $response, Database $dbForProject) {
->action(function (array $queries, string $search, bool $includeTotal, Response $response, Database $dbForProject) {
try {
$queries = Query::parseQueries($queries);
@@ -1099,10 +1105,9 @@ App::get('/v1/users/identities')
$cursor->setValue($cursorDocument);
}
$filterQueries = Query::groupByType($queries)['filters'];
try {
$identities = $dbForProject->find('identities', $queries);
$total = $dbForProject->count('identities', $filterQueries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForProject->count('identities', $queries, APP_LIMIT_COUNT) : 0;
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
+98 -20
View File
@@ -29,12 +29,20 @@ use Utopia\Database\Helpers\Role;
use Utopia\Database\Query;
use Utopia\Database\Validator\Authorization;
use Utopia\Database\Validator\Query\Cursor;
use Utopia\Detector\Detection\Framework\Analog;
use Utopia\Detector\Detection\Framework\Angular;
use Utopia\Detector\Detection\Framework\Astro;
use Utopia\Detector\Detection\Framework\Flutter;
use Utopia\Detector\Detection\Framework\Lynx;
use Utopia\Detector\Detection\Framework\NextJs;
use Utopia\Detector\Detection\Framework\Nuxt;
use Utopia\Detector\Detection\Framework\React;
use Utopia\Detector\Detection\Framework\ReactNative;
use Utopia\Detector\Detection\Framework\Remix;
use Utopia\Detector\Detection\Framework\Svelte;
use Utopia\Detector\Detection\Framework\SvelteKit;
use Utopia\Detector\Detection\Framework\TanStackStart;
use Utopia\Detector\Detection\Framework\Vue;
use Utopia\Detector\Detection\Packager\NPM;
use Utopia\Detector\Detection\Packager\PNPM;
use Utopia\Detector\Detection\Packager\Yarn;
@@ -58,6 +66,7 @@ use Utopia\Validator\Boolean;
use Utopia\Validator\Text;
use Utopia\Validator\WhiteList;
use Utopia\VCS\Adapter\Git\GitHub;
use Utopia\VCS\Exception\FileNotFound;
use Utopia\VCS\Exception\RepositoryNotFound;
use function Swoole\Coroutine\batch;
@@ -166,7 +175,7 @@ $createGitDeployments = function (GitHub $github, string $providerInstallationId
$latestCommentId = \strval($github->updateComment($owner, $repositoryName, $latestCommentId, $comment->generateComment()));
} finally {
$dbForPlatform->deleteDocument('vcsCommentLocks', $latestCommentId);
Authorization::skip(fn () => $dbForPlatform->deleteDocument('vcsCommentLocks', $latestCommentId));
}
}
} else {
@@ -237,7 +246,7 @@ $createGitDeployments = function (GitHub $github, string $providerInstallationId
$latestCommentId = \strval($github->updateComment($owner, $repositoryName, $latestCommentId, $comment->generateComment()));
} finally {
$dbForPlatform->deleteDocument('vcsCommentLocks', $latestCommentId);
Authorization::skip(fn () => $dbForPlatform->deleteDocument('vcsCommentLocks', $latestCommentId));
}
}
}
@@ -458,7 +467,7 @@ $createGitDeployments = function (GitHub $github, string $providerInstallationId
$github->updateComment($owner, $repositoryName, $latestCommentId, $comment->generateComment());
}
} finally {
$dbForPlatform->deleteDocument('vcsCommentLocks', $latestCommentId);
Authorization::skip(fn () => $dbForPlatform->deleteDocument('vcsCommentLocks', $latestCommentId));
}
}
}
@@ -818,7 +827,10 @@ App::post('/v1/vcs/github/installations/:installationId/detections')
$files = \array_column($files, 'name');
$languages = $github->listRepositoryLanguages($owner, $repositoryName);
$detector = new Packager($files);
$detector = new Packager();
foreach ($files as $file) {
$detector->addInput($file);
}
$detector
->addOption(new Yarn())
->addOption(new PNPM())
@@ -828,6 +840,14 @@ App::post('/v1/vcs/github/installations/:installationId/detections')
$packager = !\is_null($detection) ? $detection->getName() : 'npm';
if ($type === 'framework') {
$packages = '';
try {
$contentResponse = $github->getRepositoryContent($owner, $repositoryName, \rtrim($providerRootDirectory, '/') . '/package.json');
$packages = $contentResponse['content'] ?? '';
} catch (FileNotFound $e) {
// Continue detection without package.json
}
$output = new Document([
'framework' => '',
'installCommand' => '',
@@ -835,14 +855,27 @@ App::post('/v1/vcs/github/installations/:installationId/detections')
'outputDirectory' => '',
]);
$detector = new Framework($files, $packager);
$detector = new Framework($packager);
$detector->addInput($packages, Framework::INPUT_PACKAGES);
foreach ($files as $file) {
$detector->addInput($file, Framework::INPUT_FILE);
}
$detector
->addOption(new Flutter())
->addOption(new Nuxt())
->addOption(new Analog())
->addOption(new Angular())
->addOption(new Astro())
->addOption(new SvelteKit())
->addOption(new Flutter())
->addOption(new Lynx())
->addOption(new NextJs())
->addOption(new Remix());
->addOption(new Nuxt())
->addOption(new React())
->addOption(new ReactNative())
->addOption(new Remix())
->addOption(new Svelte())
->addOption(new SvelteKit())
->addOption(new TanStackStart())
->addOption(new Vue());
$framework = $detector->detect();
@@ -877,7 +910,18 @@ App::post('/v1/vcs/github/installations/:installationId/detections')
];
foreach ($strategies as $strategy) {
$detector = new Runtime($strategy === Strategy::LANGUAGES ? $languages : $files, $strategy, $packager);
$detector = new Runtime($strategy, $packager);
if ($strategy === Strategy::LANGUAGES) {
foreach ($languages as $language) {
$detector->addInput($language);
}
} else {
foreach ($files as $file) {
$detector->addInput($file);
}
}
$detector
->addOption(new Node())
->addOption(new Bun())
@@ -984,7 +1028,10 @@ App::get('/v1/vcs/github/installations/:installationId/providerRepositories')
$files = $github->listRepositoryContents($repo['organization'], $repo['name'], '');
$files = \array_column($files, 'name');
$detector = new Packager($files);
$detector = new Packager();
foreach ($files as $file) {
$detector->addInput($file);
}
$detector
->addOption(new Yarn())
->addOption(new PNPM())
@@ -994,14 +1041,35 @@ App::get('/v1/vcs/github/installations/:installationId/providerRepositories')
$packager = !\is_null($detection) ? $detection->getName() : 'npm';
if ($type === 'framework') {
$frameworkDetector = new Framework($files, $packager);
$packages = '';
try {
$contentResponse = $github->getRepositoryContent($repo['organization'], $repo['name'], 'package.json');
$packages = $contentResponse['content'] ?? '';
} catch (FileNotFound $e) {
// Continue detection without package.json
}
$frameworkDetector = new Framework($packager);
$frameworkDetector->addInput($packages, Framework::INPUT_PACKAGES);
foreach ($files as $file) {
$frameworkDetector->addInput($file, Framework::INPUT_FILE);
}
$frameworkDetector
->addOption(new Flutter())
->addOption(new Nuxt())
->addOption(new Analog())
->addOption(new Angular())
->addOption(new Astro())
->addOption(new SvelteKit())
->addOption(new Flutter())
->addOption(new Lynx())
->addOption(new NextJs())
->addOption(new Remix());
->addOption(new Nuxt())
->addOption(new React())
->addOption(new ReactNative())
->addOption(new Remix())
->addOption(new Svelte())
->addOption(new SvelteKit())
->addOption(new TanStackStart())
->addOption(new Vue());
$detectedFramework = $frameworkDetector->detect();
@@ -1026,7 +1094,16 @@ App::get('/v1/vcs/github/installations/:installationId/providerRepositories')
];
foreach ($strategies as $strategy) {
$detector = new Runtime($strategy === Strategy::LANGUAGES ? $languages : $files, $strategy, $packager);
$detector = new Runtime($strategy, $packager);
if ($strategy === Strategy::LANGUAGES) {
foreach ($languages as $language) {
$detector->addInput($language);
}
} else {
foreach ($files as $file) {
$detector->addInput($file);
}
}
$detector
->addOption(new Node())
->addOption(new Bun())
@@ -1374,7 +1451,7 @@ App::post('/v1/vcs/github/events')
Authorization::skip(fn () => $dbForPlatform->deleteDocument('repositories', $repository->getId()));
}
$dbForPlatform->deleteDocument('installations', $installation->getId());
Authorization::skip(fn () => $dbForPlatform->deleteDocument('installations', $installation->getId()));
}
}
} elseif ($event == $github::EVENT_PULL_REQUEST) {
@@ -1458,11 +1535,12 @@ App::get('/v1/vcs/installations')
))
->param('queries', [], new Installations(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Installations::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->param('total', true, new Boolean(true), 'When set to false, the total count returned will be 0 and will not be calculated.', true)
->inject('response')
->inject('project')
->inject('dbForProject')
->inject('dbForPlatform')
->action(function (array $queries, string $search, Response $response, Document $project, Database $dbForProject, Database $dbForPlatform) {
->action(function (array $queries, string $search, bool $includeTotal, Response $response, Document $project, Database $dbForProject, Database $dbForPlatform) {
try {
$queries = Query::parseQueries($queries);
} catch (QueryException $e) {
@@ -1503,7 +1581,7 @@ App::get('/v1/vcs/installations')
$filterQueries = Query::groupByType($queries)['filters'];
try {
$results = $dbForPlatform->find('installations', $queries);
$total = $dbForPlatform->count('installations', $filterQueries, APP_LIMIT_COUNT);
$total = $includeTotal ? $dbForPlatform->count('installations', $filterQueries, APP_LIMIT_COUNT) : 0;
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
+1
View File
@@ -90,6 +90,7 @@ const APP_PLATFORM_CLIENT = 'client';
const APP_PLATFORM_CONSOLE = 'console';
const APP_VCS_GITHUB_USERNAME = 'Appwrite';
const APP_VCS_GITHUB_EMAIL = 'team@appwrite.io';
const APP_VCS_GITHUB_URL = 'https://github.com/TeamAppwrite';
const APP_BRANDED_EMAIL_BASE_TEMPLATE = 'email-base-styled';
// Database Reconnect
+1 -1
View File
@@ -555,7 +555,7 @@ App::setResource('deviceForFiles', function ($project, Telemetry $telemetry) {
App::setResource('deviceForSites', function ($project, Telemetry $telemetry) {
return new Device\Telemetry($telemetry, getDevice(APP_STORAGE_SITES . '/app-' . $project->getId()));
}, ['project', 'telemetry']);
App::setResource('deviceForImports', function ($project, Telemetry $telemetry) {
App::setResource('deviceForMigrations', function ($project, Telemetry $telemetry) {
return new Device\Telemetry($telemetry, getDevice(APP_STORAGE_IMPORTS . '/app-' . $project->getId()));
}, ['project', 'telemetry']);
App::setResource('deviceForFunctions', function ($project, Telemetry $telemetry) {
+1 -1
View File
@@ -349,7 +349,7 @@ Server::setResource('deviceForSites', function (Document $project, Telemetry $te
return new TelemetryDevice($telemetry, getDevice(APP_STORAGE_SITES . '/app-' . $project->getId()));
}, ['project', 'telemetry']);
Server::setResource('deviceForImports', function (Document $project, Telemetry $telemetry) {
Server::setResource('deviceForMigrations', function (Document $project, Telemetry $telemetry) {
return new TelemetryDevice($telemetry, getDevice(APP_STORAGE_IMPORTS . '/app-' . $project->getId()));
}, ['project', 'telemetry']);
+6 -5
View File
@@ -52,9 +52,10 @@
"utopia-php/cache": "0.13.*",
"utopia-php/cli": "0.15.*",
"utopia-php/config": "0.2.*",
"utopia-php/database": "2.*",
"utopia-php/detector": "0.1.*",
"utopia-php/domains": "0.8.*",
"utopia-php/database": "3.*",
"utopia-php/detector": "0.2.*",
"utopia-php/domains": "0.9.*",
"utopia-php/emails": "0.6.*",
"utopia-php/dns": "0.3.*",
"utopia-php/dsn": "0.2.1",
"utopia-php/framework": "0.33.*",
@@ -62,7 +63,7 @@
"utopia-php/image": "0.8.*",
"utopia-php/locale": "0.8.*",
"utopia-php/logger": "0.6.*",
"utopia-php/messaging": "0.19.*",
"utopia-php/messaging": "0.20.*",
"utopia-php/migration": "1.*",
"utopia-php/orchestration": "0.9.*",
"utopia-php/platform": "0.7.*",
@@ -74,7 +75,7 @@
"utopia-php/swoole": "0.8.*",
"utopia-php/system": "0.9.*",
"utopia-php/telemetry": "0.1.*",
"utopia-php/vcs": "0.11.*",
"utopia-php/vcs": "0.12.*",
"utopia-php/websocket": "0.3.*",
"matomo/device-detector": "6.4.*",
"dragonmantank/cron-expression": "3.4.*",
Generated
+485 -111
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": "568800edca746c4e8d0d50648b25f589",
"content-hash": "66e5a72649d7f816ba8ec979faca4cd8",
"packages": [
{
"name": "adhocore/jwt",
@@ -756,16 +756,16 @@
},
{
"name": "google/protobuf",
"version": "v4.32.1",
"version": "v4.33.0",
"source": {
"type": "git",
"url": "https://github.com/protocolbuffers/protobuf-php.git",
"reference": "c4ed1c1f9bbc1e91766e2cd6c0af749324fe87cb"
"reference": "b50269e23204e5ae859a326ec3d90f09efe3047d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/c4ed1c1f9bbc1e91766e2cd6c0af749324fe87cb",
"reference": "c4ed1c1f9bbc1e91766e2cd6c0af749324fe87cb",
"url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/b50269e23204e5ae859a326ec3d90f09efe3047d",
"reference": "b50269e23204e5ae859a326ec3d90f09efe3047d",
"shasum": ""
},
"require": {
@@ -794,9 +794,9 @@
"proto"
],
"support": {
"source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.32.1"
"source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.33.0"
},
"time": "2025-09-14T05:14:52+00:00"
"time": "2025-10-15T20:10:28+00:00"
},
{
"name": "league/csv",
@@ -959,6 +959,83 @@
},
"time": "2025-08-20T17:20:16+00:00"
},
{
"name": "mongodb/mongodb",
"version": "2.1.1",
"source": {
"type": "git",
"url": "https://github.com/mongodb/mongo-php-library.git",
"reference": "f399d24905dd42f97dfe0af9706129743ef247ac"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/f399d24905dd42f97dfe0af9706129743ef247ac",
"reference": "f399d24905dd42f97dfe0af9706129743ef247ac",
"shasum": ""
},
"require": {
"composer-runtime-api": "^2.0",
"ext-mongodb": "^2.1",
"php": "^8.1",
"psr/log": "^1.1.4|^2|^3",
"symfony/polyfill-php85": "^1.32"
},
"replace": {
"mongodb/builder": "*"
},
"require-dev": {
"doctrine/coding-standard": "^12.0",
"phpunit/phpunit": "^10.5.35",
"rector/rector": "^1.2",
"squizlabs/php_codesniffer": "^3.7",
"vimeo/psalm": "6.5.*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.x-dev"
}
},
"autoload": {
"files": [
"src/functions.php"
],
"psr-4": {
"MongoDB\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Andreas Braun",
"email": "andreas.braun@mongodb.com"
},
{
"name": "Jeremy Mikola",
"email": "jmikola@gmail.com"
},
{
"name": "Jérôme Tamarelle",
"email": "jerome.tamarelle@mongodb.com"
}
],
"description": "MongoDB driver library",
"homepage": "https://jira.mongodb.org/browse/PHPLIB",
"keywords": [
"database",
"driver",
"mongodb",
"persistence"
],
"support": {
"issues": "https://github.com/mongodb/mongo-php-library/issues",
"source": "https://github.com/mongodb/mongo-php-library/tree/2.1.1"
},
"time": "2025-08-13T20:50:05+00:00"
},
{
"name": "mustangostang/spyc",
"version": "0.6.3",
@@ -3017,6 +3094,86 @@
],
"time": "2025-07-08T02:45:35+00:00"
},
{
"name": "symfony/polyfill-php85",
"version": "v1.33.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php85.git",
"reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91",
"reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91",
"shasum": ""
},
"require": {
"php": ">=7.2"
},
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Php85\\": ""
},
"classmap": [
"Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"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-23T16:12:55+00:00"
},
{
"name": "symfony/service-contracts",
"version": "v3.6.0",
@@ -3293,16 +3450,16 @@
},
{
"name": "utopia-php/abuse",
"version": "1.0.1",
"version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/abuse.git",
"reference": "cd591568791556d246d901d6aaf9935ab02c3f9a"
"reference": "611fa66a97e87c0dbbc133a717d970da7a5ca828"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/abuse/zipball/cd591568791556d246d901d6aaf9935ab02c3f9a",
"reference": "cd591568791556d246d901d6aaf9935ab02c3f9a",
"url": "https://api.github.com/repos/utopia-php/abuse/zipball/611fa66a97e87c0dbbc133a717d970da7a5ca828",
"reference": "611fa66a97e87c0dbbc133a717d970da7a5ca828",
"shasum": ""
},
"require": {
@@ -3310,7 +3467,7 @@
"ext-pdo": "*",
"ext-redis": "*",
"php": ">=8.0",
"utopia-php/database": "2.*"
"utopia-php/database": "*"
},
"require-dev": {
"laravel/pint": "1.*",
@@ -3338,9 +3495,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/abuse/issues",
"source": "https://github.com/utopia-php/abuse/tree/1.0.1"
"source": "https://github.com/utopia-php/abuse/tree/1.0.2"
},
"time": "2025-09-04T12:46:54+00:00"
"time": "2025-10-20T07:18:33+00:00"
},
{
"name": "utopia-php/analytics",
@@ -3390,21 +3547,21 @@
},
{
"name": "utopia-php/audit",
"version": "1.0.1",
"version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/audit.git",
"reference": "5ef26d6a2ab2db7bb86288a1a6ef970307b46f22"
"reference": "8c17065c2473d4ca799f65585ca74eb53e1be211"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/audit/zipball/5ef26d6a2ab2db7bb86288a1a6ef970307b46f22",
"reference": "5ef26d6a2ab2db7bb86288a1a6ef970307b46f22",
"url": "https://api.github.com/repos/utopia-php/audit/zipball/8c17065c2473d4ca799f65585ca74eb53e1be211",
"reference": "8c17065c2473d4ca799f65585ca74eb53e1be211",
"shasum": ""
},
"require": {
"php": ">=8.0",
"utopia-php/database": "2.*"
"utopia-php/database": "*"
},
"require-dev": {
"laravel/pint": "1.*",
@@ -3431,9 +3588,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/audit/issues",
"source": "https://github.com/utopia-php/audit/tree/1.0.1"
"source": "https://github.com/utopia-php/audit/tree/1.0.2"
},
"time": "2025-09-04T12:46:43+00:00"
"time": "2025-10-20T07:14:26+00:00"
},
{
"name": "utopia-php/cache",
@@ -3634,30 +3791,80 @@
"time": "2020-10-24T09:49:09+00:00"
},
{
"name": "utopia-php/database",
"version": "2.3.2",
"name": "utopia-php/console",
"version": "0.0.1",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/database.git",
"reference": "35c978ddd20b649d119296094686d3cc9fcf161f"
"url": "https://github.com/utopia-php/console.git",
"reference": "f77104e4a888fa9cb3e08f32955ec09479ab7a92"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/database/zipball/35c978ddd20b649d119296094686d3cc9fcf161f",
"reference": "35c978ddd20b649d119296094686d3cc9fcf161f",
"url": "https://api.github.com/repos/utopia-php/console/zipball/f77104e4a888fa9cb3e08f32955ec09479ab7a92",
"reference": "f77104e4a888fa9cb3e08f32955ec09479ab7a92",
"shasum": ""
},
"require": {
"php": ">=7.4"
},
"require-dev": {
"laravel/pint": "1.2.*",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^9.3",
"squizlabs/php_codesniffer": "^3.6",
"swoole/ide-helper": "4.8.8"
},
"type": "library",
"autoload": {
"psr-4": {
"Utopia\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Console helpers for logging, prompting, and executing commands",
"keywords": [
"cli",
"console",
"php",
"terminal",
"utopia"
],
"support": {
"issues": "https://github.com/utopia-php/console/issues",
"source": "https://github.com/utopia-php/console/tree/0.0.1"
},
"time": "2025-10-20T14:41:36+00:00"
},
{
"name": "utopia-php/database",
"version": "3.0.4",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/database.git",
"reference": "a83997d5555d6cd873b829a2459292211c6ab13f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/database/zipball/a83997d5555d6cd873b829a2459292211c6ab13f",
"reference": "a83997d5555d6cd873b829a2459292211c6ab13f",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"ext-mongodb": "*",
"ext-pdo": "*",
"php": ">=8.1",
"utopia-php/cache": "0.13.*",
"utopia-php/framework": "0.33.*",
"utopia-php/mongo": "0.11.*",
"utopia-php/pools": "0.8.*"
},
"require-dev": {
"fakerphp/faker": "1.23.*",
"laravel/pint": "1.*",
"laravel/pint": "*",
"pcov/clobber": "2.*",
"phpstan/phpstan": "1.*",
"phpunit/phpunit": "9.*",
@@ -3685,22 +3892,22 @@
],
"support": {
"issues": "https://github.com/utopia-php/database/issues",
"source": "https://github.com/utopia-php/database/tree/2.3.2"
"source": "https://github.com/utopia-php/database/tree/3.0.4"
},
"time": "2025-10-07T03:09:32+00:00"
"time": "2025-10-28T08:21:21+00:00"
},
{
"name": "utopia-php/detector",
"version": "0.1.5",
"version": "0.2.1",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/detector.git",
"reference": "b5d6ba51352485b524589bc0ee8d07a9efafe718"
"reference": "89f96e864220de13800cf398a1f1686a85401eaa"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/detector/zipball/b5d6ba51352485b524589bc0ee8d07a9efafe718",
"reference": "b5d6ba51352485b524589bc0ee8d07a9efafe718",
"url": "https://api.github.com/repos/utopia-php/detector/zipball/89f96e864220de13800cf398a1f1686a85401eaa",
"reference": "89f96e864220de13800cf398a1f1686a85401eaa",
"shasum": ""
},
"require": {
@@ -3730,9 +3937,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/detector/issues",
"source": "https://github.com/utopia-php/detector/tree/0.1.5"
"source": "https://github.com/utopia-php/detector/tree/0.2.1"
},
"time": "2025-05-19T11:01:28+00:00"
"time": "2025-10-27T13:38:33+00:00"
},
{
"name": "utopia-php/dns",
@@ -3792,21 +3999,22 @@
},
{
"name": "utopia-php/domains",
"version": "0.8.2",
"version": "0.9.1",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/domains.git",
"reference": "caa294dcebd05c8af876c8afef3e992faccdf645"
"reference": "99b4ec95d5d6b7a5c990a66c56412212d9af37e7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/domains/zipball/caa294dcebd05c8af876c8afef3e992faccdf645",
"reference": "caa294dcebd05c8af876c8afef3e992faccdf645",
"url": "https://api.github.com/repos/utopia-php/domains/zipball/99b4ec95d5d6b7a5c990a66c56412212d9af37e7",
"reference": "99b4ec95d5d6b7a5c990a66c56412212d9af37e7",
"shasum": ""
},
"require": {
"php": ">=8.0",
"utopia-php/framework": "0.33.*"
"utopia-php/cache": "0.13.*",
"utopia-php/validators": "0.0.*"
},
"require-dev": {
"laravel/pint": "1.2.*",
@@ -3847,9 +4055,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/domains/issues",
"source": "https://github.com/utopia-php/domains/tree/0.8.2"
"source": "https://github.com/utopia-php/domains/tree/0.9.1"
},
"time": "2025-10-06T09:56:54+00:00"
"time": "2025-10-21T14:52:27+00:00"
},
{
"name": "utopia-php/dsn",
@@ -3898,6 +4106,66 @@
},
"time": "2024-05-07T02:01:25+00:00"
},
{
"name": "utopia-php/emails",
"version": "0.6.2",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/emails.git",
"reference": "9c4c40cf7c03c2e9e21364566f9b192d03ea93c9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/emails/zipball/9c4c40cf7c03c2e9e21364566f9b192d03ea93c9",
"reference": "9c4c40cf7c03c2e9e21364566f9b192d03ea93c9",
"shasum": ""
},
"require": {
"php": ">=8.0",
"utopia-php/cli": "^0.15",
"utopia-php/domains": "^0.9",
"utopia-php/fetch": "^0.4",
"utopia-php/validators": "^0.0.2"
},
"require-dev": {
"laravel/pint": "1.25.*",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^9.3"
},
"type": "library",
"autoload": {
"psr-4": {
"Utopia\\Emails\\": "src/Emails"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Eldad Fux",
"email": "eldad@appwrite.io"
}
],
"description": "Utopia Emails library is simple and lite library for parsing and validating email addresses. This library is aiming to be as simple and easy to learn and use.",
"keywords": [
"RFC5322",
"email",
"emails",
"framework",
"parsing",
"php",
"upf",
"utopia",
"validation"
],
"support": {
"issues": "https://github.com/utopia-php/emails/issues",
"source": "https://github.com/utopia-php/emails/tree/0.6.2"
},
"time": "2025-10-28T16:08:17+00:00"
},
{
"name": "utopia-php/fetch",
"version": "0.4.2",
@@ -4136,16 +4404,16 @@
},
{
"name": "utopia-php/messaging",
"version": "0.19.0",
"version": "0.20.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/messaging.git",
"reference": "0b866d54e70c792a3c4f5ca9c12a6d358a31f4b8"
"reference": "6c5be4588d97e3732a1907ecb13cd8a098eade96"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/messaging/zipball/0b866d54e70c792a3c4f5ca9c12a6d358a31f4b8",
"reference": "0b866d54e70c792a3c4f5ca9c12a6d358a31f4b8",
"url": "https://api.github.com/repos/utopia-php/messaging/zipball/6c5be4588d97e3732a1907ecb13cd8a098eade96",
"reference": "6c5be4588d97e3732a1907ecb13cd8a098eade96",
"shasum": ""
},
"require": {
@@ -4181,22 +4449,22 @@
],
"support": {
"issues": "https://github.com/utopia-php/messaging/issues",
"source": "https://github.com/utopia-php/messaging/tree/0.19.0"
"source": "https://github.com/utopia-php/messaging/tree/0.20.0"
},
"time": "2025-10-14T11:46:49+00:00"
"time": "2025-10-22T04:27:37+00:00"
},
{
"name": "utopia-php/migration",
"version": "1.1.0",
"version": "1.3.3",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/migration.git",
"reference": "6fb6f8f032cd34c3c65728a55d494adeac2ff038"
"reference": "731b3a963c58c30e0b2368695d57a7e8fcb7455c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/migration/zipball/6fb6f8f032cd34c3c65728a55d494adeac2ff038",
"reference": "6fb6f8f032cd34c3c65728a55d494adeac2ff038",
"url": "https://api.github.com/repos/utopia-php/migration/zipball/731b3a963c58c30e0b2368695d57a7e8fcb7455c",
"reference": "731b3a963c58c30e0b2368695d57a7e8fcb7455c",
"shasum": ""
},
"require": {
@@ -4204,9 +4472,9 @@
"ext-curl": "*",
"ext-openssl": "*",
"php": ">=8.1",
"utopia-php/database": "2.*",
"utopia-php/console": "0.0.*",
"utopia-php/database": "3.*",
"utopia-php/dsn": "0.2.*",
"utopia-php/framework": "0.33.*",
"utopia-php/storage": "0.18.*"
},
"require-dev": {
@@ -4214,7 +4482,6 @@
"laravel/pint": "1.*",
"phpstan/phpstan": "1.*",
"phpunit/phpunit": "11.*",
"utopia-php/cli": "0.16.*",
"vlucas/phpdotenv": "5.*"
},
"type": "library",
@@ -4237,9 +4504,70 @@
],
"support": {
"issues": "https://github.com/utopia-php/migration/issues",
"source": "https://github.com/utopia-php/migration/tree/1.1.0"
"source": "https://github.com/utopia-php/migration/tree/1.3.3"
},
"time": "2025-09-10T05:45:30+00:00"
"time": "2025-10-28T04:02:08+00:00"
},
{
"name": "utopia-php/mongo",
"version": "0.11.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/mongo.git",
"reference": "34bc0cda8ea368cde68702a6fffe2c3ac625398e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/mongo/zipball/34bc0cda8ea368cde68702a6fffe2c3ac625398e",
"reference": "34bc0cda8ea368cde68702a6fffe2c3ac625398e",
"shasum": ""
},
"require": {
"ext-mongodb": "2.1.*",
"mongodb/mongodb": "2.1.*",
"php": ">=8.0",
"ramsey/uuid": "4.9.*"
},
"require-dev": {
"fakerphp/faker": "1.*",
"laravel/pint": "*",
"phpstan/phpstan": "*",
"phpunit/phpunit": "9.*",
"swoole/ide-helper": "5.1.*"
},
"type": "library",
"autoload": {
"psr-4": {
"Utopia\\Mongo\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Eldad Fux",
"email": "eldad@appwrite.io"
},
{
"name": "Wess",
"email": "wess@appwrite.io"
}
],
"description": "A simple library to manage Mongo database",
"keywords": [
"database",
"mongo",
"php",
"upf",
"utopia"
],
"support": {
"issues": "https://github.com/utopia-php/mongo/issues",
"source": "https://github.com/utopia-php/mongo/tree/0.11.0"
},
"time": "2025-10-20T11:11:23+00:00"
},
{
"name": "utopia-php/orchestration",
@@ -4780,17 +5108,63 @@
"time": "2025-03-17T11:57:52+00:00"
},
{
"name": "utopia-php/vcs",
"version": "0.11.0",
"name": "utopia-php/validators",
"version": "0.0.2",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/vcs.git",
"reference": "0e665eaa7d906168525bf6aac50b6bcc3e4fe528"
"url": "https://github.com/utopia-php/validators.git",
"reference": "894210695c5d35fa248fb65f7fe7237b6ff4fb0b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/vcs/zipball/0e665eaa7d906168525bf6aac50b6bcc3e4fe528",
"reference": "0e665eaa7d906168525bf6aac50b6bcc3e4fe528",
"url": "https://api.github.com/repos/utopia-php/validators/zipball/894210695c5d35fa248fb65f7fe7237b6ff4fb0b",
"reference": "894210695c5d35fa248fb65f7fe7237b6ff4fb0b",
"shasum": ""
},
"require": {
"php": ">=8.1"
},
"require-dev": {
"ext-xdebug": "*",
"laravel/pint": "^1.2",
"phpstan/phpstan": "1.*",
"phpunit/phpunit": "^9.5.25"
},
"type": "library",
"autoload": {
"psr-4": {
"Utopia\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "A lightweight collection of reusable validators for Utopia projects",
"keywords": [
"php",
"utopia",
"validation",
"validator"
],
"support": {
"issues": "https://github.com/utopia-php/validators/issues",
"source": "https://github.com/utopia-php/validators/tree/0.0.2"
},
"time": "2025-10-20T21:52:28+00:00"
},
{
"name": "utopia-php/vcs",
"version": "0.12.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/vcs.git",
"reference": "28457cf347972c4ec95d3ca77776a4921364a665"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/vcs/zipball/28457cf347972c4ec95d3ca77776a4921364a665",
"reference": "28457cf347972c4ec95d3ca77776a4921364a665",
"shasum": ""
},
"require": {
@@ -4824,9 +5198,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/vcs/issues",
"source": "https://github.com/utopia-php/vcs/tree/0.11.0"
"source": "https://github.com/utopia-php/vcs/tree/0.12.0"
},
"time": "2025-07-23T13:54:58+00:00"
"time": "2025-10-22T12:58:29+00:00"
},
{
"name": "utopia-php/websocket",
@@ -4879,28 +5253,28 @@
},
{
"name": "webmozart/assert",
"version": "1.11.0",
"version": "1.12.0",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
"reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
"reference": "541057574806f942c94662b817a50f63f7345360"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
"reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/541057574806f942c94662b817a50f63f7345360",
"reference": "541057574806f942c94662b817a50f63f7345360",
"shasum": ""
},
"require": {
"ext-ctype": "*",
"ext-date": "*",
"ext-filter": "*",
"php": "^7.2 || ^8.0"
},
"conflict": {
"phpstan/phpstan": "<0.12.20",
"vimeo/psalm": "<4.6.1 || 4.6.2"
},
"require-dev": {
"phpunit/phpunit": "^8.5.13"
"suggest": {
"ext-intl": "",
"ext-simplexml": "",
"ext-spl": ""
},
"type": "library",
"extra": {
@@ -4931,9 +5305,9 @@
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
"source": "https://github.com/webmozarts/assert/tree/1.11.0"
"source": "https://github.com/webmozarts/assert/tree/1.12.0"
},
"time": "2022-06-03T18:03:27+00:00"
"time": "2025-10-20T12:43:39+00:00"
},
{
"name": "webonyx/graphql-php",
@@ -5004,16 +5378,16 @@
"packages-dev": [
{
"name": "appwrite/sdk-generator",
"version": "1.4.4",
"version": "1.4.15",
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-generator.git",
"reference": "a20b20cfd70a1879f0d0fb2b4f669aa5ed836c49"
"reference": "b4a2fd9e92903c2e156f17fc5dafe102e6cfdfda"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/a20b20cfd70a1879f0d0fb2b4f669aa5ed836c49",
"reference": "a20b20cfd70a1879f0d0fb2b4f669aa5ed836c49",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/b4a2fd9e92903c2e156f17fc5dafe102e6cfdfda",
"reference": "b4a2fd9e92903c2e156f17fc5dafe102e6cfdfda",
"shasum": ""
},
"require": {
@@ -5049,9 +5423,9 @@
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
"support": {
"issues": "https://github.com/appwrite/sdk-generator/issues",
"source": "https://github.com/appwrite/sdk-generator/tree/1.4.4"
"source": "https://github.com/appwrite/sdk-generator/tree/1.4.15"
},
"time": "2025-10-13T09:20:49+00:00"
"time": "2025-10-28T04:52:59+00:00"
},
{
"name": "doctrine/annotations",
@@ -5528,16 +5902,16 @@
},
{
"name": "nikic/php-parser",
"version": "v5.6.1",
"version": "v5.6.2",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2"
"reference": "3a454ca033b9e06b63282ce19562e892747449bb"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2",
"reference": "f103601b29efebd7ff4a1ca7b3eeea9e3336a2a2",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb",
"reference": "3a454ca033b9e06b63282ce19562e892747449bb",
"shasum": ""
},
"require": {
@@ -5580,9 +5954,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v5.6.1"
"source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2"
},
"time": "2025-08-13T20:13:15+00:00"
"time": "2025-10-21T19:32:17+00:00"
},
{
"name": "phar-io/manifest",
@@ -5755,16 +6129,16 @@
},
{
"name": "phpbench/phpbench",
"version": "1.4.1",
"version": "1.4.2",
"source": {
"type": "git",
"url": "https://github.com/phpbench/phpbench.git",
"reference": "78cd98a9aa34e0f8f80ca01972a8b88d2c30194b"
"reference": "bb61ae6c54b3d58642be154eb09f4e73c3511018"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpbench/phpbench/zipball/78cd98a9aa34e0f8f80ca01972a8b88d2c30194b",
"reference": "78cd98a9aa34e0f8f80ca01972a8b88d2c30194b",
"url": "https://api.github.com/repos/phpbench/phpbench/zipball/bb61ae6c54b3d58642be154eb09f4e73c3511018",
"reference": "bb61ae6c54b3d58642be154eb09f4e73c3511018",
"shasum": ""
},
"require": {
@@ -5791,7 +6165,7 @@
"ergebnis/composer-normalize": "^2.39",
"friendsofphp/php-cs-fixer": "^3.0",
"jangregor/phpstan-prophecy": "^1.0",
"phpspec/prophecy": "dev-master",
"phpspec/prophecy": "^1.22",
"phpstan/extension-installer": "^1.1",
"phpstan/phpstan": "^1.0",
"phpstan/phpstan-phpunit": "^1.0",
@@ -5841,7 +6215,7 @@
],
"support": {
"issues": "https://github.com/phpbench/phpbench/issues",
"source": "https://github.com/phpbench/phpbench/tree/1.4.1"
"source": "https://github.com/phpbench/phpbench/tree/1.4.2"
},
"funding": [
{
@@ -5849,7 +6223,7 @@
"type": "github"
}
],
"time": "2025-03-12T08:01:40+00:00"
"time": "2025-10-26T14:21:59+00:00"
},
{
"name": "phpstan/phpstan",
@@ -7498,16 +7872,16 @@
},
{
"name": "symfony/console",
"version": "v7.3.4",
"version": "v7.3.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db"
"reference": "cdb80fa5869653c83cfe1a9084a673b6daf57ea7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/2b9c5fafbac0399a20a2e82429e2bd735dcfb7db",
"reference": "2b9c5fafbac0399a20a2e82429e2bd735dcfb7db",
"url": "https://api.github.com/repos/symfony/console/zipball/cdb80fa5869653c83cfe1a9084a673b6daf57ea7",
"reference": "cdb80fa5869653c83cfe1a9084a673b6daf57ea7",
"shasum": ""
},
"require": {
@@ -7572,7 +7946,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v7.3.4"
"source": "https://github.com/symfony/console/tree/v7.3.5"
},
"funding": [
{
@@ -7592,7 +7966,7 @@
"type": "tidelift"
}
],
"time": "2025-09-22T15:31:00+00:00"
"time": "2025-10-14T15:46:26+00:00"
},
{
"name": "symfony/filesystem",
@@ -7666,16 +8040,16 @@
},
{
"name": "symfony/finder",
"version": "v7.3.2",
"version": "v7.3.5",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
"reference": "2a6614966ba1074fa93dae0bc804227422df4dfe"
"reference": "9f696d2f1e340484b4683f7853b273abff94421f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/finder/zipball/2a6614966ba1074fa93dae0bc804227422df4dfe",
"reference": "2a6614966ba1074fa93dae0bc804227422df4dfe",
"url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f",
"reference": "9f696d2f1e340484b4683f7853b273abff94421f",
"shasum": ""
},
"require": {
@@ -7710,7 +8084,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.2"
"source": "https://github.com/symfony/finder/tree/v7.3.5"
},
"funding": [
{
@@ -7730,7 +8104,7 @@
"type": "tidelift"
}
],
"time": "2025-07-15T13:41:35+00:00"
"time": "2025-10-15T18:45:57+00:00"
},
{
"name": "symfony/options-resolver",
@@ -8518,7 +8892,7 @@
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {},
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
@@ -8542,5 +8916,5 @@
"platform-overrides": {
"php": "8.3"
},
"plugin-api-version": "2.6.0"
"plugin-api-version": "2.2.0"
}
+3 -2
View File
@@ -219,7 +219,7 @@ services:
appwrite-console:
<<: *x-logging
container_name: appwrite-console
image: appwrite/console:7.4.7
image: appwrite/console:7.4.11
restart: unless-stopped
networks:
- appwrite
@@ -698,6 +698,7 @@ services:
- appwrite
volumes:
- appwrite-imports:/storage/imports:rw
- appwrite-uploads:/storage/uploads:rw
- ./app:/usr/src/code/app
- ./src:/usr/src/code/src
- ./tests:/usr/src/code/tests
@@ -966,7 +967,7 @@ services:
hostname: exc1
<<: *x-logging
stop_signal: SIGINT
image: openruntimes/executor:0.11.0
image: openruntimes/executor:0.11.4
restart: unless-stopped
networks:
- appwrite
@@ -1,6 +1,8 @@
import io.appwrite.Client;
import io.appwrite.coroutines.CoroutineCallback;
import io.appwrite.services.Databases;
import io.appwrite.Permission;
import io.appwrite.Role;
Client client = new Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -19,7 +21,7 @@ databases.createDocument(
"age" to 30,
"isAdmin" to false
), // data
listOf("read("any")"), // permissions (optional)
listOf(Permission.read(Role.any())), // permissions (optional)
"<TRANSACTION_ID>", // transactionId (optional)
new CoroutineCallback<>((result, error) -> {
if (error != null) {
@@ -1,6 +1,8 @@
import io.appwrite.Client;
import io.appwrite.coroutines.CoroutineCallback;
import io.appwrite.services.Databases;
import io.appwrite.Permission;
import io.appwrite.Role;
Client client = new Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,7 +15,7 @@ databases.updateDocument(
"<COLLECTION_ID>", // collectionId
"<DOCUMENT_ID>", // documentId
mapOf( "a" to "b" ), // data (optional)
listOf("read("any")"), // permissions (optional)
listOf(Permission.read(Role.any())), // permissions (optional)
"<TRANSACTION_ID>", // transactionId (optional)
new CoroutineCallback<>((result, error) -> {
if (error != null) {
@@ -1,6 +1,8 @@
import io.appwrite.Client;
import io.appwrite.coroutines.CoroutineCallback;
import io.appwrite.services.Databases;
import io.appwrite.Permission;
import io.appwrite.Role;
Client client = new Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,7 +15,7 @@ databases.upsertDocument(
"<COLLECTION_ID>", // collectionId
"<DOCUMENT_ID>", // documentId
mapOf( "a" to "b" ), // data
listOf("read("any")"), // permissions (optional)
listOf(Permission.read(Role.any())), // permissions (optional)
"<TRANSACTION_ID>", // transactionId (optional)
new CoroutineCallback<>((result, error) -> {
if (error != null) {
@@ -2,6 +2,8 @@ import io.appwrite.Client;
import io.appwrite.coroutines.CoroutineCallback;
import io.appwrite.models.InputFile;
import io.appwrite.services.Storage;
import io.appwrite.Permission;
import io.appwrite.Role;
Client client = new Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,7 +15,7 @@ storage.createFile(
"<BUCKET_ID>", // bucketId
"<FILE_ID>", // fileId
InputFile.fromPath("file.png"), // file
listOf("read("any")"), // permissions (optional)
listOf(Permission.read(Role.any())), // permissions (optional)
new CoroutineCallback<>((result, error) -> {
if (error != null) {
error.printStackTrace();
@@ -1,6 +1,8 @@
import io.appwrite.Client;
import io.appwrite.coroutines.CoroutineCallback;
import io.appwrite.services.Storage;
import io.appwrite.Permission;
import io.appwrite.Role;
Client client = new Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -12,7 +14,7 @@ storage.updateFile(
"<BUCKET_ID>", // bucketId
"<FILE_ID>", // fileId
"<NAME>", // name (optional)
listOf("read("any")"), // permissions (optional)
listOf(Permission.read(Role.any())), // permissions (optional)
new CoroutineCallback<>((result, error) -> {
if (error != null) {
error.printStackTrace();
@@ -1,6 +1,8 @@
import io.appwrite.Client;
import io.appwrite.coroutines.CoroutineCallback;
import io.appwrite.services.TablesDB;
import io.appwrite.Permission;
import io.appwrite.Role;
Client client = new Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -19,7 +21,7 @@ tablesDB.createRow(
"age" to 30,
"isAdmin" to false
), // data
listOf("read("any")"), // permissions (optional)
listOf(Permission.read(Role.any())), // permissions (optional)
"<TRANSACTION_ID>", // transactionId (optional)
new CoroutineCallback<>((result, error) -> {
if (error != null) {
@@ -1,6 +1,8 @@
import io.appwrite.Client;
import io.appwrite.coroutines.CoroutineCallback;
import io.appwrite.services.TablesDB;
import io.appwrite.Permission;
import io.appwrite.Role;
Client client = new Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,7 +15,7 @@ tablesDB.updateRow(
"<TABLE_ID>", // tableId
"<ROW_ID>", // rowId
mapOf( "a" to "b" ), // data (optional)
listOf("read("any")"), // permissions (optional)
listOf(Permission.read(Role.any())), // permissions (optional)
"<TRANSACTION_ID>", // transactionId (optional)
new CoroutineCallback<>((result, error) -> {
if (error != null) {
@@ -1,6 +1,8 @@
import io.appwrite.Client;
import io.appwrite.coroutines.CoroutineCallback;
import io.appwrite.services.TablesDB;
import io.appwrite.Permission;
import io.appwrite.Role;
Client client = new Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,7 +15,7 @@ tablesDB.upsertRow(
"<TABLE_ID>", // tableId
"<ROW_ID>", // rowId
mapOf( "a" to "b" ), // data (optional)
listOf("read("any")"), // permissions (optional)
listOf(Permission.read(Role.any())), // permissions (optional)
"<TRANSACTION_ID>", // transactionId (optional)
new CoroutineCallback<>((result, error) -> {
if (error != null) {
@@ -1,6 +1,8 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.Databases
import io.appwrite.Permission
import io.appwrite.Role
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -19,6 +21,6 @@ val result = databases.createDocument(
"age" to 30,
"isAdmin" to false
),
permissions = listOf("read("any")"), // (optional)
permissions = listOf(Permission.read(Role.any())), // (optional)
transactionId = "<TRANSACTION_ID>", // (optional)
)
@@ -1,6 +1,8 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.Databases
import io.appwrite.Permission
import io.appwrite.Role
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,6 +15,6 @@ val result = databases.updateDocument(
collectionId = "<COLLECTION_ID>",
documentId = "<DOCUMENT_ID>",
data = mapOf( "a" to "b" ), // (optional)
permissions = listOf("read("any")"), // (optional)
permissions = listOf(Permission.read(Role.any())), // (optional)
transactionId = "<TRANSACTION_ID>", // (optional)
)
@@ -1,6 +1,8 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.Databases
import io.appwrite.Permission
import io.appwrite.Role
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,6 +15,6 @@ val result = databases.upsertDocument(
collectionId = "<COLLECTION_ID>",
documentId = "<DOCUMENT_ID>",
data = mapOf( "a" to "b" ),
permissions = listOf("read("any")"), // (optional)
permissions = listOf(Permission.read(Role.any())), // (optional)
transactionId = "<TRANSACTION_ID>", // (optional)
)
@@ -2,6 +2,8 @@ import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.models.InputFile
import io.appwrite.services.Storage
import io.appwrite.Permission
import io.appwrite.Role
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,5 +15,5 @@ val result = storage.createFile(
bucketId = "<BUCKET_ID>",
fileId = "<FILE_ID>",
file = InputFile.fromPath("file.png"),
permissions = listOf("read("any")"), // (optional)
permissions = listOf(Permission.read(Role.any())), // (optional)
)
@@ -1,6 +1,8 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.Storage
import io.appwrite.Permission
import io.appwrite.Role
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -12,5 +14,5 @@ val result = storage.updateFile(
bucketId = "<BUCKET_ID>",
fileId = "<FILE_ID>",
name = "<NAME>", // (optional)
permissions = listOf("read("any")"), // (optional)
permissions = listOf(Permission.read(Role.any())), // (optional)
)
@@ -1,6 +1,8 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.TablesDB
import io.appwrite.Permission
import io.appwrite.Role
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -19,6 +21,6 @@ val result = tablesDB.createRow(
"age" to 30,
"isAdmin" to false
),
permissions = listOf("read("any")"), // (optional)
permissions = listOf(Permission.read(Role.any())), // (optional)
transactionId = "<TRANSACTION_ID>", // (optional)
)
@@ -1,6 +1,8 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.TablesDB
import io.appwrite.Permission
import io.appwrite.Role
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,6 +15,6 @@ val result = tablesDB.updateRow(
tableId = "<TABLE_ID>",
rowId = "<ROW_ID>",
data = mapOf( "a" to "b" ), // (optional)
permissions = listOf("read("any")"), // (optional)
permissions = listOf(Permission.read(Role.any())), // (optional)
transactionId = "<TRANSACTION_ID>", // (optional)
)
@@ -1,6 +1,8 @@
import io.appwrite.Client
import io.appwrite.coroutines.CoroutineCallback
import io.appwrite.services.TablesDB
import io.appwrite.Permission
import io.appwrite.Role
val client = Client(context)
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1") // Your API Endpoint
@@ -13,6 +15,6 @@ val result = tablesDB.upsertRow(
tableId = "<TABLE_ID>",
rowId = "<ROW_ID>",
data = mapOf( "a" to "b" ), // (optional)
permissions = listOf("read("any")"), // (optional)
permissions = listOf(Permission.read(Role.any())), // (optional)
transactionId = "<TRANSACTION_ID>", // (optional)
)
@@ -17,7 +17,7 @@ let document = try await databases.createDocument(
"age": 30,
"isAdmin": false
],
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: "<TRANSACTION_ID>" // optional
)
@@ -11,7 +11,7 @@ let document = try await databases.updateDocument(
collectionId: "<COLLECTION_ID>",
documentId: "<DOCUMENT_ID>",
data: [:], // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: "<TRANSACTION_ID>" // optional
)
@@ -11,7 +11,7 @@ let document = try await databases.upsertDocument(
collectionId: "<COLLECTION_ID>",
documentId: "<DOCUMENT_ID>",
data: [:],
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: "<TRANSACTION_ID>" // optional
)
@@ -10,6 +10,6 @@ let file = try await storage.createFile(
bucketId: "<BUCKET_ID>",
fileId: "<FILE_ID>",
file: InputFile.fromPath("file.png"),
permissions: ["read("any")"] // optional
permissions: [Permission.read(Role.any())] // optional
)
@@ -10,6 +10,6 @@ let file = try await storage.updateFile(
bucketId: "<BUCKET_ID>",
fileId: "<FILE_ID>",
name: "<NAME>", // optional
permissions: ["read("any")"] // optional
permissions: [Permission.read(Role.any())] // optional
)
@@ -17,7 +17,7 @@ let row = try await tablesDB.createRow(
"age": 30,
"isAdmin": false
],
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: "<TRANSACTION_ID>" // optional
)
@@ -11,7 +11,7 @@ let row = try await tablesDB.updateRow(
tableId: "<TABLE_ID>",
rowId: "<ROW_ID>",
data: [:], // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: "<TRANSACTION_ID>" // optional
)
@@ -11,7 +11,7 @@ let row = try await tablesDB.upsertRow(
tableId: "<TABLE_ID>",
rowId: "<ROW_ID>",
data: [:], // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: "<TRANSACTION_ID>" // optional
)
@@ -1,4 +1,6 @@
import 'package:appwrite/appwrite.dart';
import 'package:appwrite/permission.dart';
import 'package:appwrite/role.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -17,6 +19,6 @@ Document result = await databases.createDocument(
"age": 30,
"isAdmin": false
},
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>', // optional
);
@@ -1,4 +1,6 @@
import 'package:appwrite/appwrite.dart';
import 'package:appwrite/permission.dart';
import 'package:appwrite/role.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,6 +13,6 @@ Document result = await databases.updateDocument(
collectionId: '<COLLECTION_ID>',
documentId: '<DOCUMENT_ID>',
data: {}, // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>', // optional
);
@@ -1,4 +1,6 @@
import 'package:appwrite/appwrite.dart';
import 'package:appwrite/permission.dart';
import 'package:appwrite/role.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,6 +13,6 @@ Document result = await databases.upsertDocument(
collectionId: '<COLLECTION_ID>',
documentId: '<DOCUMENT_ID>',
data: {},
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>', // optional
);
@@ -1,5 +1,7 @@
import 'dart:io';
import 'package:appwrite/appwrite.dart';
import 'package:appwrite/permission.dart';
import 'package:appwrite/role.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,5 +13,5 @@ File result = await storage.createFile(
bucketId: '<BUCKET_ID>',
fileId: '<FILE_ID>',
file: InputFile(path: './path-to-files/image.jpg', filename: 'image.jpg'),
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
);
@@ -1,4 +1,6 @@
import 'package:appwrite/appwrite.dart';
import 'package:appwrite/permission.dart';
import 'package:appwrite/role.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,5 +12,5 @@ File result = await storage.updateFile(
bucketId: '<BUCKET_ID>',
fileId: '<FILE_ID>',
name: '<NAME>', // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
);
@@ -1,4 +1,6 @@
import 'package:appwrite/appwrite.dart';
import 'package:appwrite/permission.dart';
import 'package:appwrite/role.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -17,6 +19,6 @@ Row result = await tablesDB.createRow(
"age": 30,
"isAdmin": false
},
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>', // optional
);
@@ -1,4 +1,6 @@
import 'package:appwrite/appwrite.dart';
import 'package:appwrite/permission.dart';
import 'package:appwrite/role.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,6 +13,6 @@ Row result = await tablesDB.updateRow(
tableId: '<TABLE_ID>',
rowId: '<ROW_ID>',
data: {}, // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>', // optional
);
@@ -1,4 +1,6 @@
import 'package:appwrite/appwrite.dart';
import 'package:appwrite/permission.dart';
import 'package:appwrite/role.dart';
Client client = Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,6 +13,6 @@ Row result = await tablesDB.upsertRow(
tableId: '<TABLE_ID>',
rowId: '<ROW_ID>',
data: {}, // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>', // optional
);
@@ -1,4 +1,4 @@
import { Client, Databases } from "react-native-appwrite";
import { Client, Databases, Permission, Role } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -1,4 +1,4 @@
import { Client, Databases } from "react-native-appwrite";
import { Client, Databases, Permission, Role } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -1,4 +1,4 @@
import { Client, Databases } from "react-native-appwrite";
import { Client, Databases, Permission, Role } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -1,4 +1,4 @@
import { Client, Storage } from "react-native-appwrite";
import { Client, Storage, Permission, Role } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -1,4 +1,4 @@
import { Client, Storage } from "react-native-appwrite";
import { Client, Storage, Permission, Role } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -1,4 +1,4 @@
import { Client, TablesDB } from "react-native-appwrite";
import { Client, TablesDB, Permission, Role } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -1,4 +1,4 @@
import { Client, TablesDB } from "react-native-appwrite";
import { Client, TablesDB, Permission, Role } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -1,4 +1,4 @@
import { Client, TablesDB } from "react-native-appwrite";
import { Client, TablesDB, Permission, Role } from "react-native-appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -1,4 +1,4 @@
import { Client, Databases } from "appwrite";
import { Client, Databases, Permission, Role } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -17,7 +17,7 @@ const result = await databases.createDocument({
"age": 30,
"isAdmin": false
},
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>' // optional
});
@@ -1,4 +1,4 @@
import { Client, Databases } from "appwrite";
import { Client, Databases, Permission, Role } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,7 +11,7 @@ const result = await databases.updateDocument({
collectionId: '<COLLECTION_ID>',
documentId: '<DOCUMENT_ID>',
data: {}, // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>' // optional
});
@@ -1,4 +1,4 @@
import { Client, Databases } from "appwrite";
import { Client, Databases, Permission, Role } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,7 +11,7 @@ const result = await databases.upsertDocument({
collectionId: '<COLLECTION_ID>',
documentId: '<DOCUMENT_ID>',
data: {},
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>' // optional
});
@@ -1,4 +1,4 @@
import { Client, Storage } from "appwrite";
import { Client, Storage, Permission, Role } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,7 +10,7 @@ const result = await storage.createFile({
bucketId: '<BUCKET_ID>',
fileId: '<FILE_ID>',
file: document.getElementById('uploader').files[0],
permissions: ["read("any")"] // optional
permissions: [Permission.read(Role.any())] // optional
});
console.log(result);
@@ -1,4 +1,4 @@
import { Client, Storage } from "appwrite";
import { Client, Storage, Permission, Role } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,7 +10,7 @@ const result = await storage.updateFile({
bucketId: '<BUCKET_ID>',
fileId: '<FILE_ID>',
name: '<NAME>', // optional
permissions: ["read("any")"] // optional
permissions: [Permission.read(Role.any())] // optional
});
console.log(result);
@@ -1,4 +1,4 @@
import { Client, TablesDB } from "appwrite";
import { Client, TablesDB, Permission, Role } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -17,7 +17,7 @@ const result = await tablesDB.createRow({
"age": 30,
"isAdmin": false
},
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>' // optional
});
@@ -1,4 +1,4 @@
import { Client, TablesDB } from "appwrite";
import { Client, TablesDB, Permission, Role } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,7 +11,7 @@ const result = await tablesDB.updateRow({
tableId: '<TABLE_ID>',
rowId: '<ROW_ID>',
data: {}, // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>' // optional
});
@@ -1,4 +1,4 @@
import { Client, TablesDB } from "appwrite";
import { Client, TablesDB, Permission, Role } from "appwrite";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,7 +11,7 @@ const result = await tablesDB.upsertRow({
tableId: '<TABLE_ID>',
rowId: '<ROW_ID>',
data: {}, // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>' // optional
});
@@ -0,0 +1,3 @@
appwrite messaging create-resend-provider \
--provider-id <PROVIDER_ID> \
--name <NAME>
@@ -0,0 +1,2 @@
appwrite messaging update-resend-provider \
--provider-id <PROVIDER_ID>
@@ -1,4 +1,4 @@
import { Client, Databases } from "@appwrite.io/console";
import { Client, Databases, Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,7 +10,7 @@ const result = await databases.createCollection({
databaseId: '<DATABASE_ID>',
collectionId: '<COLLECTION_ID>',
name: '<NAME>',
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
documentSecurity: false, // optional
enabled: false // optional
});
@@ -1,4 +1,4 @@
import { Client, Databases } from "@appwrite.io/console";
import { Client, Databases, Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -17,7 +17,7 @@ const result = await databases.createDocument({
"age": 30,
"isAdmin": false
},
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>' // optional
});
@@ -1,4 +1,4 @@
import { Client, Databases } from "@appwrite.io/console";
import { Client, Databases, Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,7 +10,7 @@ const result = await databases.updateCollection({
databaseId: '<DATABASE_ID>',
collectionId: '<COLLECTION_ID>',
name: '<NAME>',
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
documentSecurity: false, // optional
enabled: false // optional
});
@@ -1,4 +1,4 @@
import { Client, Databases } from "@appwrite.io/console";
import { Client, Databases, Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,7 +11,7 @@ const result = await databases.updateDocument({
collectionId: '<COLLECTION_ID>',
documentId: '<DOCUMENT_ID>',
data: {}, // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>' // optional
});
@@ -1,4 +1,4 @@
import { Client, Databases } from "@appwrite.io/console";
import { Client, Databases, Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,7 +11,7 @@ const result = await databases.upsertDocument({
collectionId: '<COLLECTION_ID>',
documentId: '<DOCUMENT_ID>',
data: {},
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>' // optional
});
@@ -0,0 +1,20 @@
import { Client, Messaging } 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 messaging = new Messaging(client);
const result = await messaging.createResendProvider({
providerId: '<PROVIDER_ID>',
name: '<NAME>',
apiKey: '<API_KEY>', // optional
fromName: '<FROM_NAME>', // optional
fromEmail: 'email@example.com', // optional
replyToName: '<REPLY_TO_NAME>', // optional
replyToEmail: 'email@example.com', // optional
enabled: false // optional
});
console.log(result);
@@ -0,0 +1,20 @@
import { Client, Messaging } 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 messaging = new Messaging(client);
const result = await messaging.updateResendProvider({
providerId: '<PROVIDER_ID>',
name: '<NAME>', // optional
enabled: false, // optional
apiKey: '<API_KEY>', // optional
fromName: '<FROM_NAME>', // optional
fromEmail: 'email@example.com', // optional
replyToName: '<REPLY_TO_NAME>', // optional
replyToEmail: '<REPLY_TO_EMAIL>' // optional
});
console.log(result);
@@ -1,4 +1,4 @@
import { Client, Storage, } from "@appwrite.io/console";
import { Client, Storage, , Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -9,7 +9,7 @@ const storage = new Storage(client);
const result = await storage.createBucket({
bucketId: '<BUCKET_ID>',
name: '<NAME>',
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
fileSecurity: false, // optional
enabled: false, // optional
maximumFileSize: 1, // optional
@@ -1,4 +1,4 @@
import { Client, Storage } from "@appwrite.io/console";
import { Client, Storage, Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,7 +10,7 @@ const result = await storage.createFile({
bucketId: '<BUCKET_ID>',
fileId: '<FILE_ID>',
file: document.getElementById('uploader').files[0],
permissions: ["read("any")"] // optional
permissions: [Permission.read(Role.any())] // optional
});
console.log(result);
@@ -1,4 +1,4 @@
import { Client, Storage, } from "@appwrite.io/console";
import { Client, Storage, , Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -9,7 +9,7 @@ const storage = new Storage(client);
const result = await storage.updateBucket({
bucketId: '<BUCKET_ID>',
name: '<NAME>',
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
fileSecurity: false, // optional
enabled: false, // optional
maximumFileSize: 1, // optional
@@ -1,4 +1,4 @@
import { Client, Storage } from "@appwrite.io/console";
import { Client, Storage, Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,7 +10,7 @@ const result = await storage.updateFile({
bucketId: '<BUCKET_ID>',
fileId: '<FILE_ID>',
name: '<NAME>', // optional
permissions: ["read("any")"] // optional
permissions: [Permission.read(Role.any())] // optional
});
console.log(result);
@@ -1,4 +1,4 @@
import { Client, TablesDB } from "@appwrite.io/console";
import { Client, TablesDB, Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -17,7 +17,7 @@ const result = await tablesDB.createRow({
"age": 30,
"isAdmin": false
},
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>' // optional
});
@@ -1,4 +1,4 @@
import { Client, TablesDB } from "@appwrite.io/console";
import { Client, TablesDB, Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,7 +10,7 @@ const result = await tablesDB.createTable({
databaseId: '<DATABASE_ID>',
tableId: '<TABLE_ID>',
name: '<NAME>',
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
rowSecurity: false, // optional
enabled: false // optional
});
@@ -1,4 +1,4 @@
import { Client, TablesDB } from "@appwrite.io/console";
import { Client, TablesDB, Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,7 +11,7 @@ const result = await tablesDB.updateRow({
tableId: '<TABLE_ID>',
rowId: '<ROW_ID>',
data: {}, // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>' // optional
});
@@ -1,4 +1,4 @@
import { Client, TablesDB } from "@appwrite.io/console";
import { Client, TablesDB, Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -10,7 +10,7 @@ const result = await tablesDB.updateTable({
databaseId: '<DATABASE_ID>',
tableId: '<TABLE_ID>',
name: '<NAME>',
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
rowSecurity: false, // optional
enabled: false // optional
});
@@ -1,4 +1,4 @@
import { Client, TablesDB } from "@appwrite.io/console";
import { Client, TablesDB, Permission, Role } from "@appwrite.io/console";
const client = new Client()
.setEndpoint('https://<REGION>.cloud.appwrite.io/v1') // Your API Endpoint
@@ -11,7 +11,7 @@ const result = await tablesDB.upsertRow({
tableId: '<TABLE_ID>',
rowId: '<ROW_ID>',
data: {}, // optional
permissions: ["read("any")"], // optional
permissions: [Permission.read(Role.any())], // optional
transactionId: '<TRANSACTION_ID>' // optional
});

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