Files
Genarrative/server-rs/crates/api-server/src/modules/external_api.rs
T
kdletters d8dd2f1857 补齐外部OpenAPI编辑器素材能力
移除外部OpenAPI中的API Key管理接口暴露
补齐编辑器项目列表、最近项目、重命名和删除外部接口
补齐素材直传凭证、素材对象确认和签名读取外部接口
复用站内编辑器生成、素材库和项目资源链路并按API Key账号归属
更新外部OpenAPI、后端契约和项目共享记忆文档
2026-06-21 13:40:09 +08:00

221 lines
8.6 KiB
Rust

use axum::{
Router,
extract::DefaultBodyLimit,
middleware,
routing::{get, patch, post},
};
use crate::{
external_api_auth::require_external_api_key,
external_assets_api::{
confirm_external_asset_object, create_external_direct_upload_ticket,
get_external_asset_read_url,
},
external_editor_api::{
create_external_editor_asset, create_external_editor_asset_folder,
create_external_editor_project, create_external_editor_project_resource,
delete_external_editor_asset, delete_external_editor_asset_folder,
delete_external_editor_project, edit_external_editor_image,
extract_external_editor_ui_design_assets, generate_external_editor_background_music,
generate_external_editor_character_animation, generate_external_editor_icon_spritesheet,
generate_external_editor_image, generate_external_editor_sound_effect,
generate_external_editor_video, get_external_editor_asset_library,
get_external_editor_project, list_external_editor_projects,
load_recent_external_editor_project, openapi_json, rename_external_editor_project,
save_external_editor_canvas, update_external_editor_asset,
update_external_editor_asset_folder,
},
state::AppState,
};
const EXTERNAL_EDITOR_IMAGE_REFERENCE_BODY_LIMIT_BYTES: usize = 12 * 1024 * 1024;
const EXTERNAL_EDITOR_VIDEO_BODY_LIMIT_BYTES: usize = 64 * 1024 * 1024;
pub fn router(state: AppState) -> Router<AppState> {
Router::new()
.route("/api/external/v1/openapi.json", get(openapi_json))
.route(
"/api/external/v1/assets/direct-upload-tickets",
post(create_external_direct_upload_ticket).route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/assets/objects/confirm",
post(confirm_external_asset_object).route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/assets/read-url",
get(get_external_asset_read_url).route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/projects",
get(list_external_editor_projects)
.post(create_external_editor_project)
.route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/projects/recent",
get(load_recent_external_editor_project).route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/projects/{project_id}",
get(get_external_editor_project)
.delete(delete_external_editor_project)
.route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/projects/{project_id}/metadata",
patch(rename_external_editor_project).route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/projects/{project_id}/canvas",
patch(save_external_editor_canvas).route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/projects/{project_id}/resources",
post(create_external_editor_project_resource).route_layer(
middleware::from_fn_with_state(state.clone(), require_external_api_key),
),
)
.route(
"/api/external/v1/editor/assets/library",
get(get_external_editor_asset_library).route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/assets/folders",
post(create_external_editor_asset_folder).route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/assets/folders/{folder_id}",
patch(update_external_editor_asset_folder)
.delete(delete_external_editor_asset_folder)
.route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/assets",
post(create_external_editor_asset).route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/assets/{asset_id}",
patch(update_external_editor_asset)
.delete(delete_external_editor_asset)
.route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/images/generations",
post(generate_external_editor_image)
.layer(DefaultBodyLimit::max(
EXTERNAL_EDITOR_IMAGE_REFERENCE_BODY_LIMIT_BYTES,
))
.route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/images/edits",
post(edit_external_editor_image)
.layer(DefaultBodyLimit::max(
EXTERNAL_EDITOR_IMAGE_REFERENCE_BODY_LIMIT_BYTES,
))
.route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/icon-spritesheets/generations",
post(generate_external_editor_icon_spritesheet)
.layer(DefaultBodyLimit::max(
EXTERNAL_EDITOR_IMAGE_REFERENCE_BODY_LIMIT_BYTES,
))
.route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/ui-designs/assets/extractions",
post(extract_external_editor_ui_design_assets)
.layer(DefaultBodyLimit::max(
EXTERNAL_EDITOR_IMAGE_REFERENCE_BODY_LIMIT_BYTES,
))
.route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/character-animations/generations",
post(generate_external_editor_character_animation)
.layer(DefaultBodyLimit::max(
EXTERNAL_EDITOR_IMAGE_REFERENCE_BODY_LIMIT_BYTES,
))
.route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/videos/generations",
post(generate_external_editor_video)
.layer(DefaultBodyLimit::max(
EXTERNAL_EDITOR_VIDEO_BODY_LIMIT_BYTES,
))
.route_layer(middleware::from_fn_with_state(
state.clone(),
require_external_api_key,
)),
)
.route(
"/api/external/v1/editor/audios/sound-effects/generations",
post(generate_external_editor_sound_effect).route_layer(
middleware::from_fn_with_state(state.clone(), require_external_api_key),
),
)
.route(
"/api/external/v1/editor/audios/background-music/generations",
post(generate_external_editor_background_music).route_layer(
middleware::from_fn_with_state(state, require_external_api_key),
),
)
}