b7c36074b9
将 API 与 SpacetimeDB 的画布布局校验上限统一提高到 2 MiB 为站内与外部画布保存接口增加 4 MiB 请求体上限 补充 2 MiB 边界通过和超限拒绝测试
230 lines
8.4 KiB
Rust
230 lines
8.4 KiB
Rust
use axum::{
|
|
Router,
|
|
extract::DefaultBodyLimit,
|
|
handler::Handler,
|
|
middleware,
|
|
routing::{get, patch, post},
|
|
};
|
|
|
|
use crate::{
|
|
auth::require_bearer_auth,
|
|
editor_agent::api::editor_agent_message,
|
|
editor_agent::{
|
|
cancel_editor_agent_tool_call, confirm_editor_agent_tool_call,
|
|
create_editor_agent_conversation, delete_editor_agent_conversation,
|
|
get_editor_agent_conversation, list_editor_agent_conversations,
|
|
},
|
|
editor_project::{
|
|
EDITOR_LAYOUT_REQUEST_BODY_MAX_BYTES, create_editor_asset, create_editor_asset_folder,
|
|
create_editor_project, create_editor_project_resource, delete_editor_asset,
|
|
delete_editor_asset_folder, delete_editor_project, edit_editor_image,
|
|
extract_editor_ui_design_assets, generate_editor_icon_spritesheet, generate_editor_image,
|
|
get_editor_asset_library, get_editor_generation_pricing, get_editor_project,
|
|
list_editor_projects, list_public_editor_project_resources, load_recent_editor_project,
|
|
remove_editor_image_background, rename_editor_project, save_editor_project_layout,
|
|
split_editor_icon_spritesheet, submit_editor_asset_showcase,
|
|
toggle_editor_showcase_asset_like, update_editor_asset, update_editor_asset_folder,
|
|
update_editor_project_resource_showcase,
|
|
},
|
|
state::AppState,
|
|
};
|
|
|
|
const EDITOR_AGENT_MESSAGE_BODY_LIMIT_BYTES: usize = 2 * 1024 * 1024;
|
|
|
|
pub fn router(state: AppState) -> Router<AppState> {
|
|
Router::new()
|
|
.route(
|
|
"/api/editor/generation-pricing",
|
|
get(get_editor_generation_pricing),
|
|
)
|
|
.route(
|
|
"/api/editor/showcase/resources",
|
|
get(list_public_editor_project_resources),
|
|
)
|
|
.route(
|
|
"/api/editor/projects/recent",
|
|
get(load_recent_editor_project).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/projects",
|
|
get(list_editor_projects)
|
|
.post(create_editor_project)
|
|
.route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/projects/{project_id}",
|
|
get(get_editor_project)
|
|
.patch(
|
|
save_editor_project_layout
|
|
.layer(DefaultBodyLimit::max(EDITOR_LAYOUT_REQUEST_BODY_MAX_BYTES)),
|
|
)
|
|
.delete(delete_editor_project)
|
|
.route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/projects/{project_id}/metadata",
|
|
patch(rename_editor_project).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/projects/{project_id}/resources",
|
|
post(create_editor_project_resource).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/projects/{project_id}/agent-conversations",
|
|
get(list_editor_agent_conversations)
|
|
.post(create_editor_agent_conversation)
|
|
.route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/agent-conversations/{conversation_id}",
|
|
get(get_editor_agent_conversation)
|
|
.delete(delete_editor_agent_conversation)
|
|
.route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/agent-conversations/{conversation_id}/messages",
|
|
post(editor_agent_message)
|
|
.layer(DefaultBodyLimit::max(EDITOR_AGENT_MESSAGE_BODY_LIMIT_BYTES))
|
|
.route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/agent-conversations/{conversation_id}/messages/{message_id}/confirm",
|
|
post(confirm_editor_agent_tool_call).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/agent-conversations/{conversation_id}/messages/{message_id}/cancel",
|
|
post(cancel_editor_agent_tool_call).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/project-resources/{resource_id}/showcase",
|
|
patch(update_editor_project_resource_showcase).route_layer(
|
|
middleware::from_fn_with_state(state.clone(), require_bearer_auth),
|
|
),
|
|
)
|
|
.route(
|
|
"/api/editor/assets/library",
|
|
get(get_editor_asset_library).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/assets/folders",
|
|
post(create_editor_asset_folder).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/assets/folders/{folder_id}",
|
|
patch(update_editor_asset_folder)
|
|
.delete(delete_editor_asset_folder)
|
|
.route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/assets",
|
|
post(create_editor_asset).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/assets/{asset_id}",
|
|
patch(update_editor_asset)
|
|
.delete(delete_editor_asset)
|
|
.route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/assets/{asset_id}/showcase-submissions",
|
|
post(submit_editor_asset_showcase).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/showcase/assets/{showcase_id}/likes",
|
|
post(toggle_editor_showcase_asset_like).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/images/generations",
|
|
post(generate_editor_image).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/images/edits",
|
|
post(edit_editor_image).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/images/background-removals",
|
|
post(remove_editor_image_background).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/icon-spritesheets/generations",
|
|
post(generate_editor_icon_spritesheet).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/icon-spritesheets/slices",
|
|
post(split_editor_icon_spritesheet).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
.route(
|
|
"/api/editor/ui-designs/assets/extractions",
|
|
post(extract_editor_ui_design_assets).route_layer(middleware::from_fn_with_state(
|
|
state.clone(),
|
|
require_bearer_auth,
|
|
)),
|
|
)
|
|
}
|