mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-03 01:40:21 +08:00
refactor: 大规模模块拆分与代码精简,新增 ai-pipeline/data-contracts 独立 crate
- 新增 aether-ai-pipeline 和 aether-data-contracts crate,将 pipeline 逻辑与数据契约从 gateway 中解耦 - 重构 admin handlers:拆分单体模块为 auth/billing/endpoint/features/model/observability/provider/system 等独立子模块 - 合并 chat/cli 重复代码路径:精简 conversion、finalize、planner 中的 sync/chat/cli 分支 - 重构 scheduler/executor/data 层,引入 facade 模式降低模块间耦合 - 移除冗余的 intent 模块,将 plan_fallback/policy/stream_path/sync_path 迁移至 executor - 前端适配:调整 admin API 调用和 provider 模型测试对话框
This commit is contained in:
@@ -5,7 +5,10 @@ use super::types::{
|
||||
normalize_proxy_metadata, ProxyNodeHeartbeatMutation, ProxyNodeReadRepository,
|
||||
ProxyNodeTunnelStatusMutation, ProxyNodeWriteRepository, StoredProxyNode, StoredProxyNodeEvent,
|
||||
};
|
||||
use crate::DataLayerError;
|
||||
use crate::{
|
||||
error::{postgres_error, SqlxResultExt},
|
||||
DataLayerError,
|
||||
};
|
||||
|
||||
const FIND_PROXY_NODE_SQL: &str = r#"
|
||||
SELECT
|
||||
@@ -142,49 +145,58 @@ impl SqlxProxyNodeRepository {
|
||||
|
||||
fn row_to_stored(row: &PgRow) -> Result<StoredProxyNode, DataLayerError> {
|
||||
Ok(StoredProxyNode::new(
|
||||
row.try_get("id")?,
|
||||
row.try_get("name")?,
|
||||
row.try_get("ip")?,
|
||||
row.try_get("port")?,
|
||||
row.try_get("is_manual")?,
|
||||
row.try_get("status")?,
|
||||
row.try_get("heartbeat_interval")?,
|
||||
row.try_get("active_connections")?,
|
||||
row.try_get("total_requests")?,
|
||||
row.try_get("failed_requests")?,
|
||||
row.try_get("dns_failures")?,
|
||||
row.try_get("stream_errors")?,
|
||||
row.try_get("tunnel_mode")?,
|
||||
row.try_get("tunnel_connected")?,
|
||||
row.try_get("config_version")?,
|
||||
row.try_get("id").map_postgres_err()?,
|
||||
row.try_get("name").map_postgres_err()?,
|
||||
row.try_get("ip").map_postgres_err()?,
|
||||
row.try_get("port").map_postgres_err()?,
|
||||
row.try_get("is_manual").map_postgres_err()?,
|
||||
row.try_get("status").map_postgres_err()?,
|
||||
row.try_get("heartbeat_interval").map_postgres_err()?,
|
||||
row.try_get("active_connections").map_postgres_err()?,
|
||||
row.try_get("total_requests").map_postgres_err()?,
|
||||
row.try_get("failed_requests").map_postgres_err()?,
|
||||
row.try_get("dns_failures").map_postgres_err()?,
|
||||
row.try_get("stream_errors").map_postgres_err()?,
|
||||
row.try_get("tunnel_mode").map_postgres_err()?,
|
||||
row.try_get("tunnel_connected").map_postgres_err()?,
|
||||
row.try_get("config_version").map_postgres_err()?,
|
||||
)?
|
||||
.with_manual_proxy_fields(
|
||||
row.try_get("proxy_url")?,
|
||||
row.try_get("proxy_username")?,
|
||||
row.try_get("proxy_password")?,
|
||||
row.try_get("proxy_url").map_postgres_err()?,
|
||||
row.try_get("proxy_username").map_postgres_err()?,
|
||||
row.try_get("proxy_password").map_postgres_err()?,
|
||||
)
|
||||
.with_runtime_fields(
|
||||
row.try_get("region")?,
|
||||
row.try_get("registered_by")?,
|
||||
Self::optional_unix_secs(row.try_get("last_heartbeat_at_unix_secs")?),
|
||||
row.try_get("avg_latency_ms")?,
|
||||
row.try_get("proxy_metadata")?,
|
||||
row.try_get("hardware_info")?,
|
||||
row.try_get("estimated_max_concurrency")?,
|
||||
Self::optional_unix_secs(row.try_get("tunnel_connected_at_unix_secs")?),
|
||||
row.try_get("remote_config")?,
|
||||
Self::optional_unix_secs(row.try_get("created_at_unix_secs")?),
|
||||
Self::optional_unix_secs(row.try_get("updated_at_unix_secs")?),
|
||||
row.try_get("region").map_postgres_err()?,
|
||||
row.try_get("registered_by").map_postgres_err()?,
|
||||
Self::optional_unix_secs(
|
||||
row.try_get("last_heartbeat_at_unix_secs")
|
||||
.map_postgres_err()?,
|
||||
),
|
||||
row.try_get("avg_latency_ms").map_postgres_err()?,
|
||||
row.try_get("proxy_metadata").map_postgres_err()?,
|
||||
row.try_get("hardware_info").map_postgres_err()?,
|
||||
row.try_get("estimated_max_concurrency")
|
||||
.map_postgres_err()?,
|
||||
Self::optional_unix_secs(
|
||||
row.try_get("tunnel_connected_at_unix_secs")
|
||||
.map_postgres_err()?,
|
||||
),
|
||||
row.try_get("remote_config").map_postgres_err()?,
|
||||
Self::optional_unix_secs(row.try_get("created_at_unix_secs").map_postgres_err()?),
|
||||
Self::optional_unix_secs(row.try_get("updated_at_unix_secs").map_postgres_err()?),
|
||||
))
|
||||
}
|
||||
|
||||
fn row_to_event(row: &PgRow) -> Result<StoredProxyNodeEvent, DataLayerError> {
|
||||
Ok(StoredProxyNodeEvent {
|
||||
id: row.try_get("id")?,
|
||||
node_id: row.try_get("node_id")?,
|
||||
event_type: row.try_get("event_type")?,
|
||||
detail: row.try_get("detail")?,
|
||||
created_at_unix_secs: Self::optional_unix_secs(row.try_get("created_at_unix_secs")?),
|
||||
id: row.try_get("id").map_postgres_err()?,
|
||||
node_id: row.try_get("node_id").map_postgres_err()?,
|
||||
event_type: row.try_get("event_type").map_postgres_err()?,
|
||||
detail: row.try_get("detail").map_postgres_err()?,
|
||||
created_at_unix_secs: Self::optional_unix_secs(
|
||||
row.try_get("created_at_unix_secs").map_postgres_err()?,
|
||||
),
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -194,7 +206,8 @@ impl ProxyNodeReadRepository for SqlxProxyNodeRepository {
|
||||
async fn list_proxy_nodes(&self) -> Result<Vec<StoredProxyNode>, DataLayerError> {
|
||||
let rows = sqlx::query(LIST_PROXY_NODES_SQL)
|
||||
.fetch_all(&self.pool)
|
||||
.await?;
|
||||
.await
|
||||
.map_postgres_err()?;
|
||||
rows.iter().map(Self::row_to_stored).collect()
|
||||
}
|
||||
|
||||
@@ -205,7 +218,8 @@ impl ProxyNodeReadRepository for SqlxProxyNodeRepository {
|
||||
let row = sqlx::query(FIND_PROXY_NODE_SQL)
|
||||
.bind(node_id)
|
||||
.fetch_optional(&self.pool)
|
||||
.await?;
|
||||
.await
|
||||
.map_postgres_err()?;
|
||||
row.map(|row| Self::row_to_stored(&row)).transpose()
|
||||
}
|
||||
|
||||
@@ -218,7 +232,8 @@ impl ProxyNodeReadRepository for SqlxProxyNodeRepository {
|
||||
.bind(node_id)
|
||||
.bind(i64::try_from(limit).unwrap_or(i64::MAX))
|
||||
.fetch_all(&self.pool)
|
||||
.await?;
|
||||
.await
|
||||
.map_postgres_err()?;
|
||||
rows.iter().map(Self::row_to_event).collect()
|
||||
}
|
||||
}
|
||||
@@ -256,7 +271,8 @@ impl ProxyNodeWriteRepository for SqlxProxyNodeRepository {
|
||||
.bind(mutation.dns_failures_delta)
|
||||
.bind(mutation.stream_errors_delta)
|
||||
.execute(&self.pool)
|
||||
.await?;
|
||||
.await
|
||||
.map_postgres_err()?;
|
||||
|
||||
self.find_proxy_node(&mutation.node_id).await
|
||||
}
|
||||
@@ -283,7 +299,7 @@ impl ProxyNodeWriteRepository for SqlxProxyNodeRepository {
|
||||
)
|
||||
});
|
||||
|
||||
let mut tx = self.pool.begin().await?;
|
||||
let mut tx = self.pool.begin().await.map_postgres_err()?;
|
||||
|
||||
if existing
|
||||
.tunnel_connected_at_unix_secs
|
||||
@@ -305,8 +321,9 @@ VALUES (
|
||||
.bind(event_type)
|
||||
.bind(format!("[stale_ignored] {event_detail}"))
|
||||
.execute(&mut *tx)
|
||||
.await?;
|
||||
tx.commit().await?;
|
||||
.await
|
||||
.map_postgres_err()?;
|
||||
tx.commit().await.map_err(postgres_error)?;
|
||||
return self.find_proxy_node(&mutation.node_id).await;
|
||||
}
|
||||
|
||||
@@ -334,7 +351,8 @@ WHERE id = $1
|
||||
.bind(mutation.connected)
|
||||
.bind(observed_at_unix_secs.map(|value| value as f64))
|
||||
.execute(&mut *tx)
|
||||
.await?;
|
||||
.await
|
||||
.map_postgres_err()?;
|
||||
|
||||
sqlx::query(
|
||||
r#"
|
||||
@@ -355,9 +373,10 @@ VALUES (
|
||||
.bind(event_detail)
|
||||
.bind(observed_at_unix_secs.map(|value| value as f64))
|
||||
.execute(&mut *tx)
|
||||
.await?;
|
||||
.await
|
||||
.map_postgres_err()?;
|
||||
|
||||
tx.commit().await?;
|
||||
tx.commit().await.map_err(postgres_error)?;
|
||||
self.find_proxy_node(&mutation.node_id).await
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user