datai/docs/archive/decisions/adr/0027-file-infrastructure-enums.md

261 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 架构决策记录 (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 官方文档