From 5a0559096658574dae6814dfcf1d1969e8b05b82 Mon Sep 17 00:00:00 2001 From: Vincent Ge Date: Mon, 17 Jan 2022 15:03:39 -0500 Subject: [PATCH 01/14] adds Chinese translations to README --- README-CN.md | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 README-CN.md diff --git a/README-CN.md b/README-CN.md new file mode 100644 index 0000000000..90283042b7 --- /dev/null +++ b/README-CN.md @@ -0,0 +1,169 @@ +
+

+ Appwrite Logo +
+
+ 适用于[Flutter/Vue/Angular/React/iOS/Android/* 等等平台 *]的完整后端服务 +
+
+

+ + +[![Discord](https://img.shields.io/discord/564160730845151244?label=discord&style=flat-square)](https://appwrite.io/discord?r=Github) +[![Docker Pulls](https://img.shields.io/docker/pulls/appwrite/appwrite?color=f02e65&style=flat-square)](https://hub.docker.com/r/appwrite/appwrite) +[![Build Status](https://img.shields.io/travis/com/appwrite/appwrite?style=flat-square)](https://travis-ci.com/appwrite/appwrite) +[![Twitter Account](https://img.shields.io/twitter/follow/appwrite?color=00acee&label=twitter&style=flat-square)](https://twitter.com/appwrite) +[![翻译](https://img.shields.io/badge/translate-f02e65?style=flat-square)](docs/tutorials/add-translations.md) +[![周边商店](https://img.shields.io/badge/swag%20store-f02e65?style=flat-square)](https://store.appwrite.io) + +Appwrite 是一个可应用于网页,移动,和后端开发的端到端后端平台, 以一系列 Docker 容器化的微服务形式包装发行。Appwrite 以高度抽象化的界面简化了从零编写 API 的繁琐过程,在保证软件安全的前提下给开发者一个高效的开发过程。 + +Appwrite 可以提供给开发者用户验证,外部授权,用户数据读写检索,文件储存, 图像处理,云函数计算,[等多种服务](https:/ /appwrite.io/docs)。 + +![Appwrite](public/images/github.png) + +更多信息请到 Appwrite 官网查看: [https://appwrite.io](https://appwrite.io) + +内容: + +- [安装](#安装) + - [Unix](#unix) + - [Windows](#windows) + - [CMD](#cmd) + - [PowerShell](#powershell) + - [从旧版本升级](#从旧版本升级) +- [快速入门](#入门) + - [软件服务](#软件服务) + - [开发套件](#开发套件) + - [客户端](#客户端) + - [服务器](#服务器) + - [开发者社区](#开发者社区) +- [软件架构]](#软件架构) +- [贡献代码](#贡献代码) +- [安全](#安全) +- [订阅我们](#订阅我们) +- [版权说明](#版权说明) + +## 安装 + +Appwrite 的容器化服务器只需要一行指令就可以运行。您可以使用 docker-compose 在本地主机上运行 Appwrite,也可以在任何其他容器化工具(如 Kubernetes、Docker Swarm 或 Rancher)上运行 Appwrite。 + +开始运行 Appwrite 服务器的最简单方法是运行我们的 docker-compose 文件。在运行安装命令之前,请确保您的机器上安装了 [Docker](https://dockerdocs.cn/get-docker/index.html): + +### Unix + +```bash +docker run -it --rm \ + --volume /var/run/docker.sock:/var/run/docker.sock \ + --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \ + --entrypoint="install" \ + appwrite/appwrite:0.12.1 +``` + +### Windows + +#### CMD + +```cmd +docker run -it --rm ^ + --volume //var/run/docker.sock:/var/run/docker.sock ^ + --volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^ + --entrypoint="install" ^ + appwrite/appwrite:0.12.1 +``` + +#### PowerShell + +```powershell +docker run -it --rm , + --volume /var/run/docker.sock:/var/run/docker.sock , + --volume ${pwd}/appwrite:/usr/src/code/appwrite:rw , + --entrypoint="install" , + appwrite/appwrite:0.12.1 +``` + +运行后,可以在浏览器上访问 http://localhost 找到 Appwrite 控制台。请注意,在非 Linux 本机主机上,安装完成后服务器可能需要几分钟才能启动。 + + +需要自定义容器构架,请查看我们的 Docker [环境变量](https://appwrite.io/docs/environment-variables) 文档。您还可以参考我们的 [docker-compose.yml](https://gist.github.com/eldadfux/977869ff6bdd7312adfd4e629ee15cc5#file-docker-compose-yml) 文件手动设置环境。 + +### 从旧版本升级 + +如果您从旧版本升级 Appwrite 服务器,则应在设置完成后使用 Appwrite 迁移工具。有关这方面的更多信息,请查看 [安装文档](https://appwrite.io/docs/installation)。 + +## 入门 + +开始使用 Appwrite 只需要在控制台创建一个新项目,选择开发平台,然后抓取我们的开发套件。您可以从以下的教程中找到你喜欢的平台开始使用 Appwrite。 + +* [开始使用 Web](https://appwrite.io/docs/getting-started-for-web) +* [开始使用 Flutter](https://appwrite.io/docs/getting-started-for-flutter) +* [开始使用 Apple](https://appwrite.io/docs/getting-started-for-apple) +* [开始使用 Android](https://appwrite.io/docs/getting-started-for-android) +* [开始使用 Server](https://appwrite.io/docs/getting-started-for-server) +* [开始使用 CLI](https://appwrite.io/docs/command-line) + +### 软件服务 + +* [**帐户**](https://appwrite.io/docs/client/account) -管理当前用户的帐户和登录方式。跟踪和管理用户 Session, 的名号,登录设备,登录方法和记录。 +* [**用户**](https://appwrite.io/docs/server/users) - 在以管理员模式登录时管理和列出所有用户。 +* [**团队**](https://appwrite.io/docs/client/teams) - 管理用户分组。管理团队中的成员权限,邀请,和用户角色。 +* [**数据库**](https://appwrite.io/docs/client/database) - 管理数据库文档和文档集。用检索界面来对文档和文档集进行读取,创建,更新,和删除。 +* [**贮存**](https://appwrite.io/docs/client/storage) - 管理文件的阅读、创建、删除和预览。设置文件的预览来满足程序的个性化需求。所有文件都由 ClamAV 扫描并安全存储和加密。 +* [**云函数**](https://appwrite.io/docs/server/functions) - 在安全,隔离的环境中运行自定义代码。这些代码可以被事件,CRON,或者手动操作触发。 +* [**语言适配**](https://appwrite.io/docs/client/locale) - 根据用户所在的的国家和地区做出合适的语言适配。 +* [**头像**](https://appwrite.io/docs/client/avatars) -管理用户头像、国家旗帜、浏览器图标、信用卡符号,和生成二维码。 +如需完整的 API 界面文档,请访问 [https://appwrite.io/docs](https://appwrite.io/docs)。如需更多教程、新闻和公告,请订阅我们的 [博客](https://medium.com/appwrite-io) 和 加入我们的[Discord 社区](https://discord.gg/GSeTUeA)。 + +### 开发套件 + +以下是当前支持的平台和语言列表。如果您想帮助我们为您选择的平台添加支持,您可以访问我们的 [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 团队维护) + +#### 服务器 +* ✅   [NodeJS](https://github.com/appwrite/sdk-for-node) (由 Appwrite 团队维护) +* ✅   [PHP](https://github.com/appwrite/sdk-for-php) (由 Appwr实验 团队维护) +* ✅   [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 团队维护) +* ✅   [Apple](https://github.com/appwrite/sdk-for-apple) - **公侧** (由 Appwrite 团队维护) +* ✅   [.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)) + +找不到需要的的 SDK? - 欢迎通过发起PR来帮助我们完善Appwrite的软件生态环境 [SDK 生成器](https://github.com/appwrite/sdk-generator)! + + +## 软件架构 + +![Appwrite 软件架构](docs/specs/overview.drawio.svg) + +Appwrite 使用高拓展性的微服务架构。此外,Appwrite 支持多种 API(REST、WebSocket 和 即将推出的 GraphQL),来迎合您的个性化开发习惯。 + +Appwrite API 界面层利用后台缓存和任务委派来提供极地的反应时间。后台的 Worker 代理还允许您使用消息队列来处理负载,并精确控制硬件合理分配和成本。您可以在 [贡献指南](CONTRIBUTING.md#architecture-1) 中了解有关我们架构的更多信息。 + +## 贡献代码 + +所有代码贡献 - 包括来自具有直接提交更改权限的贡献者 - 都必须提交PR请求并在合并分支之前得到核心开发人员的批准。这是为了确保正确审查所有代码。 + +我们欢迎所有人提交PR!如果您愿意提供帮助,可以在 [贡献指南](CONTRIBUTING.md) 中了解有关如何为项目做出贡献的更多信息。 + +## 安全 + +对于安全问题,请发送电子邮件至 [security@appwrite.io](mailto:security@appwrite.io),而不是在 GitHub 上发布公开问题。 + +## 订阅我们 + +加入我们在世界各地不断发展的社区!请参阅我们的官方 [博客](https://medium.com/appwrite-io)。在 [Twitter](https://twitter.com/appwrite)、[Facebook 页面](https://www.facebook.com/appwrite.io)、[Facebook 群组](https://www.facebook)、[开发者社区](https://dev.to/appwrite) 等平台订阅我们或加入我们的 [Discord 社区](https://discord.gg/GSeTUeA) 以获得更多帮助,想法和讨论。 + +## 版权说明 + +版权详情,访问 [BSD 3-Clause License](./LICENSE)。 \ No newline at end of file From 51585b29c545f94190c9903588478711fc4bb1b4 Mon Sep 17 00:00:00 2001 From: Vincent Ge Date: Tue, 18 Jan 2022 11:33:38 -0500 Subject: [PATCH 02/14] corrected translation issues found by Adam Yang --- README-CN.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README-CN.md b/README-CN.md index 90283042b7..1bf6db365f 100644 --- a/README-CN.md +++ b/README-CN.md @@ -104,9 +104,9 @@ docker run -it --rm , ### 软件服务 -* [**帐户**](https://appwrite.io/docs/client/account) -管理当前用户的帐户和登录方式。跟踪和管理用户 Session, 的名号,登录设备,登录方法和记录。 +* [**帐户**](https://appwrite.io/docs/client/account) -管理当前用户的帐户和登录方式。跟踪和管理用户 Session,登录设备,登录方法和查看相关记录。 * [**用户**](https://appwrite.io/docs/server/users) - 在以管理员模式登录时管理和列出所有用户。 -* [**团队**](https://appwrite.io/docs/client/teams) - 管理用户分组。管理团队中的成员权限,邀请,和用户角色。 +* [**团队**](https://appwrite.io/docs/client/teams) - 管理用户分组。邀请成员,管理团队中的用户权限和用户角色。 * [**数据库**](https://appwrite.io/docs/client/database) - 管理数据库文档和文档集。用检索界面来对文档和文档集进行读取,创建,更新,和删除。 * [**贮存**](https://appwrite.io/docs/client/storage) - 管理文件的阅读、创建、删除和预览。设置文件的预览来满足程序的个性化需求。所有文件都由 ClamAV 扫描并安全存储和加密。 * [**云函数**](https://appwrite.io/docs/server/functions) - 在安全,隔离的环境中运行自定义代码。这些代码可以被事件,CRON,或者手动操作触发。 @@ -121,19 +121,19 @@ docker run -it --rm , #### 客户端 * ✅   [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 团队维护) +* ✅   [Apple](https://github.com/appwrite/sdk-for-apple) - **公测** (由 Appwrite 团队维护) * ✅   [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) (由 Appwr实验 团队维护) * ✅   [Dart](https://github.com/appwrite/sdk-for-dart) - (由 Appwrite 团队维护) -* ✅   [Deno](https://github.com/appwrite/sdk-for-deno) - **公侧** (由 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 团队维护) -* ✅   [Apple](https://github.com/appwrite/sdk-for-apple) - **公侧** (由 Appwrite 团队维护) -* ✅   [.NET](https://github.com/appwrite/sdk-for-dotnet) - **公侧** (由 Appwrite 团队维护) +* ✅   [Kotlin](https://github.com/appwrite/sdk-for-kotlin) - **公测** (由 Appwrite 团队维护) +* ✅   [Apple](https://github.com/appwrite/sdk-for-apple) - **公测** (由 Appwrite 团队维护) +* ✅   [.NET](https://github.com/appwrite/sdk-for-dotnet) - **公测** (由 Appwrite 团队维护) #### 开发者社区 * ✅   [Appcelerator Titanium](https://github.com/m1ga/ti.appwrite) (维护者 [Michael Gangolf](https://github.com/m1ga/)) @@ -148,7 +148,7 @@ docker run -it --rm , Appwrite 使用高拓展性的微服务架构。此外,Appwrite 支持多种 API(REST、WebSocket 和 即将推出的 GraphQL),来迎合您的个性化开发习惯。 -Appwrite API 界面层利用后台缓存和任务委派来提供极地的反应时间。后台的 Worker 代理还允许您使用消息队列来处理负载,并精确控制硬件合理分配和成本。您可以在 [贡献指南](CONTRIBUTING.md#architecture-1) 中了解有关我们架构的更多信息。 +Appwrite API 界面层利用后台缓存和任务委派来提供极速的响应时间。后台的 Worker 代理还允许您使用消息队列来处理负载,并精确控制硬件合理分配和成本。您可以在 [贡献指南](CONTRIBUTING.md#architecture-1) 中了解有关我们架构的更多信息。 ## 贡献代码 From 1cf7da26d4aff9b22b7f0729b5359cc227bb59c1 Mon Sep 17 00:00:00 2001 From: kodumbeats Date: Wed, 19 Jan 2022 17:15:22 -0500 Subject: [PATCH 03/14] Test new exists behavior in database --- composer.json | 2 +- composer.lock | 44 +++++++++++++++++++++++++------------------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/composer.json b/composer.json index d6c0a7ff2d..016c33888b 100644 --- a/composer.json +++ b/composer.json @@ -46,7 +46,7 @@ "utopia-php/cache": "0.4.*", "utopia-php/cli": "0.11.*", "utopia-php/config": "0.2.*", - "utopia-php/database": "0.13.*", + "utopia-php/database": "dev-feat-check-if-collection-exists as 0.14.0", "utopia-php/locale": "0.4.*", "utopia-php/orchestration": "0.2.*", "utopia-php/registry": "0.5.*", diff --git a/composer.lock b/composer.lock index 62a9f81bd6..644b6bc749 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f022f43cc2d6023c3dad3805b7c4455a", + "content-hash": "f864e323b153e24e1392840eb114b951", "packages": [ { "name": "adhocore/jwt", @@ -355,16 +355,16 @@ }, { "name": "composer/package-versions-deprecated", - "version": "1.11.99.4", + "version": "1.11.99.5", "source": { "type": "git", "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b174585d1fe49ceed21928a945138948cb394600" + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b174585d1fe49ceed21928a945138948cb394600", - "reference": "b174585d1fe49ceed21928a945138948cb394600", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b4f54f74ef3453349c24a845d22392cd31e65f1d", + "reference": "b4f54f74ef3453349c24a845d22392cd31e65f1d", "shasum": "" }, "require": { @@ -408,7 +408,7 @@ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.4" + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.5" }, "funding": [ { @@ -424,7 +424,7 @@ "type": "tidelift" } ], - "time": "2021-09-13T08:41:34+00:00" + "time": "2022-01-17T14:14:24+00:00" }, { "name": "dragonmantank/cron-expression", @@ -2141,16 +2141,16 @@ }, { "name": "utopia-php/database", - "version": "0.13.2", + "version": "dev-feat-check-if-collection-exists", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "bf92279b707b3a10ee5ec5df5c065023b2221357" + "reference": "49b4eef6728f44a33df2707993319a2f352e75fa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/bf92279b707b3a10ee5ec5df5c065023b2221357", - "reference": "bf92279b707b3a10ee5ec5df5c065023b2221357", + "url": "https://api.github.com/repos/utopia-php/database/zipball/49b4eef6728f44a33df2707993319a2f352e75fa", + "reference": "49b4eef6728f44a33df2707993319a2f352e75fa", "shasum": "" }, "require": { @@ -2198,9 +2198,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/0.13.2" + "source": "https://github.com/utopia-php/database/tree/feat-check-if-collection-exists" }, - "time": "2022-01-04T10:51:22+00:00" + "time": "2022-01-19T21:01:38+00:00" }, { "name": "utopia-php/domains", @@ -3703,9 +3703,6 @@ "require": { "php": "^7.1 || ^8.0" }, - "replace": { - "myclabs/deep-copy": "self.version" - }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", @@ -6645,9 +6642,18 @@ "time": "2015-12-17T08:42:14+00:00" } ], - "aliases": [], + "aliases": [ + { + "package": "utopia-php/database", + "version": "dev-feat-check-if-collection-exists", + "alias": "0.14.0", + "alias_normalized": "0.14.0.0" + } + ], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "utopia-php/database": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -6669,5 +6675,5 @@ "platform-overrides": { "php": "8.0" }, - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.2.0" } From 4a8c87970661124de6f62ff54e2be4ac1c6209ae Mon Sep 17 00:00:00 2001 From: kodumbeats Date: Wed, 19 Jan 2022 17:15:38 -0500 Subject: [PATCH 04/14] Retry database connections in realtime server --- app/realtime.php | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/app/realtime.php b/app/realtime.php index 9acb37570d..e783f166de 100644 --- a/app/realtime.php +++ b/app/realtime.php @@ -91,13 +91,34 @@ $server->error($logError); function getDatabase(Registry &$register, string $namespace) { - $db = $register->get('dbPool')->get(); - $redis = $register->get('redisPool')->get(); + $attempts = 0; + $sleep = 2; + $maxAttempts = 10; - $cache = new Cache(new RedisCache($redis)); - $database = new Database(new MariaDB($db), $cache); - $database->setDefaultDatabase(App::getEnv('_APP_DB_SCHEMA', 'appwrite')); - $database->setNamespace($namespace); + do { + try { + $attempts++; + + $db = $register->get('dbPool')->get(); + $redis = $register->get('redisPool')->get(); + + $cache = new Cache(new RedisCache($redis)); + $database = new Database(new MariaDB($db), $cache); + $database->setDefaultDatabase(App::getEnv('_APP_DB_SCHEMA', 'appwrite')); + $database->setNamespace($namespace); + + if (!$database->exists(App::getEnv('_APP_DB_SCHEMA', 'appwrite'), 'realtime')) { + throw new Exception('Collection not ready'); + } + break; // leave loop if successful + } catch(\Exception $e) { + Console::warning("Database not ready. Retrying connection ({$attempts})..."); + if ($attempts >= $maxAttempts) { + throw new \Exception('Failed to connect to database: '. $e->getMessage()); + } + sleep($sleep); + } + } while ($attempts < $maxAttempts); return [ $database, @@ -106,6 +127,7 @@ function getDatabase(Registry &$register, string $namespace) $register->get('redisPool')->put($redis); } ]; + }; $server->onStart(function () use ($stats, $register, $containerId, &$statsDocument, $logError) { From d9eb1e9545aed9e10154c3dd1b75c01339c4d5b3 Mon Sep 17 00:00:00 2001 From: Matej Baco Date: Fri, 21 Jan 2022 09:05:41 +0100 Subject: [PATCH 05/14] Use dynamic value in controller --- app/controllers/api/functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/functions.php b/app/controllers/api/functions.php index a64c47597a..8488b341f0 100644 --- a/app/controllers/api/functions.php +++ b/app/controllers/api/functions.php @@ -46,7 +46,7 @@ App::post('/v1/functions') ->param('vars', [], new Assoc(), 'Key-value JSON object that will be passed to the function as environment variables.', true) ->param('events', [], new ArrayList(new WhiteList(array_keys(Config::getParam('events')), true)), 'Events list.', true) ->param('schedule', '', new Cron(), 'Schedule CRON syntax.', true) - ->param('timeout', 15, new Range(1, 900), 'Function maximum execution time in seconds.', true) + ->param('timeout', 15, new Range(1, (int) App::getEnv('_APP_FUNCTIONS_TIMEOUT', 900)), 'Function maximum execution time in seconds.', true) ->inject('response') ->inject('dbForProject') ->action(function ($functionId, $name, $execute, $runtime, $vars, $events, $schedule, $timeout, $response, $dbForProject) { @@ -294,7 +294,7 @@ App::put('/v1/functions/:functionId') ->param('vars', [], new Assoc(), 'Key-value JSON object that will be passed to the function as environment variables.', true) ->param('events', [], new ArrayList(new WhiteList(array_keys(Config::getParam('events')), true)), 'Events list.', true) ->param('schedule', '', new Cron(), 'Schedule CRON syntax.', true) - ->param('timeout', 15, new Range(1, 900), 'Maximum execution time in seconds.', true) + ->param('timeout', 15, new Range(1, (int) App::getEnv('_APP_FUNCTIONS_TIMEOUT', 900)), 'Maximum execution time in seconds.', true) ->inject('response') ->inject('dbForProject') ->inject('project') From f7373fff2b10d8cfde1bda2e62998f71dbe2e362 Mon Sep 17 00:00:00 2001 From: kodumbeats Date: Fri, 21 Jan 2022 11:39:21 -0500 Subject: [PATCH 06/14] Update utopia/database to latest --- composer.json | 2 +- composer.lock | 27 +++++++++------------------ 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/composer.json b/composer.json index 016c33888b..e7bd6646a9 100644 --- a/composer.json +++ b/composer.json @@ -46,7 +46,7 @@ "utopia-php/cache": "0.4.*", "utopia-php/cli": "0.11.*", "utopia-php/config": "0.2.*", - "utopia-php/database": "dev-feat-check-if-collection-exists as 0.14.0", + "utopia-php/database": "0.14.*", "utopia-php/locale": "0.4.*", "utopia-php/orchestration": "0.2.*", "utopia-php/registry": "0.5.*", diff --git a/composer.lock b/composer.lock index 644b6bc749..91440e4a7a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f864e323b153e24e1392840eb114b951", + "content-hash": "ab493f0a7f01a1105f8bc5caaf9b928b", "packages": [ { "name": "adhocore/jwt", @@ -2141,16 +2141,16 @@ }, { "name": "utopia-php/database", - "version": "dev-feat-check-if-collection-exists", + "version": "0.14.0", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "49b4eef6728f44a33df2707993319a2f352e75fa" + "reference": "2f2527bb080cf578fba327ea2ec637064561d403" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/49b4eef6728f44a33df2707993319a2f352e75fa", - "reference": "49b4eef6728f44a33df2707993319a2f352e75fa", + "url": "https://api.github.com/repos/utopia-php/database/zipball/2f2527bb080cf578fba327ea2ec637064561d403", + "reference": "2f2527bb080cf578fba327ea2ec637064561d403", "shasum": "" }, "require": { @@ -2198,9 +2198,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/feat-check-if-collection-exists" + "source": "https://github.com/utopia-php/database/tree/0.14.0" }, - "time": "2022-01-19T21:01:38+00:00" + "time": "2022-01-21T16:34:34+00:00" }, { "name": "utopia-php/domains", @@ -6642,18 +6642,9 @@ "time": "2015-12-17T08:42:14+00:00" } ], - "aliases": [ - { - "package": "utopia-php/database", - "version": "dev-feat-check-if-collection-exists", - "alias": "0.14.0", - "alias_normalized": "0.14.0.0" - } - ], + "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "utopia-php/database": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { From 7e6c9b9d87e0348b158cc24a21034d8caf808b5a Mon Sep 17 00:00:00 2001 From: kodumbeats Date: Fri, 21 Jan 2022 12:32:27 -0500 Subject: [PATCH 07/14] Harmonize database reconnect across services --- app/init.php | 3 +++ app/realtime.php | 10 ++++------ src/Appwrite/Resque/Worker.php | 15 +++++++++------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/init.php b/app/init.php index 439e7cc3b1..d591d1ddbd 100644 --- a/app/init.php +++ b/app/init.php @@ -86,6 +86,9 @@ const APP_SOCIAL_DISCORD_CHANNEL = '564160730845151244'; const APP_SOCIAL_DEV = 'https://dev.to/appwrite'; const APP_SOCIAL_STACKSHARE = 'https://stackshare.io/appwrite'; const APP_SOCIAL_YOUTUBE = 'https://www.youtube.com/c/appwrite?sub_confirmation=1'; +// Database Reconnect +const DATABASE_RECONNECT_SLEEP = 2; +const DATABASE_RECONNECT_MAX_ATTEMPTS = 10; // Database Worker Types const DATABASE_TYPE_CREATE_ATTRIBUTE = 'createAttribute'; const DATABASE_TYPE_CREATE_INDEX = 'createIndex'; diff --git a/app/realtime.php b/app/realtime.php index e783f166de..b2ddf67634 100644 --- a/app/realtime.php +++ b/app/realtime.php @@ -92,8 +92,6 @@ $server->error($logError); function getDatabase(Registry &$register, string $namespace) { $attempts = 0; - $sleep = 2; - $maxAttempts = 10; do { try { @@ -107,18 +105,18 @@ function getDatabase(Registry &$register, string $namespace) $database->setDefaultDatabase(App::getEnv('_APP_DB_SCHEMA', 'appwrite')); $database->setNamespace($namespace); - if (!$database->exists(App::getEnv('_APP_DB_SCHEMA', 'appwrite'), 'realtime')) { + if (!$database->exists($database->getDefaultDatabase(), 'realtime')) { throw new Exception('Collection not ready'); } break; // leave loop if successful } catch(\Exception $e) { Console::warning("Database not ready. Retrying connection ({$attempts})..."); - if ($attempts >= $maxAttempts) { + if ($attempts >= DATABASE_RECONNECT_MAX_ATTEMPTS) { throw new \Exception('Failed to connect to database: '. $e->getMessage()); } - sleep($sleep); + sleep(DATABASE_RECONNECT_SLEEP); } - } while ($attempts < $maxAttempts); + } while ($attempts < DATABASE_RECONNECT_MAX_ATTEMPTS); return [ $database, diff --git a/src/Appwrite/Resque/Worker.php b/src/Appwrite/Resque/Worker.php index 1444c90663..b9ed5af275 100644 --- a/src/Appwrite/Resque/Worker.php +++ b/src/Appwrite/Resque/Worker.php @@ -70,9 +70,6 @@ abstract class Worker throw new Exception("Please implement getName method in worker"); } - const MAX_ATTEMPTS = 10; - const SLEEP_TIME = 2; - const DATABASE_PROJECT = 'project'; const DATABASE_CONSOLE = 'console'; @@ -174,7 +171,7 @@ abstract class Worker global $register; $namespace = ''; - $sleep = self::SLEEP_TIME; // overwritten when necessary + $sleep = DATABASE_RECONNECT_SLEEP; // overwritten when necessary switch ($type) { case self::DATABASE_PROJECT: @@ -201,18 +198,24 @@ abstract class Worker $database = new Database(new MariaDB($register->get('db')), $cache); $database->setDefaultDatabase(App::getEnv('_APP_DB_SCHEMA', 'appwrite')); $database->setNamespace($namespace); // Main DB + if (!empty($projectId) && !$database->getDocument('projects', $projectId)->isEmpty()) { throw new \Exception("Project does not exist: {$projectId}"); } + + if ($type === self::DATABASE_CONSOLE && !$database->exists($database->getDefaultDatabase(), 'realtime')) { + throw new \Exception('Console project not ready'); + } + break; // leave loop if successful } catch(\Exception $e) { Console::warning("Database not ready. Retrying connection ({$attempts})..."); - if ($attempts >= self::MAX_ATTEMPTS) { + if ($attempts >= DATABASE_RECONNECT_MAX_ATTEMPTS) { throw new \Exception('Failed to connect to database: '. $e->getMessage()); } sleep($sleep); } - } while ($attempts < self::MAX_ATTEMPTS); + } while ($attempts < DATABASE_RECONNECT_MAX_ATTEMPTS); return $database; } From 2ac2c3dbd20e7a1edeaecc53f2d391794881a99e Mon Sep 17 00:00:00 2001 From: Vincent Ge Date: Mon, 24 Jan 2022 10:44:27 -0500 Subject: [PATCH 08/14] Adopted translation changes made by Yuqi --- README-CN.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README-CN.md b/README-CN.md index 1bf6db365f..8bef894c72 100644 --- a/README-CN.md +++ b/README-CN.md @@ -16,7 +16,7 @@ [![翻译](https://img.shields.io/badge/translate-f02e65?style=flat-square)](docs/tutorials/add-translations.md) [![周边商店](https://img.shields.io/badge/swag%20store-f02e65?style=flat-square)](https://store.appwrite.io) -Appwrite 是一个可应用于网页,移动,和后端开发的端到端后端平台, 以一系列 Docker 容器化的微服务形式包装发行。Appwrite 以高度抽象化的界面简化了从零编写 API 的繁琐过程,在保证软件安全的前提下给开发者一个高效的开发过程。 +Appwrite是一个基于dcoker的端到端开发者平台,其容器化的微服务库可应用于网页端,移动端,以及后端。Appwrite 通过视觉化界面极简了从零编写 API 的繁琐过程,在保证软件安全的前提下为开发者创造了一个高效的开发环境。 Appwrite 可以提供给开发者用户验证,外部授权,用户数据读写检索,文件储存, 图像处理,云函数计算,[等多种服务](https:/ /appwrite.io/docs)。 @@ -82,7 +82,7 @@ docker run -it --rm , appwrite/appwrite:0.12.1 ``` -运行后,可以在浏览器上访问 http://localhost 找到 Appwrite 控制台。请注意,在非 Linux 本机主机上,安装完成后服务器可能需要几分钟才能启动。 +运行后,可以在浏览器上访问 http://localhost 找到 Appwrite 控制台。在非 Linux 的本机主机上完成安装后,服务器可能需要几分钟才能启动。 需要自定义容器构架,请查看我们的 Docker [环境变量](https://appwrite.io/docs/environment-variables) 文档。您还可以参考我们的 [docker-compose.yml](https://gist.github.com/eldadfux/977869ff6bdd7312adfd4e629ee15cc5#file-docker-compose-yml) 文件手动设置环境。 @@ -158,7 +158,7 @@ Appwrite API 界面层利用后台缓存和任务委派来提供极速的响应 ## 安全 -对于安全问题,请发送电子邮件至 [security@appwrite.io](mailto:security@appwrite.io),而不是在 GitHub 上发布公开问题。 +为了保护您的隐私,请避免在GitHub 上发布安全问题。发送问题至 security@appwrite.io,我们将为您做更细致的解答。 ## 订阅我们 From 7da87c0358069595e0ec9475b05cd40e1449f6e1 Mon Sep 17 00:00:00 2001 From: Vincent Ge Date: Mon, 24 Jan 2022 11:08:20 -0500 Subject: [PATCH 09/14] Translations button up top and lists available languages at bottom + link --- README-CN.md | 9 ++++++++- README.md | 7 +++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/README-CN.md b/README-CN.md index 8bef894c72..cdc5d90bfc 100644 --- a/README-CN.md +++ b/README-CN.md @@ -1,3 +1,6 @@ +

+ 🌍 其他语言 +


Appwrite Logo @@ -166,4 +169,8 @@ Appwrite API 界面层利用后台缓存和任务委派来提供极速的响应 ## 版权说明 -版权详情,访问 [BSD 3-Clause License](./LICENSE)。 \ No newline at end of file +版权详情,访问 [BSD 3-Clause License](./LICENSE)。 + +## 其他语言 +- [English](README.md) +- [简体中文](README-CN.md) \ No newline at end of file diff --git a/README.md b/README.md index 3670203487..71196afdc2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +

+ 🌍 Translations +


Appwrite Logo @@ -170,3 +173,7 @@ Join our growing community around the world! See our official [Blog](https://med ## License This repository is available under the [BSD 3-Clause License](./LICENSE). + +## Translations +- [English](README.md) +- [简体中文](README-CN.md) From 32b037d6aabf86519a79faddffd3973fcc83c6dc Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 24 Jan 2022 14:25:47 -0600 Subject: [PATCH 10/14] fix: update sdk to web-default for auth docs links from console --- app/config/auth.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/config/auth.php b/app/config/auth.php index 086ba9a7b2..aab6833b65 100644 --- a/app/config/auth.php +++ b/app/config/auth.php @@ -7,35 +7,35 @@ return [ 'name' => 'Email/Password', 'key' => 'emailPassword', 'icon' => '/images/users/email.png', - 'docs' => 'https://appwrite.io/docs/client/account?sdk=web#accountCreateSession', + 'docs' => 'https://appwrite.io/docs/client/account?sdk=web-default#accountCreateSession', 'enabled' => true, ], 'magic-url' => [ 'name' => 'Magic URL', 'key' => 'usersAuthMagicURL', 'icon' => '/images/users/magic-url.png', - 'docs' => 'https://appwrite.io/docs/client/account?sdk=web#accountCreateMagicURLSession', + 'docs' => 'https://appwrite.io/docs/client/account?sdk=web-default#accountCreateMagicURLSession', 'enabled' => true, ], 'anonymous' => [ 'name' => 'Anonymous', 'key' => 'anonymous', 'icon' => '/images/users/anonymous.png', - 'docs' => 'https://appwrite.io/docs/client/account?sdk=web#accountCreateAnonymousSession', + 'docs' => 'https://appwrite.io/docs/client/account?sdk=web-default#accountCreateAnonymousSession', 'enabled' => true, ], 'invites' => [ 'name' => 'Invites', 'key' => 'invites', 'icon' => '/images/users/invites.png', - 'docs' => 'https://appwrite.io/docs/client/teams?sdk=web#teamsCreateMembership', + 'docs' => 'https://appwrite.io/docs/client/teams?sdk=web-default#teamsCreateMembership', 'enabled' => true, ], 'jwt' => [ 'name' => 'JWT', 'key' => 'JWT', 'icon' => '/images/users/jwt.png', - 'docs' => 'https://appwrite.io/docs/client/account?sdk=web#accountCreateJWT', + 'docs' => 'https://appwrite.io/docs/client/account?sdk=web-default#accountCreateJWT', 'enabled' => true, ], 'phone' => [ From 5ae1da65e39db0022f31535e3d22fcc5acf48338 Mon Sep 17 00:00:00 2001 From: Vincent Ge Date: Tue, 25 Jan 2022 17:50:41 -0500 Subject: [PATCH 11/14] moved translation links to a more visible location --- README-CN.md | 11 +++-------- README.md | 11 +++-------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/README-CN.md b/README-CN.md index cdc5d90bfc..5c4ce54433 100644 --- a/README-CN.md +++ b/README-CN.md @@ -1,6 +1,3 @@ -

- 🌍 其他语言 -


Appwrite Logo @@ -19,6 +16,8 @@ [![翻译](https://img.shields.io/badge/translate-f02e65?style=flat-square)](docs/tutorials/add-translations.md) [![周边商店](https://img.shields.io/badge/swag%20store-f02e65?style=flat-square)](https://store.appwrite.io) +[English](README.md) | 简体中文 + Appwrite是一个基于dcoker的端到端开发者平台,其容器化的微服务库可应用于网页端,移动端,以及后端。Appwrite 通过视觉化界面极简了从零编写 API 的繁琐过程,在保证软件安全的前提下为开发者创造了一个高效的开发环境。 Appwrite 可以提供给开发者用户验证,外部授权,用户数据读写检索,文件储存, 图像处理,云函数计算,[等多种服务](https:/ /appwrite.io/docs)。 @@ -169,8 +168,4 @@ Appwrite API 界面层利用后台缓存和任务委派来提供极速的响应 ## 版权说明 -版权详情,访问 [BSD 3-Clause License](./LICENSE)。 - -## 其他语言 -- [English](README.md) -- [简体中文](README-CN.md) \ No newline at end of file +版权详情,访问 [BSD 3-Clause License](./LICENSE)。 \ No newline at end of file diff --git a/README.md b/README.md index 71196afdc2..3d1a0db74f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,3 @@ -

- 🌍 Translations -


Appwrite Logo @@ -19,6 +16,8 @@ [![Translate](https://img.shields.io/badge/translate-f02e65?style=flat-square)](docs/tutorials/add-translations.md) [![Swag Store](https://img.shields.io/badge/swag%20store-f02e65?style=flat-square)](https://store.appwrite.io) +English | [简体中文](README-CN.md) + [**Appwrite 0.12 has been released! Learn what's new!**](https://dev.to/appwrite/its-here-announcing-the-release-of-appwrite-012-5c8b) Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps packaged as a set of Docker microservices. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster. @@ -172,8 +171,4 @@ Join our growing community around the world! See our official [Blog](https://med ## License -This repository is available under the [BSD 3-Clause License](./LICENSE). - -## Translations -- [English](README.md) -- [简体中文](README-CN.md) +This repository is available under the [BSD 3-Clause License](./LICENSE). \ No newline at end of file From e2ee905a8e7b80aba9cb14f83b2fb73d88b44545 Mon Sep 17 00:00:00 2001 From: Simon Trockel Date: Wed, 26 Jan 2022 11:08:10 +0100 Subject: [PATCH 12/14] Fix formatting src/Appwrite/Auth/OAuth2/Microsoft.php Co-authored-by: Christy Jacob --- src/Appwrite/Auth/OAuth2/Microsoft.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Auth/OAuth2/Microsoft.php b/src/Appwrite/Auth/OAuth2/Microsoft.php index 40d0a7b269..7f3b54567d 100644 --- a/src/Appwrite/Auth/OAuth2/Microsoft.php +++ b/src/Appwrite/Auth/OAuth2/Microsoft.php @@ -157,8 +157,8 @@ class Microsoft extends OAuth2 * Decode the JSON stored in appSecret * @return array */ - protected function decodeJson():array{ - + protected function decodeJson(): array + { try { $secret = \json_decode($this->appSecret, true); } catch (\Throwable $th) { From 7bf5da97594ee302e2fe50e8688df8414517037a Mon Sep 17 00:00:00 2001 From: Simon Trockel Date: Wed, 26 Jan 2022 11:09:51 +0100 Subject: [PATCH 13/14] Fix formatting src/Appwrite/Auth/OAuth2/Microsoft.php Co-authored-by: Christy Jacob --- src/Appwrite/Auth/OAuth2/Microsoft.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Auth/OAuth2/Microsoft.php b/src/Appwrite/Auth/OAuth2/Microsoft.php index 7f3b54567d..630c4aa224 100644 --- a/src/Appwrite/Auth/OAuth2/Microsoft.php +++ b/src/Appwrite/Auth/OAuth2/Microsoft.php @@ -171,7 +171,7 @@ class Microsoft extends OAuth2 * Extracts the Tenant Id from the JSON stored in appSecret. Defaults to 'common' as a fallback * @return string */ - protected function getTenantId():string + protected function getTenantId(): string { $secret = $this->decodeJson(); return (isset($secret['tenantId'])) ? $secret['tenantId'] : 'common'; From 8b6914e194c9ec6f41d03e5dc4601433549fb658 Mon Sep 17 00:00:00 2001 From: Simon Trockel Date: Wed, 26 Jan 2022 11:10:00 +0100 Subject: [PATCH 14/14] Fix formatting src/Appwrite/Auth/OAuth2/Microsoft.php Co-authored-by: Christy Jacob --- src/Appwrite/Auth/OAuth2/Microsoft.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Auth/OAuth2/Microsoft.php b/src/Appwrite/Auth/OAuth2/Microsoft.php index 630c4aa224..c926165e2a 100644 --- a/src/Appwrite/Auth/OAuth2/Microsoft.php +++ b/src/Appwrite/Auth/OAuth2/Microsoft.php @@ -146,7 +146,7 @@ class Microsoft extends OAuth2 * Extracts the Client Secret from the JSON stored in appSecret * @return string */ - protected function getClientSecret():string + protected function getClientSecret(): string { $secret = $this->decodeJson();