Преглед изворни кода

📝 docs(system-config): add story for custom routes with cache refresh

- 创建系统管理员使用自定义路由实现缓存自动刷新的用户故事
- 定义6项验收标准,确保功能完整性和兼容性
- 分解为7个主要任务及子任务,覆盖从路由创建到测试验证全过程
- 提供详细技术栈信息、项目结构参考和实现指导
- 添加变更日志记录初始故事创建信息
yourname пре 1 месец
родитељ
комит
a399372e78
1 измењених фајлова са 169 додато и 0 уклоњено
  1. 169 0
      docs/stories/010.005.system-config-custom-routes-cache-refresh.story.md

+ 169 - 0
docs/stories/010.005.system-config-custom-routes-cache-refresh.story.md

@@ -0,0 +1,169 @@
+# Story 010.005: system-config-custom-routes-cache-refresh
+
+## Status
+Draft
+
+## Story
+**As a** 系统管理员,
+**I want** 用自定义路由替代通用CRUD路由,实现缓存自动刷新,
+**so that** 在管理后台更新系统配置时能自动刷新相应的key的Redis缓存
+
+## Acceptance Criteria
+1. 参照packages/orders-module-mt/src/routes/user/orders.mt.ts中的聚合写法
+2. 创建自定义路由替代现有的通用CRUD路由
+3. 在配置创建、更新、删除操作时自动刷新对应key的Redis缓存
+4. 保持API接口兼容性,不影响现有客户端调用
+5. 验证缓存刷新机制正确工作,确保数据一致性
+6. 所有现有功能测试通过,无回归
+
+## Tasks / Subtasks
+- [ ] 任务 1 (AC: 1, 2): 创建系统配置自定义路由目录结构
+  - [ ] 创建 `packages/core-module-mt/system-config-module-mt/src/routes/custom/` 目录
+  - [ ] 参照订单模块聚合写法,创建自定义路由文件
+  - [ ] 创建自定义路由聚合文件
+- [ ] 任务 2 (AC: 2, 3): 实现创建配置的自定义路由
+  - [ ] 创建 `packages/core-module-mt/system-config-module-mt/src/routes/custom/create-system-config.mt.ts`
+  - [ ] 实现POST路由,调用SystemConfigServiceMt的setConfig方法
+  - [ ] 在路由处理中自动刷新对应配置键的Redis缓存
+  - [ ] 保持与现有CRUD路由相同的请求/响应格式
+- [ ] 任务 3 (AC: 2, 3): 实现更新配置的自定义路由
+  - [ ] 创建 `packages/core-module-mt/system-config-module-mt/src/routes/custom/update-system-config.mt.ts`
+  - [ ] 实现PUT路由,调用SystemConfigServiceMt的update方法
+  - [ ] 在路由处理中自动刷新对应配置键的Redis缓存
+  - [ ] 保持与现有CRUD路由相同的请求/响应格式
+- [ ] 任务 4 (AC: 2, 3): 实现删除配置的自定义路由
+  - [ ] 创建 `packages/core-module-mt/system-config-module-mt/src/routes/custom/delete-system-config.mt.ts`
+  - [ ] 实现DELETE路由,调用SystemConfigServiceMt的deleteConfig方法
+  - [ ] 在路由处理中自动刷新对应配置键的Redis缓存
+  - [ ] 保持与现有CRUD路由相同的请求/响应格式
+- [ ] 任务 5 (AC: 1, 2): 重构系统配置路由聚合
+  - [ ] 修改 `packages/core-module-mt/system-config-module-mt/src/routes/system-config.routes.mt.ts`
+  - [ ] 参照订单模块聚合写法,将自定义路由与CRUD路由聚合
+  - [ ] 保持现有API接口兼容性
+- [ ] 任务 6 (AC: 4, 5): 验证缓存刷新机制
+  - [ ] 创建缓存刷新验证测试
+  - [ ] 验证创建配置时缓存正确刷新
+  - [ ] 验证更新配置时缓存正确刷新
+  - [ ] 验证删除配置时缓存正确刷新
+  - [ ] 验证多租户缓存隔离
+- [ ] 任务 7 (AC: 6): 验证现有功能无回归
+  - [ ] 运行现有系统配置模块测试
+  - [ ] 验证认证和支付模块集成正常
+  - [ ] 验证管理后台UI包集成正常
+  - [ ] 运行所有相关集成测试
+
+## Dev Notes
+
+### 技术栈信息 [Source: architecture/tech-stack.md]
+- **运行时**: Node.js 20.18.3
+- **框架**: Hono 4.8.5 (Web框架和API路由)
+- **数据库**: PostgreSQL 17 (通过TypeORM)
+- **ORM**: TypeORM 0.3.25 (实体管理)
+- **验证**: Zod + @hono/zod-openapi
+- **缓存**: Redis 7 (系统配置缓存)
+
+### 项目结构信息 [Source: architecture/source-tree.md]
+- **包位置**: `packages/core-module-mt/system-config-module-mt/`
+- **包架构层次**: 多租户核心包中的业务模块
+- **文件组织**:
+  - `src/entities/` - 实体定义 (使用 `.mt.ts` 后缀)
+  - `src/schemas/` - Zod Schema定义 (使用 `.mt.ts` 后缀)
+  - `src/services/` - 服务实现 (使用 `.mt.ts` 后缀)
+  - `src/routes/` - API路由 (使用 `.mt.ts` 后缀)
+  - `src/routes/custom/` - 自定义路由 (新增)
+  - `tests/` - 测试文件
+- **现有模块参考**:
+  - `auth-module-mt/` - 认证模块
+  - `user-module-mt/` - 用户模块
+  - `file-module-mt/` - 文件模块
+  - `orders-module-mt/` - 订单模块 (聚合写法参考)
+
+### 订单模块聚合写法参考 [Source: packages/orders-module-mt/src/routes/user/orders.mt.ts]
+```typescript
+// 订单模块的聚合写法示例
+const userOrderRoutes = new OpenAPIHono()
+  .route('/', createOrderRoutes)
+  .route('/', cancelOrderRoutes)
+  .route('/', userOrderCrudRoutes);
+```
+
+### 系统配置服务缓存方法 [Source: packages/core-module-mt/system-config-module-mt/src/services/system-config.service.mt.ts]
+- **setConfig**: 设置配置值,自动清除缓存
+- **update**: 重写方法,在更新时清除缓存
+- **deleteConfig**: 删除配置,自动清除缓存
+- **getConfigByKey**: 获取配置值,带缓存逻辑
+- **getConfigsByKeys**: 批量获取配置,带缓存逻辑
+
+### Redis缓存键格式 [Source: packages/shared-utils/src/utils/redis.util.ts]
+- **缓存键格式**: `system_config:{tenantId}:{configKey}`
+- **默认TTL**: 1小时 (3600秒)
+- **空值缓存TTL**: 5分钟 (300秒)
+
+### 现有系统配置路由结构 [Source: packages/core-module-mt/system-config-module-mt/src/routes/system-config.routes.mt.ts]
+当前使用通用CRUD路由:
+```typescript
+const systemConfigCrudRoutes = createCrudRoutes({
+  entity: SystemConfigMt,
+  createSchema: CreateSystemConfigSchema,
+  updateSchema: UpdateSystemConfigSchema,
+  getSchema: SystemConfigSchema,
+  listSchema: SystemConfigSchema,
+  searchFields: ['configKey', 'description'],
+  middleware: [authMiddleware],
+  tenantOptions: {
+    enabled: true,
+    tenantIdField: 'tenantId',
+    autoExtractFromContext: true
+  }
+});
+```
+
+### 共享CRUD集成模式 [Source: packages/shared-crud/src/services/generic-crud.service.ts]
+- **继承模式**: 继承 `GenericCrudService<T>` 抽象类
+- **租户配置**: 通过 `tenantOptions` 配置租户隔离
+- **用户跟踪**: 通过 `userTracking` 配置用户跟踪
+- **核心方法**: `getList()`, `getById()`, `create()`, `update()`, `delete()`
+
+### 先前故事实施经验
+从Epic 010的前4个故事中提取的关键经验:
+- **缓存穿透保护**: 实现空值缓存机制防止缓存穿透攻击 [Source: docs/stories/010.002.system-config-redis-cache.story.md]
+- **多租户隔离**: 修复了多租户隔离概念,强制要求tenantId参数 [Source: docs/stories/010.002.system-config-redis-cache.story.md]
+- **TypeORM语法**: 修复了`{ configKey: missingKeys }`语法错误,改为`{ configKey: In(missingKeys) }` [Source: docs/stories/010.002.system-config-redis-cache.story.md]
+- **包导出配置**: 修复了system-config-module-mt包导出配置问题 [Source: docs/stories/010.003.system-config-auth-payment-integration.story.md]
+
+### 测试
+
+#### 测试标准 [Source: architecture/testing-strategy.md]
+- **测试框架**: Vitest + hono/testing
+- **测试位置**: `packages/core-module-mt/system-config-module-mt/tests/`
+- **测试类型**: 单元测试 + 集成测试
+- **覆盖率目标**: 单元测试 ≥ 80%,集成测试 ≥ 60%
+
+#### 测试文件结构
+- `tests/integration/` - 集成测试
+  - `system-config.routes.integration.test.ts` - 现有路由集成测试
+  - `system-config-custom-routes.integration.test.ts` - 新增自定义路由集成测试
+
+#### 测试要求
+- 验证自定义路由与CRUD路由聚合正确
+- 验证缓存刷新机制正确工作
+- 验证多租户缓存隔离
+- 验证API接口兼容性
+- 验证现有功能无回归
+
+## Change Log
+| Date | Version | Description | Author |
+|------|---------|-------------|--------|
+| 2025-11-22 | 1.0 | 初始故事创建 | Bob (Scrum Master) |
+
+## Dev Agent Record
+
+### Agent Model Used
+
+### Debug Log References
+
+### Completion Notes List
+
+### File List
+
+## QA Results