datai/datai-scenes/datai-scene-salesforce/docs/decisions/adr/0027-file-infrastructure-enums.md

261 lines
11 KiB
Markdown
Raw Normal View History

# 架构决策记录 (ADR) - 基础设施和枚举定义
## 背景
REQ-011-1 需求要求在 datai-salesforce-common 模块定义文件上传下载所需的基础设施,包括:
- 文件对象类型枚举FileObjectType
- 文件上传下载参数类DTO/VO
- 文件上传下载异常类
- 文件验证工具类
这些基础设施将被后续的文件上传下载功能REQ-011-2/3/4/5/6使用需要确保设计的合理性和可扩展性。
**约束条件**
- 必须基于现有的 Spring Boot 3 技术栈
- 必须遵循 Authentication.canvas 中定义的架构和调用关系
- 必须在 datai-salesforce-common 模块下实现
- 必须遵循 SSOT 方法论
**业务需求**
- 支持 Attachment、ContentDocument、Document 三种文件对象类型
- 提供统一的参数验证和响应封装
- 提供完善的异常处理机制
- 支持文件大小和类型验证
## 决策
采用**策略模式 + 枚举 + 统一异常处理**的架构设计方案:
1. **文件对象类型枚举FileObjectType**
- 使用 Java 枚举定义 ATTACHMENT、CONTENT_DOCUMENT、DOCUMENT 三个枚举值
- 每个枚举值包含描述、文件大小限制、推荐等级、API 类型、必填字段等元数据
- 提供静态方法进行枚举值与字符串的转换
- 提供获取文件大小限制和推荐等级的方法
2. **参数类设计**
- FileUploadRequest包含组织配置 ID、文件对象类型、文件、关联记录 ID、文件名、描述等字段
- FileDownloadRequest包含组织配置 ID、文件对象类型、文件 ID、保存路径等字段
- FileUploadResponse包含文件 ID、文件名、文件大小、文件类型、上传时间、操作状态等字段
- FileDownloadResponse包含文件名、文件大小、保存路径、下载时间、操作状态等字段
- 使用 Lombok 注解简化代码(@Data、@Builder、@NoArgsConstructor、@AllArgsConstructor
- 使用 JSR-303 验证注解(@NotNull、@NotBlank、@Size、@Valid
3. **异常类设计**
- 继承自 datai-salesforce-common 模块的 RuntimeException 基类
- 提供错误代码枚举FileErrorCode
- 每个异常类包含错误代码、错误消息、异常链cause
- 异常类包括FileUploadException、FileDownloadException、FileSizeExceededException、FileTypeNotSupportedException、FileObjectNotFoundException、OrgConfigNotFoundException、FileValidationException
4. **验证工具类设计**
- FileValidationUtils提供文件大小验证、文件类型验证、文件名验证、文件扩展名获取、文件 MIME 类型获取等静态方法
- 使用 Apache Tika 获取文件 MIME 类型
- 提供可配置的文件大小限制和文件类型白名单
## 备选方案
### 方案一:策略模式 + 枚举 + 统一异常处理(已选择)
**优点**
- 枚举提供类型安全和编译时检查
- 策略模式易于扩展新的文件对象类型
- 统一异常处理机制便于维护
- 参数类使用 Lombok 和 JSR-303 注解,代码简洁
- 验证工具类提供可复用的验证逻辑
**缺点**
- 需要引入 Apache Tika 依赖
- 枚举扩展需要修改代码
### 方案二:配置文件 + 反射 + 动态验证
**优点**
- 文件对象类型配置化,无需修改代码即可扩展
- 验证规则可配置,灵活性高
**缺点**
- 失去编译时类型安全
- 反射影响性能
- 配置复杂度增加
- 维护成本高
### 方案三:继承体系 + 抽象类
**优点**
- 面向对象设计,符合 OOP 原则
- 可以通过继承扩展功能
**缺点**
- 类层次结构复杂
- 三种文件对象类型差异较大,难以抽象
- 违反"组合优于继承"原则
## 影响
### 系统架构影响
1. **datai-salesforce-common 模块**
- 新增枚举类FileObjectType
- 新增参数类FileUploadRequest、FileDownloadRequest、FileUploadResponse、FileDownloadResponse
- 新增异常类FileUploadException、FileDownloadException、FileSizeExceededException、FileTypeNotSupportedException、FileObjectNotFoundException、OrgConfigNotFoundException、FileValidationException
- 新增错误代码枚举FileErrorCode
- 新增工具类FileValidationUtils
2. **依赖管理**
- 需要引入 Apache Tika 依赖(用于文件 MIME 类型检测)
- 需要引入 Lombok 依赖(如果尚未引入)
- 需要引入 Spring Validation 依赖(如果尚未引入)
### 开发流程影响
1. **后续子需求开发**
- REQ-011-2/3/4 可以直接使用 FileObjectType 枚举
- REQ-011-2/3/4 可以直接使用 FileUploadRequest 和 FileDownloadRequest
- REQ-011-2/3/4 可以直接使用 FileUploadResponse 和 FileDownloadResponse
- REQ-011-2/3/4 可以直接使用异常类和验证工具类
2. **测试流程**
- 需要为枚举类编写单元测试
- 需要为参数类编写单元测试
- 需要为异常类编写单元测试
- 需要为验证工具类编写单元测试
### 运维管理影响
1. **配置管理**
- 文件大小限制和文件类型白名单可以通过配置文件管理
- 无需修改代码即可调整验证规则
2. **日志管理**
- 异常类提供详细的错误信息和错误代码
- 便于日志分析和问题排查
## 风险
### 技术风险
1. **Apache Tika 依赖冲突**
- 风险描述Apache Tika 可能与项目现有依赖冲突
- 影响程度:中
- 缓解措施:使用 Maven 依赖树检查冲突,必要时使用 exclusions
2. **枚举扩展性**
- 风险描述:未来可能需要支持更多文件对象类型,需要修改枚举
- 影响程度:低
- 缓解措施:枚举设计时考虑扩展性,提供清晰的扩展文档
### 业务风险
1. **文件大小限制调整**
- 风险描述Salesforce 可能调整文件大小限制
- 影响程度:低
- 缓解措施:文件大小限制配置化,便于调整
2. **文件类型白名单维护**
- 风险描述:文件类型白名单需要定期维护
- 影响程度:低
- 缓解措施:提供配置文件,便于运维人员维护
### 实施风险
1. **参数验证复杂性**
- 风险描述:参数验证逻辑可能过于复杂
- 影响程度:中
- 缓解措施:使用 JSR-303 验证注解,简化验证逻辑
2. **异常类设计不完善**
- 风险描述:异常类设计可能不够完善,遗漏某些异常场景
- 影响程度:中
- 缓解措施:参考现有的异常类定义,提供详细的错误代码
## 回滚策略
如果决策实施后出现问题,可以采用以下回滚策略:
1. **Apache Tika 依赖冲突**
- 回滚方案:移除 Apache Tika 依赖,使用 Java 内置的 Files.probeContentType() 方法
- 回滚步骤:
1. 在 pom.xml 中移除 Apache Tika 依赖
2. 修改 FileValidationUtils使用 Files.probeContentType() 方法
3. 重新编译和测试
2. **枚举扩展性不足**
- 回滚方案:将枚举改为配置文件 + 反射
- 回滚步骤:
1. 创建 file-object-types.yml 配置文件
2. 修改 FileObjectType 为配置类
3. 使用反射动态加载配置
4. 重新编译和测试
3. **参数验证逻辑复杂**
- 回滚方案:简化参数验证,只保留核心验证逻辑
- 回滚步骤:
1. 移除复杂的自定义验证注解
2. 只保留 JSR-303 基础验证注解
3. 重新编译和测试
## 验收标准
定义验证该决策有效性的具体标准和测试方法:
1. **功能验证**
- [ ] FileObjectType 枚举包含 ATTACHMENT、CONTENT_DOCUMENT、DOCUMENT 三个枚举值
- [ ] FileObjectType 枚举提供描述、文件大小限制、推荐等级等元数据
- [ ] FileObjectType 枚举提供枚举值与字符串的转换方法
- [ ] FileUploadRequest 包含所有必需字段
- [ ] FileDownloadRequest 包含所有必需字段
- [ ] FileUploadResponse 包含所有必需字段
- [ ] FileDownloadResponse 包含所有必需字段
- [ ] 所有异常类继承自 RuntimeException
- [ ] 所有异常类提供错误代码和错误消息
- [ ] FileValidationUtils 提供所有必需的验证方法
2. **代码质量验证**
- [ ] 代码符合项目编码规范
- [ ] 代码有清晰的注释
- [ ] 代码通过 SonarQube 静态代码分析
- [ ] 代码通过 Checkstyle 检查
3. **单元测试验证**
- [ ] FileObjectType 枚举单元测试覆盖率 ≥ 90%
- [ ] 参数类单元测试覆盖率 ≥ 90%
- [ ] 异常类单元测试覆盖率 ≥ 90%
- [ ] FileValidationUtils 单元测试覆盖率 ≥ 90%
4. **集成测试验证**
- [ ] 后续子需求REQ-011-2/3/4能够正常使用这些基础设施
- [ ] 文件上传下载功能能够正常工作
## 视觉锚点
### Visual Reference
引用 Canvas 的具体节点或快照:
- [Authentication.canvas](../../Authentication.canvas) - 相关架构图
- **具体节点**: [通用常量](node_common_constant) - 定义Salesforce相关的常量
- **具体节点**: [通用异常](node_common_exception) - 定义Salesforce相关的异常类
### Status
- [x] Draft
- [ ] Accepted
- [ ] Superceded
## 参考资料
列出与该决策相关的参考资料,包括文档、文章或其他资源:
1. [REQ-011.md](../requirements/REQ-011.md) - 父需求文档
2. [REQ-011-1.md](../requirements/REQ-011-1.md) - 子需求文档
3. [Authentication.canvas](../Authentication.canvas) - 项目架构视觉化展示
4. [Attachment文件上传.md](../reference-code/data-dump/Attachment文件上传.md) - Salesforce Attachment 上传实现逻辑
5. [Attachment文件下载.md](../reference-code/data-dump/Attachment文件下载.md) - Salesforce Attachment 下载实现逻辑
6. [Document上传下载.md](../reference-code/data-dump/Document上传下载.md) - Salesforce Document 上传下载实现逻辑
7. [ContentVersion上传下载.md](../reference-code/data-dump/ContentVersion上传下载.md) - Salesforce ContentVersion 上传下载实现逻辑
8. [大文件上传下载.md](../reference-code/data-dump/大文件上传下载.md) - 大文件上传下载实现逻辑
9. [CommonServiceImpl.java](../reference-code/data-dump/CommonServiceImpl.java) - 现有的文件上传下载实现逻辑
10. [DataImportNewServiceImpl.java](../reference-code/data-dump/DataImportNewServiceImpl.java) - 现有的文件上传下载实现逻辑
11. [Java 枚举最佳实践](https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html) - Oracle 官方文档
12. [JSR-303 Bean Validation](https://beanvalidation.org/2.0/spec/) - Bean Validation 规范
13. [Apache Tika 文档](https://tika.apache.org/) - Apache Tika 官方文档
14. [Lombok 文档](https://projectlombok.org/) - Lombok 官方文档