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

3.6 KiB
Raw Blame History

1. CheckerDefinition 泛型化

  • 1.1 修改 src/server/checker/runner/types.ts:为 CheckerDefinition 接口添加泛型参数 <TResolved extends ResolvedTargetBase = ResolvedTargetBase>,约束 execute、resolve、serialize 方法的 target 参数类型
  • 1.2 修改 src/server/checker/runner/registry.ts:内部 Map 类型使用 CheckerDefinition(默认泛型参数),确保类型擦除
  • 1.3 修改 src/server/checker/runner/http/execute.tsHttpChecker 实现 CheckerDefinition<ResolvedHttpTarget>,移除 execute/serialize 方法内的 as ResolvedHttpTarget 断言resolve 方法内对 RawTargetConfig 的断言保留,泛型不覆盖输入参数窄化)
  • 1.4 修改 src/server/checker/runner/command/execute.tsCommandChecker 实现 CheckerDefinition<ResolvedCommandTarget>,移除 execute/serialize 方法内的 as ResolvedCommandTarget 断言resolve 方法内对 RawTargetConfig 的断言保留)
  • 1.5 修复 src/web/components/ErrorBoundary.tsxoverride 标记(noImplicitOverride 规则要求的既有代码修复),运行 bun run typecheck 确认类型系统无错误

2. ProbeStore 批量查询优化

  • 2.1 在 src/server/checker/store.ts 中新增 getAllRecentSamples(limit: number) 方法,使用 ROW_NUMBER() OVER (PARTITION BY target_id ORDER BY timestamp DESC) 实现单次批量查询
  • 2.2 修改 src/server/checker/store.tsgetAllTargetStats 的 availability 计算:将 Math.round((row.upCount / row.totalChecks) * 10000) / 100 改为 Math.round((row.upCount / row.totalChecks) * 100 * 100) / 100,与 getTargetStats 精度一致
  • 2.3 修改 src/server/routes/targets.tshandleTargets 使用 store.getAllRecentSamples(30) 替代循环调用 store.getRecentSamples
  • 2.4 在 tests/server/checker/store.test.ts 中新增 getAllRecentSamples 的单元测试和 availability 精度一致性测试

3. Engine rejected 结果持久化

  • 3.1 修改 src/server/checker/engine.tsprobeGroup 中对 rejected 结果通过索引关联 target构造 matched: falsefailure: { kind: "error", phase: "internal", path: "engine", message } 的 check_result 写入 store
  • 3.2 在 tests/server/checker/engine.test.ts 中新增 rejected 结果写入的测试用例

4. 启动逻辑统一

  • 4.1 新增 src/server/bootstrap.ts,导出 bootstrap(options: BootstrapOptions) 函数,封装 loadConfig → ProbeStore → syncTargets → ProbeEngine → startServer → shutdown handler 完整序列
  • 4.2 修改 src/server/dev.ts:改为调用 bootstrap({ configPath, mode: "development" })
  • 4.3 修改 scripts/build.ts:生成的 server entry 改为调用 bootstrap({ configPath, mode: "production", staticAssets })
  • 4.4 在 tests/server/ 中新增 bootstrap 相关测试

5. dataDir 路径修复

  • 5.1 修改 src/server/checker/config-loader.ts:对 dataDir 使用 resolve(configDir, dataDir) 处理相对路径
  • 5.2 在 tests/server/checker/config-loader.test.ts 中新增 dataDir 路径解析的测试用例

6. pageSize 上限

  • 6.1 修改 src/server/middleware.tsvalidatePagination 增加 pageSize > 200 的校验,返回 400
  • 6.2 在 tests/server/app.test.ts 中新增 pageSize 超限的测试用例

7. 质量保障与文档

  • 7.1 运行 bun run checkschema:check + typecheck + lint + test确认全部通过
  • 7.2 运行 bun run build 确认构建成功
  • 7.3 更新 DEVELOPMENT.md 中相关章节bootstrap 启动流程、CheckerDefinition 泛型说明、pageSize 上限说明)