## ADDED Requirements ### Requirement: 注册源 调用方白名单 SHALL 维护于宜搭"权限表单"。mjava-com MUST 通过 `com.caller.registry.formUuid` 配置项动态加载调用方清单。 #### Scenario: 启动时全量加载 - **WHEN** 应用启动 `@PostConstruct` - **THEN** 按 `com.caller.registry.formUuid` 分页查询宜搭表单 - **AND** 过滤 `enabled=on` 的记录转为 `CallerProfile` 写入内存 `Map` ### Requirement: 加载与刷新 注册表 SHALL 支持 TTL 自动刷新与 stale-while-revalidate。 #### Scenario: TTL 到期触发刷新 - **WHEN** 距上次加载超过 `com.caller.registry.ttlSeconds`(默认 300 秒) - **THEN** 异步重新拉取宜搭表单 - **AND** 期间旧数据继续可用,直到新数据就绪替换 #### Scenario: 手动刷新入口 - **WHEN** 调用 `POST /api/com/_admin/reloadCallers` - **AND** 当前 profile 为 dev - **THEN** 立即同步重新加载 ### Requirement: 密钥轮换 调用方密钥更新 SHALL 由运营在宜搭表单手动完成。本 change 不支持双密钥并存。 #### Scenario: 单密钥轮换 - **WHEN** 运营更新宜搭表单 `callerSecret` - **THEN** 下次 TTL 刷新后新密钥生效 - **AND** 轮换期间客户端必须同步切换(可接受短暂 401) ### Requirement: 调用方停用 调用方停用 SHALL 在下次注册表刷新后立即生效。停用期间请求 MUST 返回 401。 #### Scenario: enabled=off - **WHEN** 宜搭表单 `radioField_enabled=off` - **AND** 注册表刷新完成 - **THEN** 该 callerId 从内存 Map 移除 - **AND** 后续请求返回 `401 { code: "CALLER_DISABLED" }`