Procházet zdrojové kódy

📝 docs(story): 更新平台邮箱字段可选功能的故事文档

- 更新后端schema验证任务描述,明确使用`.or(z.literal('')).transform()`方案
- 重新组织单元测试任务,优先验证schema转换逻辑
- 在技术细节部分详细说明问题根源和推荐的解决方案
- 更新具体测试场景列表,反映新的验证逻辑
yourname před 2 týdny
rodič
revize
a5815a9e2c
1 změnil soubory, kde provedl 42 přidání a 14 odebrání
  1. 42 14
      docs/stories/009.002.story.md

+ 42 - 14
docs/stories/009.002.story.md

@@ -21,19 +21,23 @@ Draft
   - [ ] 测试表单提交时邮箱字段可为空(不填写)
   - [ ] 测试表单提交时邮箱字段可为有效邮箱格式
   - [ ] 测试表单提交时邮箱字段为无效格式应显示验证错误
-- [ ] 验证平台模块后端schema验证 (AC: 2, 3)
-  - [ ] 检查allin-packages/platform-module/src/schemas/platform.schema.ts中的CreatePlatformSchema
-  - [ ] 确认contactEmail字段已经是.optional()状态(支持空值)
-  - [ ] 确认保留.email()验证(如果填写,必须是有效邮箱格式)
-  - [ ] 检查UpdatePlatformSchema中的contactEmail字段验证规则一致
+- [ ] 修改平台模块后端schema验证 (AC: 2, 3)
+  - [ ] 修改allin-packages/platform-module/src/schemas/platform.schema.ts中的CreatePlatformSchema
+  - [ ] 将contactEmail字段改为:`.optional().or(z.literal('')).transform(val => val === '' ? undefined : val)`
+  - [ ] 保留.email()验证(如果填写,必须是有效邮箱格式)
+  - [ ] 同样修改UpdatePlatformSchema中的contactEmail字段验证规则
+  - [ ] 确保.openapi()描述保持不变
 - [ ] 验证数据库兼容性 (AC: 3)
   - [ ] 检查allin-packages/platform-module/src/entities/platform.entity.ts中contactEmail字段为nullable: true
   - [ ] 验证现有数据可以正常读取和更新
 - [ ] 编写单元测试 (AC: 1, 2, 3)
+  - [ ] 为平台schema添加测试,验证空字符串转换为undefined
+  - [ ] 为平台schema添加测试,验证有效邮箱格式通过验证
+  - [ ] 为平台schema添加测试,验证无效邮箱格式显示错误
+  - [ ] 为平台schema添加测试,验证undefined通过验证(可选字段)
   - [ ] 为平台管理表单添加测试,验证邮箱字段可为空的表单提交
   - [ ] 为平台管理表单添加测试,验证邮箱字段为有效邮箱格式的表单提交
   - [ ] 为平台管理表单添加测试,验证邮箱字段为无效格式时显示验证错误
-  - [ ] 为平台schema添加测试,验证邮箱字段验证规则(optional + email验证)
   - [ ] 添加集成测试验证端到端功能
 - [ ] 执行回归测试 (AC: 3)
   - [ ] 测试现有平台数据的显示和编辑功能
@@ -83,10 +87,31 @@ Draft
 - 问题:空字符串`''`不是有效的邮箱格式,会导致Zod验证失败
 - 正确做法:默认值应该是`undefined`
 
+**技术细节**:
+- Zod schema:`.optional()`允许`undefined`,但不允许无效的邮箱格式
+- React Hook Form:`defaultValues`中可以使用`undefined`,但输入框清空后值是`''`
+- 当前所有字段都设置为`''`,但只有`contactEmail`需要特殊处理,因为它是可选但需要邮箱验证的字段
+
+**解决方案选项**:
+1. **推荐方案**:修改schema,使用`.or(z.literal(''))`允许空字符串,然后转换
+   ```typescript
+   contactEmail: z.string().email().max(100).optional()
+     .or(z.literal(''))  // 允许空字符串
+     .transform(val => val === '' ? undefined : val)  // 将空字符串转为undefined
+   ```
+2. **备选方案**:前端在提交前将空字符串转换为`undefined`
+3. **简单方案**:只修改默认值为`undefined`,但用户清空输入框后还是`''`
+
+根据故事需求,推荐使用方案1,因为它:
+- 保持邮箱验证(如果填写了)
+- 允许空字符串(用户清空输入框)
+- 在API层面将空字符串转为`undefined`
+
 根据故事"邮箱字段改为非必要输入项"的要求,需要:
-1. 将前端表单默认值从`''`改为`undefined`
-2. 确保字段支持空值(不填写)
-3. 如果用户选择填写,验证邮箱格式
+1. 修改schema,允许空字符串并转换为`undefined`
+2. 可选:将前端表单默认值从`''`改为`undefined`
+3. 确保字段支持空值(不填写)
+4. 如果用户选择填写,验证邮箱格式
 
 ### 文件位置参考
 1. **平台管理组件**: `allin-packages/platform-management-ui/src/components/PlatformManagement.tsx`
@@ -110,11 +135,14 @@ Draft
 - 错误处理:测试各种错误场景和边界条件 [Source: architecture/coding-standards.md#错误处理]
 
 **具体测试场景**:
-1. 平台表单:验证提交时邮箱字段可为空(不填写)
-2. 平台表单:验证提交时邮箱字段可为有效邮箱格式
-3. 平台表单:验证提交时邮箱字段为无效格式应显示验证错误
-4. 数据兼容性:验证现有含邮箱数据的显示和编辑
-5. schema验证:验证字段为optional且保留email验证
+1. schema验证:空字符串`''`转换为`undefined`通过验证
+2. schema验证:`undefined`通过验证(可选字段)
+3. schema验证:有效邮箱格式通过验证
+4. schema验证:无效邮箱格式显示验证错误
+5. 平台表单:验证提交时邮箱字段可为空(不填写)
+6. 平台表单:验证提交时邮箱字段可为有效邮箱格式
+7. 平台表单:验证提交时邮箱字段为无效格式应显示验证错误
+8. 数据兼容性:验证现有含邮箱数据的显示和编辑
 
 ## Testing
 ### 测试标准