refactor: 拆分 gateway 单体为独立 crate,新增 systemd 部署方案

将 gateway 内部的 model-fetch、provider-transport、scheduler-core、
usage-runtime、video-tasks-core 模块提取为独立 crate;重构 gateway
内部模块结构(state/router/cache/data/query 等);移除大量遗留模块
文件;新增 systemd 二进制部署骨架及相关文档;更新前端 usage 相关
API 和组件。
This commit is contained in:
fawney19
2026-04-05 20:23:16 +08:00
parent cbc811f6ce
commit 763ff03a7b
777 changed files with 42654 additions and 21464 deletions
+179
View File
@@ -0,0 +1,179 @@
use super::{AppState, GatewayError};
use crate::{async_task, video_tasks};
impl AppState {
pub(crate) async fn read_data_backed_video_task_response(
&self,
route_family: Option<&str>,
request_path: &str,
) -> Result<Option<video_tasks::LocalVideoTaskReadResponse>, GatewayError> {
self.data
.read_video_task_response(route_family, request_path)
.await
.map_err(|err| GatewayError::Internal(err.to_string()))
}
pub(crate) async fn find_video_task_by_id(
&self,
task_id: &str,
) -> Result<Option<aether_data::repository::video_tasks::StoredVideoTask>, GatewayError> {
self.data
.find_video_task(aether_data::repository::video_tasks::VideoTaskLookupKey::Id(task_id))
.await
.map_err(|err| GatewayError::Internal(err.to_string()))
}
pub(crate) async fn find_video_task_by_short_id(
&self,
short_id: &str,
) -> Result<Option<aether_data::repository::video_tasks::StoredVideoTask>, GatewayError> {
self.data
.find_video_task(
aether_data::repository::video_tasks::VideoTaskLookupKey::ShortId(short_id),
)
.await
.map_err(|err| GatewayError::Internal(err.to_string()))
}
pub(crate) async fn upsert_video_task_snapshot(
&self,
snapshot: &video_tasks::LocalVideoTaskSnapshot,
) -> Result<Option<aether_data::repository::video_tasks::StoredVideoTask>, GatewayError> {
self.data
.upsert_video_task(snapshot.to_upsert_record())
.await
.map_err(|err| GatewayError::Internal(err.to_string()))
}
pub(crate) async fn hydrate_video_task_for_route(
&self,
route_family: Option<&str>,
request_path: &str,
) -> Result<bool, GatewayError> {
let lookup =
video_tasks::resolve_video_task_hydration_lookup_key(route_family, request_path);
let Some(lookup) = lookup else {
return Ok(false);
};
let Some(task) = self
.data
.find_video_task(lookup)
.await
.map_err(|err| GatewayError::Internal(err.to_string()))?
else {
return Ok(false);
};
if self.video_tasks.hydrate_from_stored_task(&task) {
return Ok(true);
}
let Some(snapshot) = self.reconstruct_video_task_snapshot(&task).await? else {
return Ok(false);
};
self.video_tasks.record_snapshot(snapshot);
Ok(true)
}
pub(crate) async fn reconstruct_video_task_snapshot(
&self,
task: &aether_data::repository::video_tasks::StoredVideoTask,
) -> Result<Option<video_tasks::LocalVideoTaskSnapshot>, GatewayError> {
crate::provider_transport::reconstruct_local_video_task_snapshot(self, task)
.await
.map_err(GatewayError::Internal)
}
pub(crate) async fn claim_due_video_tasks(
&self,
now_unix_secs: u64,
claim_until_unix_secs: u64,
limit: usize,
) -> Result<Vec<aether_data::repository::video_tasks::StoredVideoTask>, GatewayError> {
self.data
.claim_due_video_tasks(now_unix_secs, claim_until_unix_secs, limit)
.await
.map_err(|err| GatewayError::Internal(err.to_string()))
}
pub(crate) async fn update_active_video_task(
&self,
task: aether_data::repository::video_tasks::UpsertVideoTask,
) -> Result<Option<aether_data::repository::video_tasks::StoredVideoTask>, GatewayError> {
self.data
.update_active_video_task(task)
.await
.map_err(|err| GatewayError::Internal(err.to_string()))
}
pub(crate) async fn list_video_task_page(
&self,
filter: &aether_data::repository::video_tasks::VideoTaskQueryFilter,
offset: usize,
limit: usize,
) -> Result<Vec<aether_data::repository::video_tasks::StoredVideoTask>, GatewayError> {
self.data
.list_video_task_page(filter, offset, limit)
.await
.map_err(|err| GatewayError::Internal(err.to_string()))
}
pub(crate) async fn count_video_tasks(
&self,
filter: &aether_data::repository::video_tasks::VideoTaskQueryFilter,
) -> Result<u64, GatewayError> {
self.data
.count_video_tasks(filter)
.await
.map_err(|err| GatewayError::Internal(err.to_string()))
}
pub(crate) async fn count_video_tasks_by_status(
&self,
filter: &aether_data::repository::video_tasks::VideoTaskQueryFilter,
) -> Result<Vec<aether_data::repository::video_tasks::VideoTaskStatusCount>, GatewayError> {
self.data
.count_video_tasks_by_status(filter)
.await
.map_err(|err| GatewayError::Internal(err.to_string()))
}
pub(crate) async fn count_distinct_video_task_users(
&self,
filter: &aether_data::repository::video_tasks::VideoTaskQueryFilter,
) -> Result<u64, GatewayError> {
self.data
.count_distinct_video_task_users(filter)
.await
.map_err(|err| GatewayError::Internal(err.to_string()))
}
pub(crate) async fn top_video_task_models(
&self,
filter: &aether_data::repository::video_tasks::VideoTaskQueryFilter,
limit: usize,
) -> Result<Vec<aether_data::repository::video_tasks::VideoTaskModelCount>, GatewayError> {
self.data
.top_video_task_models(filter, limit)
.await
.map_err(|err| GatewayError::Internal(err.to_string()))
}
pub(crate) async fn count_video_tasks_created_since(
&self,
filter: &aether_data::repository::video_tasks::VideoTaskQueryFilter,
created_since_unix_secs: u64,
) -> Result<u64, GatewayError> {
self.data
.count_video_tasks_created_since(filter, created_since_unix_secs)
.await
.map_err(|err| GatewayError::Internal(err.to_string()))
}
pub(crate) async fn execute_video_task_refresh_plan(
&self,
refresh_plan: &video_tasks::LocalVideoTaskReadRefreshPlan,
) -> Result<bool, GatewayError> {
async_task::execute_video_task_refresh_plan(self, refresh_plan).await
}
}