Merge branch '1.8.x' into feat-tanstack-start-sites

This commit is contained in:
Matej Bačo
2025-10-24 12:43:51 +02:00
33 changed files with 4569 additions and 2151 deletions
@@ -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';
+57 -39
View File
@@ -4934,7 +4934,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 376,
"weight": 378,
"cookies": false,
"type": "",
"demo": "databases\/list-transactions.md",
@@ -4999,7 +4999,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 372,
"weight": 374,
"cookies": false,
"type": "",
"demo": "databases\/create-transaction.md",
@@ -5067,7 +5067,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 373,
"weight": 375,
"cookies": false,
"type": "",
"demo": "databases\/get-transaction.md",
@@ -5129,7 +5129,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 374,
"weight": 376,
"cookies": false,
"type": "",
"demo": "databases\/update-transaction.md",
@@ -5205,7 +5205,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 375,
"weight": 377,
"cookies": false,
"type": "",
"demo": "databases\/delete-transaction.md",
@@ -5269,7 +5269,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 377,
"weight": 379,
"cookies": false,
"type": "",
"demo": "databases\/create-operations.md",
@@ -5352,7 +5352,7 @@
"x-appwrite": {
"method": "listDocuments",
"group": "documents",
"weight": 335,
"weight": 337,
"cookies": false,
"type": "",
"demo": "databases\/list-documents.md",
@@ -5451,7 +5451,7 @@
"x-appwrite": {
"method": "createDocument",
"group": "documents",
"weight": 327,
"weight": 329,
"cookies": false,
"type": "",
"demo": "databases\/create-document.md",
@@ -5607,7 +5607,7 @@
"x-appwrite": {
"method": "getDocument",
"group": "documents",
"weight": 328,
"weight": 330,
"cookies": false,
"type": "",
"demo": "databases\/get-document.md",
@@ -5716,7 +5716,7 @@
"x-appwrite": {
"method": "upsertDocument",
"group": "documents",
"weight": 331,
"weight": 333,
"cookies": false,
"type": "",
"demo": "databases\/upsert-document.md",
@@ -5870,7 +5870,7 @@
"x-appwrite": {
"method": "updateDocument",
"group": "documents",
"weight": 329,
"weight": 331,
"cookies": false,
"type": "",
"demo": "databases\/update-document.md",
@@ -5978,7 +5978,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 333,
"weight": 335,
"cookies": false,
"type": "",
"demo": "databases\/delete-document.md",
@@ -6082,7 +6082,7 @@
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 338,
"weight": 340,
"cookies": false,
"type": "",
"demo": "databases\/decrement-document-attribute.md",
@@ -6206,7 +6206,7 @@
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 337,
"weight": 339,
"cookies": false,
"type": "",
"demo": "databases\/increment-document-attribute.md",
@@ -6330,7 +6330,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 468,
"weight": 470,
"cookies": false,
"type": "",
"demo": "functions\/list-executions.md",
@@ -6405,7 +6405,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 466,
"weight": 468,
"cookies": false,
"type": "",
"demo": "functions\/create-execution.md",
@@ -6521,7 +6521,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 467,
"weight": 469,
"cookies": false,
"type": "",
"demo": "functions\/get-execution.md",
@@ -7115,7 +7115,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 296,
"weight": 298,
"cookies": false,
"type": "",
"demo": "messaging\/create-subscriber.md",
@@ -7198,7 +7198,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 300,
"weight": 302,
"cookies": false,
"type": "",
"demo": "messaging\/delete-subscriber.md",
@@ -8076,7 +8076,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 441,
"weight": 443,
"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": 439,
"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": 440,
"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": 441,
"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": 442,
"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": 444,
"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": 435,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-rows.md",
@@ -8592,7 +8610,7 @@
"x-appwrite": {
"method": "createRow",
"group": "rows",
"weight": 425,
"weight": 427,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-row.md",
@@ -8743,7 +8761,7 @@
"x-appwrite": {
"method": "getRow",
"group": "rows",
"weight": 426,
"weight": 428,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-row.md",
@@ -8851,7 +8869,7 @@
"x-appwrite": {
"method": "upsertRow",
"group": "rows",
"weight": 429,
"weight": 431,
"cookies": false,
"type": "",
"demo": "tablesdb\/upsert-row.md",
@@ -8996,7 +9014,7 @@
"x-appwrite": {
"method": "updateRow",
"group": "rows",
"weight": 427,
"weight": 429,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-row.md",
@@ -9103,7 +9121,7 @@
"x-appwrite": {
"method": "deleteRow",
"group": "rows",
"weight": 431,
"weight": 433,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-row.md",
@@ -9206,7 +9224,7 @@
"x-appwrite": {
"method": "decrementRowColumn",
"group": "rows",
"weight": 436,
"weight": 438,
"cookies": false,
"type": "",
"demo": "tablesdb\/decrement-row-column.md",
@@ -9329,7 +9347,7 @@
"x-appwrite": {
"method": "incrementRowColumn",
"group": "rows",
"weight": 435,
"weight": 437,
"cookies": false,
"type": "",
"demo": "tablesdb\/increment-row-column.md",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+57 -39
View File
@@ -4934,7 +4934,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 376,
"weight": 378,
"cookies": false,
"type": "",
"demo": "databases\/list-transactions.md",
@@ -4999,7 +4999,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 372,
"weight": 374,
"cookies": false,
"type": "",
"demo": "databases\/create-transaction.md",
@@ -5067,7 +5067,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 373,
"weight": 375,
"cookies": false,
"type": "",
"demo": "databases\/get-transaction.md",
@@ -5129,7 +5129,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 374,
"weight": 376,
"cookies": false,
"type": "",
"demo": "databases\/update-transaction.md",
@@ -5205,7 +5205,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 375,
"weight": 377,
"cookies": false,
"type": "",
"demo": "databases\/delete-transaction.md",
@@ -5269,7 +5269,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 377,
"weight": 379,
"cookies": false,
"type": "",
"demo": "databases\/create-operations.md",
@@ -5352,7 +5352,7 @@
"x-appwrite": {
"method": "listDocuments",
"group": "documents",
"weight": 335,
"weight": 337,
"cookies": false,
"type": "",
"demo": "databases\/list-documents.md",
@@ -5451,7 +5451,7 @@
"x-appwrite": {
"method": "createDocument",
"group": "documents",
"weight": 327,
"weight": 329,
"cookies": false,
"type": "",
"demo": "databases\/create-document.md",
@@ -5607,7 +5607,7 @@
"x-appwrite": {
"method": "getDocument",
"group": "documents",
"weight": 328,
"weight": 330,
"cookies": false,
"type": "",
"demo": "databases\/get-document.md",
@@ -5716,7 +5716,7 @@
"x-appwrite": {
"method": "upsertDocument",
"group": "documents",
"weight": 331,
"weight": 333,
"cookies": false,
"type": "",
"demo": "databases\/upsert-document.md",
@@ -5870,7 +5870,7 @@
"x-appwrite": {
"method": "updateDocument",
"group": "documents",
"weight": 329,
"weight": 331,
"cookies": false,
"type": "",
"demo": "databases\/update-document.md",
@@ -5978,7 +5978,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 333,
"weight": 335,
"cookies": false,
"type": "",
"demo": "databases\/delete-document.md",
@@ -6082,7 +6082,7 @@
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 338,
"weight": 340,
"cookies": false,
"type": "",
"demo": "databases\/decrement-document-attribute.md",
@@ -6206,7 +6206,7 @@
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 337,
"weight": 339,
"cookies": false,
"type": "",
"demo": "databases\/increment-document-attribute.md",
@@ -6330,7 +6330,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 468,
"weight": 470,
"cookies": false,
"type": "",
"demo": "functions\/list-executions.md",
@@ -6405,7 +6405,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 466,
"weight": 468,
"cookies": false,
"type": "",
"demo": "functions\/create-execution.md",
@@ -6521,7 +6521,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 467,
"weight": 469,
"cookies": false,
"type": "",
"demo": "functions\/get-execution.md",
@@ -7115,7 +7115,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 296,
"weight": 298,
"cookies": false,
"type": "",
"demo": "messaging\/create-subscriber.md",
@@ -7198,7 +7198,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 300,
"weight": 302,
"cookies": false,
"type": "",
"demo": "messaging\/delete-subscriber.md",
@@ -8076,7 +8076,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 441,
"weight": 443,
"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": 439,
"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": 440,
"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": 441,
"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": 442,
"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": 444,
"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": 435,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-rows.md",
@@ -8592,7 +8610,7 @@
"x-appwrite": {
"method": "createRow",
"group": "rows",
"weight": 425,
"weight": 427,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-row.md",
@@ -8743,7 +8761,7 @@
"x-appwrite": {
"method": "getRow",
"group": "rows",
"weight": 426,
"weight": 428,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-row.md",
@@ -8851,7 +8869,7 @@
"x-appwrite": {
"method": "upsertRow",
"group": "rows",
"weight": 429,
"weight": 431,
"cookies": false,
"type": "",
"demo": "tablesdb\/upsert-row.md",
@@ -8996,7 +9014,7 @@
"x-appwrite": {
"method": "updateRow",
"group": "rows",
"weight": 427,
"weight": 429,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-row.md",
@@ -9103,7 +9121,7 @@
"x-appwrite": {
"method": "deleteRow",
"group": "rows",
"weight": 431,
"weight": 433,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-row.md",
@@ -9206,7 +9224,7 @@
"x-appwrite": {
"method": "decrementRowColumn",
"group": "rows",
"weight": 436,
"weight": 438,
"cookies": false,
"type": "",
"demo": "tablesdb\/decrement-row-column.md",
@@ -9329,7 +9347,7 @@
"x-appwrite": {
"method": "incrementRowColumn",
"group": "rows",
"weight": 435,
"weight": 437,
"cookies": false,
"type": "",
"demo": "tablesdb\/increment-row-column.md",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+57 -39
View File
@@ -5076,7 +5076,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 376,
"weight": 378,
"cookies": false,
"type": "",
"demo": "databases\/list-transactions.md",
@@ -5141,7 +5141,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 372,
"weight": 374,
"cookies": false,
"type": "",
"demo": "databases\/create-transaction.md",
@@ -5209,7 +5209,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 373,
"weight": 375,
"cookies": false,
"type": "",
"demo": "databases\/get-transaction.md",
@@ -5270,7 +5270,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 374,
"weight": 376,
"cookies": false,
"type": "",
"demo": "databases\/update-transaction.md",
@@ -5347,7 +5347,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 375,
"weight": 377,
"cookies": false,
"type": "",
"demo": "databases\/delete-transaction.md",
@@ -5410,7 +5410,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 377,
"weight": 379,
"cookies": false,
"type": "",
"demo": "databases\/create-operations.md",
@@ -5489,7 +5489,7 @@
"x-appwrite": {
"method": "listDocuments",
"group": "documents",
"weight": 335,
"weight": 337,
"cookies": false,
"type": "",
"demo": "databases\/list-documents.md",
@@ -5582,7 +5582,7 @@
"x-appwrite": {
"method": "createDocument",
"group": "documents",
"weight": 327,
"weight": 329,
"cookies": false,
"type": "",
"demo": "databases\/create-document.md",
@@ -5736,7 +5736,7 @@
"x-appwrite": {
"method": "getDocument",
"group": "documents",
"weight": 328,
"weight": 330,
"cookies": false,
"type": "",
"demo": "databases\/get-document.md",
@@ -5837,7 +5837,7 @@
"x-appwrite": {
"method": "upsertDocument",
"group": "documents",
"weight": 331,
"weight": 333,
"cookies": false,
"type": "",
"demo": "databases\/upsert-document.md",
@@ -5987,7 +5987,7 @@
"x-appwrite": {
"method": "updateDocument",
"group": "documents",
"weight": 329,
"weight": 331,
"cookies": false,
"type": "",
"demo": "databases\/update-document.md",
@@ -6093,7 +6093,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 333,
"weight": 335,
"cookies": false,
"type": "",
"demo": "databases\/delete-document.md",
@@ -6191,7 +6191,7 @@
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 338,
"weight": 340,
"cookies": false,
"type": "",
"demo": "databases\/decrement-document-attribute.md",
@@ -6309,7 +6309,7 @@
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 337,
"weight": 339,
"cookies": false,
"type": "",
"demo": "databases\/increment-document-attribute.md",
@@ -6425,7 +6425,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 468,
"weight": 470,
"cookies": false,
"type": "",
"demo": "functions\/list-executions.md",
@@ -6498,7 +6498,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 466,
"weight": 468,
"cookies": false,
"type": "",
"demo": "functions\/create-execution.md",
@@ -6615,7 +6615,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 467,
"weight": 469,
"cookies": false,
"type": "",
"demo": "functions\/get-execution.md",
@@ -7240,7 +7240,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 296,
"weight": 298,
"cookies": false,
"type": "",
"demo": "messaging\/create-subscriber.md",
@@ -7324,7 +7324,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 300,
"weight": 302,
"cookies": false,
"type": "",
"demo": "messaging\/delete-subscriber.md",
@@ -8153,7 +8153,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 441,
"weight": 443,
"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": 439,
"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": 440,
"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": 441,
"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": 442,
"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": 444,
"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": 435,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-rows.md",
@@ -8658,7 +8676,7 @@
"x-appwrite": {
"method": "createRow",
"group": "rows",
"weight": 425,
"weight": 427,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-row.md",
@@ -8807,7 +8825,7 @@
"x-appwrite": {
"method": "getRow",
"group": "rows",
"weight": 426,
"weight": 428,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-row.md",
@@ -8907,7 +8925,7 @@
"x-appwrite": {
"method": "upsertRow",
"group": "rows",
"weight": 429,
"weight": 431,
"cookies": false,
"type": "",
"demo": "tablesdb\/upsert-row.md",
@@ -9048,7 +9066,7 @@
"x-appwrite": {
"method": "updateRow",
"group": "rows",
"weight": 427,
"weight": 429,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-row.md",
@@ -9153,7 +9171,7 @@
"x-appwrite": {
"method": "deleteRow",
"group": "rows",
"weight": 431,
"weight": 433,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-row.md",
@@ -9250,7 +9268,7 @@
"x-appwrite": {
"method": "decrementRowColumn",
"group": "rows",
"weight": 436,
"weight": 438,
"cookies": false,
"type": "",
"demo": "tablesdb\/decrement-row-column.md",
@@ -9367,7 +9385,7 @@
"x-appwrite": {
"method": "incrementRowColumn",
"group": "rows",
"weight": 435,
"weight": 437,
"cookies": false,
"type": "",
"demo": "tablesdb\/increment-row-column.md",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+57 -39
View File
@@ -5076,7 +5076,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 376,
"weight": 378,
"cookies": false,
"type": "",
"demo": "databases\/list-transactions.md",
@@ -5141,7 +5141,7 @@
"x-appwrite": {
"method": "createTransaction",
"group": "transactions",
"weight": 372,
"weight": 374,
"cookies": false,
"type": "",
"demo": "databases\/create-transaction.md",
@@ -5209,7 +5209,7 @@
"x-appwrite": {
"method": "getTransaction",
"group": "transactions",
"weight": 373,
"weight": 375,
"cookies": false,
"type": "",
"demo": "databases\/get-transaction.md",
@@ -5270,7 +5270,7 @@
"x-appwrite": {
"method": "updateTransaction",
"group": "transactions",
"weight": 374,
"weight": 376,
"cookies": false,
"type": "",
"demo": "databases\/update-transaction.md",
@@ -5347,7 +5347,7 @@
"x-appwrite": {
"method": "deleteTransaction",
"group": "transactions",
"weight": 375,
"weight": 377,
"cookies": false,
"type": "",
"demo": "databases\/delete-transaction.md",
@@ -5410,7 +5410,7 @@
"x-appwrite": {
"method": "createOperations",
"group": "transactions",
"weight": 377,
"weight": 379,
"cookies": false,
"type": "",
"demo": "databases\/create-operations.md",
@@ -5489,7 +5489,7 @@
"x-appwrite": {
"method": "listDocuments",
"group": "documents",
"weight": 335,
"weight": 337,
"cookies": false,
"type": "",
"demo": "databases\/list-documents.md",
@@ -5582,7 +5582,7 @@
"x-appwrite": {
"method": "createDocument",
"group": "documents",
"weight": 327,
"weight": 329,
"cookies": false,
"type": "",
"demo": "databases\/create-document.md",
@@ -5736,7 +5736,7 @@
"x-appwrite": {
"method": "getDocument",
"group": "documents",
"weight": 328,
"weight": 330,
"cookies": false,
"type": "",
"demo": "databases\/get-document.md",
@@ -5837,7 +5837,7 @@
"x-appwrite": {
"method": "upsertDocument",
"group": "documents",
"weight": 331,
"weight": 333,
"cookies": false,
"type": "",
"demo": "databases\/upsert-document.md",
@@ -5987,7 +5987,7 @@
"x-appwrite": {
"method": "updateDocument",
"group": "documents",
"weight": 329,
"weight": 331,
"cookies": false,
"type": "",
"demo": "databases\/update-document.md",
@@ -6093,7 +6093,7 @@
"x-appwrite": {
"method": "deleteDocument",
"group": "documents",
"weight": 333,
"weight": 335,
"cookies": false,
"type": "",
"demo": "databases\/delete-document.md",
@@ -6191,7 +6191,7 @@
"x-appwrite": {
"method": "decrementDocumentAttribute",
"group": "documents",
"weight": 338,
"weight": 340,
"cookies": false,
"type": "",
"demo": "databases\/decrement-document-attribute.md",
@@ -6309,7 +6309,7 @@
"x-appwrite": {
"method": "incrementDocumentAttribute",
"group": "documents",
"weight": 337,
"weight": 339,
"cookies": false,
"type": "",
"demo": "databases\/increment-document-attribute.md",
@@ -6425,7 +6425,7 @@
"x-appwrite": {
"method": "listExecutions",
"group": "executions",
"weight": 468,
"weight": 470,
"cookies": false,
"type": "",
"demo": "functions\/list-executions.md",
@@ -6498,7 +6498,7 @@
"x-appwrite": {
"method": "createExecution",
"group": "executions",
"weight": 466,
"weight": 468,
"cookies": false,
"type": "",
"demo": "functions\/create-execution.md",
@@ -6615,7 +6615,7 @@
"x-appwrite": {
"method": "getExecution",
"group": "executions",
"weight": 467,
"weight": 469,
"cookies": false,
"type": "",
"demo": "functions\/get-execution.md",
@@ -7240,7 +7240,7 @@
"x-appwrite": {
"method": "createSubscriber",
"group": "subscribers",
"weight": 296,
"weight": 298,
"cookies": false,
"type": "",
"demo": "messaging\/create-subscriber.md",
@@ -7324,7 +7324,7 @@
"x-appwrite": {
"method": "deleteSubscriber",
"group": "subscribers",
"weight": 300,
"weight": 302,
"cookies": false,
"type": "",
"demo": "messaging\/delete-subscriber.md",
@@ -8153,7 +8153,7 @@
"x-appwrite": {
"method": "listTransactions",
"group": "transactions",
"weight": 441,
"weight": 443,
"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": 439,
"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": 440,
"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": 441,
"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": 442,
"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": 444,
"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": 435,
"cookies": false,
"type": "",
"demo": "tablesdb\/list-rows.md",
@@ -8658,7 +8676,7 @@
"x-appwrite": {
"method": "createRow",
"group": "rows",
"weight": 425,
"weight": 427,
"cookies": false,
"type": "",
"demo": "tablesdb\/create-row.md",
@@ -8807,7 +8825,7 @@
"x-appwrite": {
"method": "getRow",
"group": "rows",
"weight": 426,
"weight": 428,
"cookies": false,
"type": "",
"demo": "tablesdb\/get-row.md",
@@ -8907,7 +8925,7 @@
"x-appwrite": {
"method": "upsertRow",
"group": "rows",
"weight": 429,
"weight": 431,
"cookies": false,
"type": "",
"demo": "tablesdb\/upsert-row.md",
@@ -9048,7 +9066,7 @@
"x-appwrite": {
"method": "updateRow",
"group": "rows",
"weight": 427,
"weight": 429,
"cookies": false,
"type": "",
"demo": "tablesdb\/update-row.md",
@@ -9153,7 +9171,7 @@
"x-appwrite": {
"method": "deleteRow",
"group": "rows",
"weight": 431,
"weight": 433,
"cookies": false,
"type": "",
"demo": "tablesdb\/delete-row.md",
@@ -9250,7 +9268,7 @@
"x-appwrite": {
"method": "decrementRowColumn",
"group": "rows",
"weight": 436,
"weight": 438,
"cookies": false,
"type": "",
"demo": "tablesdb\/decrement-row-column.md",
@@ -9367,7 +9385,7 @@
"x-appwrite": {
"method": "incrementRowColumn",
"group": "rows",
"weight": 435,
"weight": 437,
"cookies": false,
"type": "",
"demo": "tablesdb\/increment-row-column.md",
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+180
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'])
@@ -1372,6 +1454,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'])
+4 -4
View File
@@ -175,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 {
@@ -246,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));
}
}
}
@@ -467,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));
}
}
}
@@ -1451,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) {
+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
@@ -62,7 +62,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.*",
@@ -0,0 +1 @@
Create a new Resend provider.
@@ -0,0 +1 @@
Update a Resend provider by its unique ID.
@@ -5,6 +5,8 @@ namespace Appwrite\Platform\Modules\Compute;
use Appwrite\Event\Build;
use Appwrite\Extend\Exception;
use Appwrite\Platform\Action;
use Appwrite\Platform\Modules\Compute\Validator\Specification as SpecificationValidator;
use Utopia\Config\Config;
use Utopia\Database\Database;
use Utopia\Database\Document;
use Utopia\Database\Exception\Duplicate;
@@ -19,6 +21,37 @@ use Utopia\VCS\Exception\RepositoryNotFound;
class Base extends Action
{
/**
* Get default specification based on plan and available specifications.
*
* @param array $plan The billing plan configuration
* @return string The appropriate default specification
*/
protected function getDefaultSpecification(array $plan): string
{
$specifications = Config::getParam('specifications', []);
if (empty($specifications)) {
return APP_COMPUTE_SPECIFICATION_DEFAULT;
}
$specificationValidator = new SpecificationValidator(
$plan,
$specifications,
System::getEnv('_APP_COMPUTE_CPUS', 0),
System::getEnv('_APP_COMPUTE_MEMORY', 0)
);
$allowedSpecifications = $specificationValidator->getAllowedSpecifications();
// If there is no plan use the highest specification
if (empty($plan)) {
return end($allowedSpecifications) ?? APP_COMPUTE_SPECIFICATION_DEFAULT;
}
// Otherwise, use the lowest specification available in the plan
return $allowedSpecifications[0] ?? APP_COMPUTE_SPECIFICATION_DEFAULT;
}
public function redeployVcsFunction(Request $request, Document $function, Document $project, Document $installation, Database $dbForProject, Build $queueForBuilds, Document $template, GitHub $github, bool $activate, string $referenceType = 'branch', string $reference = ''): Document
{
$deploymentId = ID::unique();
@@ -93,7 +93,7 @@ class Create extends Base
->param('providerBranch', '', new Text(128, 0), 'Production branch for the repo linked to the function.', true)
->param('providerSilentMode', false, new Boolean(), 'Is the VCS (Version Control System) connection in silent mode for the repo linked to the function? In silent mode, comments will not be made on commits and pull requests.', true)
->param('providerRootDirectory', '', new Text(128, 0), 'Path to function code in the linked repo.', true)
->param('specification', APP_COMPUTE_SPECIFICATION_DEFAULT, fn (array $plan) => new Specification(
->param('specification', fn (array $plan) => $this->getDefaultSpecification($plan), fn (array $plan) => new Specification(
$plan,
Config::getParam('specifications', []),
System::getEnv('_APP_COMPUTE_CPUS', 0),
@@ -89,7 +89,7 @@ class Update extends Base
->param('providerBranch', '', new Text(128, 0), 'Production branch for the repo linked to the function', true)
->param('providerSilentMode', false, new Boolean(), 'Is the VCS (Version Control System) connection in silent mode for the repo linked to the function? In silent mode, comments will not be made on commits and pull requests.', true)
->param('providerRootDirectory', '', new Text(128, 0), 'Path to function code in the linked repo.', true)
->param('specification', APP_COMPUTE_SPECIFICATION_DEFAULT, fn (array $plan) => new Specification(
->param('specification', fn (array $plan) => $this->getDefaultSpecification($plan), fn (array $plan) => new Specification(
$plan,
Config::getParam('specifications', []),
System::getEnv('_APP_COMPUTE_CPUS', 0),
@@ -467,11 +467,10 @@ class Builds extends Action
}
$providerCommitHash = \trim($stdout);
$authorUrl = "https://github.com/$cloneOwner";
$deployment->setAttribute('providerCommitHash', $providerCommitHash ?? '');
$deployment->setAttribute('providerCommitAuthorUrl', $authorUrl);
$deployment->setAttribute('providerCommitAuthor', 'Appwrite');
$deployment->setAttribute('providerCommitAuthorUrl', APP_VCS_GITHUB_URL);
$deployment->setAttribute('providerCommitAuthor', APP_VCS_GITHUB_USERNAME);
$deployment->setAttribute('providerCommitMessage', "Create '" . $resource->getAttribute('name', '') . "' function");
$deployment->setAttribute('providerCommitUrl', "https://github.com/$cloneOwner/$cloneRepository/commit/$providerCommitHash");
$deployment = $dbForProject->updateDocument('deployments', $deployment->getId(), $deployment);
@@ -102,17 +102,15 @@ class Get extends Action
throw new Exception(Exception::DEPLOYMENT_NOT_FOUND);
}
$response
->setContentType('application/gzip')
->addHeader('Cache-Control', 'no-cache, no-store, must-revalidate')
->addHeader('Expires', '0')
->addHeader('Pragma', 'no-cache')
->addHeader('X-Peak', \memory_get_peak_usage())
->addHeader('Content-Disposition', 'attachment; filename="' . $deploymentId . '-' . $type . '.tar.gz"');
$size = $device->getFileSize($path);
$rangeHeader = $request->getHeader('range');
$response
->setContentType('application/gzip')
->addHeader('Cache-Control', 'private, max-age=3888000') // 45 days
->addHeader('X-Peak', \memory_get_peak_usage())
->addHeader('Content-Disposition', 'attachment; filename="' . $deploymentId . '-' . $type . '.tar.gz"');
if (!empty($rangeHeader)) {
$start = $request->getRangeStart();
$end = $request->getRangeEnd();
@@ -133,6 +131,7 @@ class Get extends Action
->setStatusCode(Response::STATUS_CODE_PARTIALCONTENT);
$response->send($device->read($path, $start, ($end - $start + 1)));
return;
}
if ($size > APP_STORAGE_READ_BUFFER) {
@@ -78,7 +78,7 @@ class Create extends Base
->param('providerBranch', '', new Text(128, 0), 'Production branch for the repo linked to the site.', true)
->param('providerSilentMode', false, new Boolean(), 'Is the VCS (Version Control System) connection in silent mode for the repo linked to the site? In silent mode, comments will not be made on commits and pull requests.', true)
->param('providerRootDirectory', '', new Text(128, 0), 'Path to site code in the linked repo.', true)
->param('specification', APP_COMPUTE_SPECIFICATION_DEFAULT, fn (array $plan) => new Specification(
->param('specification', fn (array $plan) => $this->getDefaultSpecification($plan), fn (array $plan) => new Specification(
$plan,
Config::getParam('specifications', []),
System::getEnv('_APP_COMPUTE_CPUS', 0),
@@ -82,7 +82,7 @@ class Update extends Base
->param('providerBranch', '', new Text(128, 0), 'Production branch for the repo linked to the site.', true)
->param('providerSilentMode', false, new Boolean(), 'Is the VCS (Version Control System) connection in silent mode for the repo linked to the site? In silent mode, comments will not be made on commits and pull requests.', true)
->param('providerRootDirectory', '', new Text(128, 0), 'Path to site code in the linked repo.', true)
->param('specification', APP_COMPUTE_SPECIFICATION_DEFAULT, fn (array $plan) => new Specification(
->param('specification', fn (array $plan) => $this->getDefaultSpecification($plan), fn (array $plan) => new Specification(
$plan,
Config::getParam('specifications', []),
System::getEnv('_APP_COMPUTE_CPUS', 0),
@@ -16,6 +16,7 @@ use Utopia\DSN\DSN;
use Utopia\Logger\Log;
use Utopia\Messaging\Adapter\Email as EmailAdapter;
use Utopia\Messaging\Adapter\Email\Mailgun;
use Utopia\Messaging\Adapter\Email\Resend;
use Utopia\Messaging\Adapter\Email\Sendgrid;
use Utopia\Messaging\Adapter\Email\SMTP;
use Utopia\Messaging\Adapter\Push\APNS;
@@ -506,6 +507,7 @@ class Messaging extends Action
$credentials['isEuRegion'] ?? false
),
'sendgrid' => new Sendgrid($apiKey),
'resend' => new Resend($apiKey),
default => null
};
}
@@ -435,7 +435,6 @@ class StatsUsage extends Action
return $cmp;
}
unset($this->projects[$sequence]);
// Period ASC
$cmp = strcmp($a['period'], $b['period']);
if ($cmp !== 0) {
+22
View File
@@ -292,6 +292,7 @@ trait Base
// Providers
public const string CREATE_MAILGUN_PROVIDER = 'create_mailgun_provider';
public const string CREATE_SENDGRID_PROVIDER = 'create_sendgrid_provider';
public const string CREATE_RESEND_PROVIDER = 'create_resend_provider';
public const string CREATE_SMTP_PROVIDER = 'create_smtp_provider';
public const string CREATE_TWILIO_PROVIDER = 'create_twilio_provider';
public const string CREATE_TELESIGN_PROVIDER = 'create_telesign_provider';
@@ -304,6 +305,7 @@ trait Base
public const string GET_PROVIDER = 'get_provider';
public const string UPDATE_MAILGUN_PROVIDER = 'update_mailgun_provider';
public const string UPDATE_SENDGRID_PROVIDER = 'update_sendgrid_provider';
public const string UPDATE_RESEND_PROVIDER = 'update_resend_provider';
public const string UPDATE_SMTP_PROVIDER = 'update_smtp_provider';
public const string UPDATE_TWILIO_PROVIDER = 'update_twilio_provider';
public const string UPDATE_TELESIGN_PROVIDER = 'update_telesign_provider';
@@ -2494,6 +2496,16 @@ trait Base
enabled
}
}';
case self::CREATE_RESEND_PROVIDER:
return 'mutation createResendProvider($providerId: String!, $name: String!, $apiKey: String!, $fromName: String!, $fromEmail: String!, $replyToName: String, $replyToEmail: String) {
messagingCreateResendProvider(providerId: $providerId, name: $name, apiKey: $apiKey, fromName: $fromName, fromEmail: $fromEmail, replyToName: $replyToName, replyToEmail: $replyToEmail) {
_id
name
provider
type
enabled
}
}';
case self::CREATE_SMTP_PROVIDER:
return 'mutation createSmtpProvider($providerId: String!, $name: String!, $host: String!, $port: Int!, $username: String!, $password: String!, $encryption: String!, $autoTLS: Boolean! $fromName: String!, $fromEmail: String!, $replyToName: String, $replyToEmail: String) {
messagingCreateSmtpProvider(providerId: $providerId, name: $name, host: $host, port: $port, username: $username, password: $password, encryption: $encryption, autoTLS: $autoTLS, fromName: $fromName, fromEmail: $fromEmail, replyToName: $replyToName, replyToEmail: $replyToEmail) {
@@ -2618,6 +2630,16 @@ trait Base
enabled
}
}';
case self::UPDATE_RESEND_PROVIDER:
return 'mutation messagingUpdateResendProvider($providerId: String!, $name: String!, $apiKey: String!, $enabled: Boolean, $fromName: String, $fromEmail: String, $replyToName: String, $replyToEmail: String) {
messagingUpdateResendProvider(providerId: $providerId, name: $name, apiKey: $apiKey, enabled: $enabled, fromName: $fromName, fromEmail: $fromEmail, replyToName: $replyToName, replyToEmail: $replyToEmail) {
_id
name
provider
type
enabled
}
}';
case self::UPDATE_SMTP_PROVIDER:
return 'mutation updateSmtpProvider($providerId: String!, $name: String!, $host: String!, $port: Int!, $username: String!, $password: String!, $encryption: String!, $autoTLS: Boolean!, $fromName: String, $fromEmail: String, $enabled: Boolean) {
messagingUpdateSmtpProvider(providerId: $providerId, name: $name, host: $host, port: $port, username: $username, password: $password, encryption: $encryption, autoTLS: $autoTLS, fromName: $fromName, fromEmail: $fromEmail, enabled: $enabled) {
+22 -10
View File
@@ -26,6 +26,13 @@ class MessagingTest extends Scope
'fromName' => 'Sender Name',
'fromEmail' => 'sender-email@my-domain.com',
],
'Resend' => [
'providerId' => ID::unique(),
'name' => 'Resend1',
'apiKey' => 'my-apikey',
'fromName' => 'Sender Name',
'fromEmail' => 'sender-email@my-domain.com',
],
'Mailgun' => [
'providerId' => ID::unique(),
'name' => 'Mailgun1',
@@ -123,45 +130,50 @@ class MessagingTest extends Scope
'name' => 'Sengrid2',
'apiKey' => 'my-apikey',
],
'Mailgun' => [
'Resend' => [
'providerId' => $providers[1]['_id'],
'name' => 'Resend2',
'apiKey' => 'my-apikey',
],
'Mailgun' => [
'providerId' => $providers[2]['_id'],
'name' => 'Mailgun2',
'apiKey' => 'my-apikey',
'domain' => 'my-domain',
],
'Twilio' => [
'providerId' => $providers[2]['_id'],
'providerId' => $providers[3]['_id'],
'name' => 'Twilio2',
'accountSid' => 'my-accountSid',
'authToken' => 'my-authToken',
],
'Telesign' => [
'providerId' => $providers[3]['_id'],
'providerId' => $providers[4]['_id'],
'name' => 'Telesign2',
'customerId' => 'my-username',
'apiKey' => 'my-password',
],
'Textmagic' => [
'providerId' => $providers[4]['_id'],
'providerId' => $providers[5]['_id'],
'name' => 'Textmagic2',
'username' => 'my-username',
'apiKey' => 'my-apikey',
],
'Msg91' => [
'providerId' => $providers[5]['_id'],
'providerId' => $providers[6]['_id'],
'name' => 'Ms91-2',
'senderId' => 'my-senderid',
'authKey' => 'my-authkey',
'templateId' => '123456',
],
'Vonage' => [
'providerId' => $providers[6]['_id'],
'providerId' => $providers[7]['_id'],
'name' => 'Vonage2',
'apiKey' => 'my-apikey',
'apiSecret' => 'my-apisecret',
],
'Fcm' => [
'providerId' => $providers[7]['_id'],
'providerId' => $providers[8]['_id'],
'name' => 'FCM2',
'serviceAccountJSON' => [
'type' => 'service_account',
@@ -171,7 +183,7 @@ class MessagingTest extends Scope
]
],
'Apns' => [
'providerId' => $providers[8]['_id'],
'providerId' => $providers[9]['_id'],
'name' => 'APNS2',
'authKey' => 'my-authkey',
'authKeyId' => 'my-authkeyid',
@@ -205,7 +217,7 @@ class MessagingTest extends Scope
], [
'query' => $this->getQuery('update_mailgun_provider'),
'variables' => [
'providerId' => $providers[1]['_id'],
'providerId' => $providers[2]['_id'],
'name' => 'Mailgun2',
'apiKey' => 'my-apikey',
'domain' => 'my-domain',
@@ -213,7 +225,7 @@ class MessagingTest extends Scope
'enabled' => false,
]
]);
$providers[1] = $response['body']['data']['messagingUpdateMailgunProvider'];
$providers[2] = $response['body']['data']['messagingUpdateMailgunProvider'];
$this->assertEquals(200, $response['headers']['status-code']);
$this->assertEquals('Mailgun2', $response['body']['data']['messagingUpdateMailgunProvider']['name']);
$this->assertEquals(false, $response['body']['data']['messagingUpdateMailgunProvider']['enabled']);
+14 -3
View File
@@ -25,6 +25,13 @@ trait MessagingBase
'apiKey' => 'my-apikey',
'from' => 'sender-email@my-domain.com',
],
'resend' => [
'providerId' => ID::unique(),
'name' => 'Resend1',
'apiKey' => 'my-apikey',
'fromName' => 'Sender Name',
'fromEmail' => 'sender-email@my-domain.com',
],
'mailgun' => [
'providerId' => ID::unique(),
'name' => 'Mailgun1',
@@ -132,6 +139,10 @@ trait MessagingBase
'name' => 'Sengrid2',
'apiKey' => 'my-apikey',
],
'resend' => [
'name' => 'Resend2',
'apiKey' => 'my-apikey',
],
'mailgun' => [
'name' => 'Mailgun2',
'apiKey' => 'my-apikey',
@@ -210,7 +221,7 @@ trait MessagingBase
$providers[$index] = $response['body'];
}
$response = $this->client->call(Client::METHOD_PATCH, '/messaging/providers/mailgun/' . $providers[1]['$id'], [
$response = $this->client->call(Client::METHOD_PATCH, '/messaging/providers/mailgun/' . $providers[2]['$id'], [
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
'x-appwrite-key' => $this->getProject()['apiKey'],
@@ -226,7 +237,7 @@ trait MessagingBase
$this->assertEquals('Mailgun2', $response['body']['name']);
$this->assertEquals(false, $response['body']['enabled']);
$providers[1] = $response['body'];
$providers[2] = $response['body'];
return $providers;
}
@@ -269,7 +280,7 @@ trait MessagingBase
]);
$this->assertEquals(200, $response['headers']['status-code']);
$this->assertEquals(11, \count($response['body']['providers']));
$this->assertEquals(12, \count($response['body']['providers']));
return $providers;
}
@@ -0,0 +1,75 @@
<?php
namespace Tests\Unit\Platform\Modules\Compute\Validator;
use Appwrite\Platform\Modules\Compute\Specification as SpecificationConstants;
use Appwrite\Platform\Modules\Compute\Validator\Specification;
use PHPUnit\Framework\TestCase;
use Utopia\Config\Config;
class SpecificationTest extends TestCase
{
private array $specifications;
protected function setUp(): void
{
parent::setUp();
$this->specifications = Config::getParam('specifications', []);
}
public function testGetAllowedSpecificationsNoLimits(): void
{
$validator = new Specification(
plan: [],
specifications: $this->specifications,
maxCpus: 0,
maxMemory: 0
);
$allowed = $validator->getAllowedSpecifications();
$this->assertCount(count($this->specifications), $allowed);
$this->assertEquals(
$this->specifications[array_key_last($this->specifications)]['slug'],
$allowed[array_key_last($allowed)]
);
}
public function testGetAllowedSpecificationsWithMaxCpusAndMemory(): void
{
$validator = new Specification(
plan: [],
specifications: $this->specifications,
maxCpus: 2,
maxMemory: 2048
);
$allowed = $validator->getAllowedSpecifications();
$this->assertCount(4, $allowed);
$this->assertEquals(
SpecificationConstants::S_2VCPU_2GB,
$allowed[array_key_last($allowed)]
);
}
public function testGetAllowedSpecificationsWithPlanLimits(): void
{
$plan = [
'runtimeSpecifications' => [
SpecificationConstants::S_05VCPU_512MB,
SpecificationConstants::S_1VCPU_512MB
]
];
$validator = new Specification(
plan: $plan,
specifications: $this->specifications,
maxCpus: 0,
maxMemory: 0
);
$allowed = $validator->getAllowedSpecifications();
$this->assertCount(2, $allowed);
$this->assertContains(SpecificationConstants::S_05VCPU_512MB, $allowed);
$this->assertContains(SpecificationConstants::S_1VCPU_512MB, $allowed);
}
}