Files
Genarrative/server-rs/crates/api-server/src/external_assets_api.rs
T
lhk229 8b4c3792c7
Project CI / Repository checks (push) Successful in 2m43s
Project CI / Frontend tests (push) Successful in 3m26s
Project CI / Backend tests (push) Successful in 6m23s
Project CI / Native shell tests (push) Successful in 20m45s
主站对AGC请求头做特殊处理和记录 (#246)
Co-authored-by: 段舒康 <kdletters@qq.com>
Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/246
Co-authored-by: Linghong <ink29535@proton.me>
Co-committed-by: Linghong <ink29535@proton.me>
2026-09-03 15:33:26 +08:00

94 lines
2.9 KiB
Rust

use axum::{
Json,
extract::{Extension, Query, State},
http::StatusCode,
};
use serde_json::{Value, json};
use shared_contracts::assets::{
ConfirmAssetObjectRequest, CreateDirectUploadTicketRequest, GetReadUrlQuery,
};
use crate::{
assets::{
AssetReadAuthorization, confirm_asset_object_for_owner,
create_direct_upload_ticket_for_owner, get_asset_read_url_with_query,
},
external_api_auth::ExternalApiPrincipal,
http_error::AppError,
request_context::RequestContext,
state::AppState,
tracking::TrackingClientMarker,
};
const SCOPE_EDITOR_ASSET: &str = "editor:asset";
const EXTERNAL_ASSET_PROVIDER: &str = "external-assets-api";
pub async fn create_external_direct_upload_ticket(
State(state): State<AppState>,
Extension(request_context): Extension<RequestContext>,
Extension(principal): Extension<ExternalApiPrincipal>,
client_marker: Option<Extension<TrackingClientMarker>>,
Json(payload): Json<CreateDirectUploadTicketRequest>,
) -> Result<Json<Value>, AppError> {
require_scope(&principal, SCOPE_EDITOR_ASSET)?;
create_direct_upload_ticket_for_owner(
&state,
&request_context,
principal.owner_user_id(),
None,
client_marker.map(|Extension(marker)| marker),
payload,
)
.await
}
pub async fn confirm_external_asset_object(
State(state): State<AppState>,
Extension(request_context): Extension<RequestContext>,
Extension(principal): Extension<ExternalApiPrincipal>,
client_marker: Option<Extension<TrackingClientMarker>>,
Json(mut payload): Json<ConfirmAssetObjectRequest>,
) -> Result<Json<Value>, AppError> {
require_scope(&principal, SCOPE_EDITOR_ASSET)?;
payload.owner_user_id = Some(principal.owner_user_id().to_string());
confirm_asset_object_for_owner(
&state,
&request_context,
principal.owner_user_id(),
None,
client_marker.map(|Extension(marker)| marker),
payload,
)
.await
}
pub async fn get_external_asset_read_url(
State(state): State<AppState>,
Extension(request_context): Extension<RequestContext>,
Extension(principal): Extension<ExternalApiPrincipal>,
Query(query): Query<GetReadUrlQuery>,
) -> Result<Json<Value>, AppError> {
require_scope(&principal, SCOPE_EDITOR_ASSET)?;
get_asset_read_url_with_query(
&state,
&request_context,
query,
AssetReadAuthorization::Owner(principal.owner_user_id().to_string()),
)
.await
}
fn require_scope(principal: &ExternalApiPrincipal, scope: &str) -> Result<(), AppError> {
if principal.has_scope(scope) {
return Ok(());
}
Err(
AppError::from_status(StatusCode::FORBIDDEN).with_details(json!({
"provider": EXTERNAL_ASSET_PROVIDER,
"keyId": principal.key_id(),
"scope": scope,
"message": "API Key 缺少所需权限",
})),
)
}