use axum::{ Router, extract::DefaultBodyLimit, middleware, routing::{get, post}, }; use crate::{ auth::{require_bearer_auth, require_runtime_principal_auth}, state::AppState, wooden_fish::{ checkpoint_wooden_fish_run, create_wooden_fish_session, execute_wooden_fish_action, finish_wooden_fish_run, get_wooden_fish_gallery_detail, get_wooden_fish_runtime_work, get_wooden_fish_session, list_wooden_fish_gallery, list_wooden_fish_works, publish_wooden_fish_work, start_wooden_fish_run, }, }; const WOODEN_FISH_CREATION_BODY_LIMIT_BYTES: usize = 32 * 1024 * 1024; pub fn router(state: AppState) -> Router { Router::new() .route( "/api/creation/wooden-fish/sessions", post(create_wooden_fish_session) // 中文注释:兼容旧小程序把参考图或录音 Data URL 放进创作 JSON 的请求;新前端音频会先直传 OSS。 .layer(DefaultBodyLimit::max(WOODEN_FISH_CREATION_BODY_LIMIT_BYTES)) .route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/creation/wooden-fish/sessions/{session_id}", get(get_wooden_fish_session).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/creation/wooden-fish/sessions/{session_id}/actions", post(execute_wooden_fish_action) // 中文注释:compile/regenerate 会携带参考图旧兼容输入,避免 Axum 默认 2MB 先于 handler 拦截。 .layer(DefaultBodyLimit::max(WOODEN_FISH_CREATION_BODY_LIMIT_BYTES)) .route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/creation/wooden-fish/works", get(list_wooden_fish_works).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/creation/wooden-fish/works/{profile_id}/publish", post(publish_wooden_fish_work).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/runtime/wooden-fish/works/{profile_id}", get(get_wooden_fish_runtime_work), ) .route( "/api/runtime/wooden-fish/runs", post(start_wooden_fish_run).route_layer(middleware::from_fn_with_state( state.clone(), require_runtime_principal_auth, )), ) .route( "/api/runtime/wooden-fish/runs/{run_id}/checkpoint", post(checkpoint_wooden_fish_run).route_layer(middleware::from_fn_with_state( state.clone(), require_runtime_principal_auth, )), ) .route( "/api/runtime/wooden-fish/runs/{run_id}/finish", post(finish_wooden_fish_run).route_layer(middleware::from_fn_with_state( state.clone(), require_runtime_principal_auth, )), ) .route( "/api/runtime/wooden-fish/gallery", get(list_wooden_fish_gallery), ) .route( "/api/runtime/wooden-fish/gallery/{public_work_code}", get(get_wooden_fish_gallery_detail), ) }