3个版本 (1个稳定版)

2024.5.12 2024年5月13日
0.7.0 2022年5月21日
0.6.2 2022年5月5日
0.0.9 2020年1月27日

数据库接口中排名第136

每月下载量32
用于deepwell-rpc

AGPL-3.0-or-later

2MB
35K SLoC

DEEPWELL

Build status

DEEPWELL是提供Wikijump核心维基操作的内联后端系统。这旨在作为Web服务器逻辑任务的一部分的内部API,因此验证调用用户是否有权限执行给定任务是Web服务器的职责。DEEPWELL将假设所有请求都是可信的并执行它们。

设置了lint #![forbid(unsafe_code)],因此这个crate只有安全代码。

在GNU Affero通用公共许可证的条款下提供。见LICENSE.md

开发

如果您已安装sea-orm-cli,并且有一个本地运行的Wikijump实例,您可以使用以下脚本来自动生成SeaORM模型文件

$ scripts/generate-models.sh

结构

crate的主要组织结构如下

  • api/ — Web服务器定义,例如其路由和相关结构。
    • 为Framerail公开内部API。
  • endpoints/ — 对上述单个端点的实现。
  • services/ — "服务",或不同概念或操作的逻辑封装。
    • 例如,ParentService 允许检索和存储与父子页面关系相关的数据。您可以将其视为“包装”page_parent 表。
    • 同样,PageService 封装了 page 表,同时也包装了所有其他包含在“页面”逻辑概念中的操作,例如使用 RevisionService 作为“编辑”方法的一部分来创建新修订版本。
    • 结构定义按服务组织,此处可找到。例如,用作请求主体的结构很可能也在此定义。一些特定于路由的结构在这里直接定义。
  • locales/ — 提供本地化方法,解释 Fluent 翻译文件。
  • models/ — 主要由 Sea-ORM 自动生成,这些文件允许与数据库接口。
  • utils/ — 后端范围的实用工具和其他工具,分为几个部分。
  • web/ — 对于一些枚举、结构和其他在应用程序中使用的概念,通常与以某种方式与 Web API 接口相关。
  • 其他模块是实用工具,通常通过查看其内容即可理解。

路由定义在 api/ 中,它们的实现位于 methods/ 中,它们依赖的结构位于 services/<name>/structs.rs 中。封装逻辑操作的调用服务位于 services/<name>.rsservices/<name>/service.rs 中。

编译

此可执行文件针对最新稳定的 Rust。在编写本文时,这是 1.77.0

目前该包有一个功能

  • notify — 启用跟踪本地化目录和配置文件的功能,如果它们被修改则重新加载服务器。这应在本地构建中使用,而不是在生产环境中使用。
$ cargo build [--features ...] [--release]

执行

$ cargo build --features <deploy|local> -- [-q] [-p <port>] <config-file>

除了显示的参数之外,还有许多其他参数。运行 --help 获取所有相关信息。

这将使用给定的配置文件运行 DEEPWELL 的本地实例。在调试(即仅在 --features local 时)的情况下,您还可以传递 ---watch-files 以在配置文件或任何本地化文件更改时自动重新启动进程。

这似乎不与 Docker 一起工作,因此您应该手动停止 api 容器,并使用标志在本地运行它。这样将正确监视更改并重新启动自身。

测试

尚未实现测试,但实现后,运行

$ cargo test

如果您想查看测试输出,请将 -----nocapture 添加到末尾。

代码风格检查

$ cargo fmt     # Ensure code is formatted
$ cargo clippy  # Check code for lints

数据库

与数据库管理(可以说 DEEPWELL “拥有”)相关的有两个重要目录。它们都是相当直白的

  • migrations/ — 一系列 SQL 文件,用于为新数据库设置模式。
  • seeder/ — 初始化新实例所需的数据。
  • 这不是迁移系统的一部分,而是使用 DEEPWELL 服务和方法确保所有不变量都得到正确设置,而不是需要在迁移文件中以原始行形式手动提供。
  • 这也使得修改实例的初始状态变得更加容易,因为只需编辑默认的起始页面,就只需要编辑一个常规文本文件。

迁移和种子运行是否在启动时由配置控制。这意味着它们可以通过以下方式设置:

  • RUN_MIGRATIONS环境变量,或者--run-migrations命令行标志。
  • RUN_SEEDER环境变量,或者--run-seeder命令行标志。

对于本地安装,这两个都默认启用。

基本数据库设置(创建wikijump数据库和用户)是在构建容器时完成的。请参阅/install/files/postgres/init/

添加新的迁移

数据库迁移是通过使用sqlx迁移来应用的,这可以在migrations/目录中看到简单的结构。可以通过使用sqlx命令行实用工具添加新的迁移

$ sqlx migrate add [name_of_migration]

迁移名称应该是全小写,snake_case,并且限制为1-3个单词。

请注意,由于Wikijump还没有生产部署,迁移正在被压缩以简化数据库系统。增量迁移是必要的,以避免破坏生产环境,但在存在之前,没有必要进行拆分所有更改的额外工作。

您可以查看sqlx migrate --helpsqlx-cli以获取更多信息。

依赖项

~68–105MB
~2M SLoC