|
|
@@ -19,37 +19,41 @@ Draft
|
|
|
## Tasks / Subtasks
|
|
|
- [ ] 任务 1 (AC: 1, 2): 创建系统配置自定义路由目录结构
|
|
|
- [ ] 创建 `packages/core-module-mt/system-config-module-mt/src/routes/custom/` 目录
|
|
|
- - [ ] 参照订单模块聚合写法,创建自定义路由文件
|
|
|
+ - [ ] 参照订单模块聚合写法,创建自定义路由文件 [对照: packages/orders-module-mt/src/routes/user/orders.mt.ts]
|
|
|
- [ ] 创建自定义路由聚合文件
|
|
|
- [ ] 任务 2 (AC: 2, 3): 实现创建配置的自定义路由
|
|
|
- [ ] 创建 `packages/core-module-mt/system-config-module-mt/src/routes/custom/create-system-config.mt.ts`
|
|
|
- - [ ] 实现POST路由,调用SystemConfigServiceMt的setConfig方法
|
|
|
+ - [ ] 实现POST路由,调用SystemConfigServiceMt的setConfig方法 [对照: packages/core-module-mt/system-config-module-mt/src/services/system-config.service.mt.ts:128-158]
|
|
|
- [ ] 在路由处理中自动刷新对应配置键的Redis缓存
|
|
|
- - [ ] 保持与现有CRUD路由相同的请求/响应格式
|
|
|
+ - [ ] 保持与现有CRUD路由相同的请求/响应格式 [对照: packages/core-module-mt/system-config-module-mt/src/routes/system-config.routes.mt.ts]
|
|
|
+ - [ ] **确保多租户隔离**: 从上下文中提取tenantId,确保只刷新当前租户的缓存
|
|
|
- [ ] 任务 3 (AC: 2, 3): 实现更新配置的自定义路由
|
|
|
- [ ] 创建 `packages/core-module-mt/system-config-module-mt/src/routes/custom/update-system-config.mt.ts`
|
|
|
- - [ ] 实现PUT路由,调用SystemConfigServiceMt的update方法
|
|
|
+ - [ ] 实现PUT路由,调用SystemConfigServiceMt的update方法 [对照: packages/core-module-mt/system-config-module-mt/src/services/system-config.service.mt.ts:189-199]
|
|
|
- [ ] 在路由处理中自动刷新对应配置键的Redis缓存
|
|
|
- - [ ] 保持与现有CRUD路由相同的请求/响应格式
|
|
|
+ - [ ] 保持与现有CRUD路由相同的请求/响应格式 [对照: packages/core-module-mt/system-config-module-mt/src/routes/system-config.routes.mt.ts]
|
|
|
+ - [ ] **确保多租户隔离**: 验证更新操作只影响当前租户的配置和缓存
|
|
|
- [ ] 任务 4 (AC: 2, 3): 实现删除配置的自定义路由
|
|
|
- [ ] 创建 `packages/core-module-mt/system-config-module-mt/src/routes/custom/delete-system-config.mt.ts`
|
|
|
- - [ ] 实现DELETE路由,调用SystemConfigServiceMt的deleteConfig方法
|
|
|
+ - [ ] 实现DELETE路由,调用SystemConfigServiceMt的deleteConfig方法 [对照: packages/core-module-mt/system-config-module-mt/src/services/system-config.service.mt.ts:170-184]
|
|
|
- [ ] 在路由处理中自动刷新对应配置键的Redis缓存
|
|
|
- - [ ] 保持与现有CRUD路由相同的请求/响应格式
|
|
|
+ - [ ] 保持与现有CRUD路由相同的请求/响应格式 [对照: packages/core-module-mt/system-config-module-mt/src/routes/system-config.routes.mt.ts]
|
|
|
+ - [ ] **确保多租户隔离**: 验证删除操作只删除当前租户的配置和缓存
|
|
|
- [ ] 任务 5 (AC: 1, 2): 重构系统配置路由聚合
|
|
|
- [ ] 修改 `packages/core-module-mt/system-config-module-mt/src/routes/system-config.routes.mt.ts`
|
|
|
- - [ ] 参照订单模块聚合写法,将自定义路由与CRUD路由聚合
|
|
|
+ - [ ] 参照订单模块聚合写法,将自定义路由与CRUD路由聚合 [对照: packages/orders-module-mt/src/routes/user/orders.mt.ts:34-38]
|
|
|
- [ ] 保持现有API接口兼容性
|
|
|
+ - [ ] **确保多租户中间件正确应用**: 保持authMiddleware和tenantOptions配置
|
|
|
- [ ] 任务 6 (AC: 4, 5): 验证缓存刷新机制
|
|
|
- [ ] 创建缓存刷新验证测试
|
|
|
- [ ] 验证创建配置时缓存正确刷新
|
|
|
- [ ] 验证更新配置时缓存正确刷新
|
|
|
- [ ] 验证删除配置时缓存正确刷新
|
|
|
- - [ ] 验证多租户缓存隔离
|
|
|
+ - [ ] **验证多租户缓存隔离**: 确保不同租户的配置缓存完全隔离
|
|
|
- [ ] 任务 7 (AC: 6): 验证现有功能无回归
|
|
|
- - [ ] 运行现有系统配置模块测试
|
|
|
- - [ ] 验证认证和支付模块集成正常
|
|
|
- - [ ] 验证管理后台UI包集成正常
|
|
|
+ - [ ] 运行现有系统配置模块测试 [对照: packages/core-module-mt/system-config-module-mt/tests/integration/system-config.routes.integration.test.ts]
|
|
|
+ - [ ] 验证认证和支付模块集成正常 [对照: packages/core-module-mt/auth-module-mt/src/services/mini-auth.service.mt.ts]
|
|
|
+ - [ ] 验证管理后台UI包集成正常 [对照: packages/system-config-management-ui-mt/src/api/systemConfigClient.ts]
|
|
|
- [ ] 运行所有相关集成测试
|
|
|
|
|
|
## Dev Notes
|
|
|
@@ -124,6 +128,14 @@ const systemConfigCrudRoutes = createCrudRoutes({
|
|
|
- **用户跟踪**: 通过 `userTracking` 配置用户跟踪
|
|
|
- **核心方法**: `getList()`, `getById()`, `create()`, `update()`, `delete()`
|
|
|
|
|
|
+### 多租户隔离关键要求
|
|
|
+**强制多租户隔离要求**:
|
|
|
+- **租户ID提取**: 所有自定义路由必须从上下文中提取tenantId [对照: packages/core-module-mt/system-config-module-mt/src/services/system-config.service.mt.ts:11-13]
|
|
|
+- **缓存键隔离**: Redis缓存键必须包含tenantId前缀 `system_config:{tenantId}:{configKey}` [对照: packages/shared-utils/src/utils/redis.util.ts:68]
|
|
|
+- **数据库查询隔离**: 所有数据库查询必须包含tenantId条件 [对照: packages/core-module-mt/system-config-module-mt/src/services/system-config.service.mt.ts:40]
|
|
|
+- **操作范围限制**: 创建、更新、删除操作只能影响当前租户的配置
|
|
|
+- **缓存刷新隔离**: 缓存刷新操作只能清除当前租户的缓存
|
|
|
+
|
|
|
### 先前故事实施经验
|
|
|
从Epic 010的前4个故事中提取的关键经验:
|
|
|
- **缓存穿透保护**: 实现空值缓存机制防止缓存穿透攻击 [Source: docs/stories/010.002.system-config-redis-cache.story.md]
|
|
|
@@ -147,7 +159,9 @@ const systemConfigCrudRoutes = createCrudRoutes({
|
|
|
#### 测试要求
|
|
|
- 验证自定义路由与CRUD路由聚合正确
|
|
|
- 验证缓存刷新机制正确工作
|
|
|
-- 验证多租户缓存隔离
|
|
|
+- **验证多租户缓存隔离**: 确保不同租户的配置缓存完全隔离
|
|
|
+- **验证多租户数据隔离**: 确保操作只影响当前租户的数据
|
|
|
+- **验证租户ID提取**: 确保从上下文中正确提取tenantId
|
|
|
- 验证API接口兼容性
|
|
|
- 验证现有功能无回归
|
|
|
|
|
|
@@ -155,6 +169,7 @@ const systemConfigCrudRoutes = createCrudRoutes({
|
|
|
| Date | Version | Description | Author |
|
|
|
|------|---------|-------------|--------|
|
|
|
| 2025-11-22 | 1.0 | 初始故事创建 | Bob (Scrum Master) |
|
|
|
+| 2025-11-22 | 1.1 | 添加对照文件路径标注,强调多租户隔离要求 | Bob (Scrum Master) |
|
|
|
|
|
|
## Dev Agent Record
|
|
|
|