1
0
Files
DiAL/openspec/changes/backend-architecture-hardening/tasks.md
lanyuanxiaoyao 147a2559ae refactor: 后端架构加固 — 泛型化、批量查询、bootstrap 统一、路径修复与 pageSize 上限
- CheckerDefinition 泛型化,HTTP/Command checker 移除 resolved target 断言
- 新增 ProbeStore.getAllRecentSamples 消除 targets 路由 N+1 查询
- 统一 getAllTargetStats 与 getTargetStats 的 availability 精度
- Engine rejected 结果写入 internal error 记录,提升可观测性
- 新增 bootstrap.ts 统一 dev/production 启动序列
- dataDir 相对路径改为基于配置文件目录解析
- validatePagination 增加 pageSize 上限 200 校验
- 修复 ErrorBoundary override 标记
- 更新 README/DEVELOPMENT 文档,新增完整测试覆盖
2026-05-13 18:15:46 +08:00

43 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 1. CheckerDefinition 泛型化
- [x] 1.1 修改 `src/server/checker/runner/types.ts`:为 CheckerDefinition 接口添加泛型参数 `<TResolved extends ResolvedTargetBase = ResolvedTargetBase>`,约束 execute、resolve、serialize 方法的 target 参数类型
- [x] 1.2 修改 `src/server/checker/runner/registry.ts`:内部 Map 类型使用 `CheckerDefinition`(默认泛型参数),确保类型擦除
- [x] 1.3 修改 `src/server/checker/runner/http/execute.ts`HttpChecker 实现 `CheckerDefinition<ResolvedHttpTarget>`,移除 execute/serialize 方法内的 `as ResolvedHttpTarget` 断言resolve 方法内对 RawTargetConfig 的断言保留,泛型不覆盖输入参数窄化)
- [x] 1.4 修改 `src/server/checker/runner/command/execute.ts`CommandChecker 实现 `CheckerDefinition<ResolvedCommandTarget>`,移除 execute/serialize 方法内的 `as ResolvedCommandTarget` 断言resolve 方法内对 RawTargetConfig 的断言保留)
- [x] 1.5 修复 `src/web/components/ErrorBoundary.tsx``override` 标记(`noImplicitOverride` 规则要求的既有代码修复),运行 `bun run typecheck` 确认类型系统无错误
## 2. ProbeStore 批量查询优化
- [x] 2.1 在 `src/server/checker/store.ts` 中新增 `getAllRecentSamples(limit: number)` 方法,使用 `ROW_NUMBER() OVER (PARTITION BY target_id ORDER BY timestamp DESC)` 实现单次批量查询
- [x] 2.2 修改 `src/server/checker/store.ts``getAllTargetStats` 的 availability 计算:将 `Math.round((row.upCount / row.totalChecks) * 10000) / 100` 改为 `Math.round((row.upCount / row.totalChecks) * 100 * 100) / 100`,与 `getTargetStats` 精度一致
- [x] 2.3 修改 `src/server/routes/targets.ts``handleTargets` 使用 `store.getAllRecentSamples(30)` 替代循环调用 `store.getRecentSamples`
- [x] 2.4 在 `tests/server/checker/store.test.ts` 中新增 `getAllRecentSamples` 的单元测试和 availability 精度一致性测试
## 3. Engine rejected 结果持久化
- [x] 3.1 修改 `src/server/checker/engine.ts``probeGroup` 中对 rejected 结果通过索引关联 target构造 `matched: false``failure: { kind: "error", phase: "internal", path: "engine", message }` 的 check_result 写入 store
- [x] 3.2 在 `tests/server/checker/engine.test.ts` 中新增 rejected 结果写入的测试用例
## 4. 启动逻辑统一
- [x] 4.1 新增 `src/server/bootstrap.ts`,导出 `bootstrap(options: BootstrapOptions)` 函数,封装 loadConfig → ProbeStore → syncTargets → ProbeEngine → startServer → shutdown handler 完整序列
- [x] 4.2 修改 `src/server/dev.ts`:改为调用 `bootstrap({ configPath, mode: "development" })`
- [x] 4.3 修改 `scripts/build.ts`:生成的 server entry 改为调用 `bootstrap({ configPath, mode: "production", staticAssets })`
- [x] 4.4 在 `tests/server/` 中新增 bootstrap 相关测试
## 5. dataDir 路径修复
- [x] 5.1 修改 `src/server/checker/config-loader.ts`:对 dataDir 使用 `resolve(configDir, dataDir)` 处理相对路径
- [x] 5.2 在 `tests/server/checker/config-loader.test.ts` 中新增 dataDir 路径解析的测试用例
## 6. pageSize 上限
- [x] 6.1 修改 `src/server/middleware.ts``validatePagination` 增加 `pageSize > 200` 的校验,返回 400
- [x] 6.2 在 `tests/server/app.test.ts` 中新增 pageSize 超限的测试用例
## 7. 质量保障与文档
- [x] 7.1 运行 `bun run check`schema:check + typecheck + lint + test确认全部通过
- [x] 7.2 运行 `bun run build` 确认构建成功
- [x] 7.3 更新 DEVELOPMENT.md 中相关章节bootstrap 启动流程、CheckerDefinition 泛型说明、pageSize 上限说明)