mirror of
https://github.com/appwrite/appwrite.git
synced 2026-05-26 13:51:13 +00:00
Compare commits
58
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e6384557c8 | ||
|
|
7ecba8c0f2 | ||
|
|
46038c9fef | ||
|
|
bb3143128f | ||
|
|
f3d6eb09dd | ||
|
|
a735e969ec | ||
|
|
3ca1f3065f | ||
|
|
2c9da8a1c4 | ||
|
|
f5f549b520 | ||
|
|
5da1dd26bc | ||
|
|
fef9b6dfd3 | ||
|
|
1483e08754 | ||
|
|
740baec56a | ||
|
|
c92217afb9 | ||
|
|
db5c29742d | ||
|
|
816a203e73 | ||
|
|
363011ee32 | ||
|
|
51e5b50ae7 | ||
|
|
342b9f2910 | ||
|
|
71c21a7bd8 | ||
|
|
f8c22a6700 | ||
|
|
01465f5c8d | ||
|
|
7301704762 | ||
|
|
f8b89b2294 | ||
|
|
4cf226f733 | ||
|
|
8902942e83 | ||
|
|
8e02115828 | ||
|
|
a49c3a33f0 | ||
|
|
6080a363ee | ||
|
|
3887ba69d7 | ||
|
|
d19f205207 | ||
|
|
cfc36a9f47 | ||
|
|
52e5947822 | ||
|
|
08b539ba05 | ||
|
|
4e780c0f75 | ||
|
|
3211867f6a | ||
|
|
d1c5ec4585 | ||
|
|
f90034a510 | ||
|
|
701f0bbd4d | ||
|
|
c0bea3d833 | ||
|
|
53a9c87f42 | ||
|
|
03bfed4e25 | ||
|
|
96359b8f6a | ||
|
|
16c7aa230d | ||
|
|
5ea1268107 | ||
|
|
c856ffef45 | ||
|
|
6509f19773 | ||
|
|
8ec13eb221 | ||
|
|
19f965befe | ||
|
|
4077dc48b4 | ||
|
|
14f38343f5 | ||
|
|
dd04c005aa | ||
|
|
0328134cbc | ||
|
|
a65f3b1f4a | ||
|
|
11c93f800f | ||
|
|
c673662a34 | ||
|
|
092322ff4e | ||
|
|
e4d8d38c6e |
@@ -13,8 +13,13 @@ on:
|
||||
schedule:
|
||||
- cron: '0 16 * * 0'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
permissions:
|
||||
security-events: write
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
name: "Console SDK Preview"
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- 'app/config/specs/*-latest-console.json'
|
||||
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
name: Setup & Build Console SDK
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Load and Start Appwrite
|
||||
run: |
|
||||
docker compose build
|
||||
docker compose up -d
|
||||
docker compose exec appwrite sdks --platform=console --sdk=web --version=latest --git=no
|
||||
sudo chown -R $USER:$USER ./app/sdks/console-web
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
- name: Build and Publish SDK
|
||||
working-directory: ./app/sdks/console-web
|
||||
run: |
|
||||
npm install
|
||||
npm run build
|
||||
npx pkg-pr-new publish --comment=update
|
||||
@@ -16,3 +16,4 @@ dev/yasd_init.php
|
||||
.phpunit.result.cache
|
||||
Makefile
|
||||
appwrite.json
|
||||
/.zed/
|
||||
+7
-13
@@ -1,6 +1,6 @@
|
||||
# Contributing
|
||||
|
||||
We would ❤️ you to contribute to Appwrite and help make it better! We want contributing to Appwrite to be fun, enjoyable, and educational for anyone and everyone. All contributions are welcome, including issues, and new docs, as well as updates and tweaks, blog posts, workshops, and more.
|
||||
We would :heart: you to contribute to Appwrite and help make it better! We want contributing to Appwrite to be fun, enjoyable, and educational for anyone and everyone. All contributions are welcome, including issues, and new docs, as well as updates and tweaks, blog posts, workshops, and more.
|
||||
|
||||
## Here for Hacktoberfest?
|
||||
If you're here to contribute during Hacktoberfest, we're so happy to see you here. Appwrite has been a long-time participant of Hacktoberfest and we welcome you, whatever your experience level. This year, we're **only taking contributions for issues tagged** `hacktoberfest`, so we can focus our resources to support your contributions.
|
||||
@@ -9,13 +9,13 @@ You can [find issues using this query](https://github.com/search?q=org%3Aappwrit
|
||||
|
||||
## How to Start?
|
||||
|
||||
If you are worried or don’t know where to start, check out the next section that explains what kind of help we could use and where you can get involved. You can send your questions to [@appwrite](https://twitter.com/appwrite) on Twitter or to anyone from the [Appwrite team on Discord](https://appwrite.io/discord). You can also submit an issue, and a maintainer can guide you!
|
||||
If you are worried or don’t know where to start, check out the next section that explains what kind of help we could use and where you can get involved. You can send your questions to [@appwrite on Twitter](https://twitter.com/appwrite) or to anyone from the [Appwrite team on Discord](https://appwrite.io/discord). You can also submit an issue, and a maintainer can guide you!
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
Help us keep Appwrite open and inclusive. Please read and follow our [Code of Conduct](https://github.com/appwrite/.github/blob/main/CODE_OF_CONDUCT.md).
|
||||
|
||||
## Submit a Pull Request 🚀
|
||||
## Submit a Pull Request :rocket:
|
||||
|
||||
Branch naming convention is as following
|
||||
|
||||
@@ -65,13 +65,13 @@ Now, go a step further by running the linter using the following command to manu
|
||||
composer lint <your file path>
|
||||
```
|
||||
|
||||
This will give you a list of errors to rectify. If you need more information on the errors, you can pass in additional command line arguments to get more verbose information. More lists of available arguments can be found [here](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Usage). A very useful command line argument is `--report=diff`. This will give you the expected changes by the linter for easy fixing of formatting issues.
|
||||
This will give you a list of errors to rectify. If you need more information on the errors, you can pass in additional command line arguments to get more verbose information. More lists of available arguments can be found [on PHP_Codesniffer usage Wiki](https://github.com/squizlabs/PHP_CodeSniffer/wiki/Usage). A very useful command line argument is `--report=diff`. This will give you the expected changes by the linter for easy fixing of formatting issues.
|
||||
|
||||
```bash
|
||||
composer lint --report=diff <your file path>
|
||||
```
|
||||
|
||||
5. Push changes to GitHub.
|
||||
5. Push changes to GitHub
|
||||
|
||||
```
|
||||
$ git push origin [name_of_your_new_branch]
|
||||
@@ -301,7 +301,7 @@ Adding a new dependency should have vital value for the product with minimum pos
|
||||
|
||||
## Introducing New Features
|
||||
|
||||
We would 💖 you to contribute to Appwrite, but we also want to ensure Appwrite is loyal to its vision and mission statement 🙏.
|
||||
We would :sparkling_heart: you to contribute to Appwrite, but we also want to ensure Appwrite is loyal to its vision and mission statement :pray:.
|
||||
|
||||
For us to find the right balance, please open an issue explaining your ideas before introducing a new pull request.
|
||||
|
||||
@@ -319,16 +319,10 @@ These are the current metrics we collect usage stats for:
|
||||
| users | Total number of users per project|
|
||||
| executions | Total number of executions per project |
|
||||
| databases | Total number of databases per project |
|
||||
| databases.storage | Total amount of storage used by all databases per project (in bytes) |
|
||||
| databases.storage_disk | Total amount of storage used by all database per project on disk (in bytes) |
|
||||
| collections | Total number of collections per project |
|
||||
| {databaseInternalId}.collections | Total number of collections per database|
|
||||
| {databaseInternalId}.storage | Sum of database storage (in bytes) |
|
||||
| {databaseInternalId}.storage_disk | Sum of database storage on disk (in bytes) |
|
||||
| documents | Total number of documents per project |
|
||||
| {databaseInternalId}.{collectionInternalId}.documents | Total number of documents per collection |
|
||||
| {databaseInternalId}.{collectionInternalId}.storage | Sum of database storage used by the collection (in bytes) |
|
||||
| {databsaeInternalId}.{collectionInternalId}.storage_disk | Sum of database storage used by the collection on disk (in bytes) |
|
||||
| buckets | Total number of buckets per project |
|
||||
| files | Total number of files per project |
|
||||
| {bucketInternalId}.files.storage | Sum of files.storage per bucket (in bytes) |
|
||||
@@ -631,7 +625,7 @@ Pull requests are great, but there are many other ways you can help Appwrite.
|
||||
|
||||
### Blogging & Speaking
|
||||
|
||||
Blogging, speaking about, or creating tutorials about one of Appwrite’s many features are great ways to get the word out about Appwrite. Mention [@appwrite](https://twitter.com/appwrite) on Twitter and/or [email team@appwrite.io](mailto:team@appwrite.io) so we can give pointers and tips and help you spread the word by promoting your content on the different Appwrite communication channels. Please add your blog posts and videos of talks to our [Awesome Appwrite](https://github.com/appwrite/awesome-appwrite) repo on GitHub.
|
||||
Blogging, speaking about, or creating tutorials about one of Appwrite’s many features are great ways to get the word out about Appwrite. Mention [@appwrite on Twitter](https://twitter.com/appwrite) and/or [email team@appwrite.io](mailto:team@appwrite.io) so we can give pointers and tips and help you spread the word by promoting your content on the different Appwrite communication channels. Please add your blog posts and videos of talks to our [Awesome Appwrite](https://github.com/appwrite/awesome-appwrite) repo on GitHub.
|
||||
|
||||
### Presenting at Meetups
|
||||
|
||||
|
||||
+58
-22
@@ -1,8 +1,8 @@
|
||||
> 好消息!Appwrite 云现已进入公开测试版!立即访问 cloud.appwrite.io 注册,体验无忧的托管服务。今天就加入我们的云端吧!☁️🎉
|
||||
> 好消息!Appwrite 云现已进入公开测试版!立即访问 cloud.appwrite.io 注册,体验无忧的托管服务。今天就加入我们的云端吧!:cloud: :tada:
|
||||
|
||||
<br />
|
||||
<p align="center">
|
||||
<a href="https://appwrite.io" target="_blank"><img src="./public/images/banner.png" alt="Appwrite Logo"></a>
|
||||
<a href="https://appwrite.io" target="_blank"><img src="./public/images/banner.png" alt="Appwrite banner with logo and slogan build like a team of hundreds""></a>
|
||||
<br />
|
||||
<br />
|
||||
<b>适用于[Flutter/Vue/Angular/React/iOS/Android/* 等等平台 *]的完整后端服务</b>
|
||||
@@ -36,6 +36,8 @@ Appwrite 可以提供给开发者用户验证,外部授权,用户数据读
|
||||
|
||||
内容:
|
||||
|
||||
|
||||
- [开始](#开始)
|
||||
- [安装](#安装)
|
||||
- [Unix](#unix)
|
||||
- [Windows](#windows)
|
||||
@@ -54,6 +56,9 @@ Appwrite 可以提供给开发者用户验证,外部授权,用户数据读
|
||||
- [订阅我们](#订阅我们)
|
||||
- [版权说明](#版权说明)
|
||||
|
||||
## 开始
|
||||
要轻松开始使用Appwrite,您可以[**免费注册Appwrite Cloud**](https://cloud.appwrite.io/)。在Appwrite Cloud公开测试版期间,您可以完全免费使用Appwrite,而且我们不会收集您的信用卡信息。
|
||||
|
||||
## 安装
|
||||
|
||||
Appwrite 的容器化服务器只需要一行指令就可以运行。您可以使用 docker-compose 在本地主机上运行 Appwrite,也可以在任何其他容器化工具(如 [Kubernetes](https://kubernetes.io/docs/home/)、[Docker Swarm](https://docs.docker.com/engine/swarm/) 或 [Rancher](https://rancher.com/docs/))上运行 Appwrite。
|
||||
@@ -98,7 +103,42 @@ docker run -it --rm `
|
||||
|
||||
### 从旧版本升级
|
||||
|
||||
如果您从旧版本升级 Appwrite 服务器,则应在设置完成后使用 Appwrite 迁移工具。有关这方面的更多信息,请查看 [安装文档](https://appwrite.io/docs/installation)。
|
||||
如果您从旧版本升级 Appwrite 服务器,则应在设置完成后使用 Appwrite 迁移工具。有关这方面的更多信息,请查看 [安装文档](https://appwrite.io/docs/self-hosting)。
|
||||
|
||||
## 一键配置
|
||||
|
||||
除了在本地运行 Appwrite,您还可以使用预配置的设置启动 Appwrite。这样可以让您快速启动并运行 Appwrite,而无需在本地计算机上安装 Docker。
|
||||
|
||||
请从以下提供商中选择一个:
|
||||
|
||||
<table border="0">
|
||||
<tr>
|
||||
<td align="center" width="100" height="100">
|
||||
<a href="https://marketplace.digitalocean.com/apps/appwrite">
|
||||
<img width="50" height="39" src="public/images/integrations/digitalocean-logo.svg" alt="DigitalOcean Logo" />
|
||||
<br /><sub><b>DigitalOcean</b></sub></a>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" width="100" height="100">
|
||||
<a href="https://gitpod.io/#https://github.com/appwrite/integration-for-gitpod">
|
||||
<img width="50" height="39" src="public/images/integrations/gitpod-logo.svg" alt="Gitpod Logo" />
|
||||
<br /><sub><b>Gitpod</b></sub></a>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" width="100" height="100">
|
||||
<a href="https://www.linode.com/marketplace/apps/appwrite/appwrite/">
|
||||
<img width="50" height="39" src="public/images/integrations/akamai-logo.svg" alt="Akamai Logo" />
|
||||
<br /><sub><b>Akamai Compute</b></sub></a>
|
||||
</a>
|
||||
</td>
|
||||
<td align="center" width="100" height="100">
|
||||
<a href="https://aws.amazon.com/marketplace/pp/prodview-2hiaeo2px4md6">
|
||||
<img width="50" height="39" src="public/images/integrations/aws-logo.svg" alt="AWS Logo" />
|
||||
<br /><sub><b>AWS Marketplace</b></sub></a>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## 入门
|
||||
|
||||
@@ -146,29 +186,25 @@ docker run -it --rm `
|
||||
以下是当前支持的平台和语言列表。如果您想帮助我们为您选择的平台添加支持,您可以访问我们的 [SDK 生成器](https://github.com/appwrite/sdk-generator) 项目并查看我们的 [贡献指南](https://github.com/appwrite/sdk-generator/blob/master/CONTRIBUTING.md)。
|
||||
|
||||
#### 客户端
|
||||
|
||||
- ✅ [Web](https://github.com/appwrite/sdk-for-web) (由 Appwrite 团队维护)
|
||||
- ✅ [Flutter](https://github.com/appwrite/sdk-for-flutter) (由 Appwrite 团队维护)
|
||||
- ✅ [Apple](https://github.com/appwrite/sdk-for-apple) (由 Appwrite 团队维护)
|
||||
- ✅ [Android](https://github.com/appwrite/sdk-for-android) (由 Appwrite 团队维护)
|
||||
- ✅ [React Native](https://github.com/appwrite/sdk-for-react-native) - **公测** (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Web](https://github.com/appwrite/sdk-for-web) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Flutter](https://github.com/appwrite/sdk-for-flutter) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Apple](https://github.com/appwrite/sdk-for-apple) - **公测** (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Android](https://github.com/appwrite/sdk-for-android) (由 Appwrite 团队维护)
|
||||
|
||||
#### 服务器
|
||||
|
||||
- ✅ [NodeJS](https://github.com/appwrite/sdk-for-node) (由 Appwrite 团队维护)
|
||||
- ✅ [PHP](https://github.com/appwrite/sdk-for-php) (由 Appwrite 团队维护)
|
||||
- ✅ [Dart](https://github.com/appwrite/sdk-for-dart) (由 Appwrite 团队维护)
|
||||
- ✅ [Deno](https://github.com/appwrite/sdk-for-deno) (由 Appwrite 团队维护)
|
||||
- ✅ [Ruby](https://github.com/appwrite/sdk-for-ruby) (由 Appwrite 团队维护)
|
||||
- ✅ [Python](https://github.com/appwrite/sdk-for-python) (由 Appwrite 团队维护)
|
||||
- ✅ [Kotlin](https://github.com/appwrite/sdk-for-kotlin) (由 Appwrite 团队维护)
|
||||
- ✅ [Swift](https://github.com/appwrite/sdk-for-swift) (由 Appwrite 团队维护)
|
||||
- ✅ [.NET](https://github.com/appwrite/sdk-for-dotnet) - **公测** (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [NodeJS](https://github.com/appwrite/sdk-for-node) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [PHP](https://github.com/appwrite/sdk-for-php) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Dart](https://github.com/appwrite/sdk-for-dart) - (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Deno](https://github.com/appwrite/sdk-for-deno) - **公测** (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Ruby](https://github.com/appwrite/sdk-for-ruby) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Python](https://github.com/appwrite/sdk-for-python) (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Kotlin](https://github.com/appwrite/sdk-for-kotlin) - **公测** (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [Apple](https://github.com/appwrite/sdk-for-apple) - **公测** (由 Appwrite 团队维护)
|
||||
* :white_check_mark: [.NET](https://github.com/appwrite/sdk-for-dotnet) - **公测** (由 Appwrite 团队维护)
|
||||
|
||||
#### 开发者社区
|
||||
|
||||
- ✅ [Appcelerator Titanium](https://github.com/m1ga/ti.appwrite) (维护者 [Michael Gangolf](https://github.com/m1ga/))
|
||||
- ✅ [Godot Engine](https://github.com/GodotNuts/appwrite-sdk) (维护者 [fenix-hub @GodotNuts](https://github.com/fenix-hub))
|
||||
* :white_check_mark: [Appcelerator Titanium](https://github.com/m1ga/ti.appwrite) (维护者 [Michael Gangolf](https://github.com/m1ga/))
|
||||
* :white_check_mark: [Godot Engine](https://github.com/GodotNuts/appwrite-sdk) (维护者 [fenix-hub @GodotNuts](https://github.com/fenix-hub))
|
||||
|
||||
找不到需要的的 SDK? - 欢迎通过发起 PR 来帮助我们完善 Appwrite 的软件生态环境 [SDK 生成器](https://github.com/appwrite/sdk-generator)!
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
> Appwrite Init has concluded! You can check out all the latest announcements [on our Init website](https://appwrite.io/init) 🚀
|
||||
> Appwrite Init has concluded! You can check out all the latest announcements [on our Init website](https://appwrite.io/init) :rocket:
|
||||
|
||||
<br />
|
||||
<p align="center">
|
||||
<a href="https://appwrite.io" target="_blank"><img src="./public/images/banner.png" alt="Appwrite Logo"></a>
|
||||
<a href="https://appwrite.io" target="_blank"><img src="./public/images/banner.png" alt="Appwrite banner, with logo and text saying "Build Like a Team of Hundreds"></a>
|
||||
<br />
|
||||
<br />
|
||||
<b>Appwrite is a backend platform for developing Web, Mobile, and Flutter applications. Built with the open source community and optimized for developer experience in the coding languages you love.</b>
|
||||
@@ -12,11 +12,11 @@
|
||||
|
||||
<!-- [](https://travis-ci.com/appwrite/appwrite) -->
|
||||
|
||||
[](https://appwrite.io/company/careers)
|
||||
[](https://hacktoberfest.appwrite.io)
|
||||
[](https://appwrite.io/discord?r=Github)
|
||||
[](https://github.com/appwrite/appwrite/actions)
|
||||
[](https://twitter.com/appwrite)
|
||||
[](https://appwrite.io/company/careers)
|
||||
[](https://hacktoberfest.appwrite.io)
|
||||
[](https://appwrite.io/discord?r=Github)
|
||||
[](https://github.com/appwrite/appwrite/actions)
|
||||
[](https://twitter.com/appwrite)
|
||||
|
||||
<!-- [](https://hub.docker.com/r/appwrite/appwrite) -->
|
||||
<!-- [](docs/tutorials/add-translations.md) -->
|
||||
@@ -37,13 +37,14 @@ Using Appwrite, you can easily integrate your app with user authentication and m
|
||||
<br />
|
||||
</p>
|
||||
|
||||

|
||||

|
||||
|
||||
Find out more at: [https://appwrite.io](https://appwrite.io)
|
||||
Find out more at: [https://appwrite.io](https://appwrite.io).
|
||||
|
||||
Table of Contents:
|
||||
|
||||
- [Installation](#installation)
|
||||
- [Getting Started](#getting-started)
|
||||
- [Self-Hosting](#self-hosting)
|
||||
- [Unix](#unix)
|
||||
- [Windows](#windows)
|
||||
- [CMD](#cmd)
|
||||
@@ -62,11 +63,14 @@ Table of Contents:
|
||||
- [Follow Us](#follow-us)
|
||||
- [License](#license)
|
||||
|
||||
## Installation
|
||||
## Getting Started
|
||||
The easiest way to get started with Appwrite is by [signing up for Appwrite Cloud](https://cloud.appwrite.io/). While Appwrite Cloud is in public beta, you can build with Appwrite completely free, and we won't collect you credit card information.
|
||||
|
||||
## Self-Hosting
|
||||
|
||||
Appwrite is designed to run in a containerized environment. Running your server is as easy as running one command from your terminal. You can either run Appwrite on your localhost using docker-compose or on any other container orchestration tool, such as [Kubernetes](https://kubernetes.io/docs/home/), [Docker Swarm](https://docs.docker.com/engine/swarm/), or [Rancher](https://rancher.com/docs/).
|
||||
|
||||
The easiest way to start running your Appwrite server is by running our docker-compose file. Before running the installation command, make sure you have [Docker](https://www.docker.com/products/docker-desktop) installed on your machine:
|
||||
Before running the installation command, make sure you have [Docker](https://www.docker.com/products/docker-desktop) installed on your machine:
|
||||
|
||||
### Unix
|
||||
|
||||
@@ -106,7 +110,7 @@ For advanced production and custom installation, check out our Docker [environme
|
||||
|
||||
### Upgrade from an Older Version
|
||||
|
||||
If you are upgrading your Appwrite server from an older version, you should use the Appwrite migration tool once your setup is completed. For more information regarding this, check out the [Installation Docs](https://appwrite.io/docs/installation).
|
||||
If you are upgrading your Appwrite server from an older version, you should use the Appwrite migration tool once your setup is completed. For more information regarding this, check out the [Installation Docs](https://appwrite.io/docs/self-hosting).
|
||||
|
||||
## One-Click Setups
|
||||
|
||||
@@ -192,34 +196,34 @@ Below is a list of currently supported platforms and languages. If you would lik
|
||||
|
||||
#### Client
|
||||
|
||||
- ✅ [Web](https://github.com/appwrite/sdk-for-web) (Maintained by the Appwrite Team)
|
||||
- ✅ [Flutter](https://github.com/appwrite/sdk-for-flutter) (Maintained by the Appwrite Team)
|
||||
- ✅ [Apple](https://github.com/appwrite/sdk-for-apple) (Maintained by the Appwrite Team)
|
||||
- ✅ [Android](https://github.com/appwrite/sdk-for-android) (Maintained by the Appwrite Team)
|
||||
- ✅ [React Native](https://github.com/appwrite/sdk-for-react-native) - **Beta** (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [Web](https://github.com/appwrite/sdk-for-web) (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [Flutter](https://github.com/appwrite/sdk-for-flutter) (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [Apple](https://github.com/appwrite/sdk-for-apple) (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [Android](https://github.com/appwrite/sdk-for-android) (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [React Native](https://github.com/appwrite/sdk-for-react-native) - **Beta** (Maintained by the Appwrite Team)
|
||||
|
||||
#### Server
|
||||
|
||||
- ✅ [NodeJS](https://github.com/appwrite/sdk-for-node) (Maintained by the Appwrite Team)
|
||||
- ✅ [PHP](https://github.com/appwrite/sdk-for-php) (Maintained by the Appwrite Team)
|
||||
- ✅ [Dart](https://github.com/appwrite/sdk-for-dart) (Maintained by the Appwrite Team)
|
||||
- ✅ [Deno](https://github.com/appwrite/sdk-for-deno) (Maintained by the Appwrite Team)
|
||||
- ✅ [Ruby](https://github.com/appwrite/sdk-for-ruby) (Maintained by the Appwrite Team)
|
||||
- ✅ [Python](https://github.com/appwrite/sdk-for-python) (Maintained by the Appwrite Team)
|
||||
- ✅ [Kotlin](https://github.com/appwrite/sdk-for-kotlin) (Maintained by the Appwrite Team)
|
||||
- ✅ [Swift](https://github.com/appwrite/sdk-for-swift) (Maintained by the Appwrite Team)
|
||||
- ✅ [.NET](https://github.com/appwrite/sdk-for-dotnet) - **Beta** (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [NodeJS](https://github.com/appwrite/sdk-for-node) (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [PHP](https://github.com/appwrite/sdk-for-php) (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [Dart](https://github.com/appwrite/sdk-for-dart) (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [Deno](https://github.com/appwrite/sdk-for-deno) (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [Ruby](https://github.com/appwrite/sdk-for-ruby) (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [Python](https://github.com/appwrite/sdk-for-python) (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [Kotlin](https://github.com/appwrite/sdk-for-kotlin) (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [Swift](https://github.com/appwrite/sdk-for-swift) (Maintained by the Appwrite Team)
|
||||
- :white_check_mark: [.NET](https://github.com/appwrite/sdk-for-dotnet) - **Beta** (Maintained by the Appwrite Team)
|
||||
|
||||
#### Community
|
||||
|
||||
- ✅ [Appcelerator Titanium](https://github.com/m1ga/ti.appwrite) (Maintained by [Michael Gangolf](https://github.com/m1ga/))
|
||||
- ✅ [Godot Engine](https://github.com/GodotNuts/appwrite-sdk) (Maintained by [fenix-hub @GodotNuts](https://github.com/fenix-hub))
|
||||
- :white_check_mark: [Appcelerator Titanium](https://github.com/m1ga/ti.appwrite) (Maintained by [Michael Gangolf](https://github.com/m1ga/))
|
||||
- :white_check_mark: [Godot Engine](https://github.com/GodotNuts/appwrite-sdk) (Maintained by [fenix-hub @GodotNuts](https://github.com/fenix-hub))
|
||||
|
||||
Looking for more SDKs? - Help us by contributing a pull request to our [SDK Generator](https://github.com/appwrite/sdk-generator)!
|
||||
|
||||
## Architecture
|
||||
|
||||

|
||||

|
||||
|
||||
Appwrite uses a microservices architecture that was designed for easy scaling and delegation of responsibilities. In addition, Appwrite supports multiple APIs, such as REST, WebSocket, and GraphQL to allow you to interact with your resources by leveraging your existing knowledge and protocols of choice.
|
||||
|
||||
@@ -229,7 +233,7 @@ The Appwrite API layer was designed to be extremely fast by leveraging in-memory
|
||||
|
||||
All code contributions, including those of people having commit access, must go through a pull request and be approved by a core developer before being merged. This is to ensure a proper review of all the code.
|
||||
|
||||
We truly ❤️ pull requests! If you wish to help, you can learn more about how you can contribute to this project in the [contribution guide](CONTRIBUTING.md).
|
||||
We truly :heart: pull requests! If you wish to help, you can learn more about how you can contribute to this project in the [contribution guide](CONTRIBUTING.md).
|
||||
|
||||
## Security
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
| 1.3.x | :white_check_mark: |
|
||||
| 1.4.x | :white_check_mark: |
|
||||
| 1.5.x | :white_check_mark: |
|
||||
| 1.6.x | :white_check_mark: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
|
||||
@@ -412,6 +412,7 @@ august
|
||||
sammy
|
||||
cool
|
||||
brian
|
||||
brien
|
||||
platinum
|
||||
jake
|
||||
bronco
|
||||
@@ -1935,6 +1936,7 @@ panama
|
||||
lucy
|
||||
buffy
|
||||
brianna
|
||||
brienna
|
||||
welcome1
|
||||
vette
|
||||
blue22
|
||||
@@ -3053,6 +3055,7 @@ randall
|
||||
abstr
|
||||
napster
|
||||
brian1
|
||||
brien1
|
||||
bogart
|
||||
high
|
||||
hitler
|
||||
@@ -4123,6 +4126,7 @@ truman
|
||||
cubbies
|
||||
nitram
|
||||
briana
|
||||
briena
|
||||
ebony
|
||||
kings
|
||||
warner
|
||||
|
||||
@@ -16,5 +16,6 @@ return [
|
||||
'union-china-pay' => ['name' => 'Union China Pay', 'path' => __DIR__ . '/credit-cards/union-china-pay.png'],
|
||||
'visa' => ['name' => 'Visa', 'path' => __DIR__ . '/credit-cards/visa.png'],
|
||||
'mir' => ['name' => 'MIR', 'path' => __DIR__ . '/credit-cards/mir.png'],
|
||||
'maestro' => ['name' => 'Maestro', 'path' => __DIR__ . '/credit-cards/maestro.png']
|
||||
'maestro' => ['name' => 'Maestro', 'path' => __DIR__ . '/credit-cards/maestro.png'],
|
||||
'rupay' => ['name' => 'Rupay', 'path' => __DIR__ . '/credit-cards/rupay.png']
|
||||
];
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 34 KiB |
@@ -2,31 +2,37 @@
|
||||
"settings.inspire": "\"Listin að vera vitur er listin að vita hvað á að líta framhjá.\"",
|
||||
"settings.locale": "is",
|
||||
"settings.direction": "ltr",
|
||||
"emails.sender": "%s Teymi",
|
||||
"emails.verification.subject": "",
|
||||
"emails.verification.hello": "",
|
||||
"emails.verification.body": "",
|
||||
"emails.verification.footer": "",
|
||||
"emails.verification.thanks": "",
|
||||
"emails.verification.signature": "",
|
||||
"emails.magicSession.subject": "",
|
||||
"emails.magicSession.hello": "",
|
||||
"emails.magicSession.body": "",
|
||||
"emails.magicSession.footer": "",
|
||||
"emails.magicSession.thanks": "",
|
||||
"emails.magicSession.signature": "",
|
||||
"emails.recovery.subject": "",
|
||||
"emails.recovery.hello": "",
|
||||
"emails.recovery.body": "",
|
||||
"emails.recovery.footer": "",
|
||||
"emails.recovery.thanks": "",
|
||||
"emails.recovery.signature": "",
|
||||
"emails.sender": "%s teymið",
|
||||
"emails.verification.subject": "Staðfesting aðgangs",
|
||||
"emails.verification.hello": "Hæ {{name}}",
|
||||
"emails.verification.body": "Fylgdu þessum hlekk til að staðfesta netfangið þitt.",
|
||||
"emails.verification.footer": "Ef þú baðst ekki um þessa staðfestingu getur þú hunsað þessi skilaboð.",
|
||||
"emails.verification.thanks": "Takk",
|
||||
"emails.verification.signature": "{{project}} teymið",
|
||||
"emails.magicSession.subject": "Innskrá",
|
||||
"emails.magicSession.hello": "Halló,",
|
||||
"emails.magicSession.body": "Fylgdu þessum hlekk til að skrá þig inn.",
|
||||
"emails.magicSession.footer": "Ef þú baðst ekki um að skrá þig inn með þessum tölvupósti geturðu hunsað þessi skilaboð.",
|
||||
"emails.magicSession.thanks": "Takk",
|
||||
"emails.magicSession.signature": "{{project}} teymið",
|
||||
"emails.recovery.subject": "Breyta lykilorði",
|
||||
"emails.recovery.hello": "Halló {{name}}",
|
||||
"emails.recovery.body": "Fylgdu þessum hlekk til að endurstilla {{project}} lykilorðið þitt.",
|
||||
"emails.recovery.footer": "Ef þú baðst ekki um að endurstilla lykilorðið þitt geturðu hunsað þessi skilaboð.",
|
||||
"emails.recovery.thanks": "Takk",
|
||||
"emails.recovery.signature": "{{project}} teymið",
|
||||
"emails.invitation.subject": "",
|
||||
"emails.invitation.hello": "",
|
||||
"emails.invitation.body": "",
|
||||
"emails.invitation.footer": "",
|
||||
"emails.invitation.thanks": "",
|
||||
"emails.invitation.signature": "",
|
||||
"emails.invitation.hello": "Halló",
|
||||
"emails.invitation.body": "Þessi póstur var sendur til þín vegna þess að {{owner}} vildi bjóða þér að gerast meðlimur í {{team}} teyminu hjá {{project}}.",
|
||||
"emails.invitation.footer": "Ef þú hefur ekki áhuga geturðu hunsað þessi skilaboð.",
|
||||
"emails.invitation.thanks": "Takk",
|
||||
"emails.invitation.signature": "{{project}} teymið",
|
||||
"emails.certificate.subject": "SSL skýrteini - villa hjá %s",
|
||||
"emails.certificate.hello": "Halló",
|
||||
"emails.certificate.body": "Ekki tókst að búa til SSL skýrteinis fyrir '{{domain}}'. Þetta er tilraun nr. {{attempt}}, og bilunin stafaði af: {{error}}",
|
||||
"emails.certificate.footer": "Gamla vottorðið þitt mun gilda í 30 daga frá fyrstu bilun. Við mælum eindregið með því að rannsaka þetta mál, annars endar lénið þitt án gildra SSL-samskipta.",
|
||||
"emails.certificate.thanks": "Takk",
|
||||
"emails.certificate.signature": "{{project}} teymið",
|
||||
"locale.country.unknown": "Óþekktur",
|
||||
"countries.af": "Afganistan",
|
||||
"countries.ao": "Angóla",
|
||||
@@ -245,4 +251,4 @@
|
||||
"emails.otpSession.securityPhrase": "Öryggissetning fyrir þetta tölvupóst er {{phrase}}. Þú getur treyst þessum tölvupósti ef þessi setning passar við setninguna sem birtist við innskráningu.",
|
||||
"emails.otpSession.thanks": "Takk,",
|
||||
"emails.otpSession.signature": "{{project}} liðið"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36747,12 +36747,6 @@
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"storageTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated number of total databases storage in bytes.",
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"databases": {
|
||||
"type": "array",
|
||||
"description": "Aggregated number of databases per period.",
|
||||
@@ -36776,14 +36770,6 @@
|
||||
"$ref": "#\/components\/schemas\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"storage": {
|
||||
"type": "array",
|
||||
"description": "An array of the aggregated number of databases storage in bytes per period.",
|
||||
"items": {
|
||||
"$ref": "#\/components\/schemas\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -36791,11 +36777,9 @@
|
||||
"databasesTotal",
|
||||
"collectionsTotal",
|
||||
"documentsTotal",
|
||||
"storageTotal",
|
||||
"databases",
|
||||
"collections",
|
||||
"documents",
|
||||
"storage"
|
||||
"documents"
|
||||
]
|
||||
},
|
||||
"usageDatabase": {
|
||||
@@ -36819,12 +36803,6 @@
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"storageTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated number of total storage used in bytes.",
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"collections": {
|
||||
"type": "array",
|
||||
"description": "Aggregated number of collections per period.",
|
||||
@@ -36840,24 +36818,14 @@
|
||||
"$ref": "#\/components\/schemas\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"storage": {
|
||||
"type": "array",
|
||||
"description": "Aggregated storage used in bytes per period.",
|
||||
"items": {
|
||||
"$ref": "#\/components\/schemas\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"range",
|
||||
"collectionsTotal",
|
||||
"documentsTotal",
|
||||
"storageTotal",
|
||||
"collections",
|
||||
"documents",
|
||||
"storage"
|
||||
"documents"
|
||||
]
|
||||
},
|
||||
"usageCollection": {
|
||||
@@ -37398,12 +37366,6 @@
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"databasesStorageTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated sum of databases storage size (in bytes).",
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"usersTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated number of users.",
|
||||
@@ -37500,14 +37462,6 @@
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"databasesStorageBreakdown": {
|
||||
"type": "array",
|
||||
"description": "An array of the aggregated breakdown of storage usage by databases.",
|
||||
"items": {
|
||||
"$ref": "#\/components\/schemas\/metricBreakdown"
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"executionsMbSecondsBreakdown": {
|
||||
"type": "array",
|
||||
"description": "Aggregated breakdown in totals of execution mbSeconds by functions.",
|
||||
@@ -37537,7 +37491,6 @@
|
||||
"executionsTotal",
|
||||
"documentsTotal",
|
||||
"databasesTotal",
|
||||
"databasesStorageTotal",
|
||||
"usersTotal",
|
||||
"filesStorageTotal",
|
||||
"functionsStorageTotal",
|
||||
@@ -37552,7 +37505,6 @@
|
||||
"executions",
|
||||
"executionsBreakdown",
|
||||
"bucketsBreakdown",
|
||||
"databasesStorageBreakdown",
|
||||
"executionsMbSecondsBreakdown",
|
||||
"buildsMbSecondsBreakdown",
|
||||
"functionsStorageBreakdown"
|
||||
|
||||
@@ -239,7 +239,7 @@
|
||||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -556,7 +556,7 @@
|
||||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -624,7 +624,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -711,7 +711,7 @@
|
||||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -774,7 +774,7 @@
|
||||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -850,7 +850,7 @@
|
||||
}
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -928,7 +928,7 @@
|
||||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -981,7 +981,7 @@
|
||||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -1032,7 +1032,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -1083,7 +1083,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -5082,9 +5082,9 @@
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"body": {
|
||||
"type": "string",
|
||||
"type": "object",
|
||||
"description": "HTTP body of execution. Default value is empty string.",
|
||||
"x-example": null
|
||||
"x-example": "{}"
|
||||
},
|
||||
"async": {
|
||||
"type": "boolean",
|
||||
@@ -5368,7 +5368,7 @@
|
||||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"tags": [
|
||||
"locale"
|
||||
@@ -6268,7 +6268,7 @@
|
||||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"tags": [
|
||||
"storage"
|
||||
|
||||
@@ -278,7 +278,7 @@
|
||||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -591,7 +591,7 @@
|
||||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -658,7 +658,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -744,7 +744,7 @@
|
||||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -806,7 +806,7 @@
|
||||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -882,7 +882,7 @@
|
||||
}
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -959,7 +959,7 @@
|
||||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -1011,7 +1011,7 @@
|
||||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -1061,7 +1061,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -1111,7 +1111,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -4452,7 +4452,7 @@
|
||||
},
|
||||
"\/console\/assistant": {
|
||||
"post": {
|
||||
"summary": "Ask Query",
|
||||
"summary": "Ask query",
|
||||
"operationId": "assistantChat",
|
||||
"tags": [
|
||||
"assistant"
|
||||
@@ -11052,9 +11052,9 @@
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"body": {
|
||||
"type": "string",
|
||||
"type": "object",
|
||||
"description": "HTTP body of execution. Default value is empty string.",
|
||||
"x-example": null
|
||||
"x-example": "{}"
|
||||
},
|
||||
"async": {
|
||||
"type": "boolean",
|
||||
@@ -13257,7 +13257,7 @@
|
||||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"tags": [
|
||||
"locale"
|
||||
@@ -18060,7 +18060,7 @@
|
||||
},
|
||||
"\/migrations": {
|
||||
"get": {
|
||||
"summary": "List Migrations",
|
||||
"summary": "List migrations",
|
||||
"operationId": "migrationsList",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -18136,7 +18136,7 @@
|
||||
},
|
||||
"\/migrations\/appwrite": {
|
||||
"post": {
|
||||
"summary": "Migrate Appwrite Data",
|
||||
"summary": "Migrate Appwrite data",
|
||||
"operationId": "migrationsCreateAppwriteMigration",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -18226,7 +18226,7 @@
|
||||
},
|
||||
"\/migrations\/appwrite\/report": {
|
||||
"get": {
|
||||
"summary": "Generate a report on Appwrite Data",
|
||||
"summary": "Generate a report on Appwrite data",
|
||||
"operationId": "migrationsGetAppwriteReport",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -18321,7 +18321,7 @@
|
||||
},
|
||||
"\/migrations\/firebase": {
|
||||
"post": {
|
||||
"summary": "Migrate Firebase Data (Service Account)",
|
||||
"summary": "Migrate Firebase data (Service Account)",
|
||||
"operationId": "migrationsCreateFirebaseMigration",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -18399,7 +18399,7 @@
|
||||
},
|
||||
"\/migrations\/firebase\/deauthorize": {
|
||||
"get": {
|
||||
"summary": "Revoke Appwrite's authorization to access Firebase Projects",
|
||||
"summary": "Revoke Appwrite's authorization to access Firebase projects",
|
||||
"operationId": "migrationsDeleteFirebaseAuth",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -18442,7 +18442,7 @@
|
||||
},
|
||||
"\/migrations\/firebase\/oauth": {
|
||||
"post": {
|
||||
"summary": "Migrate Firebase Data (OAuth)",
|
||||
"summary": "Migrate Firebase data (OAuth)",
|
||||
"operationId": "migrationsCreateFirebaseOAuthMigration",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -18520,7 +18520,7 @@
|
||||
},
|
||||
"\/migrations\/firebase\/projects": {
|
||||
"get": {
|
||||
"summary": "List Firebase Projects",
|
||||
"summary": "List Firebase projects",
|
||||
"operationId": "migrationsListFirebaseProjects",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -18570,7 +18570,7 @@
|
||||
},
|
||||
"\/migrations\/firebase\/report": {
|
||||
"get": {
|
||||
"summary": "Generate a report on Firebase Data",
|
||||
"summary": "Generate a report on Firebase data",
|
||||
"operationId": "migrationsGetFirebaseReport",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -18644,7 +18644,7 @@
|
||||
},
|
||||
"\/migrations\/firebase\/report\/oauth": {
|
||||
"get": {
|
||||
"summary": "Generate a report on Firebase Data using OAuth",
|
||||
"summary": "Generate a report on Firebase data using OAuth",
|
||||
"operationId": "migrationsGetFirebaseReportOAuth",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -18718,7 +18718,7 @@
|
||||
},
|
||||
"\/migrations\/nhost": {
|
||||
"post": {
|
||||
"summary": "Migrate NHost Data",
|
||||
"summary": "Migrate NHost data",
|
||||
"operationId": "migrationsCreateNHostMigration",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -18966,7 +18966,7 @@
|
||||
},
|
||||
"\/migrations\/supabase": {
|
||||
"post": {
|
||||
"summary": "Migrate Supabase Data",
|
||||
"summary": "Migrate Supabase data",
|
||||
"operationId": "migrationsCreateSupabaseMigration",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -19199,7 +19199,7 @@
|
||||
},
|
||||
"\/migrations\/{migrationId}": {
|
||||
"get": {
|
||||
"summary": "Get Migration",
|
||||
"summary": "Get migration",
|
||||
"operationId": "migrationsGet",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -19259,7 +19259,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Retry Migration",
|
||||
"summary": "Retry migration",
|
||||
"operationId": "migrationsRetry",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -19319,7 +19319,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Migration",
|
||||
"summary": "Delete migration",
|
||||
"operationId": "migrationsDelete",
|
||||
"tags": [
|
||||
"migrations"
|
||||
@@ -19464,7 +19464,7 @@
|
||||
},
|
||||
"\/project\/variables": {
|
||||
"get": {
|
||||
"summary": "List Variables",
|
||||
"summary": "List variables",
|
||||
"operationId": "projectListVariables",
|
||||
"tags": [
|
||||
"project"
|
||||
@@ -19512,7 +19512,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create Variable",
|
||||
"summary": "Create variable",
|
||||
"operationId": "projectCreateVariable",
|
||||
"tags": [
|
||||
"project"
|
||||
@@ -19587,7 +19587,7 @@
|
||||
},
|
||||
"\/project\/variables\/{variableId}": {
|
||||
"get": {
|
||||
"summary": "Get Variable",
|
||||
"summary": "Get variable",
|
||||
"operationId": "projectGetVariable",
|
||||
"tags": [
|
||||
"project"
|
||||
@@ -19647,7 +19647,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Update Variable",
|
||||
"summary": "Update variable",
|
||||
"operationId": "projectUpdateVariable",
|
||||
"tags": [
|
||||
"project"
|
||||
@@ -19731,7 +19731,7 @@
|
||||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Variable",
|
||||
"summary": "Delete variable",
|
||||
"operationId": "projectDeleteVariable",
|
||||
"tags": [
|
||||
"project"
|
||||
@@ -24640,7 +24640,7 @@
|
||||
},
|
||||
"\/proxy\/rules": {
|
||||
"get": {
|
||||
"summary": "List Rules",
|
||||
"summary": "List rules",
|
||||
"operationId": "proxyListRules",
|
||||
"tags": [
|
||||
"proxy"
|
||||
@@ -24714,7 +24714,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create Rule",
|
||||
"summary": "Create rule",
|
||||
"operationId": "proxyCreateRule",
|
||||
"tags": [
|
||||
"proxy"
|
||||
@@ -24800,7 +24800,7 @@
|
||||
},
|
||||
"\/proxy\/rules\/{ruleId}": {
|
||||
"get": {
|
||||
"summary": "Get Rule",
|
||||
"summary": "Get rule",
|
||||
"operationId": "proxyGetRule",
|
||||
"tags": [
|
||||
"proxy"
|
||||
@@ -24860,7 +24860,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Rule",
|
||||
"summary": "Delete rule",
|
||||
"operationId": "proxyDeleteRule",
|
||||
"tags": [
|
||||
"proxy"
|
||||
@@ -24915,7 +24915,7 @@
|
||||
},
|
||||
"\/proxy\/rules\/{ruleId}\/verification": {
|
||||
"patch": {
|
||||
"summary": "Update Rule Verification Status",
|
||||
"summary": "Update rule verification status",
|
||||
"operationId": "proxyUpdateRuleVerification",
|
||||
"tags": [
|
||||
"proxy"
|
||||
@@ -25791,7 +25791,7 @@
|
||||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"tags": [
|
||||
"storage"
|
||||
@@ -27842,7 +27842,7 @@
|
||||
},
|
||||
"\/users\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "usersListIdentities",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -29141,7 +29141,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/mfa\/authenticators\/{type}": {
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "usersDeleteMfaAuthenticator",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -29219,7 +29219,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "usersListMfaFactors",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -29282,7 +29282,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "usersGetMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -29343,7 +29343,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "usersUpdateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -29404,7 +29404,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "usersCreateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -30182,7 +30182,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/targets": {
|
||||
"get": {
|
||||
"summary": "List User Targets",
|
||||
"summary": "List user targets",
|
||||
"operationId": "usersListTargets",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -30257,7 +30257,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create User Target",
|
||||
"summary": "Create user target",
|
||||
"operationId": "usersCreateTarget",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -30369,7 +30369,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/targets\/{targetId}": {
|
||||
"get": {
|
||||
"summary": "Get User Target",
|
||||
"summary": "Get user target",
|
||||
"operationId": "usersGetTarget",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -30441,7 +30441,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Update User target",
|
||||
"summary": "Update user target",
|
||||
"operationId": "usersUpdateTarget",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -30854,7 +30854,7 @@
|
||||
},
|
||||
"\/vcs\/github\/installations\/{installationId}\/providerRepositories": {
|
||||
"get": {
|
||||
"summary": "List Repositories",
|
||||
"summary": "List repositories",
|
||||
"operationId": "vcsListRepositories",
|
||||
"tags": [
|
||||
"vcs"
|
||||
@@ -31084,7 +31084,7 @@
|
||||
},
|
||||
"\/vcs\/github\/installations\/{installationId}\/providerRepositories\/{providerRepositoryId}\/branches": {
|
||||
"get": {
|
||||
"summary": "List Repository Branches",
|
||||
"summary": "List repository branches",
|
||||
"operationId": "vcsListRepositoryBranches",
|
||||
"tags": [
|
||||
"vcs"
|
||||
@@ -31547,7 +31547,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Installation",
|
||||
"summary": "Delete installation",
|
||||
"operationId": "vcsDeleteInstallation",
|
||||
"tags": [
|
||||
"vcs"
|
||||
@@ -36747,12 +36747,6 @@
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"storageTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated number of total databases storage in bytes.",
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"databases": {
|
||||
"type": "array",
|
||||
"description": "Aggregated number of databases per period.",
|
||||
@@ -36776,14 +36770,6 @@
|
||||
"$ref": "#\/components\/schemas\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"storage": {
|
||||
"type": "array",
|
||||
"description": "An array of the aggregated number of databases storage in bytes per period.",
|
||||
"items": {
|
||||
"$ref": "#\/components\/schemas\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -36791,11 +36777,9 @@
|
||||
"databasesTotal",
|
||||
"collectionsTotal",
|
||||
"documentsTotal",
|
||||
"storageTotal",
|
||||
"databases",
|
||||
"collections",
|
||||
"documents",
|
||||
"storage"
|
||||
"documents"
|
||||
]
|
||||
},
|
||||
"usageDatabase": {
|
||||
@@ -36819,12 +36803,6 @@
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"storageTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated number of total storage used in bytes.",
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"collections": {
|
||||
"type": "array",
|
||||
"description": "Aggregated number of collections per period.",
|
||||
@@ -36840,24 +36818,14 @@
|
||||
"$ref": "#\/components\/schemas\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"storage": {
|
||||
"type": "array",
|
||||
"description": "Aggregated storage used in bytes per period.",
|
||||
"items": {
|
||||
"$ref": "#\/components\/schemas\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"range",
|
||||
"collectionsTotal",
|
||||
"documentsTotal",
|
||||
"storageTotal",
|
||||
"collections",
|
||||
"documents",
|
||||
"storage"
|
||||
"documents"
|
||||
]
|
||||
},
|
||||
"usageCollection": {
|
||||
@@ -37398,12 +37366,6 @@
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"databasesStorageTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated sum of databases storage size (in bytes).",
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"usersTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated number of users.",
|
||||
@@ -37500,14 +37462,6 @@
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"databasesStorageBreakdown": {
|
||||
"type": "array",
|
||||
"description": "An array of the aggregated breakdown of storage usage by databases.",
|
||||
"items": {
|
||||
"$ref": "#\/components\/schemas\/metricBreakdown"
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"executionsMbSecondsBreakdown": {
|
||||
"type": "array",
|
||||
"description": "Aggregated breakdown in totals of execution mbSeconds by functions.",
|
||||
@@ -37537,7 +37491,6 @@
|
||||
"executionsTotal",
|
||||
"documentsTotal",
|
||||
"databasesTotal",
|
||||
"databasesStorageTotal",
|
||||
"usersTotal",
|
||||
"filesStorageTotal",
|
||||
"functionsStorageTotal",
|
||||
@@ -37552,7 +37505,6 @@
|
||||
"executions",
|
||||
"executionsBreakdown",
|
||||
"bucketsBreakdown",
|
||||
"databasesStorageBreakdown",
|
||||
"executionsMbSecondsBreakdown",
|
||||
"buildsMbSecondsBreakdown",
|
||||
"functionsStorageBreakdown"
|
||||
|
||||
@@ -241,7 +241,7 @@
|
||||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -562,7 +562,7 @@
|
||||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -631,7 +631,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -719,7 +719,7 @@
|
||||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -783,7 +783,7 @@
|
||||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -859,7 +859,7 @@
|
||||
}
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -938,7 +938,7 @@
|
||||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -992,7 +992,7 @@
|
||||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -1044,7 +1044,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -1096,7 +1096,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"account"
|
||||
@@ -9939,9 +9939,9 @@
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"body": {
|
||||
"type": "string",
|
||||
"type": "object",
|
||||
"description": "HTTP body of execution. Default value is empty string.",
|
||||
"x-example": null
|
||||
"x-example": "{}"
|
||||
},
|
||||
"async": {
|
||||
"type": "boolean",
|
||||
@@ -12097,7 +12097,7 @@
|
||||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"tags": [
|
||||
"locale"
|
||||
@@ -17789,7 +17789,7 @@
|
||||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"tags": [
|
||||
"storage"
|
||||
@@ -19645,7 +19645,7 @@
|
||||
},
|
||||
"\/users\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "usersListIdentities",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -20885,7 +20885,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/mfa\/authenticators\/{type}": {
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "usersDeleteMfaAuthenticator",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -20964,7 +20964,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "usersListMfaFactors",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -21028,7 +21028,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "usersGetMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -21090,7 +21090,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "usersUpdateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -21152,7 +21152,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "usersCreateMfaRecoveryCodes",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -21941,7 +21941,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/targets": {
|
||||
"get": {
|
||||
"summary": "List User Targets",
|
||||
"summary": "List user targets",
|
||||
"operationId": "usersListTargets",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -22017,7 +22017,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create User Target",
|
||||
"summary": "Create user target",
|
||||
"operationId": "usersCreateTarget",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -22130,7 +22130,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/targets\/{targetId}": {
|
||||
"get": {
|
||||
"summary": "Get User Target",
|
||||
"summary": "Get user target",
|
||||
"operationId": "usersGetTarget",
|
||||
"tags": [
|
||||
"users"
|
||||
@@ -22203,7 +22203,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Update User target",
|
||||
"summary": "Update user target",
|
||||
"operationId": "usersUpdateTarget",
|
||||
"tags": [
|
||||
"users"
|
||||
|
||||
@@ -37270,12 +37270,6 @@
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"storageTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated number of total databases storage in bytes.",
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"databases": {
|
||||
"type": "array",
|
||||
"description": "Aggregated number of databases per period.",
|
||||
@@ -37302,15 +37296,6 @@
|
||||
"$ref": "#\/definitions\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"storage": {
|
||||
"type": "array",
|
||||
"description": "An array of the aggregated number of databases storage in bytes per period.",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"$ref": "#\/definitions\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -37318,11 +37303,9 @@
|
||||
"databasesTotal",
|
||||
"collectionsTotal",
|
||||
"documentsTotal",
|
||||
"storageTotal",
|
||||
"databases",
|
||||
"collections",
|
||||
"documents",
|
||||
"storage"
|
||||
"documents"
|
||||
]
|
||||
},
|
||||
"usageDatabase": {
|
||||
@@ -37346,12 +37329,6 @@
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"storageTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated number of total storage used in bytes.",
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"collections": {
|
||||
"type": "array",
|
||||
"description": "Aggregated number of collections per period.",
|
||||
@@ -37369,25 +37346,14 @@
|
||||
"$ref": "#\/definitions\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"storage": {
|
||||
"type": "array",
|
||||
"description": "Aggregated storage used in bytes per period.",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"$ref": "#\/definitions\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"range",
|
||||
"collectionsTotal",
|
||||
"documentsTotal",
|
||||
"storageTotal",
|
||||
"collections",
|
||||
"documents",
|
||||
"storage"
|
||||
"documents"
|
||||
]
|
||||
},
|
||||
"usageCollection": {
|
||||
@@ -37955,12 +37921,6 @@
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"databasesStorageTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated sum of databases storage size (in bytes).",
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"usersTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated number of users.",
|
||||
@@ -38063,15 +38023,6 @@
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"databasesStorageBreakdown": {
|
||||
"type": "array",
|
||||
"description": "An array of the aggregated breakdown of storage usage by databases.",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"$ref": "#\/definitions\/metricBreakdown"
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"executionsMbSecondsBreakdown": {
|
||||
"type": "array",
|
||||
"description": "Aggregated breakdown in totals of execution mbSeconds by functions.",
|
||||
@@ -38104,7 +38055,6 @@
|
||||
"executionsTotal",
|
||||
"documentsTotal",
|
||||
"databasesTotal",
|
||||
"databasesStorageTotal",
|
||||
"usersTotal",
|
||||
"filesStorageTotal",
|
||||
"functionsStorageTotal",
|
||||
@@ -38119,7 +38069,6 @@
|
||||
"executions",
|
||||
"executionsBreakdown",
|
||||
"bucketsBreakdown",
|
||||
"databasesStorageBreakdown",
|
||||
"executionsMbSecondsBreakdown",
|
||||
"buildsMbSecondsBreakdown",
|
||||
"functionsStorageBreakdown"
|
||||
|
||||
@@ -293,7 +293,7 @@
|
||||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -619,7 +619,7 @@
|
||||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -687,7 +687,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -773,7 +773,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -838,7 +838,7 @@
|
||||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -917,7 +917,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -994,7 +994,7 @@
|
||||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -1049,7 +1049,7 @@
|
||||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -1102,7 +1102,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -1155,7 +1155,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -5167,7 +5167,7 @@
|
||||
"summary": "Create execution",
|
||||
"operationId": "functionsCreateExecution",
|
||||
"consumes": [
|
||||
"multipart\/form-data"
|
||||
"application\/json"
|
||||
],
|
||||
"produces": [
|
||||
"multipart\/form-data"
|
||||
@@ -5226,65 +5226,59 @@
|
||||
"in": "path"
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"description": "HTTP body of execution. Default value is empty string.",
|
||||
"required": false,
|
||||
"type": "payload",
|
||||
"default": "",
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "async",
|
||||
"description": "Execute code in the background. Default value is false.",
|
||||
"required": false,
|
||||
"type": "boolean",
|
||||
"x-example": false,
|
||||
"default": false,
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "path",
|
||||
"description": "HTTP path of execution. Path can include query params. Default value is \/",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"x-example": "<PATH>",
|
||||
"default": "\/",
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "method",
|
||||
"description": "HTTP method of execution. Default value is GET.",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"x-example": "GET",
|
||||
"enum": [
|
||||
"GET",
|
||||
"POST",
|
||||
"PUT",
|
||||
"PATCH",
|
||||
"DELETE",
|
||||
"OPTIONS"
|
||||
],
|
||||
"x-enum-name": "ExecutionMethod",
|
||||
"x-enum-keys": [],
|
||||
"default": "POST",
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "headers",
|
||||
"description": "HTTP headers of execution. Defaults to empty.",
|
||||
"required": false,
|
||||
"type": "object",
|
||||
"default": [],
|
||||
"x-example": "{}",
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "scheduledAt",
|
||||
"description": "Scheduled execution time in [ISO 8601](https:\/\/www.iso.org\/iso-8601-date-and-time-format.html) format. DateTime value must be in future with precision in minutes.",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"in": "formData"
|
||||
"name": "payload",
|
||||
"in": "body",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"body": {
|
||||
"type": "object",
|
||||
"description": "HTTP body of execution. Default value is empty string.",
|
||||
"default": "",
|
||||
"x-example": "{}"
|
||||
},
|
||||
"async": {
|
||||
"type": "boolean",
|
||||
"description": "Execute code in the background. Default value is false.",
|
||||
"default": false,
|
||||
"x-example": false
|
||||
},
|
||||
"path": {
|
||||
"type": "string",
|
||||
"description": "HTTP path of execution. Path can include query params. Default value is \/",
|
||||
"default": "\/",
|
||||
"x-example": "<PATH>"
|
||||
},
|
||||
"method": {
|
||||
"type": "string",
|
||||
"description": "HTTP method of execution. Default value is GET.",
|
||||
"default": "POST",
|
||||
"x-example": "GET",
|
||||
"enum": [
|
||||
"GET",
|
||||
"POST",
|
||||
"PUT",
|
||||
"PATCH",
|
||||
"DELETE",
|
||||
"OPTIONS"
|
||||
],
|
||||
"x-enum-name": "ExecutionMethod",
|
||||
"x-enum-keys": []
|
||||
},
|
||||
"headers": {
|
||||
"type": "object",
|
||||
"description": "HTTP headers of execution. Defaults to empty.",
|
||||
"default": [],
|
||||
"x-example": "{}"
|
||||
},
|
||||
"scheduledAt": {
|
||||
"type": "string",
|
||||
"description": "Scheduled execution time in [ISO 8601](https:\/\/www.iso.org\/iso-8601-date-and-time-format.html) format. DateTime value must be in future with precision in minutes.",
|
||||
"default": null,
|
||||
"x-example": null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -5573,7 +5567,7 @@
|
||||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -6476,7 +6470,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
||||
@@ -348,7 +348,7 @@
|
||||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -670,7 +670,7 @@
|
||||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -737,7 +737,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -822,7 +822,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -886,7 +886,7 @@
|
||||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -965,7 +965,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -1041,7 +1041,7 @@
|
||||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -1095,7 +1095,7 @@
|
||||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -1147,7 +1147,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -1199,7 +1199,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -4637,7 +4637,7 @@
|
||||
},
|
||||
"\/console\/assistant": {
|
||||
"post": {
|
||||
"summary": "Ask Query",
|
||||
"summary": "Ask query",
|
||||
"operationId": "assistantChat",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -11131,7 +11131,7 @@
|
||||
"summary": "Create execution",
|
||||
"operationId": "functionsCreateExecution",
|
||||
"consumes": [
|
||||
"multipart\/form-data"
|
||||
"application\/json"
|
||||
],
|
||||
"produces": [
|
||||
"multipart\/form-data"
|
||||
@@ -11190,65 +11190,59 @@
|
||||
"in": "path"
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"description": "HTTP body of execution. Default value is empty string.",
|
||||
"required": false,
|
||||
"type": "payload",
|
||||
"default": "",
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "async",
|
||||
"description": "Execute code in the background. Default value is false.",
|
||||
"required": false,
|
||||
"type": "boolean",
|
||||
"x-example": false,
|
||||
"default": false,
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "path",
|
||||
"description": "HTTP path of execution. Path can include query params. Default value is \/",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"x-example": "<PATH>",
|
||||
"default": "\/",
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "method",
|
||||
"description": "HTTP method of execution. Default value is GET.",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"x-example": "GET",
|
||||
"enum": [
|
||||
"GET",
|
||||
"POST",
|
||||
"PUT",
|
||||
"PATCH",
|
||||
"DELETE",
|
||||
"OPTIONS"
|
||||
],
|
||||
"x-enum-name": "ExecutionMethod",
|
||||
"x-enum-keys": [],
|
||||
"default": "POST",
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "headers",
|
||||
"description": "HTTP headers of execution. Defaults to empty.",
|
||||
"required": false,
|
||||
"type": "object",
|
||||
"default": [],
|
||||
"x-example": "{}",
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "scheduledAt",
|
||||
"description": "Scheduled execution time in [ISO 8601](https:\/\/www.iso.org\/iso-8601-date-and-time-format.html) format. DateTime value must be in future with precision in minutes.",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"in": "formData"
|
||||
"name": "payload",
|
||||
"in": "body",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"body": {
|
||||
"type": "object",
|
||||
"description": "HTTP body of execution. Default value is empty string.",
|
||||
"default": "",
|
||||
"x-example": "{}"
|
||||
},
|
||||
"async": {
|
||||
"type": "boolean",
|
||||
"description": "Execute code in the background. Default value is false.",
|
||||
"default": false,
|
||||
"x-example": false
|
||||
},
|
||||
"path": {
|
||||
"type": "string",
|
||||
"description": "HTTP path of execution. Path can include query params. Default value is \/",
|
||||
"default": "\/",
|
||||
"x-example": "<PATH>"
|
||||
},
|
||||
"method": {
|
||||
"type": "string",
|
||||
"description": "HTTP method of execution. Default value is GET.",
|
||||
"default": "POST",
|
||||
"x-example": "GET",
|
||||
"enum": [
|
||||
"GET",
|
||||
"POST",
|
||||
"PUT",
|
||||
"PATCH",
|
||||
"DELETE",
|
||||
"OPTIONS"
|
||||
],
|
||||
"x-enum-name": "ExecutionMethod",
|
||||
"x-enum-keys": []
|
||||
},
|
||||
"headers": {
|
||||
"type": "object",
|
||||
"description": "HTTP headers of execution. Defaults to empty.",
|
||||
"default": [],
|
||||
"x-example": "{}"
|
||||
},
|
||||
"scheduledAt": {
|
||||
"type": "string",
|
||||
"description": "Scheduled execution time in [ISO 8601](https:\/\/www.iso.org\/iso-8601-date-and-time-format.html) format. DateTime value must be in future with precision in minutes.",
|
||||
"default": null,
|
||||
"x-example": null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -13464,7 +13458,7 @@
|
||||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -18494,7 +18488,7 @@
|
||||
},
|
||||
"\/migrations": {
|
||||
"get": {
|
||||
"summary": "List Migrations",
|
||||
"summary": "List migrations",
|
||||
"operationId": "migrationsList",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -18569,7 +18563,7 @@
|
||||
},
|
||||
"\/migrations\/appwrite": {
|
||||
"post": {
|
||||
"summary": "Migrate Appwrite Data",
|
||||
"summary": "Migrate Appwrite data",
|
||||
"operationId": "migrationsCreateAppwriteMigration",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -18665,7 +18659,7 @@
|
||||
},
|
||||
"\/migrations\/appwrite\/report": {
|
||||
"get": {
|
||||
"summary": "Generate a report on Appwrite Data",
|
||||
"summary": "Generate a report on Appwrite data",
|
||||
"operationId": "migrationsGetAppwriteReport",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -18755,7 +18749,7 @@
|
||||
},
|
||||
"\/migrations\/firebase": {
|
||||
"post": {
|
||||
"summary": "Migrate Firebase Data (Service Account)",
|
||||
"summary": "Migrate Firebase data (Service Account)",
|
||||
"operationId": "migrationsCreateFirebaseMigration",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -18837,7 +18831,7 @@
|
||||
},
|
||||
"\/migrations\/firebase\/deauthorize": {
|
||||
"get": {
|
||||
"summary": "Revoke Appwrite's authorization to access Firebase Projects",
|
||||
"summary": "Revoke Appwrite's authorization to access Firebase projects",
|
||||
"operationId": "migrationsDeleteFirebaseAuth",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -18889,7 +18883,7 @@
|
||||
},
|
||||
"\/migrations\/firebase\/oauth": {
|
||||
"post": {
|
||||
"summary": "Migrate Firebase Data (OAuth)",
|
||||
"summary": "Migrate Firebase data (OAuth)",
|
||||
"operationId": "migrationsCreateFirebaseOAuthMigration",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -18971,7 +18965,7 @@
|
||||
},
|
||||
"\/migrations\/firebase\/projects": {
|
||||
"get": {
|
||||
"summary": "List Firebase Projects",
|
||||
"summary": "List Firebase projects",
|
||||
"operationId": "migrationsListFirebaseProjects",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -19023,7 +19017,7 @@
|
||||
},
|
||||
"\/migrations\/firebase\/report": {
|
||||
"get": {
|
||||
"summary": "Generate a report on Firebase Data",
|
||||
"summary": "Generate a report on Firebase data",
|
||||
"operationId": "migrationsGetFirebaseReport",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -19096,7 +19090,7 @@
|
||||
},
|
||||
"\/migrations\/firebase\/report\/oauth": {
|
||||
"get": {
|
||||
"summary": "Generate a report on Firebase Data using OAuth",
|
||||
"summary": "Generate a report on Firebase data using OAuth",
|
||||
"operationId": "migrationsGetFirebaseReportOAuth",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -19169,7 +19163,7 @@
|
||||
},
|
||||
"\/migrations\/nhost": {
|
||||
"post": {
|
||||
"summary": "Migrate NHost Data",
|
||||
"summary": "Migrate NHost data",
|
||||
"operationId": "migrationsCreateNHostMigration",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -19414,7 +19408,7 @@
|
||||
},
|
||||
"\/migrations\/supabase": {
|
||||
"post": {
|
||||
"summary": "Migrate Supabase Data",
|
||||
"summary": "Migrate Supabase data",
|
||||
"operationId": "migrationsCreateSupabaseMigration",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -19645,7 +19639,7 @@
|
||||
},
|
||||
"\/migrations\/{migrationId}": {
|
||||
"get": {
|
||||
"summary": "Get Migration",
|
||||
"summary": "Get migration",
|
||||
"operationId": "migrationsGet",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -19705,7 +19699,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Retry Migration",
|
||||
"summary": "Retry migration",
|
||||
"operationId": "migrationsRetry",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -19765,7 +19759,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Migration",
|
||||
"summary": "Delete migration",
|
||||
"operationId": "migrationsDelete",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -19908,7 +19902,7 @@
|
||||
},
|
||||
"\/project\/variables": {
|
||||
"get": {
|
||||
"summary": "List Variables",
|
||||
"summary": "List variables",
|
||||
"operationId": "projectListVariables",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -19958,7 +19952,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create Variable",
|
||||
"summary": "Create variable",
|
||||
"operationId": "projectCreateVariable",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -20037,7 +20031,7 @@
|
||||
},
|
||||
"\/project\/variables\/{variableId}": {
|
||||
"get": {
|
||||
"summary": "Get Variable",
|
||||
"summary": "Get variable",
|
||||
"operationId": "projectGetVariable",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -20097,7 +20091,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Update Variable",
|
||||
"summary": "Update variable",
|
||||
"operationId": "projectUpdateVariable",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -20181,7 +20175,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Variable",
|
||||
"summary": "Delete variable",
|
||||
"operationId": "projectDeleteVariable",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -25101,7 +25095,7 @@
|
||||
},
|
||||
"\/proxy\/rules": {
|
||||
"get": {
|
||||
"summary": "List Rules",
|
||||
"summary": "List rules",
|
||||
"operationId": "proxyListRules",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -25174,7 +25168,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create Rule",
|
||||
"summary": "Create rule",
|
||||
"operationId": "proxyCreateRule",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -25265,7 +25259,7 @@
|
||||
},
|
||||
"\/proxy\/rules\/{ruleId}": {
|
||||
"get": {
|
||||
"summary": "Get Rule",
|
||||
"summary": "Get rule",
|
||||
"operationId": "proxyGetRule",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -25325,7 +25319,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Rule",
|
||||
"summary": "Delete rule",
|
||||
"operationId": "proxyDeleteRule",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -25382,7 +25376,7 @@
|
||||
},
|
||||
"\/proxy\/rules\/{ruleId}\/verification": {
|
||||
"patch": {
|
||||
"summary": "Update Rule Verification Status",
|
||||
"summary": "Update rule verification status",
|
||||
"operationId": "proxyUpdateRuleVerification",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -26265,7 +26259,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -28324,7 +28318,7 @@
|
||||
},
|
||||
"\/users\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "usersListIdentities",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -29661,7 +29655,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/mfa\/authenticators\/{type}": {
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "usersDeleteMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -29737,7 +29731,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "usersListMfaFactors",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -29800,7 +29794,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "usersGetMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -29861,7 +29855,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "usersUpdateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -29922,7 +29916,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "usersCreateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -30697,7 +30691,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/targets": {
|
||||
"get": {
|
||||
"summary": "List User Targets",
|
||||
"summary": "List user targets",
|
||||
"operationId": "usersListTargets",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -30771,7 +30765,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create User Target",
|
||||
"summary": "Create user target",
|
||||
"operationId": "usersCreateTarget",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -30886,7 +30880,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/targets\/{targetId}": {
|
||||
"get": {
|
||||
"summary": "Get User Target",
|
||||
"summary": "Get user target",
|
||||
"operationId": "usersGetTarget",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -30956,7 +30950,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Update User target",
|
||||
"summary": "Update user target",
|
||||
"operationId": "usersUpdateTarget",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -31368,7 +31362,7 @@
|
||||
},
|
||||
"\/vcs\/github\/installations\/{installationId}\/providerRepositories": {
|
||||
"get": {
|
||||
"summary": "List Repositories",
|
||||
"summary": "List repositories",
|
||||
"operationId": "vcsListRepositories",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -31594,7 +31588,7 @@
|
||||
},
|
||||
"\/vcs\/github\/installations\/{installationId}\/providerRepositories\/{providerRepositoryId}\/branches": {
|
||||
"get": {
|
||||
"summary": "List Repository Branches",
|
||||
"summary": "List repository branches",
|
||||
"operationId": "vcsListRepositoryBranches",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -32046,7 +32040,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Installation",
|
||||
"summary": "Delete installation",
|
||||
"operationId": "vcsDeleteInstallation",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -37270,12 +37264,6 @@
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"storageTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated number of total databases storage in bytes.",
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"databases": {
|
||||
"type": "array",
|
||||
"description": "Aggregated number of databases per period.",
|
||||
@@ -37302,15 +37290,6 @@
|
||||
"$ref": "#\/definitions\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"storage": {
|
||||
"type": "array",
|
||||
"description": "An array of the aggregated number of databases storage in bytes per period.",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"$ref": "#\/definitions\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
@@ -37318,11 +37297,9 @@
|
||||
"databasesTotal",
|
||||
"collectionsTotal",
|
||||
"documentsTotal",
|
||||
"storageTotal",
|
||||
"databases",
|
||||
"collections",
|
||||
"documents",
|
||||
"storage"
|
||||
"documents"
|
||||
]
|
||||
},
|
||||
"usageDatabase": {
|
||||
@@ -37346,12 +37323,6 @@
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"storageTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated number of total storage used in bytes.",
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"collections": {
|
||||
"type": "array",
|
||||
"description": "Aggregated number of collections per period.",
|
||||
@@ -37369,25 +37340,14 @@
|
||||
"$ref": "#\/definitions\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"storage": {
|
||||
"type": "array",
|
||||
"description": "Aggregated storage used in bytes per period.",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"$ref": "#\/definitions\/metric"
|
||||
},
|
||||
"x-example": []
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"range",
|
||||
"collectionsTotal",
|
||||
"documentsTotal",
|
||||
"storageTotal",
|
||||
"collections",
|
||||
"documents",
|
||||
"storage"
|
||||
"documents"
|
||||
]
|
||||
},
|
||||
"usageCollection": {
|
||||
@@ -37955,12 +37915,6 @@
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"databasesStorageTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated sum of databases storage size (in bytes).",
|
||||
"x-example": 0,
|
||||
"format": "int32"
|
||||
},
|
||||
"usersTotal": {
|
||||
"type": "integer",
|
||||
"description": "Total aggregated number of users.",
|
||||
@@ -38063,15 +38017,6 @@
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"databasesStorageBreakdown": {
|
||||
"type": "array",
|
||||
"description": "An array of the aggregated breakdown of storage usage by databases.",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"$ref": "#\/definitions\/metricBreakdown"
|
||||
},
|
||||
"x-example": []
|
||||
},
|
||||
"executionsMbSecondsBreakdown": {
|
||||
"type": "array",
|
||||
"description": "Aggregated breakdown in totals of execution mbSeconds by functions.",
|
||||
@@ -38104,7 +38049,6 @@
|
||||
"executionsTotal",
|
||||
"documentsTotal",
|
||||
"databasesTotal",
|
||||
"databasesStorageTotal",
|
||||
"usersTotal",
|
||||
"filesStorageTotal",
|
||||
"functionsStorageTotal",
|
||||
@@ -38119,7 +38063,6 @@
|
||||
"executions",
|
||||
"executionsBreakdown",
|
||||
"bucketsBreakdown",
|
||||
"databasesStorageBreakdown",
|
||||
"executionsMbSecondsBreakdown",
|
||||
"buildsMbSecondsBreakdown",
|
||||
"functionsStorageBreakdown"
|
||||
|
||||
@@ -310,7 +310,7 @@
|
||||
},
|
||||
"\/account\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "accountListIdentities",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -640,7 +640,7 @@
|
||||
},
|
||||
"\/account\/mfa\/authenticators\/{type}": {
|
||||
"post": {
|
||||
"summary": "Create Authenticator",
|
||||
"summary": "Create authenticator",
|
||||
"operationId": "accountCreateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -709,7 +709,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Verify Authenticator",
|
||||
"summary": "Verify authenticator",
|
||||
"operationId": "accountUpdateMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -796,7 +796,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "accountDeleteMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -862,7 +862,7 @@
|
||||
},
|
||||
"\/account\/mfa\/challenge": {
|
||||
"post": {
|
||||
"summary": "Create MFA Challenge",
|
||||
"summary": "Create MFA challenge",
|
||||
"operationId": "accountCreateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -941,7 +941,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Create MFA Challenge (confirmation)",
|
||||
"summary": "Create MFA challenge (confirmation)",
|
||||
"operationId": "accountUpdateMfaChallenge",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -1019,7 +1019,7 @@
|
||||
},
|
||||
"\/account\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "accountListMfaFactors",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -1075,7 +1075,7 @@
|
||||
},
|
||||
"\/account\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "accountGetMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -1129,7 +1129,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "accountCreateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -1183,7 +1183,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "accountUpdateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -10022,7 +10022,7 @@
|
||||
"summary": "Create execution",
|
||||
"operationId": "functionsCreateExecution",
|
||||
"consumes": [
|
||||
"multipart\/form-data"
|
||||
"application\/json"
|
||||
],
|
||||
"produces": [
|
||||
"multipart\/form-data"
|
||||
@@ -10083,65 +10083,59 @@
|
||||
"in": "path"
|
||||
},
|
||||
{
|
||||
"name": "body",
|
||||
"description": "HTTP body of execution. Default value is empty string.",
|
||||
"required": false,
|
||||
"type": "payload",
|
||||
"default": "",
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "async",
|
||||
"description": "Execute code in the background. Default value is false.",
|
||||
"required": false,
|
||||
"type": "boolean",
|
||||
"x-example": false,
|
||||
"default": false,
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "path",
|
||||
"description": "HTTP path of execution. Path can include query params. Default value is \/",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"x-example": "<PATH>",
|
||||
"default": "\/",
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "method",
|
||||
"description": "HTTP method of execution. Default value is GET.",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"x-example": "GET",
|
||||
"enum": [
|
||||
"GET",
|
||||
"POST",
|
||||
"PUT",
|
||||
"PATCH",
|
||||
"DELETE",
|
||||
"OPTIONS"
|
||||
],
|
||||
"x-enum-name": "ExecutionMethod",
|
||||
"x-enum-keys": [],
|
||||
"default": "POST",
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "headers",
|
||||
"description": "HTTP headers of execution. Defaults to empty.",
|
||||
"required": false,
|
||||
"type": "object",
|
||||
"default": [],
|
||||
"x-example": "{}",
|
||||
"in": "formData"
|
||||
},
|
||||
{
|
||||
"name": "scheduledAt",
|
||||
"description": "Scheduled execution time in [ISO 8601](https:\/\/www.iso.org\/iso-8601-date-and-time-format.html) format. DateTime value must be in future with precision in minutes.",
|
||||
"required": false,
|
||||
"type": "string",
|
||||
"in": "formData"
|
||||
"name": "payload",
|
||||
"in": "body",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"body": {
|
||||
"type": "object",
|
||||
"description": "HTTP body of execution. Default value is empty string.",
|
||||
"default": "",
|
||||
"x-example": "{}"
|
||||
},
|
||||
"async": {
|
||||
"type": "boolean",
|
||||
"description": "Execute code in the background. Default value is false.",
|
||||
"default": false,
|
||||
"x-example": false
|
||||
},
|
||||
"path": {
|
||||
"type": "string",
|
||||
"description": "HTTP path of execution. Path can include query params. Default value is \/",
|
||||
"default": "\/",
|
||||
"x-example": "<PATH>"
|
||||
},
|
||||
"method": {
|
||||
"type": "string",
|
||||
"description": "HTTP method of execution. Default value is GET.",
|
||||
"default": "POST",
|
||||
"x-example": "GET",
|
||||
"enum": [
|
||||
"GET",
|
||||
"POST",
|
||||
"PUT",
|
||||
"PATCH",
|
||||
"DELETE",
|
||||
"OPTIONS"
|
||||
],
|
||||
"x-enum-name": "ExecutionMethod",
|
||||
"x-enum-keys": []
|
||||
},
|
||||
"headers": {
|
||||
"type": "object",
|
||||
"description": "HTTP headers of execution. Defaults to empty.",
|
||||
"default": [],
|
||||
"x-example": "{}"
|
||||
},
|
||||
"scheduledAt": {
|
||||
"type": "string",
|
||||
"description": "Scheduled execution time in [ISO 8601](https:\/\/www.iso.org\/iso-8601-date-and-time-format.html) format. DateTime value must be in future with precision in minutes.",
|
||||
"default": null,
|
||||
"x-example": null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -12312,7 +12306,7 @@
|
||||
},
|
||||
"\/locale\/codes": {
|
||||
"get": {
|
||||
"summary": "List Locale Codes",
|
||||
"summary": "List locale codes",
|
||||
"operationId": "localeListCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -18238,7 +18232,7 @@
|
||||
]
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete File",
|
||||
"summary": "Delete file",
|
||||
"operationId": "storageDeleteFile",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -20105,7 +20099,7 @@
|
||||
},
|
||||
"\/users\/identities": {
|
||||
"get": {
|
||||
"summary": "List Identities",
|
||||
"summary": "List identities",
|
||||
"operationId": "usersListIdentities",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -21383,7 +21377,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/mfa\/authenticators\/{type}": {
|
||||
"delete": {
|
||||
"summary": "Delete Authenticator",
|
||||
"summary": "Delete authenticator",
|
||||
"operationId": "usersDeleteMfaAuthenticator",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -21460,7 +21454,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/mfa\/factors": {
|
||||
"get": {
|
||||
"summary": "List Factors",
|
||||
"summary": "List factors",
|
||||
"operationId": "usersListMfaFactors",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -21524,7 +21518,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/mfa\/recovery-codes": {
|
||||
"get": {
|
||||
"summary": "Get MFA Recovery Codes",
|
||||
"summary": "Get MFA recovery codes",
|
||||
"operationId": "usersGetMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -21586,7 +21580,7 @@
|
||||
]
|
||||
},
|
||||
"put": {
|
||||
"summary": "Regenerate MFA Recovery Codes",
|
||||
"summary": "Regenerate MFA recovery codes",
|
||||
"operationId": "usersUpdateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -21648,7 +21642,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Create MFA Recovery Codes",
|
||||
"summary": "Create MFA recovery codes",
|
||||
"operationId": "usersCreateMfaRecoveryCodes",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -22434,7 +22428,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/targets": {
|
||||
"get": {
|
||||
"summary": "List User Targets",
|
||||
"summary": "List user targets",
|
||||
"operationId": "usersListTargets",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -22509,7 +22503,7 @@
|
||||
]
|
||||
},
|
||||
"post": {
|
||||
"summary": "Create User Target",
|
||||
"summary": "Create user target",
|
||||
"operationId": "usersCreateTarget",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -22625,7 +22619,7 @@
|
||||
},
|
||||
"\/users\/{userId}\/targets\/{targetId}": {
|
||||
"get": {
|
||||
"summary": "Get User Target",
|
||||
"summary": "Get user target",
|
||||
"operationId": "usersGetTarget",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
@@ -22696,7 +22690,7 @@
|
||||
]
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Update User target",
|
||||
"summary": "Update user target",
|
||||
"operationId": "usersUpdateTarget",
|
||||
"consumes": [
|
||||
"application\/json"
|
||||
|
||||
@@ -3683,7 +3683,7 @@ App::patch('/v1/account/mfa')
|
||||
});
|
||||
|
||||
App::get('/v1/account/mfa/factors')
|
||||
->desc('List Factors')
|
||||
->desc('List factors')
|
||||
->groups(['api', 'account', 'mfa'])
|
||||
->label('scope', 'account')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT])
|
||||
@@ -3715,7 +3715,7 @@ App::get('/v1/account/mfa/factors')
|
||||
});
|
||||
|
||||
App::post('/v1/account/mfa/authenticators/:type')
|
||||
->desc('Create Authenticator')
|
||||
->desc('Create authenticator')
|
||||
->groups(['api', 'account'])
|
||||
->label('event', 'users.[userId].update.mfa')
|
||||
->label('scope', 'account')
|
||||
@@ -3787,7 +3787,7 @@ App::post('/v1/account/mfa/authenticators/:type')
|
||||
});
|
||||
|
||||
App::put('/v1/account/mfa/authenticators/:type')
|
||||
->desc('Verify Authenticator')
|
||||
->desc('Verify authenticator')
|
||||
->groups(['api', 'account'])
|
||||
->label('event', 'users.[userId].update.mfa')
|
||||
->label('scope', 'account')
|
||||
@@ -3852,7 +3852,7 @@ App::put('/v1/account/mfa/authenticators/:type')
|
||||
});
|
||||
|
||||
App::post('/v1/account/mfa/recovery-codes')
|
||||
->desc('Create MFA Recovery Codes')
|
||||
->desc('Create MFA recovery codes')
|
||||
->groups(['api', 'account'])
|
||||
->label('event', 'users.[userId].update.mfa')
|
||||
->label('scope', 'account')
|
||||
@@ -3894,7 +3894,7 @@ App::post('/v1/account/mfa/recovery-codes')
|
||||
});
|
||||
|
||||
App::patch('/v1/account/mfa/recovery-codes')
|
||||
->desc('Regenerate MFA Recovery Codes')
|
||||
->desc('Regenerate MFA recovery codes')
|
||||
->groups(['api', 'account', 'mfaProtected'])
|
||||
->label('event', 'users.[userId].update.mfa')
|
||||
->label('scope', 'account')
|
||||
@@ -3935,7 +3935,7 @@ App::patch('/v1/account/mfa/recovery-codes')
|
||||
});
|
||||
|
||||
App::get('/v1/account/mfa/recovery-codes')
|
||||
->desc('Get MFA Recovery Codes')
|
||||
->desc('Get MFA recovery codes')
|
||||
->groups(['api', 'account', 'mfaProtected'])
|
||||
->label('scope', 'account')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT])
|
||||
@@ -3965,7 +3965,7 @@ App::get('/v1/account/mfa/recovery-codes')
|
||||
});
|
||||
|
||||
App::delete('/v1/account/mfa/authenticators/:type')
|
||||
->desc('Delete Authenticator')
|
||||
->desc('Delete authenticator')
|
||||
->groups(['api', 'account', 'mfaProtected'])
|
||||
->label('event', 'users.[userId].delete.mfa')
|
||||
->label('scope', 'account')
|
||||
@@ -4003,7 +4003,7 @@ App::delete('/v1/account/mfa/authenticators/:type')
|
||||
});
|
||||
|
||||
App::post('/v1/account/mfa/challenge')
|
||||
->desc('Create MFA Challenge')
|
||||
->desc('Create MFA challenge')
|
||||
->groups(['api', 'account', 'mfa'])
|
||||
->label('scope', 'account')
|
||||
->label('event', 'users.[userId].challenges.[challengeId].create')
|
||||
@@ -4191,7 +4191,7 @@ App::post('/v1/account/mfa/challenge')
|
||||
});
|
||||
|
||||
App::put('/v1/account/mfa/challenge')
|
||||
->desc('Create MFA Challenge (confirmation)')
|
||||
->desc('Create MFA challenge (confirmation)')
|
||||
->groups(['api', 'account', 'mfa'])
|
||||
->label('scope', 'account')
|
||||
->label('event', 'users.[userId].sessions.[sessionId].create')
|
||||
@@ -4452,7 +4452,7 @@ App::delete('/v1/account/targets/:targetId/push')
|
||||
$response->noContent();
|
||||
});
|
||||
App::get('/v1/account/identities')
|
||||
->desc('List Identities')
|
||||
->desc('List identities')
|
||||
->groups(['api', 'account'])
|
||||
->label('scope', 'account')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_JWT])
|
||||
|
||||
@@ -550,7 +550,7 @@ App::get('/v1/avatars/initials')
|
||||
});
|
||||
|
||||
App::get('/v1/cards/cloud')
|
||||
->desc('Get Front Of Cloud Card')
|
||||
->desc('Get front Of Cloud Card')
|
||||
->groups(['api', 'avatars'])
|
||||
->label('scope', 'avatars.read')
|
||||
->label('cache', true)
|
||||
@@ -609,9 +609,9 @@ App::get('/v1/cards/cloud')
|
||||
|
||||
$isPlatinum = $user->getInternalId() % 100 === 0;
|
||||
} else {
|
||||
$name = $mock === 'normal-long' ? 'Sir First Walter O\'Brian Junior' : 'Walter O\'Brian';
|
||||
$name = $mock === 'normal-long' ? 'Sir First Walter O\'Brien Junior' : 'Walter O\'Brien';
|
||||
$createdAt = new \DateTime('now');
|
||||
$githubName = $mock === 'normal-no-github' ? '' : ($mock === 'normal-long' ? 'sir-first-walterobrian-junior' : 'walterobrian');
|
||||
$githubName = $mock === 'normal-no-github' ? '' : ($mock === 'normal-long' ? 'sir-first-walterobrien-junior' : 'walterobrien');
|
||||
$isHero = $mock === 'hero';
|
||||
$isContributor = $mock === 'contributor';
|
||||
$isEmployee = \str_starts_with($mock, 'employee');
|
||||
@@ -757,7 +757,7 @@ App::get('/v1/cards/cloud')
|
||||
});
|
||||
|
||||
App::get('/v1/cards/cloud-back')
|
||||
->desc('Get Back Of Cloud Card')
|
||||
->desc('Get back Of Cloud Card')
|
||||
->groups(['api', 'avatars'])
|
||||
->label('scope', 'avatars.read')
|
||||
->label('cache', true)
|
||||
@@ -835,7 +835,7 @@ App::get('/v1/cards/cloud-back')
|
||||
});
|
||||
|
||||
App::get('/v1/cards/cloud-og')
|
||||
->desc('Get OG Image From Cloud Card')
|
||||
->desc('Get OG image From Cloud Card')
|
||||
->groups(['api', 'avatars'])
|
||||
->label('scope', 'avatars.read')
|
||||
->label('cache', true)
|
||||
@@ -900,9 +900,9 @@ App::get('/v1/cards/cloud-og')
|
||||
} else {
|
||||
$bgVariation = \str_ends_with($mock, '-bg2') ? '2' : (\str_ends_with($mock, '-bg3') ? '3' : '1');
|
||||
$cardVariation = \str_ends_with($mock, '-right') ? '2' : (\str_ends_with($mock, '-middle') ? '3' : '1');
|
||||
$name = \str_starts_with($mock, 'normal-long') ? 'Sir First Walter O\'Brian Junior' : 'Walter O\'Brian';
|
||||
$name = \str_starts_with($mock, 'normal-long') ? 'Sir First Walter O\'Brien Junior' : 'Walter O\'Brien';
|
||||
$createdAt = new \DateTime('now');
|
||||
$githubName = $mock === 'normal-no-github' ? '' : (\str_starts_with($mock, 'normal-long') ? 'sir-first-walterobrian-junior' : 'walterobrian');
|
||||
$githubName = $mock === 'normal-no-github' ? '' : (\str_starts_with($mock, 'normal-long') ? 'sir-first-walterobrien-junior' : 'walterobrien');
|
||||
$isHero = \str_starts_with($mock, 'hero');
|
||||
$isContributor = \str_starts_with($mock, 'contributor');
|
||||
$isEmployee = \str_starts_with($mock, 'employee');
|
||||
|
||||
@@ -57,7 +57,7 @@ App::get('/v1/console/variables')
|
||||
});
|
||||
|
||||
App::post('/v1/console/assistant')
|
||||
->desc('Ask Query')
|
||||
->desc('Ask query')
|
||||
->groups(['api', 'assistant'])
|
||||
->label('scope', 'assistant.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
||||
@@ -5,7 +5,6 @@ use Appwrite\Detector\Detector;
|
||||
use Appwrite\Event\Database as EventDatabase;
|
||||
use Appwrite\Event\Delete;
|
||||
use Appwrite\Event\Event;
|
||||
use Appwrite\Event\Usage;
|
||||
use Appwrite\Extend\Exception;
|
||||
use Appwrite\Network\Validator\Email;
|
||||
use Appwrite\Utopia\Database\Validator\CustomId;
|
||||
@@ -453,8 +452,7 @@ App::post('/v1/databases')
|
||||
->inject('response')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForEvents')
|
||||
->inject('queueForUsage')
|
||||
->action(function (string $databaseId, string $name, bool $enabled, Response $response, Database $dbForProject, Event $queueForEvents, Usage $queueForUsage) {
|
||||
->action(function (string $databaseId, string $name, bool $enabled, Response $response, Database $dbForProject, Event $queueForEvents) {
|
||||
|
||||
$databaseId = $databaseId == 'unique()' ? ID::unique() : $databaseId;
|
||||
|
||||
@@ -504,7 +502,6 @@ App::post('/v1/databases')
|
||||
}
|
||||
|
||||
$queueForEvents->setParam('databaseId', $database->getId());
|
||||
$queueForUsage->addMetric(str_replace(['{databaseInternalId}'], [$database->getInternalId()], METRIC_DATABASE_ID_STORAGE), 1); // per database
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
@@ -736,8 +733,7 @@ App::delete('/v1/databases/:databaseId')
|
||||
->inject('dbForProject')
|
||||
->inject('queueForDatabase')
|
||||
->inject('queueForEvents')
|
||||
->inject('queueForUsage')
|
||||
->action(function (string $databaseId, Response $response, Database $dbForProject, EventDatabase $queueForDatabase, Event $queueForEvents, Usage $queueForUsage) {
|
||||
->action(function (string $databaseId, Response $response, Database $dbForProject, EventDatabase $queueForDatabase, Event $queueForEvents) {
|
||||
|
||||
$database = $dbForProject->getDocument('databases', $databaseId);
|
||||
|
||||
@@ -760,9 +756,6 @@ App::delete('/v1/databases/:databaseId')
|
||||
->setParam('databaseId', $database->getId())
|
||||
->setPayload($response->output($database, Response::MODEL_DATABASE));
|
||||
|
||||
$queueForUsage
|
||||
->addMetric(METRIC_DATABASES_STORAGE, 1); // Global, deletion forces full recalculation
|
||||
|
||||
$response->noContent();
|
||||
});
|
||||
|
||||
@@ -2357,8 +2350,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/attributes/:key
|
||||
->inject('dbForProject')
|
||||
->inject('queueForDatabase')
|
||||
->inject('queueForEvents')
|
||||
->inject('queueForUsage')
|
||||
->action(function (string $databaseId, string $collectionId, string $key, Response $response, Database $dbForProject, EventDatabase $queueForDatabase, Event $queueForEvents, Usage $queueForUsage) {
|
||||
->action(function (string $databaseId, string $collectionId, string $key, Response $response, Database $dbForProject, EventDatabase $queueForDatabase, Event $queueForEvents) {
|
||||
|
||||
$db = Authorization::skip(fn () => $dbForProject->getDocument('databases', $databaseId));
|
||||
|
||||
@@ -2443,9 +2435,6 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/attributes/:key
|
||||
->setContext('database', $db)
|
||||
->setPayload($response->output($attribute, $model));
|
||||
|
||||
$queueForUsage
|
||||
->addMetric(str_replace(['{databaseInternalId}', '{collectionInternalId}'], [$db->getInternalId(), $collection->getInternalId()], METRIC_DATABASE_ID_COLLECTION_ID_STORAGE), 1); // per collection
|
||||
|
||||
$response->noContent();
|
||||
});
|
||||
|
||||
@@ -2542,7 +2531,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/indexes')
|
||||
$attributeIndex = \array_search($attribute, array_column($oldAttributes, 'key'));
|
||||
|
||||
if ($attributeIndex === false) {
|
||||
throw new Exception(Exception::ATTRIBUTE_UNKNOWN, 'Unknown attribute: ' . $attribute);
|
||||
throw new Exception(Exception::ATTRIBUTE_UNKNOWN, 'Unknown attribute: ' . $attribute . '. Verify the attribute name or create the attribute.');
|
||||
}
|
||||
|
||||
$attributeStatus = $oldAttributes[$attributeIndex]['status'];
|
||||
@@ -2821,9 +2810,8 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/documents')
|
||||
->inject('dbForProject')
|
||||
->inject('user')
|
||||
->inject('queueForEvents')
|
||||
->inject('queueForUsage')
|
||||
->inject('mode')
|
||||
->action(function (string $databaseId, string $documentId, string $collectionId, string|array $data, ?array $permissions, Response $response, Database $dbForProject, Document $user, Event $queueForEvents, Usage $queueForUsage, string $mode) {
|
||||
->action(function (string $databaseId, string $documentId, string $collectionId, string|array $data, ?array $permissions, Response $response, Database $dbForProject, Document $user, Event $queueForEvents, string $mode) {
|
||||
|
||||
$data = (\is_string($data)) ? \json_decode($data, true) : $data; // Cast to JSON array
|
||||
|
||||
@@ -3039,9 +3027,6 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/documents')
|
||||
->setContext('database', $database)
|
||||
->setPayload($response->getPayload(), sensitive: $relationships);
|
||||
|
||||
|
||||
$queueForUsage
|
||||
->addMetric(str_replace(['{databaseInternalId}', '{collectionInternalId}'], [$database->getInternalId(), $collection->getInternalId()], METRIC_DATABASE_ID_COLLECTION_ID_STORAGE), 1); // per collection
|
||||
});
|
||||
|
||||
App::get('/v1/databases/:databaseId/collections/:collectionId/documents')
|
||||
@@ -3658,9 +3643,8 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/documents/:docu
|
||||
->inject('dbForProject')
|
||||
->inject('queueForDeletes')
|
||||
->inject('queueForEvents')
|
||||
->inject('queueForUsage')
|
||||
->inject('mode')
|
||||
->action(function (string $databaseId, string $collectionId, string $documentId, ?\DateTime $requestTimestamp, Response $response, Database $dbForProject, Delete $queueForDeletes, Event $queueForEvents, Usage $queueForUsage, string $mode) {
|
||||
->action(function (string $databaseId, string $collectionId, string $documentId, ?\DateTime $requestTimestamp, Response $response, Database $dbForProject, Delete $queueForDeletes, Event $queueForEvents, string $mode) {
|
||||
$database = Authorization::skip(fn () => $dbForProject->getDocument('databases', $databaseId));
|
||||
|
||||
$isAPIKey = Auth::isAppUser(Authorization::getRoles());
|
||||
@@ -3745,9 +3729,6 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/documents/:docu
|
||||
->setContext('database', $database)
|
||||
->setPayload($response->output($document, Response::MODEL_DOCUMENT), sensitive: $relationships);
|
||||
|
||||
$queueForUsage
|
||||
->addMetric(str_replace(['{databaseInternalId}', '{collectionInternalId}'], [$database->getInternalId(), $collection->getInternalId()], METRIC_DATABASE_ID_COLLECTION_ID_STORAGE), 1); // per collection
|
||||
|
||||
$response->noContent();
|
||||
});
|
||||
|
||||
@@ -3773,7 +3754,6 @@ App::get('/v1/databases/usage')
|
||||
METRIC_DATABASES,
|
||||
METRIC_COLLECTIONS,
|
||||
METRIC_DOCUMENTS,
|
||||
METRIC_DATABASES_STORAGE
|
||||
];
|
||||
|
||||
Authorization::skip(function () use ($dbForProject, $days, $metrics, &$stats) {
|
||||
@@ -3824,11 +3804,9 @@ App::get('/v1/databases/usage')
|
||||
'databasesTotal' => $usage[$metrics[0]]['total'],
|
||||
'collectionsTotal' => $usage[$metrics[1]]['total'],
|
||||
'documentsTotal' => $usage[$metrics[2]]['total'],
|
||||
'storageTotal' => $usage[$metrics[3]]['total'],
|
||||
'databases' => $usage[$metrics[0]]['data'],
|
||||
'collections' => $usage[$metrics[1]]['data'],
|
||||
'documents' => $usage[$metrics[2]]['data'],
|
||||
'storage' => $usage[$metrics[3]]['data'],
|
||||
]), Response::MODEL_USAGE_DATABASES);
|
||||
});
|
||||
|
||||
@@ -3860,7 +3838,6 @@ App::get('/v1/databases/:databaseId/usage')
|
||||
$metrics = [
|
||||
str_replace('{databaseInternalId}', $database->getInternalId(), METRIC_DATABASE_ID_COLLECTIONS),
|
||||
str_replace('{databaseInternalId}', $database->getInternalId(), METRIC_DATABASE_ID_DOCUMENTS),
|
||||
str_replace('{databaseInternalId}', $database->getInternalId(), METRIC_DATABASE_ID_STORAGE)
|
||||
];
|
||||
|
||||
Authorization::skip(function () use ($dbForProject, $days, $metrics, &$stats) {
|
||||
@@ -3911,10 +3888,8 @@ App::get('/v1/databases/:databaseId/usage')
|
||||
'range' => $range,
|
||||
'collectionsTotal' => $usage[$metrics[0]]['total'],
|
||||
'documentsTotal' => $usage[$metrics[1]]['total'],
|
||||
'storageTotal' => $usage[$metrics[2]]['total'],
|
||||
'collections' => $usage[$metrics[0]]['data'],
|
||||
'documents' => $usage[$metrics[1]]['data'],
|
||||
'storage' => $usage[$metrics[2]]['data'],
|
||||
]), Response::MODEL_USAGE_DATABASE);
|
||||
});
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ App::get('/v1/locale')
|
||||
});
|
||||
|
||||
App::get('/v1/locale/codes')
|
||||
->desc('List Locale Codes')
|
||||
->desc('List locale codes')
|
||||
->groups(['api', 'locale'])
|
||||
->label('scope', 'locale.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_SESSION, APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_JWT])
|
||||
|
||||
@@ -33,7 +33,7 @@ include_once __DIR__ . '/../shared/api.php';
|
||||
|
||||
App::post('/v1/migrations/appwrite')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Migrate Appwrite Data')
|
||||
->desc('Migrate Appwrite data')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].create')
|
||||
->label('audits.event', 'migration.create')
|
||||
@@ -87,7 +87,7 @@ App::post('/v1/migrations/appwrite')
|
||||
|
||||
App::post('/v1/migrations/firebase/oauth')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Migrate Firebase Data (OAuth)')
|
||||
->desc('Migrate Firebase data (OAuth)')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].create')
|
||||
->label('audits.event', 'migration.create')
|
||||
@@ -189,7 +189,7 @@ App::post('/v1/migrations/firebase/oauth')
|
||||
|
||||
App::post('/v1/migrations/firebase')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Migrate Firebase Data (Service Account)')
|
||||
->desc('Migrate Firebase data (Service Account)')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].create')
|
||||
->label('audits.event', 'migration.create')
|
||||
@@ -249,7 +249,7 @@ App::post('/v1/migrations/firebase')
|
||||
|
||||
App::post('/v1/migrations/supabase')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Migrate Supabase Data')
|
||||
->desc('Migrate Supabase data')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].create')
|
||||
->label('audits.event', 'migration.create')
|
||||
@@ -309,7 +309,7 @@ App::post('/v1/migrations/supabase')
|
||||
|
||||
App::post('/v1/migrations/nhost')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Migrate NHost Data')
|
||||
->desc('Migrate NHost data')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].create')
|
||||
->label('audits.event', 'migration.create')
|
||||
@@ -371,7 +371,7 @@ App::post('/v1/migrations/nhost')
|
||||
|
||||
App::get('/v1/migrations')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('List Migrations')
|
||||
->desc('List migrations')
|
||||
->label('scope', 'migrations.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'migrations')
|
||||
@@ -424,7 +424,7 @@ App::get('/v1/migrations')
|
||||
|
||||
App::get('/v1/migrations/:migrationId')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Get Migration')
|
||||
->desc('Get migration')
|
||||
->label('scope', 'migrations.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'migrations')
|
||||
@@ -448,7 +448,7 @@ App::get('/v1/migrations/:migrationId')
|
||||
|
||||
App::get('/v1/migrations/appwrite/report')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Generate a report on Appwrite Data')
|
||||
->desc('Generate a report on Appwrite data')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'migrations')
|
||||
@@ -490,7 +490,7 @@ App::get('/v1/migrations/appwrite/report')
|
||||
|
||||
App::get('/v1/migrations/firebase/report')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Generate a report on Firebase Data')
|
||||
->desc('Generate a report on Firebase data')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'migrations')
|
||||
@@ -537,7 +537,7 @@ App::get('/v1/migrations/firebase/report')
|
||||
|
||||
App::get('/v1/migrations/firebase/report/oauth')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Generate a report on Firebase Data using OAuth')
|
||||
->desc('Generate a report on Firebase data using OAuth')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'migrations')
|
||||
@@ -627,7 +627,7 @@ App::get('/v1/migrations/firebase/report/oauth')
|
||||
});
|
||||
|
||||
App::get('/v1/migrations/firebase/connect')
|
||||
->desc('Authorize with firebase')
|
||||
->desc('Authorize with Firebase')
|
||||
->groups(['api', 'migrations'])
|
||||
->label('scope', 'migrations.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
@@ -781,7 +781,7 @@ App::get('/v1/migrations/firebase/redirect')
|
||||
});
|
||||
|
||||
App::get('/v1/migrations/firebase/projects')
|
||||
->desc('List Firebase Projects')
|
||||
->desc('List Firebase projects')
|
||||
->groups(['api', 'migrations'])
|
||||
->label('scope', 'migrations.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
@@ -870,7 +870,7 @@ App::get('/v1/migrations/firebase/projects')
|
||||
});
|
||||
|
||||
App::get('/v1/migrations/firebase/deauthorize')
|
||||
->desc('Revoke Appwrite\'s authorization to access Firebase Projects')
|
||||
->desc('Revoke Appwrite\'s authorization to access Firebase projects')
|
||||
->groups(['api', 'migrations'])
|
||||
->label('scope', 'migrations.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
@@ -985,7 +985,7 @@ App::get('/v1/migrations/nhost/report')
|
||||
|
||||
App::patch('/v1/migrations/:migrationId')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Retry Migration')
|
||||
->desc('Retry migration')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].retry')
|
||||
->label('audits.event', 'migration.retry')
|
||||
@@ -1030,7 +1030,7 @@ App::patch('/v1/migrations/:migrationId')
|
||||
|
||||
App::delete('/v1/migrations/:migrationId')
|
||||
->groups(['api', 'migrations'])
|
||||
->desc('Delete Migration')
|
||||
->desc('Delete migration')
|
||||
->label('scope', 'migrations.write')
|
||||
->label('event', 'migrations.[migrationId].delete')
|
||||
->label('audits.event', 'migrationId.delete')
|
||||
|
||||
@@ -47,7 +47,6 @@ App::get('/v1/project/usage')
|
||||
METRIC_USERS,
|
||||
METRIC_BUCKETS,
|
||||
METRIC_FILES_STORAGE,
|
||||
METRIC_DATABASES_STORAGE,
|
||||
METRIC_DEPLOYMENTS_STORAGE,
|
||||
METRIC_BUILDS_STORAGE
|
||||
],
|
||||
@@ -57,7 +56,6 @@ App::get('/v1/project/usage')
|
||||
METRIC_NETWORK_OUTBOUND,
|
||||
METRIC_USERS,
|
||||
METRIC_EXECUTIONS,
|
||||
METRIC_DATABASES_STORAGE,
|
||||
METRIC_EXECUTIONS_MB_SECONDS,
|
||||
METRIC_BUILDS_MB_SECONDS
|
||||
]
|
||||
@@ -184,23 +182,6 @@ App::get('/v1/project/usage')
|
||||
];
|
||||
}, $dbForProject->find('buckets'));
|
||||
|
||||
$databasesStorageBreakdown = array_map(function ($database) use ($dbForProject) {
|
||||
$id = $database->getId();
|
||||
$name = $database->getAttribute('name');
|
||||
$metric = str_replace('{databaseInternalId}', $database->getInternalId(), METRIC_DATABASE_ID_STORAGE);
|
||||
|
||||
$value = $dbForProject->findOne('stats', [
|
||||
Query::equal('metric', [$metric]),
|
||||
Query::equal('period', ['inf'])
|
||||
]);
|
||||
|
||||
return [
|
||||
'resourceId' => $id,
|
||||
'name' => $name,
|
||||
'value' => $value['value'] ?? 0,
|
||||
];
|
||||
}, $dbForProject->find('databases'));
|
||||
|
||||
$functionsStorageBreakdown = array_map(function ($function) use ($dbForProject) {
|
||||
$id = $function->getId();
|
||||
$name = $function->getAttribute('name');
|
||||
@@ -288,7 +269,6 @@ App::get('/v1/project/usage')
|
||||
'buildsMbSecondsTotal' => $total[METRIC_BUILDS_MB_SECONDS],
|
||||
'documentsTotal' => $total[METRIC_DOCUMENTS],
|
||||
'databasesTotal' => $total[METRIC_DATABASES],
|
||||
'databasesStorageTotal' => $total[METRIC_DATABASES_STORAGE],
|
||||
'usersTotal' => $total[METRIC_USERS],
|
||||
'bucketsTotal' => $total[METRIC_BUCKETS],
|
||||
'filesStorageTotal' => $total[METRIC_FILES_STORAGE],
|
||||
@@ -299,7 +279,6 @@ App::get('/v1/project/usage')
|
||||
'executionsMbSecondsBreakdown' => $executionsMbSecondsBreakdown,
|
||||
'buildsMbSecondsBreakdown' => $buildsMbSecondsBreakdown,
|
||||
'bucketsBreakdown' => $bucketsBreakdown,
|
||||
'databasesStorageBreakdown' => $databasesStorageBreakdown,
|
||||
'executionsMbSecondsBreakdown' => $executionsMbSecondsBreakdown,
|
||||
'buildsMbSecondsBreakdown' => $buildsMbSecondsBreakdown,
|
||||
'functionsStorageBreakdown' => $functionsStorageBreakdown,
|
||||
@@ -309,7 +288,7 @@ App::get('/v1/project/usage')
|
||||
|
||||
// Variables
|
||||
App::post('/v1/project/variables')
|
||||
->desc('Create Variable')
|
||||
->desc('Create variable')
|
||||
->groups(['api'])
|
||||
->label('scope', 'projects.write')
|
||||
->label('audits.event', 'variable.create')
|
||||
@@ -364,7 +343,7 @@ App::post('/v1/project/variables')
|
||||
});
|
||||
|
||||
App::get('/v1/project/variables')
|
||||
->desc('List Variables')
|
||||
->desc('List variables')
|
||||
->groups(['api'])
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
@@ -389,7 +368,7 @@ App::get('/v1/project/variables')
|
||||
});
|
||||
|
||||
App::get('/v1/project/variables/:variableId')
|
||||
->desc('Get Variable')
|
||||
->desc('Get variable')
|
||||
->groups(['api'])
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
@@ -413,7 +392,7 @@ App::get('/v1/project/variables/:variableId')
|
||||
});
|
||||
|
||||
App::put('/v1/project/variables/:variableId')
|
||||
->desc('Update Variable')
|
||||
->desc('Update variable')
|
||||
->groups(['api'])
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
@@ -459,7 +438,7 @@ App::put('/v1/project/variables/:variableId')
|
||||
});
|
||||
|
||||
App::delete('/v1/project/variables/:variableId')
|
||||
->desc('Delete Variable')
|
||||
->desc('Delete variable')
|
||||
->groups(['api'])
|
||||
->label('scope', 'projects.write')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
||||
@@ -23,7 +23,7 @@ use Utopia\Validator\WhiteList;
|
||||
|
||||
App::post('/v1/proxy/rules')
|
||||
->groups(['api', 'proxy'])
|
||||
->desc('Create Rule')
|
||||
->desc('Create rule')
|
||||
->label('scope', 'rules.write')
|
||||
->label('event', 'rules.[ruleId].create')
|
||||
->label('audits.event', 'rule.create')
|
||||
@@ -149,7 +149,7 @@ App::post('/v1/proxy/rules')
|
||||
|
||||
App::get('/v1/proxy/rules')
|
||||
->groups(['api', 'proxy'])
|
||||
->desc('List Rules')
|
||||
->desc('List rules')
|
||||
->label('scope', 'rules.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'proxy')
|
||||
@@ -212,7 +212,7 @@ App::get('/v1/proxy/rules')
|
||||
|
||||
App::get('/v1/proxy/rules/:ruleId')
|
||||
->groups(['api', 'proxy'])
|
||||
->desc('Get Rule')
|
||||
->desc('Get rule')
|
||||
->label('scope', 'rules.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'proxy')
|
||||
@@ -241,7 +241,7 @@ App::get('/v1/proxy/rules/:ruleId')
|
||||
|
||||
App::delete('/v1/proxy/rules/:ruleId')
|
||||
->groups(['api', 'proxy'])
|
||||
->desc('Delete Rule')
|
||||
->desc('Delete rule')
|
||||
->label('scope', 'rules.write')
|
||||
->label('event', 'rules.[ruleId].delete')
|
||||
->label('audits.event', 'rules.delete')
|
||||
@@ -277,7 +277,7 @@ App::delete('/v1/proxy/rules/:ruleId')
|
||||
});
|
||||
|
||||
App::patch('/v1/proxy/rules/:ruleId/verification')
|
||||
->desc('Update Rule Verification Status')
|
||||
->desc('Update rule verification status')
|
||||
->groups(['api', 'proxy'])
|
||||
->label('scope', 'rules.write')
|
||||
->label('event', 'rules.[ruleId].update')
|
||||
|
||||
@@ -1549,7 +1549,7 @@ App::put('/v1/storage/buckets/:bucketId/files/:fileId')
|
||||
});
|
||||
|
||||
App::delete('/v1/storage/buckets/:bucketId/files/:fileId')
|
||||
->desc('Delete File')
|
||||
->desc('Delete file')
|
||||
->groups(['api', 'storage'])
|
||||
->label('scope', 'files.write')
|
||||
->label('event', 'buckets.[bucketId].files.[fileId].delete')
|
||||
|
||||
@@ -452,7 +452,7 @@ App::post('/v1/users/scrypt-modified')
|
||||
});
|
||||
|
||||
App::post('/v1/users/:userId/targets')
|
||||
->desc('Create User Target')
|
||||
->desc('Create user target')
|
||||
->groups(['api', 'users'])
|
||||
->label('audits.event', 'target.create')
|
||||
->label('audits.resource', 'target/response.$id')
|
||||
@@ -647,7 +647,7 @@ App::get('/v1/users/:userId/prefs')
|
||||
});
|
||||
|
||||
App::get('/v1/users/:userId/targets/:targetId')
|
||||
->desc('Get User Target')
|
||||
->desc('Get user target')
|
||||
->groups(['api', 'users'])
|
||||
->label('scope', 'targets.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_ADMIN])
|
||||
@@ -848,7 +848,7 @@ App::get('/v1/users/:userId/logs')
|
||||
});
|
||||
|
||||
App::get('/v1/users/:userId/targets')
|
||||
->desc('List User Targets')
|
||||
->desc('List user targets')
|
||||
->groups(['api', 'users'])
|
||||
->label('scope', 'targets.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY, APP_AUTH_TYPE_ADMIN])
|
||||
@@ -903,7 +903,7 @@ App::get('/v1/users/:userId/targets')
|
||||
});
|
||||
|
||||
App::get('/v1/users/identities')
|
||||
->desc('List Identities')
|
||||
->desc('List identities')
|
||||
->groups(['api', 'users'])
|
||||
->label('scope', 'users.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_KEY])
|
||||
@@ -1425,7 +1425,7 @@ App::patch('/v1/users/:userId/prefs')
|
||||
});
|
||||
|
||||
App::patch('/v1/users/:userId/targets/:targetId')
|
||||
->desc('Update User target')
|
||||
->desc('Update user target')
|
||||
->groups(['api', 'users'])
|
||||
->label('audits.event', 'target.update')
|
||||
->label('audits.resource', 'target/{response.$id}')
|
||||
@@ -1557,7 +1557,7 @@ App::patch('/v1/users/:userId/mfa')
|
||||
});
|
||||
|
||||
App::get('/v1/users/:userId/mfa/factors')
|
||||
->desc('List Factors')
|
||||
->desc('List factors')
|
||||
->groups(['api', 'users'])
|
||||
->label('scope', 'users.read')
|
||||
->label('usage.metric', 'users.{scope}.requests.read')
|
||||
@@ -1590,7 +1590,7 @@ App::get('/v1/users/:userId/mfa/factors')
|
||||
});
|
||||
|
||||
App::get('/v1/users/:userId/mfa/recovery-codes')
|
||||
->desc('Get MFA Recovery Codes')
|
||||
->desc('Get MFA recovery codes')
|
||||
->groups(['api', 'users'])
|
||||
->label('scope', 'users.read')
|
||||
->label('usage.metric', 'users.{scope}.requests.read')
|
||||
@@ -1625,7 +1625,7 @@ App::get('/v1/users/:userId/mfa/recovery-codes')
|
||||
});
|
||||
|
||||
App::patch('/v1/users/:userId/mfa/recovery-codes')
|
||||
->desc('Create MFA Recovery Codes')
|
||||
->desc('Create MFA recovery codes')
|
||||
->groups(['api', 'users'])
|
||||
->label('event', 'users.[userId].create.mfa.recovery-codes')
|
||||
->label('scope', 'users.write')
|
||||
@@ -1671,7 +1671,7 @@ App::patch('/v1/users/:userId/mfa/recovery-codes')
|
||||
});
|
||||
|
||||
App::put('/v1/users/:userId/mfa/recovery-codes')
|
||||
->desc('Regenerate MFA Recovery Codes')
|
||||
->desc('Regenerate MFA recovery codes')
|
||||
->groups(['api', 'users'])
|
||||
->label('event', 'users.[userId].update.mfa.recovery-codes')
|
||||
->label('scope', 'users.write')
|
||||
@@ -1716,7 +1716,7 @@ App::put('/v1/users/:userId/mfa/recovery-codes')
|
||||
});
|
||||
|
||||
App::delete('/v1/users/:userId/mfa/authenticators/:type')
|
||||
->desc('Delete Authenticator')
|
||||
->desc('Delete authenticator')
|
||||
->groups(['api', 'users'])
|
||||
->label('event', 'users.[userId].delete.mfa')
|
||||
->label('scope', 'users.write')
|
||||
|
||||
@@ -263,7 +263,7 @@ $createGitDeployments = function (GitHub $github, string $providerInstallationId
|
||||
};
|
||||
|
||||
App::get('/v1/vcs/github/authorize')
|
||||
->desc('Install GitHub App')
|
||||
->desc('Install GitHub app')
|
||||
->groups(['api', 'vcs'])
|
||||
->label('scope', 'vcs.read')
|
||||
->label('sdk.namespace', 'vcs')
|
||||
@@ -305,7 +305,7 @@ App::get('/v1/vcs/github/authorize')
|
||||
});
|
||||
|
||||
App::get('/v1/vcs/github/callback')
|
||||
->desc('Capture installation and authorization from GitHub App')
|
||||
->desc('Capture installation and authorization from GitHub app')
|
||||
->groups(['api', 'vcs'])
|
||||
->label('scope', 'public')
|
||||
->label('error', __DIR__ . '/../../views/general/error.phtml')
|
||||
@@ -598,7 +598,7 @@ App::post('/v1/vcs/github/installations/:installationId/providerRepositories/:pr
|
||||
});
|
||||
|
||||
App::get('/v1/vcs/github/installations/:installationId/providerRepositories')
|
||||
->desc('List Repositories')
|
||||
->desc('List repositories')
|
||||
->groups(['api', 'vcs'])
|
||||
->label('scope', 'vcs.read')
|
||||
->label('sdk.namespace', 'vcs')
|
||||
@@ -843,7 +843,7 @@ App::get('/v1/vcs/github/installations/:installationId/providerRepositories/:pro
|
||||
});
|
||||
|
||||
App::get('/v1/vcs/github/installations/:installationId/providerRepositories/:providerRepositoryId/branches')
|
||||
->desc('List Repository Branches')
|
||||
->desc('List repository branches')
|
||||
->groups(['api', 'vcs'])
|
||||
->label('scope', 'vcs.read')
|
||||
->label('sdk.namespace', 'vcs')
|
||||
@@ -892,7 +892,7 @@ App::get('/v1/vcs/github/installations/:installationId/providerRepositories/:pro
|
||||
});
|
||||
|
||||
App::post('/v1/vcs/github/events')
|
||||
->desc('Create Event')
|
||||
->desc('Create event')
|
||||
->groups(['api', 'vcs'])
|
||||
->label('scope', 'public')
|
||||
->inject('gitHub')
|
||||
@@ -1120,7 +1120,7 @@ App::get('/v1/vcs/installations/:installationId')
|
||||
});
|
||||
|
||||
App::delete('/v1/vcs/installations/:installationId')
|
||||
->desc('Delete Installation')
|
||||
->desc('Delete installation')
|
||||
->groups(['api', 'vcs'])
|
||||
->label('scope', 'vcs.write')
|
||||
->label('sdk.namespace', 'vcs')
|
||||
|
||||
@@ -25,6 +25,7 @@ use Utopia\App;
|
||||
use Utopia\CLI\Console;
|
||||
use Utopia\Config\Config;
|
||||
use Utopia\Database\Database;
|
||||
use Utopia\Database\DateTime;
|
||||
use Utopia\Database\Document;
|
||||
use Utopia\Database\Helpers\ID;
|
||||
use Utopia\Database\Query;
|
||||
@@ -81,6 +82,15 @@ function router(App $utopia, Database $dbForConsole, callable $getProjectDB, Swo
|
||||
$project = Authorization::skip(
|
||||
fn () => $dbForConsole->getDocument('projects', $projectId)
|
||||
);
|
||||
|
||||
if (!$project->isEmpty() && $project->getId() !== 'console') {
|
||||
$accessedAt = $project->getAttribute('accessedAt', '');
|
||||
if (DateTime::formatTz(DateTime::addSeconds(new \DateTime(), -APP_PROJECT_ACCESS)) > $accessedAt) {
|
||||
$project->setAttribute('accessedAt', DateTime::now());
|
||||
Authorization::skip(fn () => $dbForConsole->updateDocument('projects', $project->getId(), $project));
|
||||
}
|
||||
}
|
||||
|
||||
if (array_key_exists('proxy', $project->getAttribute('services', []))) {
|
||||
$status = $project->getAttribute('services', [])['proxy'];
|
||||
if (!$status) {
|
||||
|
||||
@@ -95,7 +95,7 @@ $databaseListener = function (string $event, Document $document, Document $proje
|
||||
$databaseInternalId = $parts[1] ?? 0;
|
||||
$queueForUsage
|
||||
->addMetric(METRIC_COLLECTIONS, $value) // per project
|
||||
->addMetric(str_replace('{databaseInternalId}', $databaseInternalId, METRIC_DATABASE_ID_COLLECTIONS), $value)
|
||||
->addMetric(str_replace('{databaseInternalId}', $databaseInternalId, METRIC_DATABASE_ID_COLLECTIONS), $value) // per database
|
||||
;
|
||||
|
||||
if ($event === Database::EVENT_DOCUMENT_DELETE) {
|
||||
|
||||
@@ -238,16 +238,10 @@ const METRIC_MESSAGES_TYPE_PROVIDER_FAILED = METRIC_MESSAGES . '.{type}.{provid
|
||||
const METRIC_SESSIONS = 'sessions';
|
||||
const METRIC_DATABASES = 'databases';
|
||||
const METRIC_COLLECTIONS = 'collections';
|
||||
const METRIC_DATABASES_STORAGE = 'databases.storage';
|
||||
const METRIC_DATABASES_STORAGE_DISK = 'databases.storage_disk';
|
||||
const METRIC_DATABASE_ID_COLLECTIONS = '{databaseInternalId}.collections';
|
||||
const METRIC_DATABASE_ID_STORAGE = '{databaseInternalId}.databases.storage';
|
||||
const METRIC_DATABASE_ID_STORAGE_DISK = '{databaseInternalId}.databases.storage_disk';
|
||||
const METRIC_DOCUMENTS = 'documents';
|
||||
const METRIC_DATABASE_ID_DOCUMENTS = '{databaseInternalId}.documents';
|
||||
const METRIC_DATABASE_ID_COLLECTION_ID_DOCUMENTS = '{databaseInternalId}.{collectionInternalId}.documents';
|
||||
const METRIC_DATABASE_ID_COLLECTION_ID_STORAGE = '{databaseInternalId}.{collectionInternalId}.databases.storage';
|
||||
const METRIC_DATABASE_ID_COLLECTION_ID_STORAGE_DISK = '{databaseInternalId}.{collectionInternalId}.databases.storage_disk';
|
||||
const METRIC_BUCKETS = 'buckets';
|
||||
const METRIC_FILES = 'files';
|
||||
const METRIC_FILES_STORAGE = 'files.storage';
|
||||
|
||||
@@ -531,8 +531,6 @@ $image = $this->getParam('image', '');
|
||||
- _APP_SMTP_USERNAME
|
||||
- _APP_SMTP_PASSWORD
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_DOMAIN
|
||||
- _APP_OPTIONS_FORCE_HTTPS
|
||||
|
||||
appwrite-worker-messaging:
|
||||
image: <?php echo $organization; ?>/<?php echo $image; ?>:<?php echo $version."\n"; ?>
|
||||
|
||||
@@ -310,6 +310,20 @@ try {
|
||||
|
||||
$worker = $platform->getWorker();
|
||||
|
||||
$worker
|
||||
->init()
|
||||
->inject('project')
|
||||
->inject('dbForConsole')
|
||||
->action(function (Document $project, Database $dbForConsole) {
|
||||
if (!$project->isEmpty() && $project->getId() !== 'console') {
|
||||
$accessedAt = $project->getAttribute('accessedAt', '');
|
||||
if (DateTime::formatTz(DateTime::addSeconds(new \DateTime(), -APP_PROJECT_ACCESS)) > $accessedAt) {
|
||||
$project->setAttribute('accessedAt', DateTime::now());
|
||||
Authorization::skip(fn () => $dbForConsole->updateDocument('projects', $project->getId(), $project));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$worker
|
||||
->shutdown()
|
||||
->inject('pools')
|
||||
|
||||
+1
-7
@@ -51,7 +51,7 @@
|
||||
"utopia-php/cache": "0.10.*",
|
||||
"utopia-php/cli": "0.15.*",
|
||||
"utopia-php/config": "0.2.*",
|
||||
"utopia-php/database": "0.53.5-rc1",
|
||||
"utopia-php/database": "0.53.4",
|
||||
"utopia-php/domains": "0.5.*",
|
||||
"utopia-php/dsn": "0.2.1",
|
||||
"utopia-php/framework": "0.33.*",
|
||||
@@ -97,11 +97,5 @@
|
||||
"platform": {
|
||||
"php": "8.3"
|
||||
}
|
||||
},
|
||||
"repositories": {
|
||||
"utopia-php/database": {
|
||||
"type": "vcs",
|
||||
"url": "https://github.com/utopia-php/database"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Generated
+1967
-448
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
||||
Create a new Document. Before using this route, you should create a new collection resource using either a [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection) API or directly from your database console.
|
||||
Create a new Document. Before using this route, you should create a new collection resource using either a [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection) API or directly from your database console.
|
||||
|
||||
@@ -175,9 +175,9 @@ Please mention in your documentation what resources or API docs you used to impl
|
||||
|
||||
## 3. Test your provider
|
||||
|
||||
After you finished adding your new provider to Appwrite, you should be able to see it in your Appwrite console. Navigate to 'Project > Users > Providers' and check your new provider's settings form.
|
||||
After you finish adding your new provider to Appwrite, you should be able to see it in your Appwrite console. Navigate to 'Project > Users > Providers' and check your new provider's settings form.
|
||||
|
||||
> To start Appwrite console from the source code, you can simply run `docker compose up -d'.
|
||||
> To start the Appwrite console from the source code, you can simply run `docker compose up -d'.
|
||||
|
||||
Add credentials and check both a successful and a failed login (where the user denies integration on the provider page).
|
||||
|
||||
|
||||
@@ -25,6 +25,9 @@ use Appwrite\Spec\Swagger2;
|
||||
use Utopia\CLI\Console;
|
||||
use Utopia\Config\Config;
|
||||
use Utopia\Platform\Action;
|
||||
use Utopia\Validator\Nullable;
|
||||
use Utopia\Validator\Text;
|
||||
use Utopia\Validator\WhiteList;
|
||||
|
||||
class SDKs extends Action
|
||||
{
|
||||
@@ -37,23 +40,35 @@ class SDKs extends Action
|
||||
{
|
||||
$this
|
||||
->desc('Generate Appwrite SDKs')
|
||||
->callback(fn () => $this->action());
|
||||
->param('platform', null, new Nullable(new Text(256)), 'Selected Platform', optional: true)
|
||||
->param('sdk', null, new Nullable(new Text(256)), 'Selected SDK', optional:true)
|
||||
->param('version', null, new Nullable(new Text(256)), 'Selected SDK', optional:true)
|
||||
->param('git', null, new Nullable(new WhiteList(['yes', 'no'])), 'Should we use git push?', optional: true)
|
||||
->param('production', null, new Nullable(new WhiteList(['yes', 'no'])), 'Should we push to production?', optional:true)
|
||||
->param('message', null, new Nullable(new Text(256)), 'Commit Message', optional:true)
|
||||
->callback([$this, 'action']);
|
||||
}
|
||||
|
||||
public function action(): void
|
||||
public function action(?string $selectedPlatform, ?string $selectedSDK, ?string $version, ?string $git, ?string $production, ?string $message)
|
||||
{
|
||||
$platforms = Config::getParam('platforms');
|
||||
$selectedPlatform = Console::confirm('Choose Platform ("' . APP_PLATFORM_CLIENT . '", "' . APP_PLATFORM_SERVER . '", "' . APP_PLATFORM_CONSOLE . '" or "*" for all):');
|
||||
$selectedSDK = \strtolower(Console::confirm('Choose SDK ("*" for all):'));
|
||||
$version = Console::confirm('Choose an Appwrite version');
|
||||
$git = (Console::confirm('Should we use git push? (yes/no)') == 'yes');
|
||||
$production = ($git) ? (Console::confirm('Type "Appwrite" to push code to production git repos') == 'Appwrite') : false;
|
||||
$message = ($git) ? Console::confirm('Please enter your commit message:') : '';
|
||||
$selectedPlatform ??= Console::confirm('Choose Platform ("' . APP_PLATFORM_CLIENT . '", "' . APP_PLATFORM_SERVER . '", "' . APP_PLATFORM_CONSOLE . '" or "*" for all):');
|
||||
$selectedSDK ??= \strtolower(Console::confirm('Choose SDK ("*" for all):'));
|
||||
$version ??= Console::confirm('Choose an Appwrite version');
|
||||
|
||||
$git ??= Console::confirm('Should we use git push? (yes/no)');
|
||||
$git = $git === 'yes';
|
||||
|
||||
if ($git) {
|
||||
$production ??= Console::confirm('Type "Appwrite" to push code to production git repos');
|
||||
$production = $production === 'Appwrite';
|
||||
$message ??= Console::confirm('Please enter your commit message:');
|
||||
}
|
||||
|
||||
if (!in_array($version, ['0.6.x', '0.7.x', '0.8.x', '0.9.x', '0.10.x', '0.11.x', '0.12.x', '0.13.x', '0.14.x', '0.15.x', '1.0.x', '1.1.x', '1.2.x', '1.3.x', '1.4.x', '1.5.x', '1.6.x', 'latest'])) {
|
||||
throw new \Exception('Unknown version given');
|
||||
}
|
||||
|
||||
$platforms = Config::getParam('platforms');
|
||||
foreach ($platforms as $key => $platform) {
|
||||
if ($selectedPlatform !== $key && $selectedPlatform !== '*') {
|
||||
continue;
|
||||
|
||||
@@ -4,7 +4,6 @@ namespace Appwrite\Platform\Workers;
|
||||
|
||||
use Appwrite\Extend\Exception;
|
||||
use Utopia\CLI\Console;
|
||||
use Utopia\Database\Database;
|
||||
use Utopia\Database\DateTime;
|
||||
use Utopia\Database\Document;
|
||||
use Utopia\Database\Exception\Duplicate;
|
||||
@@ -12,10 +11,6 @@ use Utopia\Platform\Action;
|
||||
use Utopia\Queue\Message;
|
||||
use Utopia\System\System;
|
||||
|
||||
const METRIC_COLLECTION_LEVEL_STORAGE = 4;
|
||||
const METRIC_DATABASE_LEVEL_STORAGE = 3;
|
||||
const METRIC_PROJECT_LEVEL_STORAGE = 2;
|
||||
|
||||
class UsageDump extends Action
|
||||
{
|
||||
protected array $stats = [];
|
||||
@@ -75,15 +70,6 @@ class UsageDump extends Action
|
||||
continue;
|
||||
}
|
||||
|
||||
if (str_contains($key, METRIC_DATABASES_STORAGE)) {
|
||||
try {
|
||||
$this->handleDatabaseStorage($key, $dbForProject);
|
||||
} catch (\Exception $e) {
|
||||
console::error('[' . DateTime::now() . '] failed to calculate database storage for key [' . $key . '] ' . $e->getMessage());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($this->periods as $period => $format) {
|
||||
$time = 'inf' === $period ? null : date($format, time());
|
||||
$id = \md5("{$time}_{$period}_{$key}");
|
||||
@@ -121,175 +107,4 @@ class UsageDump extends Action
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function handleDatabaseStorage(string $key, Database $dbForProject): void
|
||||
{
|
||||
$data = explode('.', $key);
|
||||
$start = microtime(true);
|
||||
|
||||
$updateMetric = function (Database $dbForProject, int $value, string $key, string $period, string|null $time) {
|
||||
$id = \md5("{$time}_{$period}_{$key}");
|
||||
|
||||
try {
|
||||
$dbForProject->createDocument('stats', new Document([
|
||||
'$id' => $id,
|
||||
'period' => $period,
|
||||
'time' => $time,
|
||||
'metric' => $key,
|
||||
'value' => $value,
|
||||
'region' => System::getEnv('_APP_REGION', 'default'),
|
||||
]));
|
||||
} catch (Duplicate $th) {
|
||||
if ($value < 0) {
|
||||
$dbForProject->decreaseDocumentAttribute(
|
||||
'stats',
|
||||
$id,
|
||||
'value',
|
||||
abs($value)
|
||||
);
|
||||
} else {
|
||||
$dbForProject->increaseDocumentAttribute(
|
||||
'stats',
|
||||
$id,
|
||||
'value',
|
||||
$value
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
foreach ($this->periods as $period => $format) {
|
||||
$time = 'inf' === $period ? null : date($format, time());
|
||||
$id = \md5("{$time}_{$period}_{$key}");
|
||||
|
||||
$value = 0;
|
||||
$diskValue = 0;
|
||||
$previousValue = 0;
|
||||
try {
|
||||
$previousValue = ($dbForProject->getDocument('stats', $id))->getAttribute('value', 0);
|
||||
} catch (\Exception $e) {
|
||||
// No previous value
|
||||
}
|
||||
|
||||
switch (count($data)) {
|
||||
// Collection Level
|
||||
case METRIC_COLLECTION_LEVEL_STORAGE:
|
||||
Console::log('[' . DateTime::now() . '] Collection Level Storage Calculation [' . $key . ']');
|
||||
$databaseInternalId = $data[0];
|
||||
$collectionInternalId = $data[1];
|
||||
|
||||
try {
|
||||
$value = $dbForProject->getSizeOfCollection('database_'.$databaseInternalId.'_collection_'.$collectionInternalId);
|
||||
$diskValue = $dbForProject->getSizeOfCollectionOnDisk('database_'.$databaseInternalId.'_collection_'.$collectionInternalId);
|
||||
} catch (\Exception $e) {
|
||||
// Collection not found
|
||||
if ($e->getMessage() !== 'Collection not found') {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
// Compare with previous value
|
||||
$diff = $value - $previousValue;
|
||||
$diskDiff = $diskValue - $previousValue;
|
||||
|
||||
if ($diff === 0 && $diskDiff === 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Update Collection
|
||||
$updateMetric($dbForProject, $diff, $key, $period, $time);
|
||||
$updateMetric($dbForProject, $diskDiff, $key . '_disk', $period, $time);
|
||||
|
||||
// Update Database
|
||||
$databaseKey = str_replace(['{databaseInternalId}'], [$data[0]], METRIC_DATABASE_ID_STORAGE);
|
||||
$updateMetric($dbForProject, $diff, $databaseKey, $period, $time);
|
||||
$updateMetric($dbForProject, $diskDiff, $databaseKey . '_disk', $period, $time);
|
||||
|
||||
// Update Project
|
||||
$projectKey = METRIC_DATABASES_STORAGE;
|
||||
$updateMetric($dbForProject, $diff, $projectKey, $period, $time);
|
||||
$updateMetric($dbForProject, $diskDiff, $projectKey . '_disk', $period, $time);
|
||||
break;
|
||||
// Database Level
|
||||
case METRIC_DATABASE_LEVEL_STORAGE:
|
||||
Console::log('[' . DateTime::now() . '] Database Level Storage Calculation [' . $key . ']');
|
||||
$databaseInternalId = $data[0];
|
||||
|
||||
$collections = [];
|
||||
try {
|
||||
$collections = $dbForProject->find('database_' . $databaseInternalId);
|
||||
} catch (\Exception $e) {
|
||||
// Database not found
|
||||
if ($e->getMessage() !== 'Collection not found') {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($collections as $collection) {
|
||||
try {
|
||||
$value += $dbForProject->getSizeOfCollection('database_'.$databaseInternalId.'_collection_'.$collection->getInternalId());
|
||||
$diskValue += $dbForProject->getSizeOfCollectionOnDisk('database_'.$databaseInternalId.'_collection_'.$collection->getInternalId());
|
||||
} catch (\Exception $e) {
|
||||
// Collection not found
|
||||
if ($e->getMessage() !== 'Collection not found') {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$diff = $value - $previousValue;
|
||||
$diskDiff = $diskValue - $previousValue;
|
||||
|
||||
if ($diff === 0 && $diskDiff === 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Update Database
|
||||
$databaseKey = str_replace(['{databaseInternalId}'], [$data[0]], METRIC_DATABASE_ID_STORAGE);
|
||||
$updateMetric($dbForProject, $diff, $databaseKey, $period, $time);
|
||||
$updateMetric($dbForProject, $diskDiff, $databaseKey . '_disk', $period, $time);
|
||||
|
||||
// Update Project
|
||||
$projectKey = METRIC_DATABASES_STORAGE;
|
||||
$updateMetric($dbForProject, $diff, $projectKey, $period, $time);
|
||||
$updateMetric($dbForProject, $diskDiff, $projectKey . '_disk', $period, $time);
|
||||
break;
|
||||
// Project Level
|
||||
case METRIC_PROJECT_LEVEL_STORAGE:
|
||||
Console::log('[' . DateTime::now() . '] Project Level Storage Calculation [' . $key . ']');
|
||||
// Get all project databases
|
||||
$databases = $dbForProject->find('database');
|
||||
|
||||
// Recalculate all databases
|
||||
foreach ($databases as $database) {
|
||||
$collections = $dbForProject->find('database_' . $database->getInternalId());
|
||||
|
||||
foreach ($collections as $collection) {
|
||||
try {
|
||||
$value += $dbForProject->getSizeOfCollection('database_'.$database->getInternalId().'_collection_'.$collection->getInternalId());
|
||||
$diskValue += $dbForProject->getSizeOfCollectionOnDisk('database_'.$database->getInternalId().'_collection_'.$collection->getInternalId());
|
||||
} catch (\Exception $e) {
|
||||
// Collection not found
|
||||
if ($e->getMessage() !== 'Collection not found') {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$diff = $value - $previousValue;
|
||||
$diskDiff = $diskValue - $previousValue;
|
||||
|
||||
// Update Project
|
||||
$projectKey = METRIC_DATABASES_STORAGE;
|
||||
$updateMetric($dbForProject, $diff, $projectKey, $period, $time);
|
||||
$updateMetric($dbForProject, $diskDiff, $projectKey . '_disk', $period, $time);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$end = microtime(true);
|
||||
|
||||
console::log('[' . DateTime::now() . '] DB Storage Calculation [' . $key . '] took ' . (($end - $start) * 1000) . ' milliseconds');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -323,6 +323,7 @@ class OpenAPI3 extends Format
|
||||
case 'Utopia\Validator\JSON':
|
||||
case 'Utopia\Validator\Mock':
|
||||
case 'Utopia\Validator\Assoc':
|
||||
case 'Appwrite\Functions\Validator\Payload':
|
||||
$param['default'] = (empty($param['default'])) ? new \stdClass() : $param['default'];
|
||||
$node['schema']['type'] = 'object';
|
||||
$node['schema']['x-example'] = '{}';
|
||||
|
||||
@@ -336,6 +336,7 @@ class Swagger2 extends Format
|
||||
case 'Utopia\Validator\JSON':
|
||||
case 'Utopia\Validator\Mock':
|
||||
case 'Utopia\Validator\Assoc':
|
||||
case 'Appwrite\Functions\Validator\Payload':
|
||||
$node['type'] = 'object';
|
||||
$node['default'] = (empty($param['default'])) ? new \stdClass() : $param['default'];
|
||||
$node['x-example'] = '{}';
|
||||
|
||||
@@ -625,11 +625,6 @@ class Response extends SwooleResponse
|
||||
}
|
||||
}
|
||||
|
||||
if (!$data->isSet($key) && !$rule['required']) { // set output key null if data key is not set and required is false
|
||||
$output[$key] = null;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($rule['array']) {
|
||||
if (!is_array($data[$key])) {
|
||||
throw new Exception($key . ' must be an array of type ' . $rule['type']);
|
||||
|
||||
@@ -293,9 +293,9 @@ class Project extends Model
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Collection
|
||||
* Filter document structure
|
||||
*
|
||||
* @return string
|
||||
* @return Document
|
||||
*/
|
||||
public function filter(Document $document): Document
|
||||
{
|
||||
|
||||
@@ -28,12 +28,6 @@ class UsageDatabase extends Model
|
||||
'default' => 0,
|
||||
'example' => 0,
|
||||
])
|
||||
->addRule('storageTotal', [
|
||||
'type' => self::TYPE_INTEGER,
|
||||
'description' => 'Total aggregated number of total storage used in bytes.',
|
||||
'default' => 0,
|
||||
'example' => 0,
|
||||
])
|
||||
->addRule('collections', [
|
||||
'type' => Response::MODEL_METRIC,
|
||||
'description' => 'Aggregated number of collections per period.',
|
||||
@@ -48,13 +42,6 @@ class UsageDatabase extends Model
|
||||
'example' => [],
|
||||
'array' => true
|
||||
])
|
||||
->addRule('storage', [
|
||||
'type' => Response::MODEL_METRIC,
|
||||
'description' => 'Aggregated storage used in bytes per period.',
|
||||
'default' => [],
|
||||
'example' => [],
|
||||
'array' => true
|
||||
])
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,12 +34,6 @@ class UsageDatabases extends Model
|
||||
'default' => 0,
|
||||
'example' => 0,
|
||||
])
|
||||
->addRule('storageTotal', [
|
||||
'type' => self::TYPE_INTEGER,
|
||||
'description' => 'Total aggregated number of total databases storage in bytes.',
|
||||
'default' => 0,
|
||||
'example' => 0,
|
||||
])
|
||||
->addRule('databases', [
|
||||
'type' => Response::MODEL_METRIC,
|
||||
'description' => 'Aggregated number of databases per period.',
|
||||
@@ -61,13 +55,6 @@ class UsageDatabases extends Model
|
||||
'example' => [],
|
||||
'array' => true
|
||||
])
|
||||
->addRule('storage', [
|
||||
'type' => Response::MODEL_METRIC,
|
||||
'description' => 'An array of the aggregated number of databases storage in bytes per period.',
|
||||
'default' => [],
|
||||
'example' => [],
|
||||
'array' => true
|
||||
])
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,12 +28,6 @@ class UsageProject extends Model
|
||||
'default' => 0,
|
||||
'example' => 0,
|
||||
])
|
||||
->addRule('databasesStorageTotal', [
|
||||
'type' => self::TYPE_INTEGER,
|
||||
'description' => 'Total aggregated sum of databases storage size (in bytes).',
|
||||
'default' => 0,
|
||||
'example' => 0,
|
||||
])
|
||||
->addRule('usersTotal', [
|
||||
'type' => self::TYPE_INTEGER,
|
||||
'description' => 'Total aggregated number of users.',
|
||||
@@ -124,13 +118,6 @@ class UsageProject extends Model
|
||||
'example' => [],
|
||||
'array' => true
|
||||
])
|
||||
->addRule('databasesStorageBreakdown', [
|
||||
'type' => Response::MODEL_METRIC_BREAKDOWN,
|
||||
'description' => 'An array of the aggregated breakdown of storage usage by databases.',
|
||||
'default' => [],
|
||||
'example' => [],
|
||||
'array' => true
|
||||
])
|
||||
->addRule('executionsMbSecondsBreakdown', [
|
||||
'type' => Response::MODEL_METRIC_BREAKDOWN,
|
||||
'description' => 'Aggregated breakdown in totals of execution mbSeconds by functions.',
|
||||
|
||||
@@ -143,7 +143,7 @@ class UsageTest extends Scope
|
||||
);
|
||||
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertEquals(22, count($response['body']));
|
||||
$this->assertEquals(20, count($response['body']));
|
||||
$this->validateDates($response['body']['network']);
|
||||
$this->validateDates($response['body']['requests']);
|
||||
$this->validateDates($response['body']['users']);
|
||||
@@ -324,7 +324,7 @@ class UsageTest extends Scope
|
||||
]
|
||||
);
|
||||
|
||||
$this->assertEquals(22, count($response['body']));
|
||||
$this->assertEquals(20, count($response['body']));
|
||||
$this->assertEquals(1, count($response['body']['requests']));
|
||||
$this->assertEquals($requestsTotal, $response['body']['requests'][array_key_last($response['body']['requests'])]['value']);
|
||||
$this->validateDates($response['body']['requests']);
|
||||
@@ -545,7 +545,7 @@ class UsageTest extends Scope
|
||||
]
|
||||
);
|
||||
|
||||
$this->assertEquals(22, count($response['body']));
|
||||
$this->assertEquals(20, count($response['body']));
|
||||
$this->assertEquals(1, count($response['body']['requests']));
|
||||
$this->assertEquals(1, count($response['body']['network']));
|
||||
$this->assertEquals($requestsTotal, $response['body']['requests'][array_key_last($response['body']['requests'])]['value']);
|
||||
@@ -590,260 +590,6 @@ class UsageTest extends Scope
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function testDatabaseStoragePrepare(): array
|
||||
{
|
||||
$response = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/databases',
|
||||
array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id']
|
||||
], $this->getHeaders()),
|
||||
[
|
||||
'databaseId' => 'unique()',
|
||||
'name' => 'dbStorageStats',
|
||||
]
|
||||
);
|
||||
|
||||
$this->assertNotEmpty($response['body']['$id']);
|
||||
$databaseId = $response['body']['$id'];
|
||||
|
||||
$response = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/databases/' . $databaseId . '/collections',
|
||||
array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id']
|
||||
], $this->getHeaders()),
|
||||
[
|
||||
'collectionId' => 'unique()',
|
||||
'name' => 'collectionStorageStats',
|
||||
'documentSecurity' => false,
|
||||
'permissions' => [
|
||||
Permission::read(Role::any()),
|
||||
Permission::create(Role::any()),
|
||||
Permission::update(Role::any()),
|
||||
Permission::delete(Role::any()),
|
||||
],
|
||||
]
|
||||
);
|
||||
|
||||
$this->assertNotEmpty($response['body']['$id']);
|
||||
$collectionId = $response['body']['$id'];
|
||||
|
||||
$response = $this->client->call(
|
||||
Client::METHOD_POST,
|
||||
'/databases/' . $databaseId . '/collections/' . $collectionId . '/attributes' . '/string',
|
||||
array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id']
|
||||
], $this->getHeaders()),
|
||||
[
|
||||
'key' => 'data',
|
||||
'size' => 100000,
|
||||
'required' => true,
|
||||
]
|
||||
);
|
||||
|
||||
return [
|
||||
'databaseId' => $databaseId,
|
||||
'collectionId' => $collectionId,
|
||||
];
|
||||
}
|
||||
|
||||
// /** @depends testDatabaseStoragePrepare */
|
||||
// #[Retry(count: 1)]
|
||||
// public function testDatabaseStorageStatsCreateDocument(array $data): array
|
||||
// {
|
||||
// $databaseId = $data['databaseId'];
|
||||
// $collectionId = $data['collectionId'];
|
||||
|
||||
// $originalProjectMetrics = $this->client->call(
|
||||
// Client::METHOD_GET,
|
||||
// '/project/usage',
|
||||
// $this->getConsoleHeaders(),
|
||||
// [
|
||||
// 'period' => '1d',
|
||||
// 'startDate' => self::getToday(),
|
||||
// 'endDate' => self::getTomorrow(),
|
||||
// ]
|
||||
// );
|
||||
|
||||
// $this->assertEquals(200, $originalProjectMetrics['headers']['status-code']);
|
||||
// $this->assertArrayHasKey('databasesStorageTotal', $originalProjectMetrics['body']);
|
||||
|
||||
// $originalProjectMetrics = $originalProjectMetrics['body'];
|
||||
|
||||
// $originalDatabaseMetrics = $this->client->call(
|
||||
// Client::METHOD_GET,
|
||||
// '/databases/' . $databaseId . '/usage?range=30d',
|
||||
// $this->getConsoleHeaders()
|
||||
// );
|
||||
|
||||
// $this->assertEquals(200, $originalDatabaseMetrics['headers']['status-code']);
|
||||
// $this->assertArrayHasKey('storageTotal', $originalDatabaseMetrics['body']);
|
||||
// $originalDatabaseMetrics = $originalDatabaseMetrics['body'];
|
||||
|
||||
// // Create documents
|
||||
// for ($i = 0; $i < 100; $i++) {
|
||||
// $response = $this->client->call(
|
||||
// Client::METHOD_POST,
|
||||
// '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents',
|
||||
// array_merge([
|
||||
// 'content-type' => 'application/json',
|
||||
// 'x-appwrite-project' => $this->getProject()['$id']
|
||||
// ], $this->getHeaders()),
|
||||
// [
|
||||
// 'documentId' => 'unique()',
|
||||
// 'data' => ['data' => str_repeat('a', 10000)],
|
||||
// ]
|
||||
// );
|
||||
|
||||
// $this->assertEquals(201, $response['headers']['status-code']);
|
||||
// }
|
||||
|
||||
// sleep(self::WAIT);
|
||||
|
||||
// for ($i = 0; $i < 3; $i++) {
|
||||
// try {
|
||||
// $newProjectMetrics = $this->client->call(
|
||||
// Client::METHOD_GET,
|
||||
// '/project/usage',
|
||||
// $this->getConsoleHeaders(),
|
||||
// [
|
||||
// 'period' => '1d',
|
||||
// 'startDate' => self::getToday(),
|
||||
// 'endDate' => self::getTomorrow(),
|
||||
// ]
|
||||
// );
|
||||
|
||||
// $this->assertEquals(200, $newProjectMetrics['headers']['status-code']);
|
||||
// $this->assertArrayHasKey('databasesStorageTotal', $newProjectMetrics['body']);
|
||||
// $this->assertGreaterThan($originalProjectMetrics['databasesStorageTotal'], $newProjectMetrics['body']['databasesStorageTotal']);
|
||||
|
||||
// $newProjectMetrics = $newProjectMetrics['body'];
|
||||
|
||||
// $newDatabaseMetrics = $this->client->call(
|
||||
// Client::METHOD_GET,
|
||||
// '/databases/' . $databaseId . '/usage?range=30d',
|
||||
// $this->getConsoleHeaders()
|
||||
// );
|
||||
|
||||
// $this->assertEquals(200, $newDatabaseMetrics['headers']['status-code']);
|
||||
// $this->assertArrayHasKey('storageTotal', $newDatabaseMetrics['body']);
|
||||
// $this->assertGreaterThan($originalDatabaseMetrics['storageTotal'], $newDatabaseMetrics['body']['storageTotal']);
|
||||
|
||||
// $newDatabaseMetrics = $newDatabaseMetrics['body'];
|
||||
|
||||
// return [
|
||||
// 'databaseId' => $databaseId,
|
||||
// 'collectionId' => $collectionId,
|
||||
// 'currentProjectMetrics' => $newProjectMetrics,
|
||||
// 'currentDatabaseMetrics' => $newDatabaseMetrics,
|
||||
// ];
|
||||
// } catch (ExpectationFailedException $e) {
|
||||
// if ($i === 2) {
|
||||
// throw $e;
|
||||
// }
|
||||
// sleep(self::WAIT);
|
||||
// continue;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// /** @depends testDatabaseStorageStatsCreateDocument */
|
||||
// #[Retry(count: 1)]
|
||||
// public function testDatabaseStorageStatsDeleteDocument(array $data): array
|
||||
// {
|
||||
// $databaseId = $data['databaseId'];
|
||||
// $collectionId = $data['collectionId'];
|
||||
// $currentProjectMetrics = $data['currentProjectMetrics'];
|
||||
// $currentDatabaseMetrics = $data['currentDatabaseMetrics'];
|
||||
|
||||
// $documents = $this->client->call(
|
||||
// Client::METHOD_GET,
|
||||
// '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents',
|
||||
// array_merge([
|
||||
// 'x-appwrite-project' => $this->getProject()['$id']
|
||||
// ], $this->getHeaders()),
|
||||
// [
|
||||
// 'queries' => [
|
||||
// Query::limit(50)->toString()
|
||||
// ]
|
||||
// ]
|
||||
// );
|
||||
|
||||
// foreach ($documents['body']['documents'] as $document) {
|
||||
// $response = $this->client->call(
|
||||
// Client::METHOD_DELETE,
|
||||
// '/databases/' . $databaseId . '/collections/' . $collectionId . '/documents/' . $document['$id'],
|
||||
// array_merge([
|
||||
// 'x-appwrite-project' => $this->getProject()['$id']
|
||||
// ], $this->getHeaders())
|
||||
// );
|
||||
|
||||
// $this->assertEquals(204, $response['headers']['status-code']);
|
||||
// }
|
||||
|
||||
// sleep(self::WAIT);
|
||||
|
||||
// for ($i = 0; $i < 3; $i++) {
|
||||
// try {
|
||||
// $newProjectMetrics = $this->client->call(
|
||||
// Client::METHOD_GET,
|
||||
// '/project/usage',
|
||||
// $this->getConsoleHeaders(),
|
||||
// [
|
||||
// 'period' => '1d',
|
||||
// 'startDate' => self::getToday(),
|
||||
// 'endDate' => self::getTomorrow(),
|
||||
// ]
|
||||
// );
|
||||
|
||||
// $this->assertEquals(200, $newProjectMetrics['headers']['status-code']);
|
||||
// $this->assertArrayHasKey('databasesStorageTotal', $newProjectMetrics['body']);
|
||||
// $this->assertLessThan($currentProjectMetrics['databasesStorageTotal'], $newProjectMetrics['body']['databasesStorageTotal']);
|
||||
|
||||
// $newProjectMetrics = $newProjectMetrics['body'];
|
||||
|
||||
// $newDatabaseMetrics = $this->client->call(
|
||||
// Client::METHOD_GET,
|
||||
// '/databases/' . $databaseId . '/usage?range=30d',
|
||||
// $this->getConsoleHeaders()
|
||||
// );
|
||||
|
||||
// $this->assertEquals(200, $newDatabaseMetrics['headers']['status-code']);
|
||||
// $this->assertArrayHasKey('storageTotal', $newDatabaseMetrics['body']);
|
||||
// $this->assertLessThan($currentDatabaseMetrics['storageTotal'], $newDatabaseMetrics['body']['storageTotal']);
|
||||
|
||||
// $newDatabaseMetrics = $newDatabaseMetrics['body'];
|
||||
|
||||
// return [
|
||||
// 'databaseId' => $databaseId,
|
||||
// 'collectionId' => $collectionId,
|
||||
// 'currentProjectMetrics' => $newProjectMetrics,
|
||||
// 'currentDatabaseMetrics' => $newDatabaseMetrics,
|
||||
// ];
|
||||
// } catch (ExpectationFailedException $e) {
|
||||
// if ($i === 2) {
|
||||
// throw $e;
|
||||
// }
|
||||
// sleep(self::WAIT);
|
||||
// continue;
|
||||
// }
|
||||
// }
|
||||
|
||||
// $newProjectMetrics = $this->client->call(
|
||||
// Client::METHOD_GET,
|
||||
// '/project/usage',
|
||||
// $this->getConsoleHeaders(),
|
||||
// [
|
||||
// 'period' => '1d',
|
||||
// 'startDate' => self::getToday(),
|
||||
// 'endDate' => self::getTomorrow(),
|
||||
// ]
|
||||
// );
|
||||
// }
|
||||
|
||||
/** @depends testDatabaseStats */
|
||||
public function testPrepareFunctionsStats(array $data): array
|
||||
|
||||
@@ -224,7 +224,7 @@ class DatabasesConsoleClientTest extends Scope
|
||||
]);
|
||||
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertEquals(7, count($response['body']));
|
||||
$this->assertEquals(5, count($response['body']));
|
||||
$this->assertEquals('24h', $response['body']['range']);
|
||||
$this->assertIsNumeric($response['body']['documentsTotal']);
|
||||
$this->assertIsNumeric($response['body']['collectionsTotal']);
|
||||
|
||||
@@ -55,32 +55,12 @@ class ResponseTest extends TestCase
|
||||
'integer' => 123,
|
||||
'boolean' => true,
|
||||
'hidden' => 'secret',
|
||||
'array' => [
|
||||
'string 1',
|
||||
'string 2'
|
||||
],
|
||||
]), 'single');
|
||||
|
||||
$this->assertArrayHasKey('string', $output);
|
||||
$this->assertArrayHasKey('integer', $output);
|
||||
$this->assertArrayHasKey('boolean', $output);
|
||||
$this->assertArrayNotHasKey('hidden', $output);
|
||||
$this->assertIsArray($output['array']);
|
||||
|
||||
// test optional array
|
||||
$output = $this->response->output(new Document([
|
||||
'string' => 'lorem ipsum',
|
||||
'integer' => 123,
|
||||
'boolean' => true,
|
||||
'hidden' => 'secret',
|
||||
]), 'single');
|
||||
$this->assertArrayHasKey('string', $output);
|
||||
$this->assertArrayHasKey('integer', $output);
|
||||
$this->assertArrayHasKey('boolean', $output);
|
||||
$this->assertArrayNotHasKey('hidden', $output);
|
||||
$this->assertArrayHasKey('array', $output);
|
||||
$this->assertNull($output['array']);
|
||||
|
||||
}
|
||||
|
||||
public function testResponseModelRequired(): void
|
||||
|
||||
@@ -28,11 +28,6 @@ class Single extends Model
|
||||
'type' => self::TYPE_STRING,
|
||||
'default' => 'default',
|
||||
'required' => true
|
||||
])
|
||||
->addRule('array', [
|
||||
'type' => self::TYPE_STRING,
|
||||
'required' => false,
|
||||
'array' => true,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user