155 lines
5.6 KiB
Rust
155 lines
5.6 KiB
Rust
use axum::{
|
|
Router,
|
|
extract::DefaultBodyLimit,
|
|
middleware,
|
|
routing::{get, post},
|
|
};
|
|
|
|
use crate::{
|
|
auth::require_bearer_auth,
|
|
creative_agent::{
|
|
cancel_creative_agent_session, confirm_creative_puzzle_template,
|
|
create_creative_agent_session, get_creative_agent_session, stream_creative_agent_message,
|
|
stream_creative_draft_edit,
|
|
},
|
|
state::AppState,
|
|
story_battles::{
|
|
create_story_battle, create_story_npc_battle, get_story_battle_state, resolve_story_battle,
|
|
},
|
|
story_sessions::{
|
|
begin_story_runtime_session, begin_story_session, continue_story,
|
|
get_story_runtime_projection, get_story_session_state, resolve_story_runtime_action,
|
|
},
|
|
};
|
|
|
|
const PUZZLE_REFERENCE_IMAGE_BODY_LIMIT_BYTES: usize = 12 * 1024 * 1024;
|
|
|
|
pub fn router(state: AppState) -> Router<AppState> {
|
|
Router::new()
|
|
.route(
|
|
"/api/story/sessions",
|
|
post(begin_story_session).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/story/sessions/runtime",
|
|
post(begin_story_runtime_session).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/story/sessions/{story_session_id}/state",
|
|
get(get_story_session_state).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/story/sessions/{story_session_id}/runtime-projection",
|
|
get(get_story_runtime_projection).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/story/sessions/{story_session_id}/actions/resolve",
|
|
post(resolve_story_runtime_action).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/story/sessions/continue",
|
|
post(continue_story).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/story/battles",
|
|
post(create_story_battle).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/story/battles/{battle_state_id}",
|
|
get(get_story_battle_state).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/story/npc/battle",
|
|
post(create_story_npc_battle).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/story/battles/resolve",
|
|
post(resolve_story_battle).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/runtime/creative-agent/sessions",
|
|
post(create_creative_agent_session)
|
|
// 中文注释:创意 Agent 首轮允许携带参考图 URL/Data URL,沿用拼图参考图入口上限。
|
|
.layer(DefaultBodyLimit::max(
|
|
PUZZLE_REFERENCE_IMAGE_BODY_LIMIT_BYTES,
|
|
))
|
|
.route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/runtime/creative-agent/sessions/{session_id}",
|
|
get(get_creative_agent_session).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/runtime/creative-agent/sessions/{session_id}/messages/stream",
|
|
post(stream_creative_agent_message)
|
|
// 中文注释:message stream 同样可能带图片素材,避免默认 JSON limit 过早拒绝。
|
|
.layer(DefaultBodyLimit::max(
|
|
PUZZLE_REFERENCE_IMAGE_BODY_LIMIT_BYTES,
|
|
))
|
|
.route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/runtime/creative-agent/sessions/{session_id}/confirm-template",
|
|
post(confirm_creative_puzzle_template).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/runtime/creative-agent/sessions/{session_id}/draft-edits/stream",
|
|
post(stream_creative_draft_edit)
|
|
// 中文注释:草稿编辑会携带当前 puzzle draft JSON,保持和拼图草稿入口一致的 body 上限。
|
|
.layer(DefaultBodyLimit::max(
|
|
PUZZLE_REFERENCE_IMAGE_BODY_LIMIT_BYTES,
|
|
))
|
|
.route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/runtime/creative-agent/sessions/{session_id}/cancel",
|
|
post(cancel_creative_agent_session)
|
|
.route_layer(middleware::from_fn_with_state(state, require_bearer_auth)),
|
|
)
|
|
}
|