refactor(core): 重构 Provider Ops 架构注册、校验链路与余额缓存流程

- 将 provider ops 纯逻辑下沉到 aether-admin,拆分 architectures、actions、verify 模块
- 用统一的 architecture spec 驱动 verify、query_balance、checkin 行为,替换分散的条件分支
- 新增 sub2api / anyrouter / cubence / yescode 等架构的请求头构建、校验解析与余额解析实现
- 引入 provider balance Redis 缓存、异步刷新、pending 响应以及配置变更后的缓存清理
- 补充 provider ops 的控制面测试、Redis 缓存测试和架构边界测试

- 影响说明:统一了 Provider Ops 的扩展方式与运行时行为,降低后续新增架构的接入成本
- 影响说明:余额查询从“实时阻塞返回”扩展为“缓存命中即返回并后台刷新”的模式,前端需要兼容 pending 状态
This commit is contained in:
AAEE86
2026-04-10 15:06:42 +08:00
parent 87b433e290
commit b8ce02b4f7
48 changed files with 7680 additions and 2450 deletions

View File

@@ -385,8 +385,8 @@ fn admin_provider_ops_route_owners_stay_explicit() {
"apps/aether-gateway/src/handlers/admin/provider/ops/providers/routes/verify.rs",
);
assert!(
verify.contains("super::super::verify::{"),
"verify.rs should depend directly on verify owner"
verify.contains("super::super::verify::admin_provider_ops_local_verify_response"),
"verify.rs should depend directly on gateway verify runtime owner"
);
let connect = read_workspace_file(
@@ -414,6 +414,28 @@ fn admin_provider_ops_route_owners_stay_explicit() {
);
}
#[test]
fn admin_provider_ops_architecture_registry_uses_pure_owner() {
let architectures =
read_workspace_file("apps/aether-gateway/src/handlers/admin/provider/ops/architectures.rs");
for pattern in [
"use aether_admin::provider::ops::{get_architecture, list_architectures};",
"list_architectures(false)",
"get_architecture(architecture_id)",
] {
assert!(
architectures.contains(pattern),
"handlers/admin/provider/ops/architectures.rs should delegate architecture registry to pure owner {pattern}"
);
}
assert!(
!workspace_file_exists(
"apps/aether-gateway/src/handlers/admin/provider/ops/architectures.all.json"
),
"handlers/admin/provider/ops/architectures.all.json should be removed after moving architecture registry into aether-admin"
);
}
#[test]
fn admin_provider_summary_mod_stays_thin() {
let summary_mod =
@@ -1150,7 +1172,7 @@ fn admin_provider_ops_providers_mod_stays_thin() {
"pub(super) struct AdminProviderOpsSaveConfigRequest",
"pub(super) struct AdminProviderOpsConnectRequest",
"pub(super) struct AdminProviderOpsExecuteActionRequest",
"pub(super) struct AdminProviderOpsCheckinOutcome",
"ProviderOpsCheckinOutcome as AdminProviderOpsCheckinOutcome",
] {
assert!(
providers_support.contains(pattern),
@@ -1234,10 +1256,11 @@ fn admin_provider_ops_actions_mod_stays_thin() {
"apps/aether-gateway/src/handlers/admin/provider/ops/providers/actions/support.rs",
);
for pattern in [
"pub(super) fn admin_provider_ops_resolved_action_config(",
"pub(super) fn admin_provider_ops_checkin_data(",
"pub(super) fn admin_provider_ops_json_object_map(",
"pub(super) fn admin_provider_ops_request_url(",
"pub(super) fn admin_provider_ops_request_method(",
"pub(super) fn admin_provider_ops_should_use_rust_only_action_stub(",
"pub(super) fn admin_provider_ops_parse_rfc3339_unix_secs(",
] {
assert!(
actions_support.contains(pattern),
@@ -1298,29 +1321,34 @@ fn admin_provider_ops_actions_mod_stays_thin() {
"apps/aether-gateway/src/handlers/admin/provider/ops/providers/actions/query_balance/mod.rs",
);
for pattern in [
"mod parsers;",
"mod sub2api;",
"mod yescode;",
"pub(super) async fn admin_provider_ops_run_query_balance_action(",
"parsers::admin_provider_ops_new_api_balance_payload(",
"parse_query_balance_payload(",
"yescode::admin_provider_ops_yescode_balance_payload(",
"sub2api::admin_provider_ops_sub2api_balance_payload(",
] {
assert!(
actions_query_balance_mod.contains(pattern),
"handlers/admin/provider/ops/providers/actions/query_balance/mod.rs should keep thin query_balance entry seam {pattern}"
);
}
let actions_query_balance_parsers = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/provider/ops/providers/actions/query_balance/parsers.rs",
assert!(
!workspace_file_exists(
"apps/aether-gateway/src/handlers/admin/provider/ops/providers/actions/query_balance/parsers.rs"
),
"handlers/admin/provider/ops/providers/actions/query_balance/parsers.rs should be removed after moving balance parsing into aether-admin"
);
let pure_actions = read_workspace_file("crates/aether-admin/src/provider/ops/actions.rs");
for pattern in [
"pub(super) fn admin_provider_ops_new_api_balance_payload(",
"pub(super) fn admin_provider_ops_cubence_balance_payload(",
"pub(super) fn admin_provider_ops_nekocode_balance_payload(",
"pub(super) fn admin_provider_ops_attach_balance_checkin_outcome(",
"pub fn parse_query_balance_payload(",
"pub fn parse_sub2api_balance_payload(",
"pub fn parse_yescode_combined_balance_payload(",
"pub fn attach_balance_checkin_outcome(",
] {
assert!(
actions_query_balance_parsers.contains(pattern),
"handlers/admin/provider/ops/providers/actions/query_balance/parsers.rs should own {pattern}"
pure_actions.contains(pattern),
"crates/aether-admin/src/provider/ops/actions.rs should own {pattern}"
);
}
let actions_query_balance_yescode = read_workspace_file(
@@ -1339,6 +1367,84 @@ fn admin_provider_ops_actions_mod_stays_thin() {
);
}
#[test]
fn admin_provider_ops_verify_runtime_and_pure_owners_stay_explicit() {
let verify_mod = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/provider/ops/providers/verify/mod.rs",
);
for pattern in [
"mod proxy;",
"mod request;",
"mod sub2api;",
"pub(super) async fn admin_provider_ops_local_verify_response(",
] {
assert!(
verify_mod.contains(pattern),
"handlers/admin/provider/ops/providers/verify/mod.rs should keep runtime verify entry seam {pattern}"
);
}
let verify_proxy = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/provider/ops/providers/verify/proxy.rs",
);
for pattern in [
"struct AdminProviderOpsAnyrouterChallenge",
"fn admin_provider_ops_anyrouter_acw_cookie(",
"fn admin_provider_ops_resolve_proxy_snapshot(",
] {
assert!(
verify_proxy.contains(pattern),
"handlers/admin/provider/ops/providers/verify/proxy.rs should own {pattern}"
);
}
let verify_request = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/provider/ops/providers/verify/request.rs",
);
for pattern in [
"fn admin_provider_ops_execute_get_json(",
"fn admin_provider_ops_execute_proxy_json_request(",
"fn admin_provider_ops_verify_execution_error_message(",
] {
assert!(
verify_request.contains(pattern),
"handlers/admin/provider/ops/providers/verify/request.rs should own {pattern}"
);
}
let verify_sub2api = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/provider/ops/providers/verify/sub2api.rs",
);
for pattern in [
"fn admin_provider_ops_local_sub2api_verify_response(",
"fn admin_provider_ops_sub2api_exchange_token(",
] {
assert!(
verify_sub2api.contains(pattern),
"handlers/admin/provider/ops/providers/verify/sub2api.rs should own {pattern}"
);
}
for path in [
"apps/aether-gateway/src/handlers/admin/provider/ops/providers/verify/helpers.rs",
"apps/aether-gateway/src/handlers/admin/provider/ops/providers/verify/headers.rs",
"apps/aether-gateway/src/handlers/admin/provider/ops/providers/verify/payload.rs",
] {
assert!(
!workspace_file_exists(path),
"{path} should be removed after splitting verify runtime owners"
);
}
let pure_verify = read_workspace_file("crates/aether-admin/src/provider/ops/verify.rs");
for pattern in ["pub fn build_headers(", "pub fn parse_verify_payload("] {
assert!(
pure_verify.contains(pattern),
"crates/aether-admin/src/provider/ops/verify.rs should own {pattern}"
);
}
}
#[test]
fn admin_provider_oauth_dispatch_uses_helper_owner() {
let dispatch_mod = read_workspace_file(

File diff suppressed because it is too large Load Diff