1
0

feat: 实现分层架构,包含 domain、service、repository 和 pkg 层

- 新增 domain 层:model、provider、route、stats 实体
- 新增 service 层:models、providers、routing、stats 业务逻辑
- 新增 repository 层:models、providers、stats 数据访问
- 新增 pkg 工具包:errors、logger、validator
- 新增中间件:CORS、logging、recovery、request ID
- 新增数据库迁移:初始 schema 和索引
- 新增单元测试和集成测试
- 新增规范文档:config-management、database-migration、error-handling、layered-architecture、middleware-system、request-validation、structured-logging、test-coverage
- 移除 config 子包和 model_router(已迁移至分层架构)
This commit is contained in:
2026-04-16 00:47:20 +08:00
parent 915b004924
commit f18904af1e
77 changed files with 5727 additions and 1257 deletions

View File

@@ -1,10 +1,6 @@
# 供应商管理
# Provider Management
## Purpose
TBD - 提供供应商配置的管理功能(创建、查询、更新、删除)
## Requirements
## MODIFIED Requirements
### Requirement: 创建供应商配置
@@ -28,6 +24,8 @@ TBD - 提供供应商配置的管理功能(创建、查询、更新、删除
- **THEN** 网关 SHALL 返回错误,状态码为 400 (Bad Request)
- **THEN** 错误 SHALL 指示缺少哪些字段
**变更说明:** handler 通过 ProviderService 调用,数据访问通过 ProviderRepository。API 接口保持不变。
### Requirement: 列出所有供应商
网关 SHALL 允许获取所有供应商配置。
@@ -39,10 +37,7 @@ TBD - 提供供应商配置的管理功能(创建、查询、更新、删除
- **THEN** 每个供应商 SHALL 包含 id, name, api_key已掩码, base_url, enabled, created_at, updated_at
- **THEN** api_key SHALL 被掩码(仅显示最后 4 个字符)
#### Scenario: 列出供应商时为空
- **WHEN** 向 `/api/providers` 发送 GET 请求,且不存在供应商
- **THEN** 网关 SHALL 返回空列表
**变更说明:** 数据访问从 config 包迁移到 ProviderRepository。API 接口保持不变。
### Requirement: 获取特定供应商
@@ -59,6 +54,8 @@ TBD - 提供供应商配置的管理功能(创建、查询、更新、删除
- **WHEN** 向 `/api/providers/:id` 发送 GET 请求,携带不存在的 ID
- **THEN** 网关 SHALL 返回错误,状态码为 404 (Not Found)
**变更说明:** 通过 ProviderService 和 ProviderRepository 实现。API 接口保持不变。
### Requirement: 更新供应商配置
网关 SHALL 允许更新现有供应商配置。
@@ -70,16 +67,7 @@ TBD - 提供供应商配置的管理功能(创建、查询、更新、删除
- **THEN** 网关 SHALL 返回更新后的供应商
- **THEN** updated_at 时间戳 SHALL 被更新
#### Scenario: 更新不存在的供应商
- **WHEN** 向 `/api/providers/:id` 发送 PUT 请求,携带不存在的 ID
- **THEN** 网关 SHALL 返回错误,状态码为 404 (Not Found)
#### Scenario: 部分更新
- **WHEN** 向 `/api/providers/:id` 发送 PUT 请求,仅包含部分字段
- **THEN** 网关 SHALL 仅更新提供的字段
- **THEN** 网关 SHALL 保留未更改的字段
**变更说明:** 通过 ProviderService 和 ProviderRepository 实现。API 接口保持不变。
### Requirement: 删除供应商配置
@@ -92,60 +80,38 @@ TBD - 提供供应商配置的管理功能(创建、查询、更新、删除
- **THEN** 网关 SHALL 删除所有关联的模型CASCADE
- **THEN** 网关 SHALL 返回状态码 204 (No Content)
#### Scenario: 删除不存在的供应商
**变更说明:** 通过 ProviderService 和 ProviderRepository 实现。API 接口保持不变。
- **WHEN** 向 `/api/providers/:id` 发送 DELETE 请求,携带不存在的 ID
- **THEN** 网关 SHALL 返回错误,状态码为 404 (Not Found)
## ADDED Requirements
### Requirement: 启用和禁用供应商
### Requirement: 使用 service 层处理业务逻辑
网关 SHALL 支持启用和禁用供应商
Handler SHALL 通过 ProviderService 处理业务逻辑
#### Scenario: 禁用供应商
#### Scenario: 调用 service 方法
- **WHEN** 供应商的 `enabled` 字段设置为 false
- **THEN** 网关 SHALL 不向该供应商路由请求
- **THEN** 供应商 SHALL 保留在数据库中
- **WHEN** handler 收到请求
- **THEN** SHALL 调用对应的 ProviderService 方法Create、Get、List、Update、Delete
- **THEN** SHALL 使用 domain.Provider 类型
#### Scenario: 启用供应商
#### Scenario: 错误处理
- **WHEN** 已禁用供应商的 `enabled` 字段设置为 true
- **THEN** 网关 SHALL 恢复向该供应商路由请求
- **WHEN** service 返回错误
- **THEN** SHALL 转换为 HTTP 错误响应
- **THEN** SHALL 使用结构化错误处理
### Requirement: 验证供应商配置
### Requirement: 使用 repository 层访问数据
网关 SHALL 验证供应商配置数据。
Service SHALL 通过 ProviderRepository 访问数据。
#### Scenario: 验证 base_url 格式
#### Scenario: 调用 repository 方法
- **WHEN** 创建或更新供应商时使用无效的 base_url 格式
- **THEN** 网关 SHALL 返回错误,状态码为 400 (Bad Request)
- **WHEN** service 处理业务逻辑
- **THEN** SHALL 调用对应的 ProviderRepository 方法
- **THEN** SHALL 使用 domain.Provider 类型
#### Scenario: 验证必需字段
#### Scenario: 数据验证
- **WHEN** 创建或更新供应商
- **THEN** 网关 SHALL 验证 id, name, api_key 和 base_url 存在且非空
### Requirement: 安全存储供应商配置
网关 SHALL 安全存储供应商 API Key。
#### Scenario: 存储 API Key
- **WHEN** 创建或更新供应商时携带 API Key
- **THEN** 网关 SHALL 将 API Key 存储在数据库中
#### Scenario: 在响应中掩码 API Key
- **WHEN** 在 API 响应中返回供应商数据
- **THEN** API Key SHALL 被掩码(仅显示最后 4 个字符)
### Requirement: 仅支持 OpenAI 兼容供应商
网关 SHALL 在 MVP 中仅支持 OpenAI 兼容供应商。
#### Scenario: 供应商类型验证
- **WHEN** 创建供应商
- **THEN** 供应商类型 SHALL 隐式设置为 "openai-compatible"
- **THEN** MVP 中 SHALL 不支持其他供应商类型
- **THEN** SHALL 在 service 层验证业务规则
- **THEN** SHALL 在 repository 层执行数据库操作