refactor(api-server): narrow puzzle state surface

This commit is contained in:
kdletters
2026-05-21 18:55:25 +08:00
parent cc23b6020d
commit 5834a99107
31 changed files with 1087 additions and 169 deletions

View File

@@ -1,7 +1,7 @@
use super::*;
pub async fn create_puzzle_agent_session(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
payload: Result<Json<CreatePuzzleAgentSessionRequest>, JsonRejection>,
@@ -46,7 +46,7 @@ pub async fn create_puzzle_agent_session(
}
pub async fn generate_puzzle_onboarding_work(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
Extension(request_context): Extension<RequestContext>,
payload: Result<Json<PuzzleOnboardingGenerateRequest>, JsonRejection>,
) -> Result<Json<Value>, Response> {
@@ -161,7 +161,7 @@ pub async fn generate_puzzle_onboarding_work(
}
pub async fn save_puzzle_onboarding_work(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
payload: Result<Json<PuzzleOnboardingSaveRequest>, JsonRejection>,
@@ -270,7 +270,7 @@ pub async fn save_puzzle_onboarding_work(
}
pub async fn get_puzzle_agent_session(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(session_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -303,7 +303,7 @@ pub async fn get_puzzle_agent_session(
}
pub async fn submit_puzzle_agent_message(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(session_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -359,7 +359,7 @@ pub async fn submit_puzzle_agent_message(
llm_client: state.llm_client(),
session: &submitted_session,
quick_fill_requested: payload.quick_fill_requested.unwrap_or(false),
enable_web_search: state.config.creation_agent_llm_web_search_enabled,
enable_web_search: state.creation_agent_llm_web_search_enabled(),
},
|_| {},
)
@@ -401,7 +401,7 @@ pub async fn submit_puzzle_agent_message(
}
pub async fn stream_puzzle_agent_message(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(session_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -464,7 +464,7 @@ pub async fn stream_puzzle_agent_message(
llm_client: state.llm_client(),
session: &session,
quick_fill_requested,
enable_web_search: state.config.creation_agent_llm_web_search_enabled,
enable_web_search: state.creation_agent_llm_web_search_enabled(),
},
move |text| {
let _ = reply_tx.send(text.to_string());
@@ -554,7 +554,7 @@ pub async fn stream_puzzle_agent_message(
}
pub async fn execute_puzzle_agent_action(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(session_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -595,6 +595,8 @@ pub async fn execute_puzzle_agent_action(
has_reference_image = has_puzzle_reference_images(
payload.reference_image_src.as_deref(),
payload.reference_image_srcs.as_slice(),
payload.reference_image_asset_object_id.as_deref(),
payload.reference_image_asset_object_ids.as_slice(),
),
"拼图 Agent action 开始执行"
);
@@ -604,6 +606,8 @@ pub async fn execute_puzzle_agent_action(
let reference_image_sources = collect_puzzle_reference_image_sources(
payload.reference_image_src.as_deref(),
payload.reference_image_srcs.as_slice(),
payload.reference_image_asset_object_id.as_deref(),
payload.reference_image_asset_object_ids.as_slice(),
);
let primary_reference_image_src = reference_image_sources.first().map(String::as_str);
let prompt_text = payload
@@ -627,7 +631,7 @@ pub async fn execute_puzzle_agent_action(
};
let session = if ai_redraw {
execute_billable_asset_operation_with_cost(
&state,
state.root_state(),
&owner_user_id,
"puzzle_initial_image",
&billing_asset_id,
@@ -652,7 +656,7 @@ pub async fn execute_puzzle_agent_action(
compile_session_id.clone(),
owner_user_id.clone(),
prompt_text,
payload.reference_image_src.as_deref(),
primary_reference_image_src,
now,
)
.await
@@ -737,7 +741,7 @@ pub async fn execute_puzzle_agent_action(
}))
});
let session = execute_billable_asset_operation_with_cost(
&state,
state.root_state(),
&owner_user_id,
"puzzle_generated_image",
&billing_asset_id,
@@ -787,6 +791,8 @@ pub async fn execute_puzzle_agent_action(
let reference_image_sources = collect_puzzle_reference_image_sources(
payload.reference_image_src.as_deref(),
payload.reference_image_srcs.as_slice(),
payload.reference_image_asset_object_id.as_deref(),
payload.reference_image_asset_object_ids.as_slice(),
);
let primary_reference_image_src =
reference_image_sources.first().map(String::as_str);
@@ -942,7 +948,7 @@ pub async fn execute_puzzle_agent_action(
}))
});
let session = execute_billable_asset_operation_with_cost(
&state,
state.root_state(),
&owner_user_id,
"puzzle_ui_background_image",
&billing_asset_id,
@@ -1147,7 +1153,7 @@ pub async fn execute_puzzle_agent_action(
let (work_id, profile_id) = build_stable_puzzle_work_ids(&session_id);
let author_display_name = resolve_author_display_name(&state, &authenticated);
let profile = execute_billable_asset_operation(
&state,
state.root_state(),
&owner_user_id,
"puzzle_publish_work",
&work_id,
@@ -1235,7 +1241,7 @@ pub async fn execute_puzzle_agent_action(
}
pub async fn get_puzzle_works(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
) -> Result<Json<Value>, Response> {
@@ -1263,7 +1269,7 @@ pub async fn get_puzzle_works(
}
pub async fn get_puzzle_work_detail(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(profile_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(_authenticated): Extension<AuthenticatedAccessToken>,
@@ -1296,7 +1302,7 @@ pub async fn get_puzzle_work_detail(
}
pub async fn put_puzzle_work(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(profile_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -1355,7 +1361,7 @@ pub async fn put_puzzle_work(
}
pub async fn delete_puzzle_work(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(profile_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -1391,7 +1397,7 @@ pub async fn delete_puzzle_work(
}
pub async fn claim_puzzle_work_point_incentive(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(profile_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -1428,7 +1434,7 @@ pub async fn claim_puzzle_work_point_incentive(
}
pub async fn list_puzzle_gallery(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
Extension(request_context): Extension<RequestContext>,
) -> Result<Response, Response> {
if let Some(response) = state.puzzle_gallery_cache().read_fresh_response().await {
@@ -1487,7 +1493,7 @@ pub async fn list_puzzle_gallery(
}
pub async fn get_puzzle_gallery_detail(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(profile_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
) -> Result<Json<Value>, Response> {
@@ -1519,7 +1525,7 @@ pub async fn get_puzzle_gallery_detail(
}
pub async fn record_puzzle_gallery_like(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(profile_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -1556,7 +1562,7 @@ pub async fn record_puzzle_gallery_like(
}
pub async fn remix_puzzle_gallery_work(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(profile_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -1599,7 +1605,7 @@ pub async fn remix_puzzle_gallery_work(
}
pub async fn start_puzzle_run(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
payload: Result<Json<StartPuzzleRunRequest>, JsonRejection>,
@@ -1639,7 +1645,7 @@ pub async fn start_puzzle_run(
)
})?;
record_work_play_start_after_success(
record_puzzle_work_play_start_after_success(
&state,
&request_context,
WorkPlayTrackingDraft::new(
@@ -1665,7 +1671,7 @@ pub async fn start_puzzle_run(
}
pub async fn get_puzzle_run(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(run_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -1693,7 +1699,7 @@ pub async fn get_puzzle_run(
}
pub async fn swap_puzzle_pieces(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(run_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -1750,7 +1756,7 @@ pub async fn swap_puzzle_pieces(
}
pub async fn drag_puzzle_piece_or_group(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(run_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -1802,7 +1808,7 @@ pub async fn drag_puzzle_piece_or_group(
}
pub async fn advance_puzzle_next_level(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(run_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -1854,7 +1860,7 @@ pub async fn advance_puzzle_next_level(
}
pub async fn update_puzzle_run_pause(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(run_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -1898,7 +1904,7 @@ pub async fn update_puzzle_run_pause(
}
pub async fn use_puzzle_runtime_prop(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(run_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,
@@ -1944,7 +1950,7 @@ pub async fn use_puzzle_runtime_prop(
let fallback_run_id = run_id.clone();
let fallback_owner_user_id = owner_user_id.clone();
let run_result = execute_billable_asset_operation(
&state,
state.root_state(),
&owner_user_id,
billing_asset_kind,
billing_asset_id.as_str(),
@@ -1996,7 +2002,7 @@ pub async fn use_puzzle_runtime_prop(
}
pub async fn submit_puzzle_leaderboard(
State(state): State<AppState>,
State(state): State<PuzzleApiState>,
AxumPath(run_id): AxumPath<String>,
Extension(request_context): Extension<RequestContext>,
Extension(authenticated): Extension<AuthenticatedAccessToken>,