1
0

refactor: 迁移 Bun fullstack 架构

This commit is contained in:
2026-05-14 00:23:37 +08:00
parent bcfac52112
commit 6e485cc991
36 changed files with 403 additions and 1081 deletions

View File

@@ -1,12 +1,12 @@
## Purpose
定义后端 API 路由的组织规范:按端点拆分为独立 handler、共享响应工具集中管理、参数校验逻辑抽取为中间件、静态资源服务独立维护
定义后端 API 路由的组织规范:按端点拆分为独立 handler、共享响应工具集中管理、路径参数由 Bun routes 解析,静态资源服务由 HTML import manifest 管理
## Requirements
### Requirement: 路由按职责拆分
系统 SHALL 将 HTTP 路由处理逻辑按 API 端点拆分为独立模块,每个模块导出一个 handler 函数供 app.ts 统一注册。
系统 SHALL 将 HTTP 路由处理逻辑按 API 端点拆分为独立模块,每个模块导出 route handler 函数供 routes 对象统一注册。
#### Scenario: health 端点独立路由
- **WHEN** 客户端请求 `GET /health`
@@ -22,11 +22,11 @@
#### Scenario: history 端点独立路由
- **WHEN** 客户端请求 `GET /api/targets/:id/history?from=ISO&to=ISO`
- **THEN** `routes/history.ts` 导出的 handler 负责处理包含参数校验、store 查询和 HistoryResponse 返回
- **THEN** `routes/history.ts` 导出的 handler 负责处理,通过 `req.params.id` 获取路径参数,包含参数校验、store 查询和 HistoryResponse 返回
#### Scenario: trend 端点独立路由
- **WHEN** 客户端请求 `GET /api/targets/:id/trend?from=ISO&to=ISO`
- **THEN** `routes/trend.ts` 导出的 handler 负责处理包含参数校验、store 查询和 TrendPoint[] 返回
- **THEN** `routes/trend.ts` 导出的 handler 负责处理,通过 `req.params.id` 获取路径参数,包含参数校验、store 查询和 TrendPoint[] 返回
### Requirement: 共享辅助函数集中管理
系统 SHALL 将跨路由共享的响应格式化函数抽取到 helpers.ts 模块,单一职责、集中管理。
@@ -43,36 +43,17 @@
- **WHEN** 需要将 StoredCheckResult 映射为 API CheckResult
- **THEN** 从 `helpers.ts` 导入 `mapCheckResult` 函数,处理 failure JSON 解析和格式转换
### Requirement: 参数校验逻辑抽取为中间件
系统 SHALL 将重复的参数校验逻辑target ID 解析、时间范围校验、分页参数校验、方法检查)抽取到 middleware.ts 模块。
#### Scenario: 方法检查中间件
- **WHEN** 请求方法不是 GET 或 HEAD
- **THEN** `guardGetHead(request, mode)` SHALL 返回 405 Response否则返回 null 表示放行
#### Scenario: Target ID 校验
- **WHEN** URL 中的 id 参数不是正整数
- **THEN** `validateTargetId(idStr)` SHALL 返回 400 ApiError
#### Scenario: 时间范围参数校验
- **WHEN** from 或 to 参数缺失或格式无效
- **THEN** `validateTimeRange(from, to)` SHALL 返回 400 ApiError
#### Scenario: 分页参数校验
- **WHEN** page 或 pageSize 参数不是正整数
- **THEN** `validatePagination(page, pageSize)` SHALL 返回 400 ApiError
### Requirement: 静态资源服务独立管理
系统 SHALL 将静态资源服务、SPA fallback 和 Content-Type 映射逻辑抽取到 static.ts 模块
系统 SHALL 将 SPA fallback 逻辑交给 routes 对象中的 HTML import 通配符处理,静态资源服务由 Bun 内置 manifest 机制自动处理
#### Scenario: 根路径返回 index.html
- **WHEN** 客户端请求 `/`
- **THEN** `static.ts` 的 handler 返回 index.html设置正确的 Content-Type 和 Cache-Control
- **THEN** routes 中注册的 HTML import 自动返回 index.html
#### Scenario: 资源文件返回正确 Content-Type
- **WHEN** 客户端请求 `/assets/main.js`
- **THEN** `static.ts` 的 handler 根据文件扩展名返回正确的 Content-Type`.js``text/javascript`
- **WHEN** 客户端请求构建后的静态资源
- **THEN** Bun 内置 manifest 机制自动返回正确的 Content-Type 和缓存头
#### Scenario: SPA fallback
- **WHEN** 客户端请求非 API、非资源的路径`/dashboard`
- **THEN** `static.ts` 的 handler 返回 index.html 实现 SPA 的客户端路由
- **THEN** routes 中注册的 `"/*"` HTML import 通配符返回 index.html 实现 SPA 的客户端路由