datai/docs/archive/decisions/adr/0031-file-controller-api.md

317 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.

# 架构决策记录:文件上传下载 Controller 和 API 接口
## 背景
REQ-011-5 需求要求创建 FileController提供文件上传下载的 RESTful API 接口,支持 Attachment、ContentDocument、Document 三种文件对象类型。用户可以通过 HTTP 请求上传和下载 Salesforce 的三种文件对象,支持指定组织配置 ID。
### 面临的问题
1. **Controller 设计**: 需要设计合理的 Controller支持三种文件对象类型的上传下载功能
2. **API 设计**: 需要设计符合 RESTful 规范的 API 接口
3. **参数验证**: 需要设计合理的参数验证机制,确保 API 接口的健壮性
4. **响应封装**: 需要设计统一的响应格式,提高 API 接口的一致性
5. **策略模式应用**: 需要使用策略模式根据文件对象类型调用不同的 Service
6. **文档生成**: 需要生成清晰的 API 文档,提高 API 接口的可用性
### 约束条件
1. **技术栈限制**: 必须基于现有的 Spring Boot 3 技术栈
2. **架构约束**: 必须遵循 Authentication.canvas 中定义的架构和调用关系
3. **模块约束**: 必须在 datai-salesforce-integration 模块下实现
4. **认证约束**: 必须使用 SessionManager 进行会话管理和自动重新登录
5. **API约束**: 必须遵循 RESTful 设计规范
6. **文档约束**: 必须遵循 SSOT 方法论
7. **设计模式约束**: 必须使用策略模式封装三种文件对象的上传下载逻辑
8. **验证约束**: 必须使用 JSR-303 验证注解进行参数验证
9. **文档约束**: 必须使用 Swagger/OpenAPI 注解生成 API 文档
## 决策
### 1. Controller 设计
**决策**: 创建 FileController使用 @RestController@RequestMapping 注解
**理由**:
- @RestController 是 Spring Boot 推荐的 RESTful Controller 注解
- @RequestMapping 可以指定基础路径,便于 API 管理
- 符合 Spring Boot 最佳实践
- 代码简洁,易于维护
**实现方案**:
- 使用 @RestController 注解标记 FileController
- 使用 @RequestMapping("/files") 注解指定基础路径
- 使用 @Slf4j 注解记录日志
- 使用 @Autowired 注入 AttachmentFileService、ContentVersionFileService、DocumentFileService
### 2. API 设计
**决策**: 设计符合 RESTful 规范的 API 接口
**理由**:
- RESTful 是业界公认的 API 设计规范
- 提高 API 接口的一致性和可维护性
- 便于前端调用和集成
- 符合业界最佳实践
**实现方案**:
- 文件上传接口POST /files/upload
- 文件下载接口GET /files/download
- 使用 @PostMapping@GetMapping 注解
- 使用 @RequestParam@RequestPart 注解接收参数
- 使用 @Valid 注解进行参数验证
- 返回统一的响应格式
### 3. 参数验证
**决策**: 使用 JSR-303 验证注解进行参数验证
**理由**:
- JSR-303 是 Java 标准的验证规范
- Spring Boot 3.5.7 内置 JSR-303 支持
- 提供丰富的验证注解,如 @NotNull、@NotBlank、@Size 等
- 可以自定义验证注解
- 提高代码的可读性和可维护性
**实现方案**:
- 使用 @Valid 注解进行参数验证
- 使用 @NotNull、@NotBlank、@Size 等验证注解
- 自定义验证注解(如果需要)
- 提供详细的错误信息
### 4. 响应封装
**决策**: 使用统一的响应格式
**理由**:
- 提高 API 接口的一致性
- 便于前端处理响应
- 便于错误处理和日志记录
- 符合业界最佳实践
**实现方案**:
- 定义统一的响应格式,包含 code、message、data 字段
- 成功响应返回 200 状态码
- 失败响应返回 4xx 或 5xx 状态码
- 提供详细的错误信息
### 5. 策略模式应用
**决策**: 使用策略模式根据文件对象类型调用不同的 Service
**理由**:
- 策略模式可以很好地支持多种文件对象类型的上传下载功能
- 符合开闭原则,易于扩展新的文件对象类型
- 代码结构清晰,易于维护
- 符合单一职责原则
**实现方案**:
- 使用 switch-case 语句根据 FileObjectType 调用不同的 Service
- Attachment 类型调用 AttachmentFileService
- ContentDocument 类型调用 ContentVersionFileService
- Document 类型调用 DocumentFileService
### 6. 文档生成
**决策**: 使用 Swagger/OpenAPI 注解生成 API 文档
**理由**:
- Swagger/OpenAPI 是业界标准的 API 文档规范
- 自动生成 API 文档,减少维护成本
- 提供在线 API 测试功能
- 提高开发效率和用户体验
**实现方案**:
- 使用 @Tag 注解标记 Controller
- 使用 @Operation 注解标记方法
- 使用 @Parameter 注解标记参数
- 使用 @ApiResponse 注解标记响应
- 配置 Swagger UI
## 备选方案
### 方案 1: 使用 GraphQL API
**优点**:
- GraphQL API 灵活强大
- 可以一次性获取多个数据
- 减少网络请求次数
**缺点**:
- GraphQL API 对文件上传下载支持有限
- 实现复杂度高
- 不符合 RESTful 规范
- 前端需要学习 GraphQL
**评估**: 不推荐使用
### 方案 2: 使用 gRPC API
**优点**:
- gRPC 性能优异
- 支持多种语言
- 使用 Protocol Buffers 序列化
**缺点**:
- gRPC 不适合文件上传下载
- 实现复杂度高
- 不符合 RESTful 规范
- 前端需要学习 gRPC
**评估**: 不推荐使用
### 方案 3: 使用自定义验证逻辑
**优点**:
- 可以完全控制验证逻辑
- 不依赖第三方库
**缺点**:
- 代码冗余,不易维护
- 不符合 JSR-303 标准
- 增加开发成本
**评估**: 不推荐使用
### 方案 4: 使用自定义响应格式
**优点**:
- 可以完全控制响应格式
- 不依赖第三方库
**缺点**:
- 代码冗余,不易维护
- 不符合业界最佳实践
- 增加开发成本
**评估**: 不推荐使用
## 影响
### 系统架构影响
1. **新增模块**: 在 datai-salesforce-integration 模块下新增 FileController
2. **新增接口**: 新增文件上传下载 API 接口
3. **新增依赖**: 新增 Swagger/OpenAPI 依赖
4. **新增验证**: 新增 JSR-303 验证注解
### 开发流程影响
1. **开发流程**: 需要按照 SSOT 方法论进行开发,包括需求定义、方案决策、提示词资产化、执行会话、变更记录、闭环复盘
2. **代码规范**: 需要遵循项目编码规范,使用 Lombok 注解、JSR-303 验证注解、Swagger/OpenAPI 注解等
3. **测试要求**: 需要编写单元测试和集成测试,确保测试覆盖率 ≥ 90%
### 运维管理影响
1. **监控要求**: 需要监控 API 接口的性能和错误率
2. **日志要求**: 需要记录详细的日志,便于问题排查
3. **文档要求**: 需要维护 API 文档,确保文档的准确性和及时性
## 风险
### 技术风险
1. **API 设计风险**: API 接口设计可能不够完善
- **缓解措施**: 提前进行 API 设计评审,参考业界最佳实践
2. **参数验证风险**: 参数验证可能不够严格
- **缓解措施**: 使用 JSR-303 验证注解,提供详细的错误信息
3. **响应封装风险**: 响应封装可能不够统一
- **缓解措施**: 定义统一的响应格式,使用统一的响应封装逻辑
4. **并发风险**: 并发上传下载可能导致资源竞争
- **缓解措施**: 使用线程池,限制并发数,监控并发性能
### 业务风险
1. **兼容性风险**: 前端可能不兼容新的 API 接口
- **缓解措施**: 提供详细的 API 文档,提供前端集成指南
2. **性能风险**: API 接口性能可能不达标
- **缓解措施**: 提前进行性能测试,优化代码性能
### 实施风险
1. **开发风险**: 开发过程中可能遇到技术难题
- **缓解措施**: 提前进行技术调研,参考官方文档和示例代码
2. **测试风险**: 测试过程中可能发现性能问题
- **缓解措施**: 提前进行性能测试,优化代码性能
## 回滚策略
### 回滚条件
1. **功能不满足需求**: 如果实现的功能不满足需求,可以进行回滚
2. **性能不达标**: 如果性能不达标,可以进行回滚或优化
3. **严重Bug**: 如果发现严重Bug可以进行回滚或修复
### 回滚步骤
1. **代码回滚**: 使用 Git 回滚代码到上一个稳定版本
2. **配置回滚**: 如果有配置变更,需要回滚配置
3. **通知用户**: 通知用户回滚的原因和影响
### 回滚后调整
1. **问题分析**: 分析回滚的原因,找出问题所在
2. **方案优化**: 优化方案,解决存在的问题
3. **重新实施**: 重新实施优化后的方案
## 验收标准
### 功能验收标准
1. **上传功能**: 能够成功上传本地文件到 Salesforce Attachment、ContentDocument、Document 对象
2. **下载功能**: 能够成功从 Salesforce Attachment、ContentDocument、Document 对象下载文件到本地
3. **参数验证**: 能够正确验证参数,提供详细的错误信息
4. **异常处理**: 能够正确处理异常,提供详细的错误信息
5. **日志记录**: 能够记录详细的日志,便于问题排查
6. **API 文档**: 能够生成清晰的 API 文档,便于前端调用和集成
### 性能验收标准
1. **上传性能**: 文件上传性能良好,不影响系统响应
2. **下载性能**: 文件下载性能良好,不影响系统响应
3. **并发性能**: 并发上传下载性能良好,不出现资源竞争
### 代码质量验收标准
1. **代码规范**: 代码符合项目编码规范,有清晰的注释
2. **设计模式**: 使用策略模式封装三种文件对象的上传下载逻辑
3. **单一职责**: 遵循单一职责原则和开闭原则
4. **测试覆盖**: 测试覆盖率 ≥ 90%
### API 文档验收标准
1. **文档完整性**: API 文档包含所有接口的详细信息
2. **文档准确性**: API 文档与实际接口一致
3. **文档可读性**: API 文档清晰易懂,便于前端调用和集成
## 视觉锚点
### Visual Reference
引用 Canvas 的具体节点或快照:
- [Authentication.canvas](../../Authentication.canvas) - 项目架构视觉化展示
- **具体节点**: [集成核心](node_integration_core) - 提供与Salesforce的各种连接方式
- **具体节点**: [SessionManager](node_session_manager_detail) - 会话管理,提供登录服务
### Status
- [x] Draft
- [ ] Accepted
- [ ] Superceded
## 参考资料
列出与该决策相关的参考资料,包括文档、文章或其他资源。
- [REQ-011.md](../requirements/REQ-011.md) - Salesforce文件上传下载功能
- [REQ-011-1.md](../requirements/REQ-011-1.md) - 基础设施和枚举定义
- [REQ-011-2.md](../requirements/REQ-011-2.md) - Attachment 文件上传下载功能
- [REQ-011-3.md](../requirements/REQ-011-3.md) - ContentDocument/ContentVersion 文件上传下载功能
- [REQ-011-4.md](../requirements/REQ-011-4.md) - Document 文件上传下载功能
- [REQ-011-5.md](../requirements/REQ-011-5.md) - 文件上传下载 Controller 和 API 接口
- [0028-attachment-upload-download.md](0028-attachment-upload-download.md) - Attachment 文件上传下载架构决策
- [0029-contentversion-upload-download.md](0029-contentversion-upload-download.md) - ContentVersion 文件上传下载架构决策
- [0030-document-upload-download.md](0030-document-upload-download.md) - Document 文件上传下载架构决策
- [Spring Boot REST API 文档](https://spring.io/guides/gs/rest-service/) - Spring Boot REST API 官方文档
- [Spring Boot Validation 文档](https://spring.io/guides/gs/validating-form-input/) - Spring Boot Validation 官方文档
- [SpringDoc OpenAPI 文档](https://springdoc.org/) - SpringDoc OpenAPI 官方文档