From 36af9e9c1b063fd5ed2e2d796319bbe6d84dbe20 Mon Sep 17 00:00:00 2001 From: kdletters <61648117+kdletters@users.noreply.github.com> Date: Thu, 28 May 2026 03:00:11 +0800 Subject: [PATCH] fix: avoid spacetimedb filtered index panics --- .../crates/spacetime-module/src/match3d.rs | 9 ++--- .../src/runtime/admin_work_visibility.rs | 34 ++++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/server-rs/crates/spacetime-module/src/match3d.rs b/server-rs/crates/spacetime-module/src/match3d.rs index d473c7fd9..272c430e4 100644 --- a/server-rs/crates/spacetime-module/src/match3d.rs +++ b/server-rs/crates/spacetime-module/src/match3d.rs @@ -696,15 +696,16 @@ fn list_match3d_works_tx( let rows = if input.published_only { ctx.db .match3d_work_profile() - .by_match3d_work_publication_status() - .filter(&MATCH3D_PUBLICATION_PUBLISHED.to_string()) + .iter() + // 中文注释:列表页优先稳定性,避免二级索引 filter 初始化异常直接打爆模块实例。 + .filter(|row| row.publication_status == MATCH3D_PUBLICATION_PUBLISHED) .collect::>() } else { require_non_empty(&input.owner_user_id, "match3d owner_user_id")?; ctx.db .match3d_work_profile() - .by_match3d_work_owner_user_id() - .filter(&input.owner_user_id) + .iter() + .filter(|row| row.owner_user_id == input.owner_user_id) .collect::>() }; let mut items = rows diff --git a/server-rs/crates/spacetime-module/src/runtime/admin_work_visibility.rs b/server-rs/crates/spacetime-module/src/runtime/admin_work_visibility.rs index 35facd86b..775247737 100644 --- a/server-rs/crates/spacetime-module/src/runtime/admin_work_visibility.rs +++ b/server-rs/crates/spacetime-module/src/runtime/admin_work_visibility.rs @@ -108,8 +108,9 @@ fn update_work_visibility_tx( fn list_puzzle_work_visibility(ctx: &ReducerContext) -> Vec { ctx.db .puzzle_work_profile() - .by_puzzle_work_publication_status() - .filter(PuzzlePublicationStatus::Published) + .iter() + // 中文注释:后台页签是低频管理入口,列表优先保证稳定性,避免二级索引 filter 初始化异常打爆 wasm 实例。 + .filter(|row| row.publication_status == PuzzlePublicationStatus::Published) .map(|row| puzzle_work_visibility_snapshot(&row)) .collect() } @@ -165,8 +166,9 @@ fn puzzle_work_visibility_snapshot(row: &PuzzleWorkProfileRow) -> AdminWorkVisib fn list_custom_world_work_visibility(ctx: &ReducerContext) -> Vec { ctx.db .custom_world_profile() - .by_custom_world_profile_publication_status() - .filter(CustomWorldPublicationStatus::Published) + .iter() + // 中文注释:后台必须能读到所有已发布源表记录,包括已隐藏作品,因此不复用公开 view。 + .filter(|row| row.publication_status == CustomWorldPublicationStatus::Published) .filter(|row| row.deleted_at.is_none()) .map(|row| custom_world_work_visibility_snapshot(&row)) .collect() @@ -240,8 +242,8 @@ fn custom_world_work_visibility_snapshot(row: &CustomWorldProfile) -> AdminWorkV fn list_jump_hop_work_visibility(ctx: &ReducerContext) -> Vec { ctx.db .jump_hop_work_profile() - .by_jump_hop_work_publication_status() - .filter(JUMP_HOP_PUBLICATION_PUBLISHED) + .iter() + .filter(|row| row.publication_status == JUMP_HOP_PUBLICATION_PUBLISHED) .map(|row| jump_hop_work_visibility_snapshot(&row)) .collect() } @@ -293,8 +295,8 @@ fn jump_hop_work_visibility_snapshot(row: &JumpHopWorkProfileRow) -> AdminWorkVi fn list_wooden_fish_work_visibility(ctx: &ReducerContext) -> Vec { ctx.db .wooden_fish_work_profile() - .by_wooden_fish_work_publication_status() - .filter(WOODEN_FISH_PUBLICATION_PUBLISHED) + .iter() + .filter(|row| row.publication_status == WOODEN_FISH_PUBLICATION_PUBLISHED) .map(|row| wooden_fish_work_visibility_snapshot(&row)) .collect() } @@ -348,8 +350,8 @@ fn wooden_fish_work_visibility_snapshot( fn list_match3d_work_visibility(ctx: &ReducerContext) -> Vec { ctx.db .match3d_work_profile() - .by_match3d_work_publication_status() - .filter(MATCH3D_PUBLICATION_PUBLISHED) + .iter() + .filter(|row| row.publication_status == MATCH3D_PUBLICATION_PUBLISHED) .map(|row| match3d_work_visibility_snapshot(&row)) .collect() } @@ -401,8 +403,8 @@ fn match3d_work_visibility_snapshot(row: &Match3DWorkProfileRow) -> AdminWorkVis fn list_square_hole_work_visibility(ctx: &ReducerContext) -> Vec { ctx.db .square_hole_work_profile() - .by_square_hole_work_publication_status() - .filter(SQUARE_HOLE_PUBLICATION_PUBLISHED) + .iter() + .filter(|row| row.publication_status == SQUARE_HOLE_PUBLICATION_PUBLISHED) .map(|row| square_hole_work_visibility_snapshot(&row)) .collect() } @@ -456,8 +458,8 @@ fn square_hole_work_visibility_snapshot( fn list_visual_novel_work_visibility(ctx: &ReducerContext) -> Vec { ctx.db .visual_novel_work_profile() - .by_visual_novel_work_publication_status() - .filter(VISUAL_NOVEL_PUBLICATION_PUBLISHED) + .iter() + .filter(|row| row.publication_status == VISUAL_NOVEL_PUBLICATION_PUBLISHED) .map(|row| visual_novel_work_visibility_snapshot(&row)) .collect() } @@ -511,8 +513,8 @@ fn visual_novel_work_visibility_snapshot( fn list_big_fish_work_visibility(ctx: &ReducerContext) -> Vec { ctx.db .big_fish_creation_session() - .by_big_fish_session_stage() - .filter(BigFishCreationStage::Published) + .iter() + .filter(|row| row.stage == BigFishCreationStage::Published) .map(|row| big_fish_work_visibility_snapshot(&row)) .collect() }