恢复可选目录生成器的默认素材目录

角色图片生成在入队与同步执行预检前恢复 project 默认目录

UI 设计素材提取在入队与 worker 执行预检前恢复 project 默认目录

新增默认目录策略及四条调用路径回归测试
This commit is contained in:
2026-08-08 18:06:04 +08:00
parent dc3e92433f
commit 92832e56c2
@@ -2645,7 +2645,10 @@ pub(crate) async fn enqueue_editor_image_generation_for_owner(
state,
caller.owner_user_id.as_str(),
payload.project_id.clone(),
payload.asset_folder_id.clone(),
resolve_editor_image_generation_target_folder_id(
payload.asset_folder_id.clone(),
normalized_kind,
),
)
.await?;
payload.project_id = target.project_id;
@@ -2865,7 +2868,10 @@ where
state,
caller.owner_user_id.as_str(),
payload.project_id.clone(),
payload.asset_folder_id.clone(),
resolve_editor_image_generation_target_folder_id(
payload.asset_folder_id.clone(),
normalized_kind,
),
)
.await?;
payload.project_id = target.project_id;
@@ -7240,7 +7246,7 @@ pub(crate) async fn enqueue_editor_ui_design_asset_extraction_for_owner(
state,
caller.owner_user_id.as_str(),
payload.project_id.clone(),
payload.asset_folder_id.clone(),
resolve_editor_ui_design_asset_extraction_target_folder_id(payload.asset_folder_id.clone()),
)
.await?;
payload.project_id = target.project_id;
@@ -7309,7 +7315,7 @@ pub(crate) async fn extract_editor_ui_design_assets_for_owner(
state,
caller.owner_user_id.as_str(),
payload.project_id.clone(),
payload.asset_folder_id.clone(),
resolve_editor_ui_design_asset_extraction_target_folder_id(payload.asset_folder_id.clone()),
)
.await?;
payload.project_id = target.project_id;
@@ -10224,6 +10230,22 @@ pub(crate) fn normalize_generated_asset_folder_id(
}
}
fn resolve_editor_image_generation_target_folder_id(
asset_folder_id: Option<String>,
normalized_kind: Option<&str>,
) -> Option<String> {
asset_folder_id.or_else(|| {
matches!(normalized_kind, Some("character"))
.then(|| EDITOR_ASSET_DEFAULT_FOLDER_ID.to_string())
})
}
fn resolve_editor_ui_design_asset_extraction_target_folder_id(
asset_folder_id: Option<String>,
) -> Option<String> {
asset_folder_id.or_else(|| Some(EDITOR_ASSET_DEFAULT_FOLDER_ID.to_string()))
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub(crate) struct EditorBillableGenerationTarget {
pub(crate) project_id: Option<String>,
@@ -20037,6 +20059,56 @@ mod tests {
assert_eq!(normalize_generated_asset_folder_id(None, "user-1"), None);
}
#[test]
fn optional_folder_generators_restore_their_project_folder_defaults() {
assert_eq!(
resolve_editor_image_generation_target_folder_id(None, Some("character")).as_deref(),
Some(EDITOR_ASSET_DEFAULT_FOLDER_ID)
);
assert_eq!(
resolve_editor_image_generation_target_folder_id(None, Some("scene")),
None
);
assert_eq!(
resolve_editor_image_generation_target_folder_id(
Some("owner:asset-folder:custom".to_string()),
Some("character"),
)
.as_deref(),
Some("owner:asset-folder:custom")
);
assert_eq!(
resolve_editor_ui_design_asset_extraction_target_folder_id(None).as_deref(),
Some(EDITOR_ASSET_DEFAULT_FOLDER_ID)
);
let source = include_str!("editor_project.rs");
for (start, end, resolver) in [
(
"pub(crate) async fn enqueue_editor_image_generation_for_owner",
"pub(crate) async fn validate_editor_image_generation_parameters_for_owner",
"resolve_editor_image_generation_target_folder_id(",
),
(
"pub(crate) async fn generate_editor_image_for_owner_with_prompt_builder",
"fn editor_image_generation_billing_asset_kind",
"resolve_editor_image_generation_target_folder_id(",
),
(
"pub(crate) async fn enqueue_editor_ui_design_asset_extraction_for_owner",
"pub(crate) async fn extract_editor_ui_design_assets_for_owner",
"resolve_editor_ui_design_asset_extraction_target_folder_id(",
),
(
"pub(crate) async fn extract_editor_ui_design_assets_for_owner",
"pub(crate) fn editor_project_payload_from_record",
"resolve_editor_ui_design_asset_extraction_target_folder_id(",
),
] {
assert_function_contains(source, start, end, &[resolver]);
}
}
fn assert_function_contains(source: &str, start: &str, end: &str, snippets: &[&str]) {
let start_index = source
.find(start)