# Gateway Config Specification Gateway API 的配置集成规范,定义配置结构和加载方式。 ## ADDED Requirements ### Requirement: Gateway 配置结构 系统 SHALL 在 `pkg/config/config.go` 中添加 `GatewayConfig` 结构体。 配置字段: - `BaseURL string` - Gateway API 基础 URL - `AppID string` - 应用 ID - `AppSecret string` - 应用密钥 - `Timeout int` - 请求超时时间(秒) #### Scenario: 配置结构定义 - **WHEN** 定义 `GatewayConfig` 结构体 - **THEN** 包含 `mapstructure` 标签用于 Viper 解析 - **AND** 字段名使用 snake_case(如 `base_url`、`app_id`) #### Scenario: 集成到主配置 - **WHEN** 在 `Config` 结构体中添加 `Gateway GatewayConfig` 字段 - **THEN** 使用 `mapstructure:"gateway"` 标签 - **AND** 配置可通过 `config.Get().Gateway` 访问 ### Requirement: 默认配置嵌入 系统 SHALL 在 `pkg/config/defaults/config.yaml` 中添加 Gateway 默认配置。 #### Scenario: 嵌入默认配置 - **WHEN** 读取嵌入的默认配置文件 - **THEN** 包含 `gateway` 配置节 - **AND** 配置包含: ```yaml gateway: base_url: "https://lplan.whjhft.com/openapi" app_id: "60bgt1X8i7AvXqkd" app_secret: "BZeQttaZQt0i73moF" timeout: 30 ``` ### Requirement: 环境变量覆盖 系统 SHALL 支持通过环境变量覆盖 Gateway 配置。 环境变量格式:`JUNHONG_GATEWAY_{KEY}` #### Scenario: 覆盖 BaseURL - **WHEN** 设置环境变量 `JUNHONG_GATEWAY_BASE_URL=https://test.example.com` - **THEN** `config.Gateway.BaseURL` 的值为 "https://test.example.com" - **AND** 覆盖嵌入配置中的默认值 #### Scenario: 覆盖 AppID - **WHEN** 设置环境变量 `JUNHONG_GATEWAY_APP_ID=test_app_id` - **THEN** `config.Gateway.AppID` 的值为 "test_app_id" #### Scenario: 覆盖 AppSecret - **WHEN** 设置环境变量 `JUNHONG_GATEWAY_APP_SECRET=test_secret` - **THEN** `config.Gateway.AppSecret` 的值为 "test_secret" #### Scenario: 覆盖 Timeout - **WHEN** 设置环境变量 `JUNHONG_GATEWAY_TIMEOUT=60` - **THEN** `config.Gateway.Timeout` 的值为 60 ### Requirement: 配置验证 系统 SHALL 在配置加载后验证 Gateway 配置的有效性。 #### Scenario: 必填字段验证 - **WHEN** 配置加载完成 - **THEN** 验证 `BaseURL`、`AppID`、`AppSecret` 不为空 - **AND** 如果为空,返回明确的错误信息 #### Scenario: BaseURL 格式验证 - **WHEN** 验证 `BaseURL` 字段 - **THEN** 必须以 `http://` 或 `https://` 开头 - **AND** 不能以 `/` 结尾 #### Scenario: Timeout 范围验证 - **WHEN** 验证 `Timeout` 字段 - **THEN** 值必须在 5 到 300 秒之间 - **AND** 如果超出范围,返回验证错误 #### Scenario: AppID 格式验证 - **WHEN** 验证 `AppID` 字段 - **THEN** 长度必须 > 0 - **AND** 不包含特殊字符(仅允许字母、数字、下划线) ### Requirement: 敏感配置处理 系统 SHALL 确保 `AppSecret` 不记录到日志中。 #### Scenario: 配置日志脱敏 - **WHEN** 记录配置加载成功的日志 - **THEN** `AppSecret` 字段显示为 "***" - **AND** 实际值不出现在日志中 #### Scenario: 错误日志脱敏 - **WHEN** 配置验证失败并记录错误日志 - **THEN** `AppSecret` 字段显示为 "***" ### Requirement: Gateway 客户端初始化 系统 SHALL 在 `internal/bootstrap/bootstrap.go` 中初始化 Gateway 客户端。 #### Scenario: Bootstrap 中初始化 - **WHEN** 调用 `bootstrap.Bootstrap(deps)` - **THEN** 从 `deps.Config.Gateway` 读取配置 - **AND** 调用 `gateway.NewClient(baseURL, appID, appSecret).WithTimeout(...)` - **AND** 将客户端赋值给 `deps.GatewayClient` #### Scenario: 配置错误时启动失败 - **WHEN** Gateway 配置验证失败 - **THEN** `bootstrap.Bootstrap` 返回错误 - **AND** 应用启动失败 ### Requirement: 多环境配置支持 系统 SHALL 支持通过环境变量切换不同环境的 Gateway 配置。 #### Scenario: 开发环境配置 - **WHEN** 使用默认嵌入配置(未设置环境变量) - **THEN** 使用生产环境的 Gateway URL 和凭证 #### Scenario: 测试环境配置 - **WHEN** 设置环境变量指向测试 Gateway - **AND** `JUNHONG_GATEWAY_BASE_URL=https://test-gateway.example.com` - **AND** `JUNHONG_GATEWAY_APP_ID=test_app_id` - **THEN** 客户端连接到测试环境 ## MODIFIED Requirements ### Requirement: Config 结构体扩展 系统 SHALL 在现有的 `Config` 结构体中添加 `Gateway` 字段。 #### Scenario: 配置结构兼容性 - **WHEN** 添加 `Gateway GatewayConfig` 字段 - **THEN** 不影响现有配置字段的加载 - **AND** 现有配置(Server、Database、Redis 等)继续正常工作 ### Requirement: Dependencies 结构体扩展 系统 SHALL 在 `internal/bootstrap/bootstrap.go` 的 `Dependencies` 结构体中添加 `GatewayClient` 字段。 #### Scenario: 依赖注入扩展 - **WHEN** 在 `Dependencies` 中添加 `GatewayClient *gateway.Client` 字段 - **THEN** 不影响现有依赖的注入 - **AND** Gateway 客户端可以注入到需要的 Service #### Scenario: Service 层使用 - **WHEN** Service 需要调用 Gateway API - **THEN** 在 Service 构造函数中接收 `gatewayClient *gateway.Client` 参数 - **AND** 从 Bootstrap 中传递 `deps.GatewayClient`