feat: refine wooden fish runtime generation
This commit is contained in:
@@ -1265,6 +1265,14 @@ fn normalize_migration_row(table_name: &str, value: &serde_json::Value) -> serde
|
||||
.or_insert(serde_json::Value::Null);
|
||||
}
|
||||
}
|
||||
if table_name == "wooden_fish_work_profile" {
|
||||
if let Some(object) = next_value.as_object_mut() {
|
||||
// 中文注释:敲木鱼背景环境图晚于首版作品表加入,旧迁移包按未生成背景兼容。
|
||||
object
|
||||
.entry("background_asset_json".to_string())
|
||||
.or_insert(serde_json::Value::Null);
|
||||
}
|
||||
}
|
||||
next_value
|
||||
}
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@ pub struct WoodenFishGalleryViewRow {
|
||||
pub hit_object_reference_image_src: Option<String>,
|
||||
pub hit_sound_prompt: Option<String>,
|
||||
pub hit_object_asset: Option<WoodenFishImageAssetSnapshot>,
|
||||
pub background_asset: Option<WoodenFishImageAssetSnapshot>,
|
||||
pub hit_sound_asset: Option<WoodenFishAudioAssetSnapshot>,
|
||||
pub floating_words: Vec<String>,
|
||||
pub cover_image_src: String,
|
||||
@@ -327,6 +328,11 @@ fn compile_wooden_fish_draft_tx(
|
||||
.as_deref()
|
||||
.map(parse_json)
|
||||
.transpose()?;
|
||||
let background_asset = input
|
||||
.background_asset_json
|
||||
.as_deref()
|
||||
.map(parse_json)
|
||||
.transpose()?;
|
||||
let cover_image_src = input
|
||||
.cover_image_src
|
||||
.as_deref()
|
||||
@@ -354,6 +360,7 @@ fn compile_wooden_fish_draft_tx(
|
||||
hit_sound_prompt: input.hit_sound_prompt.as_deref().and_then(clean_optional),
|
||||
floating_words: floating_words.clone(),
|
||||
hit_object_asset: hit_object_asset.clone(),
|
||||
background_asset: background_asset.clone(),
|
||||
hit_sound_asset: hit_sound_asset.clone(),
|
||||
cover_image_src: cover_image_src.clone(),
|
||||
generation_status: input
|
||||
@@ -392,6 +399,7 @@ fn compile_wooden_fish_draft_tx(
|
||||
play_count: 0,
|
||||
updated_at: compiled_at,
|
||||
published_at: None,
|
||||
background_asset_json: background_asset.as_ref().map(to_json_string),
|
||||
};
|
||||
upsert_work(ctx, row);
|
||||
let config = config_from_draft(&draft);
|
||||
@@ -469,6 +477,14 @@ fn update_wooden_fish_work_tx(
|
||||
let asset = parse_json::<WoodenFishAudioAssetSnapshot>(&value)?;
|
||||
next.hit_sound_asset_json = to_json_string(&asset);
|
||||
}
|
||||
if let Some(value) = input
|
||||
.background_asset_json
|
||||
.as_deref()
|
||||
.and_then(clean_optional)
|
||||
{
|
||||
let asset = parse_json::<WoodenFishImageAssetSnapshot>(&value)?;
|
||||
next.background_asset_json = Some(to_json_string(&asset));
|
||||
}
|
||||
if let Some(value) = input
|
||||
.floating_words_json
|
||||
.as_deref()
|
||||
@@ -674,6 +690,7 @@ fn build_gallery_view_row(
|
||||
hit_object_reference_image_src: work.hit_object_reference_image_src,
|
||||
hit_sound_prompt: work.hit_sound_prompt,
|
||||
hit_object_asset: work.hit_object_asset,
|
||||
background_asset: work.background_asset,
|
||||
hit_sound_asset: work.hit_sound_asset,
|
||||
floating_words: work.floating_words,
|
||||
cover_image_src: work.cover_image_src,
|
||||
@@ -721,6 +738,12 @@ fn build_work_snapshot(row: &WoodenFishWorkProfileRow) -> Result<WoodenFishWorkS
|
||||
hit_object_asset: clean_optional(&row.hit_object_asset_json)
|
||||
.map(|value| parse_json(&value))
|
||||
.transpose()?,
|
||||
background_asset: row
|
||||
.background_asset_json
|
||||
.as_deref()
|
||||
.and_then(clean_optional)
|
||||
.map(|value| parse_json(&value))
|
||||
.transpose()?,
|
||||
hit_sound_asset: clean_optional(&row.hit_sound_asset_json)
|
||||
.map(|value| parse_json(&value))
|
||||
.transpose()?,
|
||||
@@ -965,6 +988,11 @@ fn insert_event(
|
||||
fn is_publish_ready(row: &WoodenFishWorkProfileRow) -> bool {
|
||||
!row.work_title.trim().is_empty()
|
||||
&& !row.hit_object_asset_json.trim().is_empty()
|
||||
&& row
|
||||
.background_asset_json
|
||||
.as_deref()
|
||||
.and_then(clean_optional)
|
||||
.is_some()
|
||||
&& !row.hit_sound_asset_json.trim().is_empty()
|
||||
&& !row.floating_words_json.trim().is_empty()
|
||||
&& row.generation_status == WOODEN_FISH_GENERATION_READY
|
||||
@@ -1002,6 +1030,7 @@ fn draft_from_config(
|
||||
hit_sound_prompt: config.hit_sound_prompt.clone(),
|
||||
floating_words: normalize_floating_words(&config.floating_words),
|
||||
hit_object_asset: None,
|
||||
background_asset: None,
|
||||
hit_sound_asset: None,
|
||||
cover_image_src: None,
|
||||
generation_status: generation_status.to_string(),
|
||||
@@ -1021,6 +1050,7 @@ fn draft_from_work_snapshot(work: &WoodenFishWorkSnapshot) -> WoodenFishDraftSna
|
||||
hit_sound_prompt: work.hit_sound_prompt.clone(),
|
||||
floating_words: work.floating_words.clone(),
|
||||
hit_object_asset: work.hit_object_asset.clone(),
|
||||
background_asset: work.background_asset.clone(),
|
||||
hit_sound_asset: work.hit_sound_asset.clone(),
|
||||
cover_image_src: clean_optional(&work.cover_image_src),
|
||||
generation_status: work.generation_status.clone(),
|
||||
@@ -1199,6 +1229,7 @@ fn clone_work(row: &WoodenFishWorkProfileRow) -> WoodenFishWorkProfileRow {
|
||||
hit_object_reference_image_src: row.hit_object_reference_image_src.clone(),
|
||||
hit_sound_prompt: row.hit_sound_prompt.clone(),
|
||||
hit_object_asset_json: row.hit_object_asset_json.clone(),
|
||||
background_asset_json: row.background_asset_json.clone(),
|
||||
hit_sound_asset_json: row.hit_sound_asset_json.clone(),
|
||||
floating_words_json: row.floating_words_json.clone(),
|
||||
cover_image_src: row.cover_image_src.clone(),
|
||||
|
||||
@@ -45,6 +45,8 @@ pub struct WoodenFishWorkProfileRow {
|
||||
pub(crate) play_count: u32,
|
||||
pub(crate) updated_at: Timestamp,
|
||||
pub(crate) published_at: Option<Timestamp>,
|
||||
#[default(None::<String>)]
|
||||
pub(crate) background_asset_json: Option<String>,
|
||||
}
|
||||
|
||||
#[spacetimedb::table(
|
||||
|
||||
@@ -45,6 +45,7 @@ pub struct WoodenFishDraftCompileInput {
|
||||
pub hit_object_reference_image_src: Option<String>,
|
||||
pub hit_sound_prompt: Option<String>,
|
||||
pub hit_object_asset_json: Option<String>,
|
||||
pub background_asset_json: Option<String>,
|
||||
pub hit_sound_asset_json: Option<String>,
|
||||
pub floating_words_json: Option<String>,
|
||||
pub cover_image_src: Option<String>,
|
||||
@@ -63,6 +64,7 @@ pub struct WoodenFishWorkUpdateInput {
|
||||
pub hit_object_reference_image_src: Option<String>,
|
||||
pub hit_sound_prompt: Option<String>,
|
||||
pub hit_object_asset_json: Option<String>,
|
||||
pub background_asset_json: Option<String>,
|
||||
pub hit_sound_asset_json: Option<String>,
|
||||
pub floating_words_json: Option<String>,
|
||||
pub cover_image_src: Option<String>,
|
||||
@@ -207,6 +209,7 @@ pub struct WoodenFishDraftSnapshot {
|
||||
pub hit_sound_prompt: Option<String>,
|
||||
pub floating_words: Vec<String>,
|
||||
pub hit_object_asset: Option<WoodenFishImageAssetSnapshot>,
|
||||
pub background_asset: Option<WoodenFishImageAssetSnapshot>,
|
||||
pub hit_sound_asset: Option<WoodenFishAudioAssetSnapshot>,
|
||||
pub cover_image_src: Option<String>,
|
||||
pub generation_status: String,
|
||||
@@ -242,6 +245,7 @@ pub struct WoodenFishWorkSnapshot {
|
||||
pub hit_object_reference_image_src: Option<String>,
|
||||
pub hit_sound_prompt: Option<String>,
|
||||
pub hit_object_asset: Option<WoodenFishImageAssetSnapshot>,
|
||||
pub background_asset: Option<WoodenFishImageAssetSnapshot>,
|
||||
pub hit_sound_asset: Option<WoodenFishAudioAssetSnapshot>,
|
||||
pub floating_words: Vec<String>,
|
||||
pub cover_image_src: String,
|
||||
|
||||
Reference in New Issue
Block a user