feat(desktop): add redis gui foundation baseline
Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
92
docs/architecture.md
Normal file
92
docs/architecture.md
Normal file
@@ -0,0 +1,92 @@
|
||||
# Backend Foundation
|
||||
|
||||
## Goals
|
||||
|
||||
- 使用 Rust workspace 作为产品的长期结构。
|
||||
- 将可复用业务能力放入 `crates/redis-core`,避免把 Redis 语义散落在 GUI 层。
|
||||
- 让 desktop 壳层只负责窗口与命令桥接,不负责领域规则。
|
||||
|
||||
## Current Domain Model
|
||||
|
||||
当前只定义启动和连接建模所需的最小领域对象:
|
||||
|
||||
- `ConnectionTarget`: Redis 目标地址、端口、数据库序号、用户名和 TLS 模式。
|
||||
- `ConnectionProfileDraft`: GUI 或未来 CLI 收集到的连接表单草稿。
|
||||
- `RedisConnectionRequest`: 一次请求内使用的连接上下文,包含非持久化密码。
|
||||
- `RedisKeyBrowseRequest`: key 浏览请求,显式携带 `SCAN` cursor、pattern 与 page size。
|
||||
- `RedisKeyMetadataRequest`: 单个 key 的元数据读取请求,用于 inspector 刷新与删除前确认。
|
||||
- `RedisValueReadRequest`: 单个 key 的 typed value 读取请求。
|
||||
- `RedisValueWriteRequest`: 单个 key 的 value 写入请求;当前仅允许 string 整值替换。
|
||||
- `RedisKeyTtlUpdateRequest`: 单个 key 的 TTL 修改请求,支持设置过期时间和移除 TTL。
|
||||
- `RedisCommandRequest`: 基础命令执行请求,显式拆分命令名与参数。
|
||||
- `RedisKeyMetadata`: key 浏览与 inspector 共享的稳定元数据结构,覆盖存在性、类型和 TTL。
|
||||
- `RedisValueRecord`: inspector 使用的稳定结构,组合 key 元数据、typed value 数据、value 写入能力和 TTL 修改能力。
|
||||
- `RedisValueData`: typed value 返回体,覆盖 `string/hash/list/set/zset/stream` 与缺失 key。
|
||||
- `RedisValueWriteCapability`: 当前明确区分 `replace_string` 与 `none`,让入口层知道哪些类型仍是只读。
|
||||
- `CommandExecutionResult`: 以稳定的 RESP2 派生结构返回基础命令结果。
|
||||
- `BackendError`: 结构化错误码,区分连接配置、认证、连接失败和命令失败。
|
||||
- `BackendBootstrap`: 向入口层暴露当前支持的能力边界和安全约束。
|
||||
|
||||
这些对象构成当前阶段的稳定后端契约:
|
||||
|
||||
- 单实例连接测试通过 `PING` 验证回路。
|
||||
- 认证通过请求态 `AUTH` 握手完成。
|
||||
- DB 切换在连接建立后通过 `SELECT` 保证。
|
||||
- 命令执行按 RESP2 基础类型映射为稳定结构体,避免 GUI 直接处理原始 socket 数据。
|
||||
- key 浏览按 `SCAN` 分页返回,并为每个命中的 key 补充 `TYPE` 与 `PTTL` 元数据。
|
||||
- inspector 可对单个 key 单独刷新元数据,避免 UI 为了刷新单项而重跑整页浏览。
|
||||
- typed value surface 当前覆盖 `string/hash/list/set/zset/stream` 六类 Redis 数据,并显式保留类型差异。
|
||||
- V1 value 编辑只允许已有 string key 的整值替换;非 string key 保持只读,避免错误覆盖集合类型。
|
||||
- string 写入会保留原 TTL,TTL 修改独立通过 `PERSIST` / `PEXPIRE` 语义建模。
|
||||
|
||||
## Persistence Boundary
|
||||
|
||||
当前阶段明确保持以下约束:
|
||||
|
||||
- 连接密钥和密码不落盘。
|
||||
- 密码仅存在于单次 `RedisConnectionRequest` 的内存生命周期内。
|
||||
- 连接配置目录和迁移策略尚未启用,因此不存在历史数据兼容承诺。
|
||||
- GUI 仅消费 `redis-core` 导出的稳定结构体,不直接定义持久化格式。
|
||||
|
||||
后续进入产品化时,应新增独立的存储 crate,并补充:
|
||||
|
||||
- 配置文件 schema
|
||||
- 版本字段与迁移器
|
||||
- 敏感信息存储策略
|
||||
- 向前/向后兼容测试
|
||||
|
||||
## Compatibility Notes
|
||||
|
||||
- 当前后端只覆盖单实例 Redis 的同步 RESP2 交互。
|
||||
- workspace 通过 `.cargo/config.toml` 启用 `resolver.incompatible-rust-versions = "fallback"`,避免在 `rustc 1.85` 环境下把 Tauri 传递依赖解析到更高 MSRV 的版本带。
|
||||
- key 浏览当前基于 Redis `SCAN` + 每 key `TYPE`/`PTTL` 的顺序读取,优先保证正确性和契约清晰,而不是在原型期过早做 pipeline 或并发优化。
|
||||
- `TlsMode::disabled` 可用,`preferred` 和 `required` 目前明确返回 `unsupported_tls_mode`,避免伪支持。
|
||||
- 命令执行结果目前覆盖 RESP2 的 `simple string`、`bulk string`、`integer`、`array` 和 `null`。
|
||||
- typed value 读取当前是 key 级 eager 读取:`HGETALL`、`LRANGE 0 -1`、`SMEMBERS`、`ZRANGE ... WITHSCORES`、`XRANGE - +`。这保证了契约直接,但尚未引入大 key 分页、截断或流式读取策略。
|
||||
- string 写入使用事务化的 `SET ... XX` 与 TTL 恢复,避免把非 string key 误写成 string,也避免默认清空现有 TTL。
|
||||
- key 元数据仍未覆盖编码、内存占用、slot、cluster 拓扑或 ACL 细粒度探测。
|
||||
- 这层契约已足以支撑连接管理、基础命令台、key 浏览、value inspector 与 TTL 编辑,但还不足以覆盖 cluster、pub/sub、流式结果或长连接会话管理。
|
||||
|
||||
## Entry Point Contract
|
||||
|
||||
- Tauri 命令只暴露共享核心层的数据,不直接返回临时字符串。
|
||||
- 当前桌面入口暴露八个命令:`backend_bootstrap`、`test_redis_connection`、`browse_redis_keys`、`inspect_redis_key`、`read_redis_value`、`write_redis_value`、`update_redis_key_ttl`、`execute_redis_command`。
|
||||
- 任何新增入口都应优先复用 `redis-core`,保证 CLI、GUI 行为模型一致。
|
||||
- 桌面入口允许演进 UI,但不应绕过领域约束自行定义 Redis 协议行为。
|
||||
|
||||
## Verification Notes
|
||||
|
||||
当前已验证的重点是:
|
||||
|
||||
- Rust 核心 crate 的测试与格式正确性
|
||||
- Tauri desktop 命令桥可以在当前 Linux 环境完成编译检查
|
||||
- Linux 下 Tauri 所需系统依赖已通过 `pkg-config` 验证
|
||||
|
||||
当前已完成的验证:
|
||||
|
||||
- `cargo test -p redis-core`
|
||||
- mock Redis 测试覆盖 AUTH、SELECT、PING、SCAN 分页、TYPE、PTTL、缺失 key 元数据映射、typed value 读取、string 安全写入和 TTL 修改
|
||||
- `Cargo.lock` 已重新解析到 Rust 1.85 兼容版本带:`serde_with 3.17.0`、`darling 0.21.0`、`time 0.3.44`
|
||||
- `cargo check -p desktop-shell --locked`
|
||||
- `pkg-config` 校验通过:`gtk+-3.0`、`webkit2gtk-4.1`、`libsoup-3.0`、`javascriptcoregtk-4.1`
|
||||
- `pnpm run desktop:build`
|
||||
Reference in New Issue
Block a user